From 4ba6c6a1367164ee12a62553edf4cdb13e4d9d20dc41d7739a73bcce6ed618b4 Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Wed, 8 Jan 2025 13:22:00 +0000 Subject: [PATCH] - Maintenance script qa.sh: * Add PR29770 xfail (glibc). * Add PR31229 kfail. OBS-URL: https://build.opensuse.org/package/show/devel:gcc/gdb?expand=0&rev=403 --- .gitattributes | 23 + .gitignore | 1 + README.qa | 117 + _constraints | 24 + _multibuild | 3 + baselibs.conf | 11 + ...b.base-examine-backwards.exp-for-aix.patch | 53 + clean.sh | 46 + fix-gdb.mi-new-ui-mi-sync.exp.patch | 23 + ...egression-on-aarch64-linux-gdbserver.patch | 366 + ...e-gdb.ada-inline-section-gc.exp-test.patch | 80 + fixup-gdb-6.3-attach-see-vdso-test.patch | 30 + fixup-gdb-6.3-gstack-20050411.patch | 25 + ...5-bz243845-stale-testing-zombie-test.patch | 35 + fixup-gdb-bz634108-solib_address.patch | 22 + fixup-gdb-glibc-strstr-workaround.patch | 19 + fixup-gdb-linux_perf-bundle.patch | 40 + ...61564-aarch64-hw-watchpoint-test.pat.patch | 43 + fixup-gdb-test-bt-cfi-without-die.patch | 38 + fixup-gdb-test-dw2-aranges.patch | 21 + ...d-aarch64-fix-reverse-stepping-failu.patch | 70 + fixup-skip-tests.patch | 101 + gdb-14.2.tar.bz2 | 3 + gdb-6.3-attach-see-vdso-test.patch | 120 + gdb-6.3-gstack-20050411.patch | 258 + gdb-6.3-mapping-zero-inode-test.patch | 247 + ...337-resolve-tls-without-debuginfo-v2.patch | 265 + ...5-bz218379-ppc-solib-trampoline-test.patch | 107 + ...5-bz243845-stale-testing-zombie-test.patch | 89 + gdb-6.5-gcore-buffer-limit-test.patch | 154 + gdb-6.5-section-num-fixup-test.patch | 127 + ...buildid-locate-rpm-librpm-workaround.patch | 19 + gdb-6.6-buildid-locate-rpm-suse.patch | 123 + gdb-6.6-buildid-locate-rpm.patch | 1084 +++ ...6.6-buildid-locate-solib-missing-ids.patch | 238 + gdb-6.6-buildid-locate.patch | 1925 ++++++ gdb-6.6-bz229517-gcore-without-terminal.patch | 188 + ....6-bz237572-ppc-atomic-sequence-test.patch | 278 + gdb-6.6-testsuite-timeouts.patch | 32 + gdb-add-index.sh-fix-bashism.patch | 21 + gdb-archer-next-over-throw-cxx-exec.patch | 88 + gdb-arm-fix-epilogue-frame-id.patch | 47 + ...humb-bit-in-arm_adjust_breakpoint_ad.patch | 77 + ...pidruro-register-from-non-freebsd-ta.patch | 219 + ...gdbserver-linux-aarch64-low.cc-build.patch | 41 + gdb-bz634108-solib_address.patch | 41 + gdb-cli-add-ignore-errors-command.patch | 201 + gdb-core-open-vdso-warning.patch | 58 + ...xp-fix-cast-handling-for-indirection.patch | 150 + ...ting-of-out-of-bounds-struct-members.patch | 365 + ...p-redo-cast-handling-for-indirection.patch | 86 + gdb-fedora-libncursesw.patch | 333 + ...p-use-after-free-in-select_event_lwp.patch | 144 + ...ix-segfault-in-for_each_block-part-1.patch | 636 ++ ...ix-segfault-in-for_each_block-part-2.patch | 168 + gdb-ftbs-swapped-calloc-args.patch | 42 + gdb-gcore-bash.patch | 10 + gdb-glibc-strstr-workaround.patch | 132 + gdb-gstack.man | 48 + gdb-linux_perf-bundle.patch | 226 + gdb-orphanripper.c | 752 ++ gdb-python-finishbreakpoint-update.patch | 447 ++ ...db.python-py-disasm.exp-on-arm-linux.patch | 125 + ...windinfo.add_saved_register-mo-fixup.patch | 70 + ...gdb.unwindinfo.add_saved_register-mo.patch | 61 + ...mote-fix-abort-on-remote_close_error.patch | 229 + gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch | 264 + ...-generate-dwarf-5-index-consistently.patch | 101 + ...2086-generate-gdb-index-consistently.patch | 230 + ...hbz-2232086-reduce-size-of-gdb-index.patch | 222 + ...3-set-solib-absolute-prefix-testcase.patch | 83 + ...07614-memleak-infpy_read_memory-test.patch | 170 + ...-s390x-wrong-prologue-skip-O2-g-3of3.patch | 235 + ...149205-catch-syscall-after-fork-test.patch | 123 + ...bz1261564-aarch64-hw-watchpoint-test.patch | 104 + ...hbz2232086-refactor-selftest-support.patch | 77 + ...hbz2250652-avoid-PyOS_ReadlineTState.patch | 48 + gdb-rhbz2250652-gdbpy_gil.patch | 81 + ...2261580-intrusive_list-assertion-fix.patch | 55 + ...dvar-assertion-frame-failed-testcase.patch | 147 + gdb-rpmlintrc | 16 + ...390-add-arch14-record-replay-support.patch | 50 + ...ltaneous-step-resume-breakpoint-test.patch | 162 + gdb-symtab-add-producer_is_gas.patch | 125 + ...-defer-backward-refs-inter-cu-intra-.patch | 74 + ...-factor-out-m_deferred_entries-usage.patch | 76 + ...tab-factor-out-m_die_range_map-usage.patch | 151 + ...w_tag_inlined_subroutine-entries-in-.patch | 112 + ...e-nullptr-parent-in-parent_map-set_p.patch | 37 + ...track-of-all-parents-for-cooked-inde.patch | 38 + ...eep-track-of-processed-dies-in-shard.patch | 126 + ...se-into-c-dw_tag_subprogram-dies-for.patch | 31 + ...efactor-condition-in-scan_attributes.patch | 70 + ...ve-deferred-entries-inter-shard-case.patch | 500 ++ ...ve-deferred-entries-intra-shard-case.patch | 120 + ...n-correct-reader-for-top-level-cu-in.patch | 224 + ...set-default-dwarf-max-cache-age-1000.patch | 13 + gdb-symtab-work-around-gas-pr28629.patch | 278 + ...work-around-pr-gas-29517-dwarf2-case.patch | 137 + gdb-symtab-work-around-pr-gas-29517.patch | 256 + gdb-symtab-workaround-pr-gas-31115.patch | 122 + ...catching-syscall-execve-exit-for-arm.patch | 130 + ....base-watch-bitfields.exp-on-aarch64.patch | 349 + ....base-watchpoint-running-on-arm-ppc6.patch | 76 + ....base-watchpoint-unaligned.exp-on-aa.patch | 262 + ...array-elements-in-ppc64_aggregate_ca.patch | 86 + ...everse-execution-of-ldr-immediate-t4.patch | 80 + ...390-add-arch15-record-replay-support.patch | 168 + gdb-test-bt-cfi-without-die.patch | 214 + gdb-test-dw2-aranges.patch | 220 + gdb-testsuite-ada-pie.patch | 121 + ...d-gdb.dwarf2-backward-spec-inter-cu..patch | 128 + ...d-gdb.dwarf2-forward-spec-inter-cu.e.patch | 128 + ...estsuite-add-gdb.suse-debranding.exp.patch | 68 + ...stsuite-add-gdb.suse-zypper-hint.exp.patch | 101 + ...d-missing-include-in-gdb.base-ctf-pt.patch | 51 + ...d-missing-include-in-gdb.base-rtld-s.patch | 47 + ...d-missing-includes-in-gdb.trace-coll.patch | 60 + ...d-missing-no-prompt-anchor-in-gdb.ba.patch | 45 + ...d-pr-gdb-26967-kfail-in-two-more-tes.patch | 167 + ...oid-intermittent-failures-on-a-debug.patch | 59 + ...ll-ldd-version-in-gdb.testsuite-dump.patch | 39 + ...estsuite-factor-out-proc-get_portnum.patch | 98 + gdb-testsuite-factor-out-proc-lock_dir.patch | 63 + gdb-testsuite-factor-out-proc-with_lock.patch | 160 + ...x-error-in-gdb.server-server-kill-py.patch | 54 + ...x-gdb.ada-verylong.exp-on-32-bit-tar.patch | 84 + ...testsuite-fix-gdb.base-eh_return.exp.patch | 80 + ...x-gdb.base-ending-run.exp-on-manjaro.patch | 58 + ...x-gdb.base-list-no-debug.exp-on-debi.patch | 103 + ...p-over-syscall.exp-with-m32-amd-case.patch | 71 + ...-fix-gdb.cp-namespace.exp-with-read1.patch | 57 + ...ix-gdb.dwarf2-dw2-gas-workaround.exp.patch | 41 + ...x-gdb.fortran-array-bounds.exp-on-ar.patch | 95 + ...fix-gdb.mi-mi-dprintf.exp-with-read1.patch | 72 + ...x-gdb.server-server-connect.exp-for-.patch | 74 + ...x-gdbserver-pid-in-gdb.server-server.patch | 117 + ...x-license-text-in-gdb.reverse-map-to.patch | 49 + ...x-missing-return-type-in-gdb.linespe.patch | 40 + gdb-testsuite-fix-regexp-in-vgdb_start.patch | 66 + ...x-spurious-fails-with-examine-backwa.patch | 221 + ...x-test-case-gdb.threads-attach-stopp.patch | 65 + ...x-test-in-gdb.python-py-finish-break.patch | 67 + ...-fix-timeout-in-gdb.tui-resize-2.exp.patch | 76 + ...x-typo-in-gdb.base-catch-syscall.exp.patch | 52 + ...stsuite-fix-valgrind-tests-on-debian.patch | 54 + ...rther-handle-long-filenames-in-gdb.b.patch | 49 + ...ndle-core-without-build-id-in-gdb.ba.patch | 66 + gdb-testsuite-handle-pac-marker.patch | 213 + ...ke-gdb.base-solib-search.exp-more-ro.patch | 93 + ...ite-make-portnum-a-persistent-global.patch | 68 + ...-move-gpu-parallel.lock-to-cache-dir.patch | 42 + ...compilation-fails-with-unix-fpie-pie.patch | 132 + ...stsuite-remove-spurious-in-save_vars.patch | 53 + ...set-errcnt-and-warncnt-in-default_gd.patch | 68 + ...mplify-gdb.server-server-kill-python.patch | 65 + ...e-find_gnatmake-instead-of-gdb_find_.patch | 139 + gdb-testsuite-use-more-progbits-for-arm.patch | 858 +++ ...allel-testing-check-slash-slash-case.patch | 95 + ...e-unique-portnum-in-parallel-testing.patch | 102 + ...allow-command-window-of-1-or-2-lines.patch | 80 + ...able-work-around-libncurses-segfault.patch | 47 + ...resizing-of-terminal-to-1-or-2-lines.patch | 147 + ...be-uninitialized-in-tui_find_disasse.patch | 57 + gdb.changes | 6139 +++++++++++++++++ gdb.spec | 1450 ++++ gdbinit | 8 + gdbinit.without-python | 5 + import-fedora.sh | 142 + import-patches.sh | 100 + ...uage-print_type-handle-varstring-nul.patch | 43 + patchlist.pl | 74 + patchname_get.sh | 314 + ...aarch64-fix-reverse-stepping-failure.patch | 478 ++ ...pc-fix-test-gdb.ada-finish-large.exp.patch | 49 + qa-local.sh | 251 + qa-remote.sh | 163 + qa.sh | 1118 +++ rs6000-unwind-on-each-instruction-fix.patch | 97 + ...-z16-arch14-instruction-descriptions.patch | 103 + v2.0.5.tar.gz | 3 + 181 files changed, 33350 insertions(+) create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 README.qa create mode 100644 _constraints create mode 100644 _multibuild create mode 100644 baselibs.conf create mode 100644 change-gdb.base-examine-backwards.exp-for-aix.patch create mode 100644 clean.sh create mode 100644 fix-gdb.mi-new-ui-mi-sync.exp.patch create mode 100644 fix-regression-on-aarch64-linux-gdbserver.patch create mode 100644 fix-the-gdb.ada-inline-section-gc.exp-test.patch create mode 100644 fixup-gdb-6.3-attach-see-vdso-test.patch create mode 100644 fixup-gdb-6.3-gstack-20050411.patch create mode 100644 fixup-gdb-6.5-bz243845-stale-testing-zombie-test.patch create mode 100644 fixup-gdb-bz634108-solib_address.patch create mode 100644 fixup-gdb-glibc-strstr-workaround.patch create mode 100644 fixup-gdb-linux_perf-bundle.patch create mode 100644 fixup-gdb-rhbz1261564-aarch64-hw-watchpoint-test.pat.patch create mode 100644 fixup-gdb-test-bt-cfi-without-die.patch create mode 100644 fixup-gdb-test-dw2-aranges.patch create mode 100644 fixup-powerpc-and-aarch64-fix-reverse-stepping-failu.patch create mode 100644 fixup-skip-tests.patch create mode 100644 gdb-14.2.tar.bz2 create mode 100644 gdb-6.3-attach-see-vdso-test.patch create mode 100644 gdb-6.3-gstack-20050411.patch create mode 100644 gdb-6.3-mapping-zero-inode-test.patch create mode 100644 gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch create mode 100644 gdb-6.5-bz218379-ppc-solib-trampoline-test.patch create mode 100644 gdb-6.5-bz243845-stale-testing-zombie-test.patch create mode 100644 gdb-6.5-gcore-buffer-limit-test.patch create mode 100644 gdb-6.5-section-num-fixup-test.patch create mode 100644 gdb-6.6-buildid-locate-rpm-librpm-workaround.patch create mode 100644 gdb-6.6-buildid-locate-rpm-suse.patch create mode 100644 gdb-6.6-buildid-locate-rpm.patch create mode 100644 gdb-6.6-buildid-locate-solib-missing-ids.patch create mode 100644 gdb-6.6-buildid-locate.patch create mode 100644 gdb-6.6-bz229517-gcore-without-terminal.patch create mode 100644 gdb-6.6-bz237572-ppc-atomic-sequence-test.patch create mode 100644 gdb-6.6-testsuite-timeouts.patch create mode 100644 gdb-add-index.sh-fix-bashism.patch create mode 100644 gdb-archer-next-over-throw-cxx-exec.patch create mode 100644 gdb-arm-fix-epilogue-frame-id.patch create mode 100644 gdb-arm-remove-thumb-bit-in-arm_adjust_breakpoint_ad.patch create mode 100644 gdb-arm-remove-tpidruro-register-from-non-freebsd-ta.patch create mode 100644 gdb-build-fix-gdbserver-linux-aarch64-low.cc-build.patch create mode 100644 gdb-bz634108-solib_address.patch create mode 100644 gdb-cli-add-ignore-errors-command.patch create mode 100644 gdb-core-open-vdso-warning.patch create mode 100644 gdb-exp-fix-cast-handling-for-indirection.patch create mode 100644 gdb-exp-fix-printing-of-out-of-bounds-struct-members.patch create mode 100644 gdb-exp-redo-cast-handling-for-indirection.patch create mode 100644 gdb-fedora-libncursesw.patch create mode 100644 gdb-fix-heap-use-after-free-in-select_event_lwp.patch create mode 100644 gdb-fix-segfault-in-for_each_block-part-1.patch create mode 100644 gdb-fix-segfault-in-for_each_block-part-2.patch create mode 100644 gdb-ftbs-swapped-calloc-args.patch create mode 100644 gdb-gcore-bash.patch create mode 100644 gdb-glibc-strstr-workaround.patch create mode 100644 gdb-gstack.man create mode 100644 gdb-linux_perf-bundle.patch create mode 100644 gdb-orphanripper.c create mode 100644 gdb-python-finishbreakpoint-update.patch create mode 100644 gdb-python-fix-gdb.python-py-disasm.exp-on-arm-linux.patch create mode 100644 gdb-python-make-gdb.unwindinfo.add_saved_register-mo-fixup.patch create mode 100644 gdb-python-make-gdb.unwindinfo.add_saved_register-mo.patch create mode 100644 gdb-remote-fix-abort-on-remote_close_error.patch create mode 100644 gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch create mode 100644 gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch create mode 100644 gdb-rhbz-2232086-generate-gdb-index-consistently.patch create mode 100644 gdb-rhbz-2232086-reduce-size-of-gdb-index.patch create mode 100644 gdb-rhbz-818343-set-solib-absolute-prefix-testcase.patch create mode 100644 gdb-rhbz1007614-memleak-infpy_read_memory-test.patch create mode 100644 gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch create mode 100644 gdb-rhbz1149205-catch-syscall-after-fork-test.patch create mode 100644 gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch create mode 100644 gdb-rhbz2232086-refactor-selftest-support.patch create mode 100644 gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch create mode 100644 gdb-rhbz2250652-gdbpy_gil.patch create mode 100644 gdb-rhbz2261580-intrusive_list-assertion-fix.patch create mode 100644 gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch create mode 100644 gdb-rpmlintrc create mode 100644 gdb-s390-add-arch14-record-replay-support.patch create mode 100644 gdb-simultaneous-step-resume-breakpoint-test.patch create mode 100644 gdb-symtab-add-producer_is_gas.patch create mode 100644 gdb-symtab-don-t-defer-backward-refs-inter-cu-intra-.patch create mode 100644 gdb-symtab-factor-out-m_deferred_entries-usage.patch create mode 100644 gdb-symtab-factor-out-m_die_range_map-usage.patch create mode 100644 gdb-symtab-fix-dw_tag_inlined_subroutine-entries-in-.patch create mode 100644 gdb-symtab-handle-nullptr-parent-in-parent_map-set_p.patch create mode 100644 gdb-symtab-keep-track-of-all-parents-for-cooked-inde.patch create mode 100644 gdb-symtab-keep-track-of-processed-dies-in-shard.patch create mode 100644 gdb-symtab-recurse-into-c-dw_tag_subprogram-dies-for.patch create mode 100644 gdb-symtab-refactor-condition-in-scan_attributes.patch create mode 100644 gdb-symtab-resolve-deferred-entries-inter-shard-case.patch create mode 100644 gdb-symtab-resolve-deferred-entries-intra-shard-case.patch create mode 100644 gdb-symtab-return-correct-reader-for-top-level-cu-in.patch create mode 100644 gdb-symtab-set-default-dwarf-max-cache-age-1000.patch create mode 100644 gdb-symtab-work-around-gas-pr28629.patch create mode 100644 gdb-symtab-work-around-pr-gas-29517-dwarf2-case.patch create mode 100644 gdb-symtab-work-around-pr-gas-29517.patch create mode 100644 gdb-symtab-workaround-pr-gas-31115.patch create mode 100644 gdb-tdep-fix-catching-syscall-execve-exit-for-arm.patch create mode 100644 gdb-tdep-fix-gdb.base-watch-bitfields.exp-on-aarch64.patch create mode 100644 gdb-tdep-fix-gdb.base-watchpoint-running-on-arm-ppc6.patch create mode 100644 gdb-tdep-fix-gdb.base-watchpoint-unaligned.exp-on-aa.patch create mode 100644 gdb-tdep-fix-nr-array-elements-in-ppc64_aggregate_ca.patch create mode 100644 gdb-tdep-fix-reverse-execution-of-ldr-immediate-t4.patch create mode 100644 gdb-tdep-s390-add-arch15-record-replay-support.patch create mode 100644 gdb-test-bt-cfi-without-die.patch create mode 100644 gdb-test-dw2-aranges.patch create mode 100644 gdb-testsuite-ada-pie.patch create mode 100644 gdb-testsuite-add-gdb.dwarf2-backward-spec-inter-cu..patch create mode 100644 gdb-testsuite-add-gdb.dwarf2-forward-spec-inter-cu.e.patch create mode 100644 gdb-testsuite-add-gdb.suse-debranding.exp.patch create mode 100644 gdb-testsuite-add-gdb.suse-zypper-hint.exp.patch create mode 100644 gdb-testsuite-add-missing-include-in-gdb.base-ctf-pt.patch create mode 100644 gdb-testsuite-add-missing-include-in-gdb.base-rtld-s.patch create mode 100644 gdb-testsuite-add-missing-includes-in-gdb.trace-coll.patch create mode 100644 gdb-testsuite-add-missing-no-prompt-anchor-in-gdb.ba.patch create mode 100644 gdb-testsuite-add-pr-gdb-26967-kfail-in-two-more-tes.patch create mode 100644 gdb-testsuite-avoid-intermittent-failures-on-a-debug.patch create mode 100644 gdb-testsuite-call-ldd-version-in-gdb.testsuite-dump.patch create mode 100644 gdb-testsuite-factor-out-proc-get_portnum.patch create mode 100644 gdb-testsuite-factor-out-proc-lock_dir.patch create mode 100644 gdb-testsuite-factor-out-proc-with_lock.patch create mode 100644 gdb-testsuite-fix-error-in-gdb.server-server-kill-py.patch create mode 100644 gdb-testsuite-fix-gdb.ada-verylong.exp-on-32-bit-tar.patch create mode 100644 gdb-testsuite-fix-gdb.base-eh_return.exp.patch create mode 100644 gdb-testsuite-fix-gdb.base-ending-run.exp-on-manjaro.patch create mode 100644 gdb-testsuite-fix-gdb.base-list-no-debug.exp-on-debi.patch create mode 100644 gdb-testsuite-fix-gdb.base-step-over-syscall.exp-with-m32-amd-case.patch create mode 100644 gdb-testsuite-fix-gdb.cp-namespace.exp-with-read1.patch create mode 100644 gdb-testsuite-fix-gdb.dwarf2-dw2-gas-workaround.exp.patch create mode 100644 gdb-testsuite-fix-gdb.fortran-array-bounds.exp-on-ar.patch create mode 100644 gdb-testsuite-fix-gdb.mi-mi-dprintf.exp-with-read1.patch create mode 100644 gdb-testsuite-fix-gdb.server-server-connect.exp-for-.patch create mode 100644 gdb-testsuite-fix-gdbserver-pid-in-gdb.server-server.patch create mode 100644 gdb-testsuite-fix-license-text-in-gdb.reverse-map-to.patch create mode 100644 gdb-testsuite-fix-missing-return-type-in-gdb.linespe.patch create mode 100644 gdb-testsuite-fix-regexp-in-vgdb_start.patch create mode 100644 gdb-testsuite-fix-spurious-fails-with-examine-backwa.patch create mode 100644 gdb-testsuite-fix-test-case-gdb.threads-attach-stopp.patch create mode 100644 gdb-testsuite-fix-test-in-gdb.python-py-finish-break.patch create mode 100644 gdb-testsuite-fix-timeout-in-gdb.tui-resize-2.exp.patch create mode 100644 gdb-testsuite-fix-typo-in-gdb.base-catch-syscall.exp.patch create mode 100644 gdb-testsuite-fix-valgrind-tests-on-debian.patch create mode 100644 gdb-testsuite-further-handle-long-filenames-in-gdb.b.patch create mode 100644 gdb-testsuite-handle-core-without-build-id-in-gdb.ba.patch create mode 100644 gdb-testsuite-handle-pac-marker.patch create mode 100644 gdb-testsuite-make-gdb.base-solib-search.exp-more-ro.patch create mode 100644 gdb-testsuite-make-portnum-a-persistent-global.patch create mode 100644 gdb-testsuite-move-gpu-parallel.lock-to-cache-dir.patch create mode 100644 gdb-testsuite-prevent-compilation-fails-with-unix-fpie-pie.patch create mode 100644 gdb-testsuite-remove-spurious-in-save_vars.patch create mode 100644 gdb-testsuite-reset-errcnt-and-warncnt-in-default_gd.patch create mode 100644 gdb-testsuite-simplify-gdb.server-server-kill-python.patch create mode 100644 gdb-testsuite-use-find_gnatmake-instead-of-gdb_find_.patch create mode 100644 gdb-testsuite-use-more-progbits-for-arm.patch create mode 100644 gdb-testsuite-use-unique-portnum-in-parallel-testing-check-slash-slash-case.patch create mode 100644 gdb-testsuite-use-unique-portnum-in-parallel-testing.patch create mode 100644 gdb-tui-allow-command-window-of-1-or-2-lines.patch create mode 100644 gdb-tui-enable-work-around-libncurses-segfault.patch create mode 100644 gdb-tui-fix-resizing-of-terminal-to-1-or-2-lines.patch create mode 100644 gdb-tui-fix-wmaybe-uninitialized-in-tui_find_disasse.patch create mode 100644 gdb.changes create mode 100644 gdb.spec create mode 100644 gdbinit create mode 100644 gdbinit.without-python create mode 100644 import-fedora.sh create mode 100644 import-patches.sh create mode 100644 make-pascal_language-print_type-handle-varstring-nul.patch create mode 100644 patchlist.pl create mode 100644 patchname_get.sh create mode 100644 powerpc-and-aarch64-fix-reverse-stepping-failure.patch create mode 100644 powerpc-fix-test-gdb.ada-finish-large.exp.patch create mode 100644 qa-local.sh create mode 100644 qa-remote.sh create mode 100644 qa.sh create mode 100644 rs6000-unwind-on-each-instruction-fix.patch create mode 100644 s390-provide-ibm-z16-arch14-instruction-descriptions.patch create mode 100644 v2.0.5.tar.gz diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..9b03811 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,23 @@ +## Default LFS +*.7z filter=lfs diff=lfs merge=lfs -text +*.bsp filter=lfs diff=lfs merge=lfs -text +*.bz2 filter=lfs diff=lfs merge=lfs -text +*.gem filter=lfs diff=lfs merge=lfs -text +*.gz filter=lfs diff=lfs merge=lfs -text +*.jar filter=lfs diff=lfs merge=lfs -text +*.lz filter=lfs diff=lfs merge=lfs -text +*.lzma filter=lfs diff=lfs merge=lfs -text +*.obscpio filter=lfs diff=lfs merge=lfs -text +*.oxt filter=lfs diff=lfs merge=lfs -text +*.pdf filter=lfs diff=lfs merge=lfs -text +*.png filter=lfs diff=lfs merge=lfs -text +*.rpm filter=lfs diff=lfs merge=lfs -text +*.tbz filter=lfs diff=lfs merge=lfs -text +*.tbz2 filter=lfs diff=lfs merge=lfs -text +*.tgz filter=lfs diff=lfs merge=lfs -text +*.ttf filter=lfs diff=lfs merge=lfs -text +*.txz filter=lfs diff=lfs merge=lfs -text +*.whl filter=lfs diff=lfs merge=lfs -text +*.xz filter=lfs diff=lfs merge=lfs -text +*.zip filter=lfs diff=lfs merge=lfs -text +*.zst filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..57affb6 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.osc diff --git a/README.qa b/README.qa new file mode 100644 index 0000000..293a973 --- /dev/null +++ b/README.qa @@ -0,0 +1,117 @@ +I. LOCAL QA. + + +0. Notes. + +Note that the configs are hardcoded in the script. F.i. atm SLE-11 is not +included, because the config is unresolvable on devel:gcc/gdb. Also Leap +15.2 is not included because of 'remote error: unknown repository type +UNDEFINED"'. + +The script tries to keep disk usage low by removing the buildroot after each +build, but that requires sudo rights, so the first thing the script does is +ask for sudo authentication. + + +1. Cleanup. + +Do: +... +$ bash qa-local.sh 1 +... + + +2. Build. + +Do: +... +$ bash qa-local.sh 2 +... + +This builds gdb for each x86_64 config, without running the testsuite. + +I did a timing run on my laptop (with 6 configs) and got: +... +real 66m17.689s +user 149m31.925s +sys 12m25.359s +... +so for a dual-core/4-SMT CPU, it's ~1h5m. + + +3. Build & test. + +Do: +... +$ bash qa-local.sh 3 +... + +This builds gdb and produces test results for each x86_64 config. + +I did a timing run on my laptop (with 6 configs) and got: +... +real 285m9.679s +user 683m16.769s +sys 133m58.287s +... +so for a dual-core/4-SMT CPU, it's ~4h45m. + +The resulting testlogs (with 6 configs) is 1.4GB. + + +4. Verify. + +Do: +... +$ bash qa-local.sh 4 +... + +This verifies the test results for each x86_64 config, using the qa.sh script. + + +5. Cleanup. + +Do: +... +$ rm -Rf tmp-qa-local +... +l + + +I. REMOTE QA. + + +1. Cleanup. + +Do: +... +$ bash qa-remote.sh 1 +... + + +2. Get test results. + +Do: +... +$ bash qa-remote.sh 2 +... + +This downloads the remote test results. + + +3. Verify. + +Do: +... +$ bash qa-remote.sh 3 +... +with m running from 1 to 5. + +This verifies the test results, using the qa.sh script. + +4. Cleanup. + +Do: +... +$ rm -Rf tmp-qa-remote +... diff --git a/_constraints b/_constraints new file mode 100644 index 0000000..9afb8f7 --- /dev/null +++ b/_constraints @@ -0,0 +1,24 @@ + + + + ppc64 + ppc64le + + + + 4 + + + + + + x86_64 + + + + 8 + + + + + diff --git a/_multibuild b/_multibuild new file mode 100644 index 0000000..964176c --- /dev/null +++ b/_multibuild @@ -0,0 +1,3 @@ + + testsuite + diff --git a/baselibs.conf b/baselibs.conf new file mode 100644 index 0000000..99bee94 --- /dev/null +++ b/baselibs.conf @@ -0,0 +1,11 @@ +gdb + +/usr/bin/gdb -> /usr/bin/gdb + # kill package for i586 32bit + targetarch x86_64 block! + prereq -glibc-x86 +gdbserver + +/usr/bin/gdbserver -> /usr/bin/gdbserver + provides "gdb-:/usr/bin/gdbserver" + # kill package for i586 32bit + targetarch x86_64 block! + prereq -glibc-x86 diff --git a/change-gdb.base-examine-backwards.exp-for-aix.patch b/change-gdb.base-examine-backwards.exp-for-aix.patch new file mode 100644 index 0000000..56d1ff4 --- /dev/null +++ b/change-gdb.base-examine-backwards.exp-for-aix.patch @@ -0,0 +1,53 @@ +From acc7b542a08819bec4aae767de547c531a7ab62e Mon Sep 17 00:00:00 2001 +From: Aditya Vidyadhar Kamath +Date: Mon, 6 Nov 2023 07:26:24 -0600 +Subject: [PATCH 03/48] Change gdb.base/examine-backwards.exp for AIX. + +In AIX unused or constant variables are collected as garbage by the linker and in the dwarf dump +an address with all f's in hexadecimal are assigned. Hence the testcase fails with many failures stating +it cannot access memory. + +This patch is a small change to get it working in AIX as well. +--- + gdb/testsuite/gdb.base/examine-backward.c | 8 ++++---- + 1 file changed, 4 insertions(+), 4 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/examine-backward.c b/gdb/testsuite/gdb.base/examine-backward.c +index e30b58fb005..354c2e2f323 100644 +--- a/gdb/testsuite/gdb.base/examine-backward.c ++++ b/gdb/testsuite/gdb.base/examine-backward.c +@@ -36,11 +36,11 @@ literals. The content of each array is the same as followings: + TestStrings, to avoid showing garbage when we look for strings + backwards from TestStrings. */ + +-const unsigned char Barrier[] = { ++unsigned char Barrier[] = { + 0x00, + }; + +-const unsigned char TestStrings[] = { ++unsigned char TestStrings[] = { + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, +@@ -54,7 +54,7 @@ const unsigned char TestStrings[] = { + 0x00 + }; + +-const short TestStringsH[] = { ++short TestStringsH[] = { + 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, + 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, +@@ -67,7 +67,7 @@ const short TestStringsH[] = { + 0x0000 + }; + +-const int TestStringsW[] = { ++int TestStringsW[] = { + 0x00000041, 0x00000042, 0x00000043, 0x00000044, + 0x00000045, 0x00000046, 0x00000047, 0x00000048, + 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, +-- +2.35.3 + diff --git a/clean.sh b/clean.sh new file mode 100644 index 0000000..ae5f1e1 --- /dev/null +++ b/clean.sh @@ -0,0 +1,46 @@ +#!/bin/sh + +dryrun=false +while [ $# -gt 0 ]; do + case $1 in + -dryrun|--dryrun|-dry-run|--dry-run) + dryrun=true + ;; + *) + echo "Don't know how to handle arg: $1" + exit 1 + esac + shift +done + +first=true +for f in *.patch; do + if grep -q "^Patch.*[ \t]$f" gdb.spec; then + continue + fi + + if $dryrun; then + if $first; then + echo "Patches not mentioned in gdb.spec:" + fi + first=false + + echo "$f" + + continue + fi + + ( set -x; osc remove -f "$f" ) +done + +files=$(echo ./*~) +if [ "$files" != "./*~" ]; then + if $dryrun; then + echo "Backup files:" + echo "$files" + else + for f in $files; do + ( set -x; rm -f "$f" ) + done + fi +fi diff --git a/fix-gdb.mi-new-ui-mi-sync.exp.patch b/fix-gdb.mi-new-ui-mi-sync.exp.patch new file mode 100644 index 0000000..0043a92 --- /dev/null +++ b/fix-gdb.mi-new-ui-mi-sync.exp.patch @@ -0,0 +1,23 @@ +Fix gdb.mi/new-ui-mi-sync.exp + +--- + gdb/testsuite/gdb.mi/new-ui-mi-sync.exp | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.mi/new-ui-mi-sync.exp b/gdb/testsuite/gdb.mi/new-ui-mi-sync.exp +index 887bd60abcd..18072d4e668 100644 +--- a/gdb/testsuite/gdb.mi/new-ui-mi-sync.exp ++++ b/gdb/testsuite/gdb.mi/new-ui-mi-sync.exp +@@ -83,7 +83,11 @@ proc do_test {sync_command} { + # in the separate MI UI. Note the "run" variant usually triggers + # =thread-group-started/=thread-created/=library-loaded as well. + with_spawn_id $gdb_main_spawn_id { +- gdb_test "add-inferior" "Added inferior 2 on connection .*" ++ gdb_test_multiple "add-inferior" "" { ++ -re "\r\nAdded inferior 2 on connection .*\[\r\n\]+$gdb_prompt " { ++ pass $gdb_test_name ++ } ++ } + } + + # Interrupt the program. diff --git a/fix-regression-on-aarch64-linux-gdbserver.patch b/fix-regression-on-aarch64-linux-gdbserver.patch new file mode 100644 index 0000000..2599a44 --- /dev/null +++ b/fix-regression-on-aarch64-linux-gdbserver.patch @@ -0,0 +1,366 @@ +From 2a7e48ca27f4c080151ce9da5a29239aa5d3b66f Mon Sep 17 00:00:00 2001 +From: Tom Tromey +Date: Fri, 19 Apr 2024 07:54:19 -0600 +Subject: [PATCH 15/48] Fix regression on aarch64-linux gdbserver + +Commit 9a03f218 ("Fix gdb.base/watchpoint-unaligned.exp on aarch64") +fixed a watchpoint bug in gdb -- but did not touch the corresponding +code in gdbserver. + +This patch moves the gdb code into gdb/nat, so that it can be shared +with gdbserver, and then changes gdbserver to use it, fixing the bug. + +This is yet another case where having a single back end would prevent +bugs. + +I tested this using the AdaCore internal gdb testsuite. + +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29423 +Approved-By: Luis Machado +--- + gdb/aarch64-nat.c | 115 --------------------------------- + gdb/aarch64-nat.h | 8 --- + gdb/nat/aarch64-hw-point.c | 115 +++++++++++++++++++++++++++++++++ + gdb/nat/aarch64-hw-point.h | 8 +++ + gdbserver/linux-aarch64-low.cc | 38 +---------- + 5 files changed, 126 insertions(+), 158 deletions(-) + +diff --git a/gdb/aarch64-nat.c b/gdb/aarch64-nat.c +index a173e4e18d5..97e3048568a 100644 +--- a/gdb/aarch64-nat.c ++++ b/gdb/aarch64-nat.c +@@ -225,121 +225,6 @@ aarch64_remove_watchpoint (CORE_ADDR addr, int len, enum target_hw_bp_type type, + return ret; + } + +-/* See aarch64-nat.h. */ +- +-bool +-aarch64_stopped_data_address (const struct aarch64_debug_reg_state *state, +- CORE_ADDR addr_trap, CORE_ADDR *addr_p) +-{ +- bool found = false; +- for (int phase = 0; phase <= 1; ++phase) +- for (int i = aarch64_num_wp_regs - 1; i >= 0; --i) +- { +- if (!(state->dr_ref_count_wp[i] +- && DR_CONTROL_ENABLED (state->dr_ctrl_wp[i]))) +- { +- /* Watchpoint disabled. */ +- continue; +- } +- +- const enum target_hw_bp_type type +- = aarch64_watchpoint_type (state->dr_ctrl_wp[i]); +- if (type == hw_execute) +- { +- /* Watchpoint disabled. */ +- continue; +- } +- +- if (phase == 0) +- { +- /* Phase 0: No hw_write. */ +- if (type == hw_write) +- continue; +- } +- else +- { +- /* Phase 1: Only hw_write. */ +- if (type != hw_write) +- continue; +- } +- +- const unsigned int offset +- = aarch64_watchpoint_offset (state->dr_ctrl_wp[i]); +- const unsigned int len +- = aarch64_watchpoint_length (state->dr_ctrl_wp[i]); +- const CORE_ADDR addr_watch = state->dr_addr_wp[i] + offset; +- const CORE_ADDR addr_watch_aligned +- = align_down (state->dr_addr_wp[i], AARCH64_HWP_MAX_LEN_PER_REG); +- const CORE_ADDR addr_orig = state->dr_addr_orig_wp[i]; +- +- /* ADDR_TRAP reports the first address of the memory range +- accessed by the CPU, regardless of what was the memory +- range watched. Thus, a large CPU access that straddles +- the ADDR_WATCH..ADDR_WATCH+LEN range may result in an +- ADDR_TRAP that is lower than the +- ADDR_WATCH..ADDR_WATCH+LEN range. E.g.: +- +- addr: | 4 | 5 | 6 | 7 | 8 | +- |---- range watched ----| +- |----------- range accessed ------------| +- +- In this case, ADDR_TRAP will be 4. +- +- The access size also can be larger than that of the watchpoint +- itself. For instance, the access size of an stp instruction is 16. +- So, if we use stp to store to address p, and set a watchpoint on +- address p + 8, the reported ADDR_TRAP can be p + 8 (observed on +- RK3399 SOC). But it also can be p (observed on M1 SOC). Checking +- for this situation introduces the possibility of false positives, +- so we only do this for hw_write watchpoints. */ +- const CORE_ADDR max_access_size = type == hw_write ? 16 : 8; +- const CORE_ADDR addr_watch_base = addr_watch_aligned - +- (max_access_size - AARCH64_HWP_MAX_LEN_PER_REG); +- if (!(addr_trap >= addr_watch_base +- && addr_trap < addr_watch + len)) +- { +- /* Not a match. */ +- continue; +- } +- +- /* To match a watchpoint known to GDB core, we must never +- report *ADDR_P outside of any ADDR_WATCH..ADDR_WATCH+LEN +- range. ADDR_WATCH <= ADDR_TRAP < ADDR_ORIG is a false +- positive on kernels older than 4.10. See PR +- external/20207. */ +- if (addr_p != nullptr) +- *addr_p = addr_orig; +- +- if (phase == 0) +- { +- /* Phase 0: Return first match. */ +- return true; +- } +- +- /* Phase 1. */ +- if (addr_p == nullptr) +- { +- /* First match, and we don't need to report an address. No need +- to look for other matches. */ +- return true; +- } +- +- if (!found) +- { +- /* First match, and we need to report an address. Look for other +- matches. */ +- found = true; +- continue; +- } +- +- /* More than one match, and we need to return an address. No need to +- look for further matches. */ +- return false; +- } +- +- return found; +-} +- + /* Define AArch64 maintenance commands. */ + + static void +diff --git a/gdb/aarch64-nat.h b/gdb/aarch64-nat.h +index fee6bda2577..f95a9d745e5 100644 +--- a/gdb/aarch64-nat.h ++++ b/gdb/aarch64-nat.h +@@ -45,14 +45,6 @@ struct aarch64_debug_reg_state *aarch64_get_debug_reg_state (pid_t pid); + + void aarch64_remove_debug_reg_state (pid_t pid); + +-/* Helper for the "stopped_data_address" target method. Returns TRUE +- if a hardware watchpoint trap at ADDR_TRAP matches a set +- watchpoint. The address of the matched watchpoint is returned in +- *ADDR_P. */ +- +-bool aarch64_stopped_data_address (const struct aarch64_debug_reg_state *state, +- CORE_ADDR addr_trap, CORE_ADDR *addr_p); +- + /* Helper functions used by aarch64_nat_target below. See their + definitions. */ + +diff --git a/gdb/nat/aarch64-hw-point.c b/gdb/nat/aarch64-hw-point.c +index 3b8cdcba23b..9eb78923e86 100644 +--- a/gdb/nat/aarch64-hw-point.c ++++ b/gdb/nat/aarch64-hw-point.c +@@ -647,3 +647,118 @@ aarch64_region_ok_for_watchpoint (CORE_ADDR addr, int len) + the checking is costly. */ + return 1; + } ++ ++/* See nat/aarch64-hw-point.h. */ ++ ++bool ++aarch64_stopped_data_address (const struct aarch64_debug_reg_state *state, ++ CORE_ADDR addr_trap, CORE_ADDR *addr_p) ++{ ++ bool found = false; ++ for (int phase = 0; phase <= 1; ++phase) ++ for (int i = aarch64_num_wp_regs - 1; i >= 0; --i) ++ { ++ if (!(state->dr_ref_count_wp[i] ++ && DR_CONTROL_ENABLED (state->dr_ctrl_wp[i]))) ++ { ++ /* Watchpoint disabled. */ ++ continue; ++ } ++ ++ const enum target_hw_bp_type type ++ = aarch64_watchpoint_type (state->dr_ctrl_wp[i]); ++ if (type == hw_execute) ++ { ++ /* Watchpoint disabled. */ ++ continue; ++ } ++ ++ if (phase == 0) ++ { ++ /* Phase 0: No hw_write. */ ++ if (type == hw_write) ++ continue; ++ } ++ else ++ { ++ /* Phase 1: Only hw_write. */ ++ if (type != hw_write) ++ continue; ++ } ++ ++ const unsigned int offset ++ = aarch64_watchpoint_offset (state->dr_ctrl_wp[i]); ++ const unsigned int len ++ = aarch64_watchpoint_length (state->dr_ctrl_wp[i]); ++ const CORE_ADDR addr_watch = state->dr_addr_wp[i] + offset; ++ const CORE_ADDR addr_watch_aligned ++ = align_down (state->dr_addr_wp[i], AARCH64_HWP_MAX_LEN_PER_REG); ++ const CORE_ADDR addr_orig = state->dr_addr_orig_wp[i]; ++ ++ /* ADDR_TRAP reports the first address of the memory range ++ accessed by the CPU, regardless of what was the memory ++ range watched. Thus, a large CPU access that straddles ++ the ADDR_WATCH..ADDR_WATCH+LEN range may result in an ++ ADDR_TRAP that is lower than the ++ ADDR_WATCH..ADDR_WATCH+LEN range. E.g.: ++ ++ addr: | 4 | 5 | 6 | 7 | 8 | ++ |---- range watched ----| ++ |----------- range accessed ------------| ++ ++ In this case, ADDR_TRAP will be 4. ++ ++ The access size also can be larger than that of the watchpoint ++ itself. For instance, the access size of an stp instruction is 16. ++ So, if we use stp to store to address p, and set a watchpoint on ++ address p + 8, the reported ADDR_TRAP can be p + 8 (observed on ++ RK3399 SOC). But it also can be p (observed on M1 SOC). Checking ++ for this situation introduces the possibility of false positives, ++ so we only do this for hw_write watchpoints. */ ++ const CORE_ADDR max_access_size = type == hw_write ? 16 : 8; ++ const CORE_ADDR addr_watch_base = addr_watch_aligned - ++ (max_access_size - AARCH64_HWP_MAX_LEN_PER_REG); ++ if (!(addr_trap >= addr_watch_base ++ && addr_trap < addr_watch + len)) ++ { ++ /* Not a match. */ ++ continue; ++ } ++ ++ /* To match a watchpoint known to GDB core, we must never ++ report *ADDR_P outside of any ADDR_WATCH..ADDR_WATCH+LEN ++ range. ADDR_WATCH <= ADDR_TRAP < ADDR_ORIG is a false ++ positive on kernels older than 4.10. See PR ++ external/20207. */ ++ if (addr_p != nullptr) ++ *addr_p = addr_orig; ++ ++ if (phase == 0) ++ { ++ /* Phase 0: Return first match. */ ++ return true; ++ } ++ ++ /* Phase 1. */ ++ if (addr_p == nullptr) ++ { ++ /* First match, and we don't need to report an address. No need ++ to look for other matches. */ ++ return true; ++ } ++ ++ if (!found) ++ { ++ /* First match, and we need to report an address. Look for other ++ matches. */ ++ found = true; ++ continue; ++ } ++ ++ /* More than one match, and we need to return an address. No need to ++ look for further matches. */ ++ return false; ++ } ++ ++ return found; ++} +diff --git a/gdb/nat/aarch64-hw-point.h b/gdb/nat/aarch64-hw-point.h +index 71ae2864927..2386cf60f90 100644 +--- a/gdb/nat/aarch64-hw-point.h ++++ b/gdb/nat/aarch64-hw-point.h +@@ -110,6 +110,14 @@ unsigned int aarch64_watchpoint_offset (unsigned int ctrl); + unsigned int aarch64_watchpoint_length (unsigned int ctrl); + enum target_hw_bp_type aarch64_watchpoint_type (unsigned int ctrl); + ++/* Helper for the "stopped_data_address" target method. Returns TRUE ++ if a hardware watchpoint trap at ADDR_TRAP matches a set ++ watchpoint. The address of the matched watchpoint is returned in ++ *ADDR_P. */ ++ ++bool aarch64_stopped_data_address (const struct aarch64_debug_reg_state *state, ++ CORE_ADDR addr_trap, CORE_ADDR *addr_p); ++ + int aarch64_handle_breakpoint (enum target_hw_bp_type type, CORE_ADDR addr, + int len, int is_insert, ptid_t ptid, + struct aarch64_debug_reg_state *state); +diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc +index fcbe7bb64d7..14346b89822 100644 +--- a/gdbserver/linux-aarch64-low.cc ++++ b/gdbserver/linux-aarch64-low.cc +@@ -577,41 +577,9 @@ aarch64_target::low_stopped_data_address () + + /* Check if the address matches any watched address. */ + state = aarch64_get_debug_reg_state (pid_of (current_thread)); +- for (i = aarch64_num_wp_regs - 1; i >= 0; --i) +- { +- const unsigned int offset +- = aarch64_watchpoint_offset (state->dr_ctrl_wp[i]); +- const unsigned int len = aarch64_watchpoint_length (state->dr_ctrl_wp[i]); +- const CORE_ADDR addr_watch = state->dr_addr_wp[i] + offset; +- const CORE_ADDR addr_watch_aligned = align_down (state->dr_addr_wp[i], 8); +- const CORE_ADDR addr_orig = state->dr_addr_orig_wp[i]; +- +- if (state->dr_ref_count_wp[i] +- && DR_CONTROL_ENABLED (state->dr_ctrl_wp[i]) +- && addr_trap >= addr_watch_aligned +- && addr_trap < addr_watch + len) +- { +- /* ADDR_TRAP reports the first address of the memory range +- accessed by the CPU, regardless of what was the memory +- range watched. Thus, a large CPU access that straddles +- the ADDR_WATCH..ADDR_WATCH+LEN range may result in an +- ADDR_TRAP that is lower than the +- ADDR_WATCH..ADDR_WATCH+LEN range. E.g.: +- +- addr: | 4 | 5 | 6 | 7 | 8 | +- |---- range watched ----| +- |----------- range accessed ------------| +- +- In this case, ADDR_TRAP will be 4. +- +- To match a watchpoint known to GDB core, we must never +- report *ADDR_P outside of any ADDR_WATCH..ADDR_WATCH+LEN +- range. ADDR_WATCH <= ADDR_TRAP < ADDR_ORIG is a false +- positive on kernels older than 4.10. See PR +- external/20207. */ +- return addr_orig; +- } +- } ++ CORE_ADDR result; ++ if (aarch64_stopped_data_address (state, addr_trap, &result)) ++ return result; + + return (CORE_ADDR) 0; + } +-- +2.35.3 + diff --git a/fix-the-gdb.ada-inline-section-gc.exp-test.patch b/fix-the-gdb.ada-inline-section-gc.exp-test.patch new file mode 100644 index 0000000..e72835c --- /dev/null +++ b/fix-the-gdb.ada-inline-section-gc.exp-test.patch @@ -0,0 +1,80 @@ +From c21fd9f7d5911fce0c17af7094d8861d1195dfda Mon Sep 17 00:00:00 2001 +From: Carl Love +Date: Mon, 13 Nov 2023 14:14:08 -0500 +Subject: [PATCH 01/48] Fix the gdb.ada/inline-section-gc.exp test + +The original intention of the test appears to be checking to make sure +setting a breakpoint in an inlined function didn't set multiple +breakpoints where one of them was at address 0. + +The gdb.ada/inline-section-gc.exp test may pass or fail depending on the +version of gnat. Per the discussion on IRC, the ada inlining appears to +have some target dependencies. In this test there are two functions, +callee and caller. Function calee is inlined into caller. The test sets +a breakpoint in function callee. The reported location where the +breakpoint is set may be at the requested location in callee or the +location in caller after callee has been inlined. The test needs to +accept either location as correct provided the breakpoint address is not +zero. + +This patch checks to see if the reported breakpoint is in function callee +or function caller and fails if the breakpoint address is 0x0. The line +number where the breakpoint is set will match the requested line if the +breakpoint location is reported is callee.adb. If the breakpoint is +reported in caller.adb, the line number in caller is the breakpoint +location in callee where it is inlined into caller. + +This patch fixes the single regression failure for the test on PowerPC. +It does not introduce any failures on X86-64. +--- + gdb/testsuite/gdb.ada/inline-section-gc.exp | 21 ++++++++++++++++--- + .../gdb.ada/inline-section-gc/caller.adb | 3 ++- + 2 files changed, 20 insertions(+), 4 deletions(-) + +diff --git a/gdb/testsuite/gdb.ada/inline-section-gc.exp b/gdb/testsuite/gdb.ada/inline-section-gc.exp +index b707335eb04..4f8b8c95395 100644 +--- a/gdb/testsuite/gdb.ada/inline-section-gc.exp ++++ b/gdb/testsuite/gdb.ada/inline-section-gc.exp +@@ -34,8 +34,23 @@ if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $options] != ""} { + + clean_restart ${testfile} + +-set bp_location [gdb_get_line_number "BREAK" ${testdir}/callee.adb] ++ ++# Depending on the version of gnat, the location of the set breakpoint may ++# be reported as being at the requested location in file callee.adb or in ++# file caller.adb where the callee function was inlined. Either way, only ++# one breakpoint should be reported and its address should not be at 0x0. ++set bp_location1 [gdb_get_line_number "BREAK" ${testdir}/callee.adb] ++set bp_location2 [gdb_get_line_number "CALLEE_LOC" ${testdir}/caller.adb] ++set test "break callee.adb:$bp_location1" ++set message "Breakpoint set" ++ + # The bug here was that gdb would set a breakpoint with two locations, + # one of them at 0x0. +-gdb_test "break callee.adb:$bp_location" \ +- "Breakpoint $decimal at $hex: file .*callee.adb, line $bp_location." ++gdb_test_multiple $test $message { ++ -re "Breakpoint $decimal at $hex: file .*callee.adb, line $bp_location1." { ++ pass $test ++ } ++ -re "Breakpoint $decimal at $hex: file .*caller.adb, line $bp_location2." { ++ pass $test ++ } ++} +diff --git a/gdb/testsuite/gdb.ada/inline-section-gc/caller.adb b/gdb/testsuite/gdb.ada/inline-section-gc/caller.adb +index 66eb2d9a910..161f3e85542 100644 +--- a/gdb/testsuite/gdb.ada/inline-section-gc/caller.adb ++++ b/gdb/testsuite/gdb.ada/inline-section-gc/caller.adb +@@ -18,4 +18,5 @@ with Callee; + procedure Caller is + begin + Callee; +-end Caller; ++end Caller; -- CALLEE_LOC, this is where the inlined callee breakpoint ++ -- is located. + +base-commit: 582fc35843fdf71b82d645d83d2903e2546cc21a +-- +2.35.3 + diff --git a/fixup-gdb-6.3-attach-see-vdso-test.patch b/fixup-gdb-6.3-attach-see-vdso-test.patch new file mode 100644 index 0000000..43ee239 --- /dev/null +++ b/fixup-gdb-6.3-attach-see-vdso-test.patch @@ -0,0 +1,30 @@ +From 19dc95258888a9e110ad54fa25a613611956a13f Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 13 Jun 2023 15:04:32 +0200 +Subject: [PATCH 5/6] fixup gdb-6.3-attach-see-vdso-test.patch + +--- + gdb/testsuite/gdb.base/attach-see-vdso.exp | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/attach-see-vdso.exp b/gdb/testsuite/gdb.base/attach-see-vdso.exp +index 5457ec4129d..35c49731f0b 100644 +--- a/gdb/testsuite/gdb.base/attach-see-vdso.exp ++++ b/gdb/testsuite/gdb.base/attach-see-vdso.exp +@@ -34,10 +34,11 @@ set escapedbinfile [string_to_regexp [standard_output_file ${testfile}]] + # The kernel VDSO is used for the syscalls returns only on i386 (not x86_64). + # + if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-m32}] != "" } { +- gdb_suppress_entire_file "Testcase nonthraded compile failed, so all tests in this file will automatically fail." ++ unsupported "Testcase nonthreaded compile failed, so all tests in this file will automatically fail." ++ return + } + +-if [get_compiler_info ${binfile}] { ++if [get_compiler_info] { + return -1 + } + +-- +2.35.3 + diff --git a/fixup-gdb-6.3-gstack-20050411.patch b/fixup-gdb-6.3-gstack-20050411.patch new file mode 100644 index 0000000..427b668 --- /dev/null +++ b/fixup-gdb-6.3-gstack-20050411.patch @@ -0,0 +1,25 @@ +From 8c0ae8c3c6fa34f046131f76871db13bc392a440 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 13 Jun 2023 14:56:55 +0200 +Subject: [PATCH 4/6] fixup gdb-6.3-gstack-20050411.patch + +--- + gdb/testsuite/gdb.base/gstack.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.base/gstack.exp b/gdb/testsuite/gdb.base/gstack.exp +index 089407ec04a..a5dacd582ff 100644 +--- a/gdb/testsuite/gdb.base/gstack.exp ++++ b/gdb/testsuite/gdb.base/gstack.exp +@@ -52,7 +52,7 @@ gdb_expect { + # exiting the function. Still we could retry the gstack command if we fail. + + set test "spawn gstack" +-set command "sh -c GDB=$GDB\\ GDBARGS=-data-directory\\\\\\ $BUILD_DATA_DIRECTORY\\ sh\\ ${srcdir}/../gstack.sh\\ $pid\\;echo\\ GSTACK-END" ++set command "sh -c GDB=$GDB\\ GDBARGS=-data-directory\\\\\\ $GDB_DATA_DIRECTORY\\ sh\\ ${srcdir}/../gstack.sh\\ $pid\\;echo\\ GSTACK-END" + set res [remote_spawn host $command]; + if { $res < 0 || $res == "" } { + perror "Spawning $command failed." +-- +2.35.3 + diff --git a/fixup-gdb-6.5-bz243845-stale-testing-zombie-test.patch b/fixup-gdb-6.5-bz243845-stale-testing-zombie-test.patch new file mode 100644 index 0000000..d15ce01 --- /dev/null +++ b/fixup-gdb-6.5-bz243845-stale-testing-zombie-test.patch @@ -0,0 +1,35 @@ +Fixup gdb.base/tracefork-zombie.exp + +Fix ERROR: +... +PASS: gdb.base/tracefork-zombie.exp: attach +ERROR: tcl error sourcing gdb/testsuite/gdb.base/tracefork-zombie.exp. +ERROR: tcl error code POSIX ESRCH {no such process} +ERROR: error reading "file12": no such process + while executing +"read $statusfi" + ("foreach" body line 5) + invoked from within +... + +--- + gdb/testsuite/gdb.base/tracefork-zombie.exp | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/tracefork-zombie.exp b/gdb/testsuite/gdb.base/tracefork-zombie.exp +index 03f790d4c5d..3e2e5517d46 100644 +--- a/gdb/testsuite/gdb.base/tracefork-zombie.exp ++++ b/gdb/testsuite/gdb.base/tracefork-zombie.exp +@@ -58,8 +58,10 @@ foreach procpid [glob -directory /proc -type d {[0-9]*}] { + if {[catch {open $procpid/status} statusfi]} { + continue + } +- set status [read $statusfi] +- close $statusfi ++ if {[catch {read $statusfi} status]} { ++ continue ++ } ++ catch {close $statusfi} + if {1 + && [regexp -line {^Name:\tgdb$} $status] + && [regexp -line {^PPid:\t1$} $status] diff --git a/fixup-gdb-bz634108-solib_address.patch b/fixup-gdb-bz634108-solib_address.patch new file mode 100644 index 0000000..a18ae59 --- /dev/null +++ b/fixup-gdb-bz634108-solib_address.patch @@ -0,0 +1,22 @@ +From 023314feb400836eb377a5bc9151850fcdd81b11 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 6 Jun 2023 09:43:36 +0200 +Subject: [PATCH 3/4] Fixup gdb-bz634108-solib_address.patch + +--- + gdb/testsuite/gdb.python/rh634108-solib_address.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.python/rh634108-solib_address.exp b/gdb/testsuite/gdb.python/rh634108-solib_address.exp +index 99e6aaba831..ebf00babc34 100644 +--- a/gdb/testsuite/gdb.python/rh634108-solib_address.exp ++++ b/gdb/testsuite/gdb.python/rh634108-solib_address.exp +@@ -21,4 +21,4 @@ gdb_start + # Skip all tests if Python scripting is not enabled. + if { [skip_python_tests] } { continue } + +-gdb_test "python print (gdb.solib_name(-1))" "None" "gdb.solib_name exists" ++gdb_test "python print (gdb.solib_name(0))" "None" "gdb.solib_name exists" +-- +2.35.3 + diff --git a/fixup-gdb-glibc-strstr-workaround.patch b/fixup-gdb-glibc-strstr-workaround.patch new file mode 100644 index 0000000..b0037e0 --- /dev/null +++ b/fixup-gdb-glibc-strstr-workaround.patch @@ -0,0 +1,19 @@ +fixup-gdb-glibc-strstr-workaround.patch + +--- + gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp b/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp +index 889f8c6f584..052bd84d420 100644 +--- a/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp ++++ b/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp +@@ -68,7 +68,7 @@ gdb_test_multiple $test $test { + set addr $expect_out(1,string) + pass "$test (fixed glibc)" + } +- -re " = {char \\*\\(const char \\*, const char \\*\\)} 0x\[0-9a-f\]+ \r\n$gdb_prompt $" { ++ -re " = {char \\*\\(const char \\*, const char \\*\\)} 0x\[0-9a-f\]+ <(__GI_)?strstr>\r\n$gdb_prompt $" { + untested "$test (gnu-ifunc not in use by glibc)" + return 0 + } diff --git a/fixup-gdb-linux_perf-bundle.patch b/fixup-gdb-linux_perf-bundle.patch new file mode 100644 index 0000000..c118deb --- /dev/null +++ b/fixup-gdb-linux_perf-bundle.patch @@ -0,0 +1,40 @@ +From af4a87e2b3c2ac5acae1e6f4405fc59e1218de74 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 18 Apr 2024 14:26:58 +0200 +Subject: [PATCH] fixup-gdb-linux_perf-bundle + +--- + gdb/gdb.c | 8 -------- + 1 file changed, 8 deletions(-) + +diff --git a/gdb/gdb.c b/gdb/gdb.c +index 41a9b70c222..6e3ff0755ab 100644 +--- a/gdb/gdb.c ++++ b/gdb/gdb.c +@@ -21,10 +21,6 @@ + #include "interps.h" + #include "run-on-main-thread.h" + +-#ifdef PERF_ATTR_SIZE_VER5_BUNDLE +-extern "C" void __libipt_init(void); +-#endif +- + int + main (int argc, char **argv) + { +@@ -36,10 +32,6 @@ main (int argc, char **argv) + + struct captured_main_args args; + +-#ifdef PERF_ATTR_SIZE_VER5_BUNDLE +- __libipt_init(); +-#endif +- + memset (&args, 0, sizeof args); + args.argc = argc; + args.argv = argv; + +base-commit: 254988c36fe592e89af5d92e1d35a6eb4b09cbb0 +-- +2.35.3 + diff --git a/fixup-gdb-rhbz1261564-aarch64-hw-watchpoint-test.pat.patch b/fixup-gdb-rhbz1261564-aarch64-hw-watchpoint-test.pat.patch new file mode 100644 index 0000000..7ee17b2 --- /dev/null +++ b/fixup-gdb-rhbz1261564-aarch64-hw-watchpoint-test.pat.patch @@ -0,0 +1,43 @@ +From e452307ba07f5d798edad73631182e137265da7d Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 13 Jun 2023 17:58:42 +0200 +Subject: [PATCH 9/9] fixup gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch + +--- + .../rhbz1261564-aarch64-watchpoint.exp | 18 ++++++++++++++---- + 1 file changed, 14 insertions(+), 4 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.exp b/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.exp +index b1cf7115663..42ebc25cc49 100644 +--- a/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.exp ++++ b/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.exp +@@ -20,12 +20,22 @@ if { [prepare_for_testing rhbz1261564-aarch64-watchpoint.exp "rhbz1261564-aarch6 + if { ! [ runto main ] } then { return 0 } + + set test "rwatch aligned.var4" +-if [istarget "s390*-*-*"] { +- gdb_test $test {Target does not support this type of hardware watchpoint\.} +- untested "s390* does not support hw read watchpoint" ++ ++set supported 1 ++gdb_test_multiple $test "" { ++ -re -wrap "Hardware read watchpoint \[0-9\]+: aligned.var4" { ++ pass $gdb_test_name ++ } ++ -re -wrap "Target does not support this type of hardware watchpoint\\." { ++ set supported 0 ++ } ++} ++ ++if { !$supported } { ++ unsupported $test + return + } +-gdb_test $test "Hardware read watchpoint \[0-9\]+: aligned.var4" ++ + + proc checkvar { address } { + global gdb_prompt +-- +2.35.3 + diff --git a/fixup-gdb-test-bt-cfi-without-die.patch b/fixup-gdb-test-bt-cfi-without-die.patch new file mode 100644 index 0000000..f68da30 --- /dev/null +++ b/fixup-gdb-test-bt-cfi-without-die.patch @@ -0,0 +1,38 @@ +fixup-gdb-test-bt-cfi-without-die.patch + +--- + gdb/testsuite/gdb.base/cfi-without-die.exp | 13 ++++++++----- + 1 file changed, 8 insertions(+), 5 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/cfi-without-die.exp b/gdb/testsuite/gdb.base/cfi-without-die.exp +index 5880d46f6d2..db1726646f8 100644 +--- a/gdb/testsuite/gdb.base/cfi-without-die.exp ++++ b/gdb/testsuite/gdb.base/cfi-without-die.exp +@@ -37,19 +37,22 @@ if ![runto callback] then { + fail "verify unwinding: Can't run to callback" + return 0 + } +-set test "verify unwinding breaks without CFI" +-gdb_test_multiple "bt" $test { ++ ++set as_expected 1 ++gdb_test_multiple "bt" "" { + -re " in \[?\]\[?\] .*\r\n$gdb_prompt $" { + # It may backtrace through some random frames even to main(). +- pass $test + } + -re " in main .*\r\n$gdb_prompt $" { +- fail $test ++ set as_expected 0 + } + -re "\r\n$gdb_prompt $" { +- pass $test + } + } ++if { ! $as_expected } { ++ untested ${testfile}.exp ++ return -1 ++} + + if { [gdb_compile "${srcdir}/${subdir}/${srccallerfile}" ${objcallerfile} \ + object [list {additional_flags=-fomit-frame-pointer -funwind-tables -fasynchronous-unwind-tables}]] != "" diff --git a/fixup-gdb-test-dw2-aranges.patch b/fixup-gdb-test-dw2-aranges.patch new file mode 100644 index 0000000..6438276 --- /dev/null +++ b/fixup-gdb-test-dw2-aranges.patch @@ -0,0 +1,21 @@ +From 81a7585502092b3c133534ac6ecb34fd56d05337 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 16 Feb 2023 12:56:41 +0100 +Subject: [PATCH 09/11] fixup gdb-test-dw2-aranges.patch + +--- + gdb/testsuite/gdb.dwarf2/dw2-aranges.S | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-aranges.S b/gdb/testsuite/gdb.dwarf2/dw2-aranges.S +index d5b9ca5a3c6..b811f6644cb 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-aranges.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-aranges.S +@@ -138,3 +138,4 @@ main: + .byte 0 /* aranges segment_size */ + + .Laranges_end: ++ .section .note.GNU-stack,"",@progbits +-- +2.35.3 + diff --git a/fixup-powerpc-and-aarch64-fix-reverse-stepping-failu.patch b/fixup-powerpc-and-aarch64-fix-reverse-stepping-failu.patch new file mode 100644 index 0000000..5be4f5e --- /dev/null +++ b/fixup-powerpc-and-aarch64-fix-reverse-stepping-failu.patch @@ -0,0 +1,70 @@ +From d60b57fe1a98094a7e4f19481193b2b5a9bb1e57 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 2 May 2024 12:02:50 +0200 +Subject: [PATCH 079/147] fixup PowerPC and aarch64: Fix reverse stepping + failure + +--- + gdb/infrun.c | 2 +- + gdb/symtab.c | 3 +-- + gdb/symtab.h | 3 +-- + 3 files changed, 3 insertions(+), 5 deletions(-) + +diff --git a/gdb/infrun.c b/gdb/infrun.c +index 069ef144a76..7be98cfc252 100644 +--- a/gdb/infrun.c ++++ b/gdb/infrun.c +@@ -6897,7 +6897,7 @@ update_line_range_start (CORE_ADDR pc, struct execution_control_state *ecs) + Given the PC, check the line table and return the PC that corresponds + to the line table entry for the source line that PC is in. */ + CORE_ADDR start_line_pc = ecs->event_thread->control.step_range_start; +- std::optional real_range_start; ++ gdb::optional real_range_start; + + /* Call find_line_range_start to get the smallest address in the + linetable for multiple Line X entries in the line table. */ +diff --git a/gdb/symtab.c b/gdb/symtab.c +index ef63ec93c5a..9a47796e5e0 100644 +--- a/gdb/symtab.c ++++ b/gdb/symtab.c +@@ -73,7 +73,6 @@ + #include "gdbsupport/gdb_string_view.h" + #include "gdbsupport/pathstuff.h" + #include "gdbsupport/common-utils.h" +-#include + + /* Forward declarations for local functions. */ + +@@ -3328,7 +3327,7 @@ sal_line_symtab_matches_p (const symtab_and_line &sal1, + + /* See symtah.h. */ + +-std::optional ++gdb::optional + find_line_range_start (CORE_ADDR pc) + { + struct symtab_and_line current_sal = find_pc_line (pc, 0); +diff --git a/gdb/symtab.h b/gdb/symtab.h +index e17d15c595b..6a611d42880 100644 +--- a/gdb/symtab.h ++++ b/gdb/symtab.h +@@ -38,7 +38,6 @@ + #include "gdb-demangle.h" + #include "split-name.h" + #include "frame.h" +-#include + + /* Opaque declarations. */ + struct ui_file; +@@ -2377,7 +2376,7 @@ extern struct symtab_and_line find_pc_sect_line (CORE_ADDR, + the starting PC of line X, and the ranges are contiguous. + */ + +-extern std::optional find_line_range_start (CORE_ADDR pc); ++extern gdb::optional find_line_range_start (CORE_ADDR pc); + + /* Wrapper around find_pc_line to just return the symtab. */ + +-- +2.35.3 + diff --git a/fixup-skip-tests.patch b/fixup-skip-tests.patch new file mode 100644 index 0000000..550d1d0 --- /dev/null +++ b/fixup-skip-tests.patch @@ -0,0 +1,101 @@ +From c1da0d6449415cc1fe6f863526735e4325b0b3ac Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Wed, 1 May 2024 12:43:41 +0200 +Subject: [PATCH 1/2] fixup-skip-tests + +--- + gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp | 4 +--- + gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp | 4 +--- + gdb/testsuite/gdb.cp/cxxexec.exp | 2 +- + .../py-gdb-rhbz1007614-memleak-infpy_read_memory.exp | 4 ++-- + gdb/testsuite/gdb.python/rh634108-solib_address.exp | 6 +++--- + 5 files changed, 8 insertions(+), 12 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp +index 0c46489f315..5879319f27c 100644 +--- a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp ++++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp +@@ -13,9 +13,7 @@ + # You should have received a copy of the GNU General Public License + # along with this program. If not, see . + +-if {[skip_shlib_tests]} { +- return 0 +-} ++require allow_shlib_tests + + set testfile "gcore-buildid-exec-but-not-solib" + set srcmainfile ${testfile}-main.c +diff --git a/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp b/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp +index 052bd84d420..73a9bb64903 100644 +--- a/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp ++++ b/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp +@@ -17,9 +17,7 @@ + # invalid IFUNC DW_AT_linkage_name: memmove strstr time + # http://sourceware.org/bugzilla/show_bug.cgi?id=14166 + +-if {[skip_shlib_tests]} { +- return 0 +-} ++require allow_shlib_tests + + set testfile "gnu-ifunc-strstr-workaround" + set executable ${testfile} +diff --git a/gdb/testsuite/gdb.cp/cxxexec.exp b/gdb/testsuite/gdb.cp/cxxexec.exp +index 77c85587407..089a679a1a9 100644 +--- a/gdb/testsuite/gdb.cp/cxxexec.exp ++++ b/gdb/testsuite/gdb.cp/cxxexec.exp +@@ -13,7 +13,7 @@ + # You should have received a copy of the GNU General Public License + # along with this program. If not, see . + +-if { [skip_cplus_tests] } { continue } ++require allow_cplus_tests + + set testfile cxxexec + if { [prepare_for_testing ${testfile}.exp ${testfile} ${testfile}.cc {c++ debug}] } { +diff --git a/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.exp b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.exp +index 2e6786d499a..d2693cfef1d 100644 +--- a/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.exp ++++ b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.exp +@@ -13,6 +13,8 @@ + # You should have received a copy of the GNU General Public License + # along with this program. If not, see . + ++require allow_python_tests ++ + set testfile py-gdb-rhbz1007614-memleak-infpy_read_memory + set srcfile ${testfile}.c + set binfile [standard_output_file ${testfile}] +@@ -21,8 +23,6 @@ if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { + return -1 + } + +-if { [skip_python_tests] } { continue } +- + set pid_of_gdb [exp_pid -i [board_info host fileid]] + + proc memory_v_pages_get {} { +diff --git a/gdb/testsuite/gdb.python/rh634108-solib_address.exp b/gdb/testsuite/gdb.python/rh634108-solib_address.exp +index ebf00babc34..2d950b79951 100644 +--- a/gdb/testsuite/gdb.python/rh634108-solib_address.exp ++++ b/gdb/testsuite/gdb.python/rh634108-solib_address.exp +@@ -15,10 +15,10 @@ + + # https://bugzilla.redhat.com/show_bug.cgi?id=634108 + ++# Skip all tests if Python scripting is not enabled. ++require allow_python_tests ++ + gdb_exit + gdb_start + +-# Skip all tests if Python scripting is not enabled. +-if { [skip_python_tests] } { continue } +- + gdb_test "python print (gdb.solib_name(0))" "None" "gdb.solib_name exists" + +base-commit: 50ee7556c2430effed45ca542852f36368336dce +-- +2.35.3 + diff --git a/gdb-14.2.tar.bz2 b/gdb-14.2.tar.bz2 new file mode 100644 index 0000000..793e37f --- /dev/null +++ b/gdb-14.2.tar.bz2 @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:8b47e772a5ab32185263ef36fc3c185df01e90deb63198d7deba550685864fa9 +size 32117643 diff --git a/gdb-6.3-attach-see-vdso-test.patch b/gdb-6.3-attach-see-vdso-test.patch new file mode 100644 index 0000000..5321c5f --- /dev/null +++ b/gdb-6.3-attach-see-vdso-test.patch @@ -0,0 +1,120 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.3-attach-see-vdso-test.patch + +;; Test kernel VDSO decoding while attaching to an i386 process. +;;=fedoratest + +diff --git a/gdb/testsuite/gdb.base/attach-see-vdso.c b/gdb/testsuite/gdb.base/attach-see-vdso.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/attach-see-vdso.c +@@ -0,0 +1,25 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2007 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 2 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, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ++ ++#include ++ ++int main () ++{ ++ pause (); ++ return 1; ++} +diff --git a/gdb/testsuite/gdb.base/attach-see-vdso.exp b/gdb/testsuite/gdb.base/attach-see-vdso.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/attach-see-vdso.exp +@@ -0,0 +1,77 @@ ++# Copyright 2007 ++ ++# 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 2 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, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++# This file was created by Jan Kratochvil . ++ ++# This test only works on Linux ++if { ![istarget "*-*-linux-gnu*"] } { ++ return 0 ++} ++ ++if {[use_gdb_stub]} { ++ untested "skipping test because of use_gdb_stub" ++ return -1 ++} ++ ++set testfile "attach-see-vdso" ++set srcfile ${testfile}.c ++set binfile [standard_output_file ${testfile}] ++set escapedbinfile [string_to_regexp [standard_output_file ${testfile}]] ++ ++# The kernel VDSO is used for the syscalls returns only on i386 (not x86_64). ++# ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-m32}] != "" } { ++ gdb_suppress_entire_file "Testcase nonthraded compile failed, so all tests in this file will automatically fail." ++} ++ ++if [get_compiler_info ${binfile}] { ++ return -1 ++} ++ ++# Start the program running and then wait for a bit, to be sure ++# that it can be attached to. ++ ++set testpid [eval exec $binfile &] ++ ++# Avoid some race: ++sleep 2 ++ ++# Start with clean gdb ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++# Never call: gdb_load ${binfile} ++# as the former problem would not reproduce otherwise. ++ ++set test "attach" ++gdb_test_multiple "attach $testpid" "$test" { ++ -re "Attaching to process $testpid\r?\n.*$gdb_prompt $" { ++ pass "$test" ++ } ++} ++ ++gdb_test "bt" "#0 *0x\[0-9a-f\]* in \[^?\].*" "backtrace decodes VDSO" ++ ++# Exit and detach the process. ++ ++gdb_exit ++ ++# Make sure we don't leave a process around to confuse ++# the next test run (and prevent the compile by keeping ++# the text file busy), in case the "set should_exit" didn't ++# work. ++ ++remote_exec build "kill -9 ${testpid}" diff --git a/gdb-6.3-gstack-20050411.patch b/gdb-6.3-gstack-20050411.patch new file mode 100644 index 0000000..c2e49ec --- /dev/null +++ b/gdb-6.3-gstack-20050411.patch @@ -0,0 +1,258 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Andrew Cagney +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.3-gstack-20050411.patch + +;; Add a wrapper script to GDB that implements pstack using the +;; --readnever option. +;;=push + +2004-11-23 Andrew Cagney + + * Makefile.in (uninstall-gstack, install-gstack): New rules, add + to install and uninstall. + * gstack.sh, gstack.1: New files. + +diff --git a/gdb/Makefile.in b/gdb/Makefile.in +--- a/gdb/Makefile.in ++++ b/gdb/Makefile.in +@@ -2035,7 +2035,7 @@ info install-info clean-info dvi pdf install-pdf html install-html: force + install: all + @$(MAKE) $(FLAGS_TO_PASS) install-only + +-install-only: $(CONFIG_INSTALL) ++install-only: install-gstack $(CONFIG_INSTALL) + transformed_name=`t='$(program_transform_name)'; \ + echo gdb | sed -e "$$t"` ; \ + if test "x$$transformed_name" = x; then \ +@@ -2085,7 +2085,25 @@ install-guile: + install-python: + $(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(GDB_DATADIR)/python/gdb + +-uninstall: force $(CONFIG_UNINSTALL) ++GSTACK=gstack ++.PHONY: install-gstack ++install-gstack: ++ transformed_name=`t='$(program_transform_name)'; \ ++ echo $(GSTACK) | sed -e "$$t"` ; \ ++ if test "x$$transformed_name" = x; then \ ++ transformed_name=$(GSTACK) ; \ ++ else \ ++ true ; \ ++ fi ; \ ++ $(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(bindir) ; \ ++ $(INSTALL_PROGRAM) $(srcdir)/$(GSTACK).sh \ ++ $(DESTDIR)$(bindir)/$$transformed_name$(EXEEXT) ; \ ++ : $(SHELL) $(srcdir)/../mkinstalldirs \ ++ $(DESTDIR)$(man1dir) ; \ ++ : $(INSTALL_DATA) $(srcdir)/gstack.1 \ ++ $(DESTDIR)$(man1dir)/$$transformed_name.1 ++ ++uninstall: force uninstall-gstack $(CONFIG_UNINSTALL) + transformed_name=`t='$(program_transform_name)'; \ + echo gdb | sed -e $$t` ; \ + if test "x$$transformed_name" = x; then \ +@@ -2116,6 +2134,18 @@ uninstall: force $(CONFIG_UNINSTALL) + rm -f $(DESTDIR)$(bindir)/$$transformed_name + @$(MAKE) DO=uninstall "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) subdir_do + ++.PHONY: uninstall-gstack ++uninstall-gstack: ++ transformed_name=`t='$(program_transform_name)'; \ ++ echo $(GSTACK) | sed -e $$t` ; \ ++ if test "x$$transformed_name" = x; then \ ++ transformed_name=$(GSTACK) ; \ ++ else \ ++ true ; \ ++ fi ; \ ++ rm -f $(DESTDIR)$(bindir)/$$transformed_name$(EXEEXT) \ ++ $(DESTDIR)$(man1dir)/$$transformed_name.1 ++ + # The C++ name parser can be built standalone for testing. + test-cp-name-parser.o: cp-name-parser.c + $(COMPILE) -DTEST_CPNAMES cp-name-parser.c +diff --git a/gdb/gstack.sh b/gdb/gstack.sh +new file mode 100644 +--- /dev/null ++++ b/gdb/gstack.sh +@@ -0,0 +1,43 @@ ++#!/bin/sh ++ ++if test $# -ne 1; then ++ echo "Usage: `basename $0 .sh` " 1>&2 ++ exit 1 ++fi ++ ++if test ! -r /proc/$1; then ++ echo "Process $1 not found." 1>&2 ++ exit 1 ++fi ++ ++# GDB doesn't allow "thread apply all bt" when the process isn't ++# threaded; need to peek at the process to determine if that or the ++# simpler "bt" should be used. ++ ++backtrace="bt" ++if test -d /proc/$1/task ; then ++ # Newer kernel; has a task/ directory. ++ if test `/bin/ls /proc/$1/task | /usr/bin/wc -l` -gt 1 2>/dev/null ; then ++ backtrace="thread apply all bt" ++ fi ++elif test -f /proc/$1/maps ; then ++ # Older kernel; go by it loading libpthread. ++ if /bin/grep -e libpthread /proc/$1/maps > /dev/null 2>&1 ; then ++ backtrace="thread apply all bt" ++ fi ++fi ++ ++GDB=${GDB:-gdb} ++ ++# Run GDB, strip out unwanted noise. ++# --readnever is no longer used since .gdb_index is now in use. ++$GDB --quiet -nx $GDBARGS /proc/$1/exe $1 <&1 | ++set width 0 ++set height 0 ++set pagination no ++$backtrace ++EOF ++/bin/sed -n \ ++ -e 's/^\((gdb) \)*//' \ ++ -e '/^#/p' \ ++ -e '/^Thread/p' +diff --git a/gdb/testsuite/gdb.base/gstack.c b/gdb/testsuite/gdb.base/gstack.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gstack.c +@@ -0,0 +1,43 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2005, 2007, 2008, 2009 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 . */ ++ ++#include ++#include ++#include ++ ++void ++func (void) ++{ ++ const char msg[] = "looping\n"; ++ ++ /* Use the most simple notification not to get caught by attach on exiting ++ the function. */ ++ write (1, msg, strlen (msg)); ++ ++ for (;;); ++} ++ ++int ++main (void) ++{ ++ alarm (60); ++ nice (100); ++ ++ func (); ++ ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/gstack.exp b/gdb/testsuite/gdb.base/gstack.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gstack.exp +@@ -0,0 +1,84 @@ ++# Copyright (C) 2012 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 . ++ ++set testfile gstack ++set executable ${testfile} ++set binfile [standard_output_file $executable] ++if {[build_executable ${testfile} ${executable} "" {debug}] == -1} { ++ return -1 ++} ++ ++set test "spawn inferior" ++set command "${binfile}" ++set res [remote_spawn host $command]; ++if { $res < 0 || $res == "" } { ++ perror "Spawning $command failed." ++ fail $test ++ return ++} ++ ++# The spawn id of the test inferior. ++set test_spawn_id $res ++ ++set use_gdb_stub 1 ++set pid [exp_pid -i $res] ++gdb_expect { ++ -re "looping\r\n" { ++ pass $test ++ } ++ eof { ++ fail "$test (eof)" ++ return ++ } ++ timeout { ++ fail "$test (timeout)" ++ return ++ } ++} ++ ++# Testcase uses the most simple notification not to get caught by attach on ++# exiting the function. Still we could retry the gstack command if we fail. ++ ++set test "spawn gstack" ++set command "sh -c GDB=$GDB\\ GDBARGS=-data-directory\\\\\\ $BUILD_DATA_DIRECTORY\\ sh\\ ${srcdir}/../gstack.sh\\ $pid\\;echo\\ GSTACK-END" ++set res [remote_spawn host $command]; ++if { $res < 0 || $res == "" } { ++ perror "Spawning $command failed." ++ fail $test ++} ++ ++set gdb_spawn_id $res ++ ++gdb_test_multiple "" $test { ++ -re "^#0 +(0x\[0-9a-f\]+ in )?\\.?func \\(\\) at \[^\r\n\]*\r\n#1 +0x\[0-9a-f\]+ in \\.?main \\(\\) at \[^\r\n\]*\r\nGSTACK-END\r\n\$" { ++ pass $test ++ } ++} ++ ++gdb_test_multiple "" "gstack exits" { ++ eof { ++ set result [wait -i $gdb_spawn_id] ++ verbose $result ++ ++ gdb_assert { [lindex $result 2] == 0 } "gstack exits with no error" ++ gdb_assert { [lindex $result 3] == 0 } "gstack's exit status is 0" ++ ++ remote_close host ++ clear_gdb_spawn_id ++ } ++} ++ ++# Kill the test inferior. ++kill_wait_spawned_process $test_spawn_id diff --git a/gdb-6.3-mapping-zero-inode-test.patch b/gdb-6.3-mapping-zero-inode-test.patch new file mode 100644 index 0000000..6fcf76a --- /dev/null +++ b/gdb-6.3-mapping-zero-inode-test.patch @@ -0,0 +1,247 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.3-mapping-zero-inode-test.patch + +;; Test GCORE for shmid 0 shared memory mappings. +;;=fedoratest: But it is broken anyway, sometimes the case being tested is not reproducible. + +diff --git a/gdb/testsuite/gdb.base/gcore-shmid0.c b/gdb/testsuite/gdb.base/gcore-shmid0.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-shmid0.c +@@ -0,0 +1,128 @@ ++/* Copyright 2007, 2009 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 2 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, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, ++ Boston, MA 02111-1307, USA. */ ++ ++/* ++ * Test GDB's handling of gcore for mapping with a name but zero inode. ++ */ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++/* The same test running in a parallel testsuite may steal us the zero SID, ++ even if we never get any EEXIST. Just try a while. */ ++ ++#define TIMEOUT_SEC 10 ++ ++static volatile int v; ++ ++static void ++initialized (void) ++{ ++ v++; ++} ++ ++static void ++unresolved (void) ++{ ++ v++; ++} ++ ++int ++main (void) ++{ ++ int sid; ++ unsigned int *addr = (void *) -1L; ++ int attempt, round = 0; ++ time_t ts_start, ts; ++ ++ if (time (&ts_start) == (time_t) -1) ++ { ++ printf ("time (): %m\n"); ++ exit (1); ++ } ++ ++ /* The generated SID will cycle with an increment of 32768, attempt until it ++ * wraps to 0. */ ++ ++ for (attempt = 0; addr == (void *) -1L; attempt++) ++ { ++ /* kernel-2.6.25-8.fc9.x86_64 just never returns the value 0 by ++ shmget(2). shmget returns SID range 0..1<<31 in steps of 32768, ++ 0x1000 should be enough but wrap the range it to be sure. */ ++ ++ if (attempt > 0x21000) ++ { ++ if (time (&ts) == (time_t) -1) ++ { ++ printf ("time (): %m\n"); ++ exit (1); ++ } ++ ++ if (ts >= ts_start && ts < ts_start + TIMEOUT_SEC) ++ { ++ attempt = 0; ++ round++; ++ continue; ++ } ++ ++ printf ("Problem is not reproducible on this kernel (attempt %d, " ++ "round %d)\n", attempt, round); ++ unresolved (); ++ exit (1); ++ } ++ ++ sid = shmget ((key_t) rand (), 0x1000, IPC_CREAT | IPC_EXCL | 0777); ++ if (sid == -1) ++ { ++ if (errno == EEXIST) ++ continue; ++ ++ printf ("shmget (%d, 0x1000, IPC_CREAT): errno %d\n", 0, errno); ++ exit (1); ++ } ++ ++ /* Use SID only if it is 0, retry it otherwise. */ ++ ++ if (sid == 0) ++ { ++ addr = shmat (sid, NULL, SHM_RND); ++ if (addr == (void *) -1L) ++ { ++ printf ("shmat (%d, NULL, SHM_RND): errno %d\n", sid, ++ errno); ++ exit (1); ++ } ++ } ++ if (shmctl (sid, IPC_RMID, NULL) != 0) ++ { ++ printf ("shmctl (%d, IPC_RMID, NULL): errno %d\n", sid, errno); ++ exit (1); ++ } ++ } ++ ++ initialized (); ++ ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/gcore-shmid0.exp b/gdb/testsuite/gdb.base/gcore-shmid0.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-shmid0.exp +@@ -0,0 +1,101 @@ ++# Copyright 2007, 2009 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 2 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, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++# Test GDB's handling of gcore for mapping with a name but zero inode. ++ ++if { [prepare_for_testing gcore-shmid0.exp gcore-shmid0] } { ++ return -1 ++} ++ ++# Does this gdb support gcore? ++set test "help gcore" ++gdb_test_multiple $test $test { ++ -re "Undefined command: .gcore.*$gdb_prompt $" { ++ # gcore command not supported -- nothing to test here. ++ unsupported "gdb does not support gcore on this target" ++ return -1; ++ } ++ -re "Save a core file .*$gdb_prompt $" { ++ pass $test ++ } ++} ++ ++if { ! [ runto_main ] } then { ++ untested gcore-shmid0.exp ++ return -1 ++} ++ ++gdb_breakpoint "initialized" ++gdb_breakpoint "unresolved" ++ ++set oldtimeout $timeout ++set timeout [expr $oldtimeout + 120] ++ ++set test "Continue to initialized." ++gdb_test_multiple "continue" $test { ++ -re "Breakpoint .*, initialized .* at .*\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re "Breakpoint .*, unresolved .* at .*\r\n$gdb_prompt $" { ++ set timeout $oldtimeout ++ unsupported $test ++ return -1 ++ } ++} ++set timeout $oldtimeout ++ ++set escapedfilename [string_to_regexp [standard_output_file gcore-shmid0.test]] ++ ++set test "save a corefile" ++gdb_test_multiple "gcore [standard_output_file gcore-shmid0.test]" $test { ++ -re "Saved corefile ${escapedfilename}\[\r\n\]+$gdb_prompt $" { ++ pass $test ++ } ++ -re "Can't create a corefile\[\r\n\]+$gdb_prompt $" { ++ unsupported $test ++ } ++} ++ ++# Be sure to remove the handle first. ++# But it would get removed even on a kill by GDB as the handle is already ++# deleted, just it is still attached. ++gdb_continue_to_end "finish" ++ ++set test "core-file command" ++gdb_test_multiple "core-file [standard_output_file gcore-shmid0.test]" $test { ++ -re ".* program is being debugged already.*y or n. $" { ++ # gdb_load may connect us to a gdbserver. ++ send_gdb "y\n" ++ exp_continue; ++ } ++ -re "Core was generated by .*\r\n\#0 .*\\\(\\\).*\r\n$gdb_prompt $" { ++ # The filename does not fit there anyway so do not check it. ++ pass $test ++ } ++ -re ".*registers from core file: File in wrong format.* $" { ++ fail "core-file command (could not read registers from core file)" ++ } ++} ++ ++set test "backtrace" ++gdb_test_multiple "bt" $test { ++ -re "#0 *initialized \\\(\\\) at .*#1 .* main \\\(.*$gdb_prompt $" { ++ pass $test ++ } ++ -re "#0 *initialized \\\(\\\) at .*Cannot access memory at address .*$gdb_prompt $" { ++ fail $test ++ } ++} diff --git a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch new file mode 100644 index 0000000..e5b6da9 --- /dev/null +++ b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch @@ -0,0 +1,265 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Jan Kratochvil +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch + +;; Support TLS symbols (+`errno' suggestion if no pthread is found) (BZ 185337). +;;=push+jan: It should be replaced by Infinity project. + +https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=185337 + +2008-02-24 Jan Kratochvil + + Port to GDB-6.8pre. + +currently for trivial nonthreaded helloworld with no debug info up to -ggdb2 you +will get: + (gdb) p errno + [some error] + +* with -ggdb2 and less "errno" in fact does not exist anywhere as it was + compiled to "(*__errno_location ())" and the macro definition is not present. + Unfortunately gdb will find the TLS symbol and it will try to access it but + as the program has been compiled without -lpthread the TLS base register + (%gs on i386) is not setup and it will result in: + Cannot access memory at address 0x8 + +Attached suggestion patch how to deal with the most common "errno" symbol +for the most common under-ggdb3 compiled programs. + +Original patch hooked into target_translate_tls_address. But its inferior +call invalidates `struct frame *' in the callers - RH BZ 690908. + +https://bugzilla.redhat.com/show_bug.cgi?id=1166549 + +2007-11-03 Jan Kratochvil + + * ./gdb/dwarf2read.c (read_partial_die, dwarf2_linkage_name): Prefer + DW_AT_MIPS_linkage_name over DW_AT_name now only for non-C. + +glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug: + <81a2> DW_AT_name : (indirect string, offset: 0x280e): __errno_location + <81a8> DW_AT_MIPS_linkage_name: (indirect string, offset: 0x2808): *__GI___errno_location + +diff --git a/gdb/printcmd.c b/gdb/printcmd.c +--- a/gdb/printcmd.c ++++ b/gdb/printcmd.c +@@ -1308,6 +1308,11 @@ process_print_command_args (const char *args, value_print_options *print_opts, + + if (exp != nullptr && *exp) + { ++ /* '*((int *(*) (void)) __errno_location) ()' is incompatible with ++ function descriptors. */ ++ if (target_has_execution () && strcmp (exp, "errno") == 0) ++ exp = "*(*(int *(*)(void)) __errno_location) ()"; ++ + /* This setting allows large arrays to be printed by limiting the + number of elements that are loaded into GDB's memory; we only + need to load as many array elements as we plan to print. */ +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno.c b/gdb/testsuite/gdb.dwarf2/dw2-errno.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.dwarf2/dw2-errno.c +@@ -0,0 +1,28 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2005, 2007 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 . ++ ++ Please email any bugs, comments, and/or additions to this file to: ++ bug-gdb@prep.ai.mit.edu */ ++ ++#include ++ ++int main() ++{ ++ errno = 42; ++ ++ return 0; /* breakpoint */ ++} +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno.exp b/gdb/testsuite/gdb.dwarf2/dw2-errno.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.dwarf2/dw2-errno.exp +@@ -0,0 +1,60 @@ ++# Copyright 2007 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 . ++ ++set testfile dw2-errno ++set srcfile ${testfile}.c ++set binfile [standard_output_file ${testfile}] ++ ++proc prep {} { ++ global srcdir subdir binfile ++ gdb_exit ++ gdb_start ++ gdb_reinitialize_dir $srcdir/$subdir ++ gdb_load ${binfile} ++ ++ runto_main ++ ++ gdb_breakpoint [gdb_get_line_number "breakpoint"] ++ gdb_continue_to_breakpoint "breakpoint" ++} ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g2"] != "" } { ++ untested "Couldn't compile test program" ++ return -1 ++} ++prep ++gdb_test "print errno" ".* = 42" "errno with macros=N threads=N" ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g3"] != "" } { ++ untested "Couldn't compile test program" ++ return -1 ++} ++prep ++gdb_test "print errno" ".* = 42" "errno with macros=Y threads=N" ++ ++if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g2"] != "" } { ++ return -1 ++} ++prep ++gdb_test "print errno" ".* = 42" "errno with macros=N threads=Y" ++ ++if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g3"] != "" } { ++ return -1 ++} ++prep ++gdb_test "print errno" ".* = 42" "errno with macros=Y threads=Y" ++ ++# TODO: Test the error on resolving ERRNO with only libc loaded. ++# Just how to find the current libc filename? +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno2.c b/gdb/testsuite/gdb.dwarf2/dw2-errno2.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.dwarf2/dw2-errno2.c +@@ -0,0 +1,28 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2005, 2007 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 . ++ ++ Please email any bugs, comments, and/or additions to this file to: ++ bug-gdb@prep.ai.mit.edu */ ++ ++#include ++ ++int main() ++{ ++ errno = 42; ++ ++ return 0; /* breakpoint */ ++} +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp b/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp +@@ -0,0 +1,71 @@ ++# Copyright 2007 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 . ++ ++set testfile dw2-errno2 ++set srcfile ${testfile}.c ++set binfile [standard_output_file ${testfile}] ++ ++proc prep { message {do_xfail 0} } { with_test_prefix $message { ++ global srcdir subdir binfile variant ++ gdb_exit ++ gdb_start ++ gdb_reinitialize_dir $srcdir/$subdir ++ gdb_load ${binfile}${variant} ++ ++ runto_main ++ ++ gdb_breakpoint [gdb_get_line_number "breakpoint"] ++ gdb_continue_to_breakpoint "breakpoint" ++ ++ gdb_test "gcore ${binfile}${variant}.core" "\r\nSaved corefile .*" "gcore $variant" ++ ++ gdb_test "print errno" ".* = 42" ++ ++ gdb_test "kill" ".*" "kill" {Kill the program being debugged\? \(y or n\) } "y" ++ gdb_test "core-file ${binfile}${variant}.core" "\r\nCore was generated by .*" "core-file" ++ if $do_xfail { ++ setup_xfail "*-*-*" ++ } ++ gdb_test "print (int) errno" ".* = 42" "print errno for core" ++}} ++ ++set variant g2thrN ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g2"] != "" } { ++ untested "Couldn't compile test program" ++ return -1 ++} ++prep "macros=N threads=N" 1 ++ ++set variant g3thrN ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g3"] != "" } { ++ untested "Couldn't compile test program" ++ return -1 ++} ++prep "macros=Y threads=N" 1 ++ ++set variant g2thrY ++if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g2"] != "" } { ++ return -1 ++} ++prep "macros=N threads=Y" ++ ++set variant g3thrY ++if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g3"] != "" } { ++ return -1 ++} ++prep "macros=Y threads=Y" 1 ++ ++# TODO: Test the error on resolving ERRNO with only libc loaded. ++# Just how to find the current libc filename? diff --git a/gdb-6.5-bz218379-ppc-solib-trampoline-test.patch b/gdb-6.5-bz218379-ppc-solib-trampoline-test.patch new file mode 100644 index 0000000..9a83337 --- /dev/null +++ b/gdb-6.5-bz218379-ppc-solib-trampoline-test.patch @@ -0,0 +1,107 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.5-bz218379-ppc-solib-trampoline-test.patch + +;; Test sideeffects of skipping ppc .so libs trampolines (BZ 218379). +;;=fedoratest + +https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=218379 + +diff --git a/gdb/testsuite/gdb.base/step-over-trampoline.c b/gdb/testsuite/gdb.base/step-over-trampoline.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/step-over-trampoline.c +@@ -0,0 +1,28 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2006 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 2 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, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++ Please email any bugs, comments, and/or additions to this file to: ++ bug-gdb@prep.ai.mit.edu */ ++ ++#include ++ ++int main (void) ++{ ++ puts ("hello world"); ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/step-over-trampoline.exp b/gdb/testsuite/gdb.base/step-over-trampoline.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/step-over-trampoline.exp +@@ -0,0 +1,59 @@ ++# Copyright 2006 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 2 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, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++if {[use_gdb_stub]} { ++ untested "skipping test because of use_gdb_stub" ++ return -1 ++} ++ ++if $tracelevel then { ++ strace $tracelevel ++} ++ ++set testfile step-over-trampoline ++set srcfile ${testfile}.c ++set binfile [standard_output_file ${testfile}] ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested "Couldn't compile test program" ++ return -1 ++} ++ ++# Get things started. ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} ++ ++# For C programs, "start" should stop in main(). ++ ++gdb_test "start" \ ++ "main \\(\\) at .*$srcfile.*" \ ++ "start" ++ ++# main () at hello2.c:5 ++# 5 puts("hello world\n"); ++# (gdb) next ++# 0x100007e0 in call___do_global_ctors_aux () ++ ++gdb_test_multiple "next" "invalid `next' output" { ++ -re "\nhello world.*return 0;.*" { ++ pass "stepped over" ++ } ++ -re " in call___do_global_ctors_aux \\(\\).*" { ++ fail "stepped into trampoline" ++ } ++} diff --git a/gdb-6.5-bz243845-stale-testing-zombie-test.patch b/gdb-6.5-bz243845-stale-testing-zombie-test.patch new file mode 100644 index 0000000..77d274a --- /dev/null +++ b/gdb-6.5-bz243845-stale-testing-zombie-test.patch @@ -0,0 +1,89 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.5-bz243845-stale-testing-zombie-test.patch + +;; Test leftover zombie process (BZ 243845). +;;=fedoratest + +diff --git a/gdb/testsuite/gdb.base/tracefork-zombie.exp b/gdb/testsuite/gdb.base/tracefork-zombie.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/tracefork-zombie.exp +@@ -0,0 +1,76 @@ ++# Copyright 2007 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 2 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, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ++ ++# are we on a target board ++if {[use_gdb_stub]} { ++ untested "skipping test because of use_gdb_stub" ++ return -1 ++} ++ ++# Start the program running and then wait for a bit, to be sure ++# that it can be attached to. ++ ++gdb_exit ++gdb_start ++gdb_load sleep ++ ++set gdb_pid [exp_pid -i [board_info host fileid]] ++set test "identified the child GDB" ++if {$gdb_pid != "" && $gdb_pid > 0} { ++ pass $test ++ verbose -log "Child GDB PID $gdb_pid" ++} else { ++ fail $test ++} ++ ++set testpid [eval exec sleep 10 &] ++exec sleep 2 ++ ++set test "attach" ++gdb_test_multiple "attach $testpid" "$test" { ++ -re "Attaching to program.*`?.*'?, process $testpid..*$gdb_prompt $" { ++ pass "$test" ++ } ++ -re "Attaching to program.*`?.*\.exe'?, process $testpid.*\[Switching to thread $testpid\..*\].*$gdb_prompt $" { ++ # Response expected on Cygwin ++ pass "$test" ++ } ++} ++ ++# Some time to let GDB spawn its testing child. ++exec sleep 2 ++ ++set found none ++foreach procpid [glob -directory /proc -type d {[0-9]*}] { ++ if {[catch {open $procpid/status} statusfi]} { ++ continue ++ } ++ set status [read $statusfi] ++ close $statusfi ++ if {1 ++ && [regexp -line {^Name:\tgdb$} $status] ++ && [regexp -line {^PPid:\t1$} $status] ++ && [regexp -line "^TracerPid:\t$gdb_pid$" $status]} { ++ set found $procpid ++ verbose -log "Found linux_test_for_tracefork zombie PID $procpid" ++ } ++} ++set test "linux_test_for_tracefork leaves no zombie" ++if {$found eq {none}} { ++ pass $test ++} else { ++ fail $test ++} diff --git a/gdb-6.5-gcore-buffer-limit-test.patch b/gdb-6.5-gcore-buffer-limit-test.patch new file mode 100644 index 0000000..c26c3c4 --- /dev/null +++ b/gdb-6.5-gcore-buffer-limit-test.patch @@ -0,0 +1,154 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.5-gcore-buffer-limit-test.patch + +;; Test gcore memory and time requirements for large inferiors. +;;=fedoratest + +diff --git a/gdb/testsuite/gdb.base/gcore-excessive-memory.c b/gdb/testsuite/gdb.base/gcore-excessive-memory.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-excessive-memory.c +@@ -0,0 +1,37 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2008 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 2 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, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++ Please email any bugs, comments, and/or additions to this file to: ++ bug-gdb@prep.ai.mit.edu */ ++ ++#include ++#include ++ ++#define MEGS 64 ++ ++int main() ++{ ++ void *mem; ++ ++ mem = malloc (MEGS * 1024ULL * 1024ULL); ++ ++ for (;;) ++ sleep (1); ++ ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/gcore-excessive-memory.exp b/gdb/testsuite/gdb.base/gcore-excessive-memory.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-excessive-memory.exp +@@ -0,0 +1,99 @@ ++# Copyright 2008 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 2 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, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++if {[use_gdb_stub]} { ++ untested "skipping test because of use_gdb_stub" ++ return -1 ++} ++ ++set testfile gcore-excessive-memory ++set srcfile ${testfile}.c ++set shfile [standard_output_file ${testfile}-gdb.sh] ++set corefile [standard_output_file ${testfile}.core] ++set binfile [standard_output_file ${testfile}] ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested "Couldn't compile test program" ++ return -1 ++} ++ ++set f [open "|getconf PAGESIZE" "r"] ++gets $f pagesize ++close $f ++ ++set pid_of_bin [eval exec $binfile &] ++sleep 2 ++ ++# Get things started. ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} ++ ++set pid_of_gdb [exp_pid -i [board_info host fileid]] ++ ++gdb_test "attach $pid_of_bin" "Attaching to .*" "attach" ++gdb_test "up 99" "in main .*" "verify we can get to main" ++ ++proc memory_v_pages_get {} { ++ global pid_of_gdb pagesize ++ set fd [open "/proc/$pid_of_gdb/statm"] ++ gets $fd line ++ close $fd ++ # number of pages of virtual memory ++ scan $line "%d" drs ++ return $drs ++} ++ ++set pages_found [memory_v_pages_get] ++ ++# It must be definitely less than `MEGS' of `gcore-excessive-memory.c'. ++set mb_gcore_reserve 4 ++verbose -log "pages_found = $pages_found, mb_gcore_reserve = $mb_gcore_reserve" ++set kb_found [expr $pages_found * $pagesize / 1024] ++set kb_permit [expr $kb_found + 1 * 1024 + $mb_gcore_reserve * 1024] ++verbose -log "kb_found = $kb_found, kb_permit = $kb_permit" ++ ++# Create the ulimit wrapper. ++set f [open $shfile "w"] ++puts $f "#! /bin/sh" ++puts $f "ulimit -v $kb_permit" ++puts $f "exec $GDB \"\$@\"" ++close $f ++remote_exec host "chmod +x $shfile" ++ ++gdb_exit ++set GDBold $GDB ++set GDB "$shfile" ++gdb_start ++set GDB $GDBold ++ ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} ++ ++set pid_of_gdb [exp_pid -i [board_info host fileid]] ++ ++gdb_test "attach $pid_of_bin" "Attaching to .*" "attach" ++gdb_test "up 99" "in main .*" "verify we can get to main" ++ ++verbose -log "kb_found before gcore = [expr [memory_v_pages_get] * $pagesize / 1024]" ++ ++gdb_test "gcore $corefile" "Saved corefile \[^\n\r\]*" "Save the core file" ++ ++verbose -log "kb_found after gcore = [expr [memory_v_pages_get] * $pagesize / 1024]" ++ ++# Cleanup. ++exec kill -9 $pid_of_bin diff --git a/gdb-6.5-section-num-fixup-test.patch b/gdb-6.5-section-num-fixup-test.patch new file mode 100644 index 0000000..3382769 --- /dev/null +++ b/gdb-6.5-section-num-fixup-test.patch @@ -0,0 +1,127 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.5-section-num-fixup-test.patch + +;; Test a crash on libraries missing the .text section. +;;=fedoratest + +diff --git a/gdb/testsuite/gdb.base/datalib-lib.c b/gdb/testsuite/gdb.base/datalib-lib.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/datalib-lib.c +@@ -0,0 +1,22 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2008 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 2 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, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++ Please email any bugs, comments, and/or additions to this file to: ++ bug-gdb@prep.ai.mit.edu */ ++ ++int var; +diff --git a/gdb/testsuite/gdb.base/datalib-main.c b/gdb/testsuite/gdb.base/datalib-main.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/datalib-main.c +@@ -0,0 +1,26 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2008 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 2 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, write to the Free Software ++ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++ Please email any bugs, comments, and/or additions to this file to: ++ bug-gdb@prep.ai.mit.edu */ ++ ++int ++main (void) ++{ ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/datalib.exp b/gdb/testsuite/gdb.base/datalib.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/datalib.exp +@@ -0,0 +1,56 @@ ++# Copyright 2008 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 2 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, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++if {[use_gdb_stub]} { ++ untested "skipping test because of use_gdb_stub" ++ return -1 ++} ++ ++set testfile datalib ++set srcfilemain ${testfile}-main.c ++set srcfilelib ${testfile}-lib.c ++set libfile [standard_output_file ${testfile}-lib.so] ++set binfile [standard_output_file ${testfile}-main] ++if { [gdb_compile "${srcdir}/${subdir}/${srcfilelib}" "${libfile}" executable [list debug {additional_flags=-shared -nostdlib}]] != "" } { ++ untested "Couldn't compile test program" ++ return -1 ++} ++if { [gdb_compile "${srcdir}/${subdir}/${srcfilemain}" "${binfile} ${libfile}" executable {debug}] != "" } { ++ untested "Couldn't compile test program" ++ return -1 ++} ++ ++# Get things started. ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load ${binfile} ++ ++# We must use a separate library as the main executable is compiled to the ++# address 0 by default and it would get fixed up already at the end of ++# INIT_OBJFILE_SECT_INDICES. We also cannot PRELINK it as PRELINK is missing ++# on ia64. The library must be NOSTDLIB as otherwise some stub code would ++# create the `.text' section there. Also DEBUG option is useful as some of ++# the crashes occur in dwarf2read.c. ++ ++# FAIL case: ++# ../../gdb/ia64-tdep.c:2838: internal-error: sect_index_text not initialized ++# A problem internal to GDB has been detected, ++ ++gdb_test "start" \ ++ "main \\(\\) at .*${srcfilemain}.*" \ ++ "start" diff --git a/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch b/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch new file mode 100644 index 0000000..52bf236 --- /dev/null +++ b/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch @@ -0,0 +1,19 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.6-buildid-locate-rpm-librpm-workaround.patch + +;; Workaround librpm BZ 643031 due to its unexpected exit() calls (BZ 642879). +;;=push+jan + +diff --git a/gdb/proc-service.list b/gdb/proc-service.list +--- a/gdb/proc-service.list ++++ b/gdb/proc-service.list +@@ -37,4 +37,7 @@ + ps_pstop; + ps_ptread; + ps_ptwrite; ++ ++ /* gdb-6.6-buildid-locate-rpm.patch */ ++ rpmsqEnable; + }; diff --git a/gdb-6.6-buildid-locate-rpm-suse.patch b/gdb-6.6-buildid-locate-rpm-suse.patch new file mode 100644 index 0000000..5b9cf7f --- /dev/null +++ b/gdb-6.6-buildid-locate-rpm-suse.patch @@ -0,0 +1,123 @@ +diff --git a/gdb/build-id.c b/gdb/build-id.c +index 059a72fc050..58d73e70bad 100644 +--- a/gdb/build-id.c ++++ b/gdb/build-id.c +@@ -863,10 +863,8 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor) + #endif + { + Header h; +- char *debuginfo, **slot, *s, *s2; ++ char *debuginfo, **slot; + errmsg_t err; +- size_t srcrpmlen = sizeof (".src.rpm") - 1; +- size_t debuginfolen = sizeof ("-debuginfo") - 1; + rpmdbMatchIterator mi_debuginfo; + + h = rpmdbNextIterator_p (mi); +@@ -875,7 +873,9 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor) + + /* Verify the debuginfo file is not already installed. */ + +- debuginfo = headerFormat_p (h, "%{sourcerpm}-debuginfo.%{arch}", ++ /* The allocated memory gets utilized below for MISSING_RPM_HASH. */ ++ debuginfo = headerFormat_p (h, ++ "%{name}-debuginfo-%{version}-%{release}.%{arch}", + &err); + if (!debuginfo) + { +@@ -883,60 +883,19 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor) + err); + continue; + } +- /* s = `.src.rpm-debuginfo.%{arch}' */ +- s = strrchr (debuginfo, '-') - srcrpmlen; +- s2 = NULL; +- if (s > debuginfo && memcmp (s, ".src.rpm", srcrpmlen) == 0) +- { +- /* s2 = `-%{release}.src.rpm-debuginfo.%{arch}' */ +- s2 = (char *) memrchr (debuginfo, '-', s - debuginfo); +- } +- if (s2) +- { +- /* s2 = `-%{version}-%{release}.src.rpm-debuginfo.%{arch}' */ +- s2 = (char *) memrchr (debuginfo, '-', s2 - debuginfo); +- } +- if (!s2) +- { +- warning (_("Error querying the rpm file `%s': %s"), filename, +- debuginfo); +- xfree (debuginfo); +- continue; +- } +- /* s = `.src.rpm-debuginfo.%{arch}' */ +- /* s2 = `-%{version}-%{release}.src.rpm-debuginfo.%{arch}' */ +- memmove (s2 + debuginfolen, s2, s - s2); +- memcpy (s2, "-debuginfo", debuginfolen); +- /* s = `XXXX.%{arch}' */ +- /* strlen ("XXXX") == srcrpmlen + debuginfolen */ +- /* s2 = `-debuginfo-%{version}-%{release}XX.%{arch}' */ +- /* strlen ("XX") == srcrpmlen */ +- memmove (s + debuginfolen, s + srcrpmlen + debuginfolen, +- strlen (s + srcrpmlen + debuginfolen) + 1); +- /* s = `-debuginfo-%{version}-%{release}.%{arch}' */ + ++ /* Verify the debuginfo file is not already installed. */ + /* RPMDBI_PACKAGES requires keylen == sizeof (int). */ + /* RPMDBI_LABEL is an interface for NVR-based dbiFindByLabel(). */ + mi_debuginfo = rpmtsInitIterator_p (ts, (rpmDbiTagVal) RPMDBI_LABEL, debuginfo, 0); +- xfree (debuginfo); + if (mi_debuginfo) + { ++ xfree (debuginfo); + rpmdbFreeIterator_p (mi_debuginfo); + count = 0; + break; + } + +- /* The allocated memory gets utilized below for MISSING_RPM_HASH. */ +- debuginfo = headerFormat_p (h, +- "%{name}-%{version}-%{release}.%{arch}", +- &err); +- if (!debuginfo) +- { +- warning (_("Error querying the rpm file `%s': %s"), filename, +- err); +- continue; +- } +- + /* Base package name for `debuginfo-install'. We do not use the + `yum' command directly as the line + yum --enablerepo='*debug*' install NAME-debuginfo.ARCH +@@ -1085,10 +1044,7 @@ missing_rpm_list_print (void) + missing_rpm_list_entries = 0; + + gdb_printf (_("Missing separate debuginfos, use: %s"), +-#ifdef DNF_DEBUGINFO_INSTALL +- "dnf " +-#endif +- "debuginfo-install"); ++ "zypper install"); + for (const char *el : array) + { + gdb_printf (" %s", el); +@@ -1296,14 +1252,15 @@ debug_print_missing (const char *binary, const char *debug) + _("Missing separate debuginfo for %s.\n"), binary); + if (debug != NULL) + { ++#ifdef HAVE_LIBRPM + if (access (debug, F_OK) == 0) { +- gdb_printf (gdb_stdlog, _("Try: %s %s\n"), +-#ifdef DNF_DEBUGINFO_INSTALL +- "dnf" + #else +- "yum" ++ if (1) { + #endif +- " --enablerepo='*debug*' install", debug); ++ const char *p = strrchr (debug, '/'); ++ gdb_printf (gdb_stdlog, _("Try: %s%.2s%.38s\"\n"), ++ "zypper install -C \"debuginfo(build-id)=", ++ p - 2, p + 1); + } else + gdb_printf (gdb_stdlog, _("The debuginfo package for this file is probably broken.\n")); + } diff --git a/gdb-6.6-buildid-locate-rpm.patch b/gdb-6.6-buildid-locate-rpm.patch new file mode 100644 index 0000000..b38b945 --- /dev/null +++ b/gdb-6.6-buildid-locate-rpm.patch @@ -0,0 +1,1084 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Kevin Buettner +Date: Wed, 22 Feb 2023 22:30:40 -0700 +Subject: gdb-6.6-buildid-locate-rpm.patch + +;;=push+jan + +diff --git a/gdb/aclocal.m4 b/gdb/aclocal.m4 +--- a/gdb/aclocal.m4 ++++ b/gdb/aclocal.m4 +@@ -11,7 +11,223 @@ + # even the implied warranty of MERCHANTABILITY or FITNESS FOR A + # PARTICULAR PURPOSE. + ++# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- ++# serial 1 (pkg-config-0.24) ++# ++# Copyright © 2004 Scott James Remnant . ++# ++# 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 2 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, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++# ++# As a special exception to the GNU General Public License, if you ++# distribute this file as part of a program that contains a ++# configuration script generated by Autoconf, you may include it under ++# the same distribution terms that you use for the rest of that program. ++ ++# PKG_PROG_PKG_CONFIG([MIN-VERSION]) ++# ---------------------------------- ++AC_DEFUN([PKG_PROG_PKG_CONFIG], ++[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) ++m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) ++m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) ++AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) ++AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) ++AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) ++ ++if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then ++ AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) ++fi ++if test -n "$PKG_CONFIG"; then ++ _pkg_min_version=m4_default([$1], [0.9.0]) ++ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) ++ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then ++ AC_MSG_RESULT([yes]) ++ else ++ AC_MSG_RESULT([no]) ++ PKG_CONFIG="" ++ fi ++fi[]dnl ++])# PKG_PROG_PKG_CONFIG ++ ++# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) ++# ++# Check to see whether a particular set of modules exists. Similar ++# to PKG_CHECK_MODULES(), but does not set variables or print errors. ++# ++# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) ++# only at the first occurence in configure.ac, so if the first place ++# it's called might be skipped (such as if it is within an "if", you ++# have to call PKG_CHECK_EXISTS manually ++# -------------------------------------------------------------- ++AC_DEFUN([PKG_CHECK_EXISTS], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl ++if test -n "$PKG_CONFIG" && \ ++ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then ++ m4_default([$2], [:]) ++m4_ifvaln([$3], [else ++ $3])dnl ++fi]) ++ ++# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) ++# --------------------------------------------- ++m4_define([_PKG_CONFIG], ++[if test -n "$$1"; then ++ pkg_cv_[]$1="$$1" ++ elif test -n "$PKG_CONFIG"; then ++ PKG_CHECK_EXISTS([$3], ++ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` ++ test "x$?" != "x0" && pkg_failed=yes ], ++ [pkg_failed=yes]) ++ else ++ pkg_failed=untried ++fi[]dnl ++])# _PKG_CONFIG ++ ++# _PKG_SHORT_ERRORS_SUPPORTED ++# ----------------------------- ++AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) ++if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then ++ _pkg_short_errors_supported=yes ++else ++ _pkg_short_errors_supported=no ++fi[]dnl ++])# _PKG_SHORT_ERRORS_SUPPORTED ++ ++ ++# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], ++# [ACTION-IF-NOT-FOUND]) ++# ++# ++# Note that if there is a possibility the first call to ++# PKG_CHECK_MODULES might not happen, you should be sure to include an ++# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac ++# ++# ++# -------------------------------------------------------------- ++AC_DEFUN([PKG_CHECK_MODULES], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl ++AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl ++AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl ++ ++pkg_failed=no ++AC_MSG_CHECKING([for $1]) ++ ++_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) ++_PKG_CONFIG([$1][_LIBS], [libs], [$2]) ++ ++m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS ++and $1[]_LIBS to avoid the need to call pkg-config. ++See the pkg-config man page for more details.]) ++ ++if test $pkg_failed = yes; then ++ AC_MSG_RESULT([no]) ++ _PKG_SHORT_ERRORS_SUPPORTED ++ if test $_pkg_short_errors_supported = yes; then ++ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` ++ else ++ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` ++ fi ++ # Put the nasty error message in config.log where it belongs ++ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD ++ ++ m4_default([$4], [AC_MSG_ERROR( ++[Package requirements ($2) were not met: ++ ++$$1_PKG_ERRORS ++ ++Consider adjusting the PKG_CONFIG_PATH environment variable if you ++installed software in a non-standard prefix. ++ ++_PKG_TEXT])[]dnl ++ ]) ++elif test $pkg_failed = untried; then ++ AC_MSG_RESULT([no]) ++ m4_default([$4], [AC_MSG_FAILURE( ++[The pkg-config script could not be found or is too old. Make sure it ++is in your PATH or set the PKG_CONFIG environment variable to the full ++path to pkg-config. ++ ++_PKG_TEXT ++ ++To get pkg-config, see .])[]dnl ++ ]) ++else ++ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS ++ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS ++ AC_MSG_RESULT([yes]) ++ $3 ++fi[]dnl ++])# PKG_CHECK_MODULES ++ ++ ++# PKG_INSTALLDIR(DIRECTORY) ++# ------------------------- ++# Substitutes the variable pkgconfigdir as the location where a module ++# should install pkg-config .pc files. By default the directory is ++# $libdir/pkgconfig, but the default can be changed by passing ++# DIRECTORY. The user can override through the --with-pkgconfigdir ++# parameter. ++AC_DEFUN([PKG_INSTALLDIR], ++[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) ++m4_pushdef([pkg_description], ++ [pkg-config installation directory @<:@]pkg_default[@:>@]) ++AC_ARG_WITH([pkgconfigdir], ++ [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, ++ [with_pkgconfigdir=]pkg_default) ++AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) ++m4_popdef([pkg_default]) ++m4_popdef([pkg_description]) ++]) dnl PKG_INSTALLDIR ++ ++ ++# PKG_NOARCH_INSTALLDIR(DIRECTORY) ++# ------------------------- ++# Substitutes the variable noarch_pkgconfigdir as the location where a ++# module should install arch-independent pkg-config .pc files. By ++# default the directory is $datadir/pkgconfig, but the default can be ++# changed by passing DIRECTORY. The user can override through the ++# --with-noarch-pkgconfigdir parameter. ++AC_DEFUN([PKG_NOARCH_INSTALLDIR], ++[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) ++m4_pushdef([pkg_description], ++ [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) ++AC_ARG_WITH([noarch-pkgconfigdir], ++ [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, ++ [with_noarch_pkgconfigdir=]pkg_default) ++AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) ++m4_popdef([pkg_default]) ++m4_popdef([pkg_description]) ++]) dnl PKG_NOARCH_INSTALLDIR ++ ++ ++# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, ++# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) ++# ------------------------------------------- ++# Retrieves the value of the pkg-config variable for the given module. ++AC_DEFUN([PKG_CHECK_VAR], ++[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl ++AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl ++ ++_PKG_CONFIG([$1], [variable="][$3]["], [$2]) ++AS_VAR_COPY([$1], [pkg_cv_][$1]) ++ ++AS_VAR_IF([$1], [""], [$5], [$4])dnl ++])# PKG_CHECK_VAR ++ + m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) ++ + # AM_AUX_DIR_EXPAND -*- Autoconf -*- + + # Copyright (C) 2001-2017 Free Software Foundation, Inc. +diff --git a/gdb/build-id.c b/gdb/build-id.c +--- a/gdb/build-id.c ++++ b/gdb/build-id.c +@@ -780,10 +780,10 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor) + static rpmts (*rpmtsCreate_p) (void); + extern rpmts rpmtsFree(rpmts ts); + static rpmts (*rpmtsFree_p) (rpmts ts); +- extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, ++ extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag, + const void * keyp, size_t keylen); + static rpmdbMatchIterator (*rpmtsInitIterator_p) (const rpmts ts, +- rpmTag rpmtag, ++ rpmDbiTagVal rpmtag, + const void *keyp, + size_t keylen); + #else /* !DLOPEN_LIBRPM */ +@@ -838,7 +838,7 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor) + && (rpmdbNextIterator_p = (Header (*) (rpmdbMatchIterator mi)) dlsym (h, "rpmdbNextIterator")) + && (rpmtsCreate_p = (rpmts (*) (void)) dlsym (h, "rpmtsCreate")) + && (rpmtsFree_p = (rpmts (*) (rpmts ts)) dlsym (h, "rpmtsFree")) +- && (rpmtsInitIterator_p = (rpmdbMatchIterator (*) (const rpmts ts, rpmTag rpmtag, const void *keyp, size_t keylen)) dlsym (h, "rpmtsInitIterator")))) ++ && (rpmtsInitIterator_p = (rpmdbMatchIterator (*) (const rpmts ts, rpmDbiTagVal rpmtag, const void *keyp, size_t keylen)) dlsym (h, "rpmtsInitIterator")))) + { + warning (_("Opened library \"%s\" is incompatible (%s), " + "missing debuginfos notifications will not be displayed"), +@@ -926,7 +926,7 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor) + + /* RPMDBI_PACKAGES requires keylen == sizeof (int). */ + /* RPMDBI_LABEL is an interface for NVR-based dbiFindByLabel(). */ +- mi_debuginfo = rpmtsInitIterator_p (ts, (rpmTag) RPMDBI_LABEL, debuginfo, 0); ++ mi_debuginfo = rpmtsInitIterator_p (ts, (rpmDbiTagVal) RPMDBI_LABEL, debuginfo, 0); + xfree (debuginfo); + if (mi_debuginfo) + { +diff --git a/gdb/config.in b/gdb/config.in +--- a/gdb/config.in ++++ b/gdb/config.in +@@ -42,6 +42,9 @@ + /* Handle .ctf type-info sections */ + #undef ENABLE_LIBCTF + ++/* librpm version specific library name to dlopen. */ ++#undef DLOPEN_LIBRPM ++ + /* Define to 1 if translation of program messages to the user's native + language is requested. */ + #undef ENABLE_NLS +@@ -265,6 +268,9 @@ + /* Define to 1 if you have the `m' library (-lm). */ + #undef HAVE_LIBM + ++/* Define if librpm library is being used. */ ++#undef HAVE_LIBRPM ++ + /* Define to 1 if you have the header file. */ + #undef HAVE_LIBUNWIND_IA64_H + +diff --git a/gdb/configure b/gdb/configure +--- a/gdb/configure ++++ b/gdb/configure +@@ -778,6 +778,11 @@ AMD_DBGAPI_CFLAGS + ENABLE_BFD_64_BIT_FALSE + ENABLE_BFD_64_BIT_TRUE + subdirs ++RPM_LIBS ++RPM_CFLAGS ++PKG_CONFIG_LIBDIR ++PKG_CONFIG_PATH ++PKG_CONFIG + GDB_DATADIR + DEBUGDIR + MAKEINFO_EXTRA_FLAGS +@@ -911,6 +916,7 @@ with_gdb_datadir + with_relocated_sources + with_auto_load_dir + with_auto_load_safe_path ++with_rpm + enable_targets + enable_64_bit_bfd + with_amd_dbgapi +@@ -988,6 +994,8 @@ AMD_DBGAPI_CFLAGS + AMD_DBGAPI_LIBS + DEBUGINFOD_CFLAGS + DEBUGINFOD_LIBS ++RPM_CFLAGS ++RPM_LIBS + YACC + YFLAGS + ZSTD_CFLAGS +@@ -1679,6 +1687,8 @@ Optional Packages: + --with-amd-dbgapi support for the amd-dbgapi target (yes / no / auto) + --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 +@@ -1759,6 +1769,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'. +@@ -18039,6 +18051,495 @@ _ACEOF + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_auto_load_safe_path" >&5 + $as_echo "$with_auto_load_safe_path" >&6; } + ++# Integration with rpm library to support missing debuginfo suggestions. ++# --without-rpm: Disable any rpm support. ++# --with-rpm=libname.so: Try to dynamically open `libname.so' during runtime. ++# Even with runtime missing `libname.so' GDB will still other run correctly. ++# Missing `libname.so' during ./configure will abort the configuration. ++# --with-rpm=librpm.so: Like `--with-rpm=libname.so' but try to find specific ++# minor version first such as `librpm-4.6.so' as minor version differences ++# mean API+ABI incompatibility. If the specific match versioned library name ++# could not be found still open dynamically at least `librpm.so'. ++# --with-rpm: Like `--with-rpm=librpm.so' but if any of its detection fails try ++# to find librpm for compilation-time linking by pkg-config. GDB binary will ++# be probably linked with the version specific library (as `librpm-4.6.so'). ++# Failure to find librpm by pkg-config will abort the configuration. ++# (default) --with-rpm=auto: Like `--with-rpm=librpm.so' but if even pkg-config ++# cannot find librpm use to the rpmless compilation (like `--without-rpm'). ++ ++ ++# Check whether --with-rpm was given. ++if test "${with_rpm+set}" = set; then : ++ withval=$with_rpm; ++else ++ with_rpm="auto" ++fi ++ ++ ++ ++ ++if test "x$with_rpm" != "xno"; then ++ if test "x$with_rpm" = "xyes"; then ++ LIBRPM="librpm.so" ++ RPM_REQUIRE=true ++ DLOPEN_REQUIRE=false ++ elif test "x$with_rpm" = "xauto"; then ++ LIBRPM="librpm.so" ++ RPM_REQUIRE=false ++ DLOPEN_REQUIRE=false ++ else ++ LIBRPM="$with_rpm" ++ RPM_REQUIRE=true ++ DLOPEN_REQUIRE=true ++ fi ++ LIBRPM_STRING='"'"$LIBRPM"'"' ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking specific librpm version" >&5 ++$as_echo_n "checking specific librpm version... " >&6; } ++ HAVE_DLOPEN_LIBRPM=false ++ save_LIBS="$LIBS" ++ LIBS="$LIBS -ldl" ++ 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; } ++else ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++#include ++#include ++#include ++#include ++ ++int ++main () ++{ ++ ++ void *h; ++ const char *const *rpmverp; ++ FILE *f; ++ ++ f = fopen ("conftest.out", "w"); ++ if (!f) ++ { ++ fprintf (stderr, "Cannot write \"%s\": %s\n", "conftest.out", ++ strerror (errno)); ++ return 1; ++ } ++ h = dlopen ($LIBRPM_STRING, RTLD_LAZY); ++ if (!h) ++ { ++ fprintf (stderr, "dlopen (\"%s\"): %s\n", $LIBRPM_STRING, dlerror ()); ++ return 1; ++ } ++ rpmverp = dlsym (h, "RPMVERSION"); ++ if (!rpmverp) ++ { ++ fprintf (stderr, "dlsym (\"RPMVERSION\"): %s\n", dlerror ()); ++ return 1; ++ } ++ fprintf (stderr, "RPMVERSION is: \""); ++ fprintf (stderr, "%s\"\n", *rpmverp); ++ ++ /* Try to find the specific librpm version only for "librpm.so" as we do ++ not know how to assemble the version string otherwise. */ ++ ++ if (strcmp ("librpm.so", $LIBRPM_STRING) != 0) ++ { ++ fprintf (f, "%s\n", $LIBRPM_STRING); ++ return 0; ++ } ++ else ++ { ++ char *h2_name; ++ void *h2; ++ int major, minor; ++ ++ if (sscanf (*rpmverp, "%d.%d", &major, &minor) != 2) ++ { ++ fprintf (stderr, "Unable to parse RPMVERSION.\n"); ++ fprintf (f, "%s\n", $LIBRPM_STRING); ++ return 0; ++ } ++ /* Avoid the square brackets by malloc. */ ++ h2_name = malloc (64); ++ sprintf (h2_name, "librpm-%d.%d.so", major, minor); ++ h2 = dlopen (h2_name, RTLD_LAZY); ++ if (!h2) ++ { ++ fprintf (stderr, "dlopen (\"%s\"): %s\n", h2_name, dlerror ()); ++ fprintf (f, "%s\n", $LIBRPM_STRING); ++ return 0; ++ } ++ if (h2 != h) ++ { ++ fprintf (stderr, "dlopen of \"%s\" and \"%s\" are different.\n", ++ $LIBRPM_STRING, h2_name); ++ fprintf (f, "%s\n", $LIBRPM_STRING); ++ return 0; ++ } ++ /* Found the valid .so name with a specific version. */ ++ fprintf (f, "%s\n", h2_name); ++ return 0; ++ } ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_run "$LINENO"; then : ++ ++ DLOPEN_LIBRPM="`cat conftest.out`" ++ if test "x$DLOPEN_LIBRPM" != "x"; then ++ HAVE_DLOPEN_LIBRPM=true ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLOPEN_LIBRPM" >&5 ++$as_echo "$DLOPEN_LIBRPM" >&6; } ++ fi ++ ++fi ++rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ ++ conftest.$ac_objext conftest.beam conftest.$ac_ext ++fi ++ ++ rm -f conftest.out ++ ++ ++ ++ if $HAVE_DLOPEN_LIBRPM; then ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking rpm library API compatibility" >&5 ++$as_echo_n "checking rpm library API compatibility... " >&6; } ++ # The compilation requires -Werror to verify anything. ++ save_CFLAGS="$CFLAGS" ++ CFLAGS="$CFLAGS -Werror" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Duplicate here the declarations to verify they match "elfread.c". */ ++#include ++#include ++#include ++#include ++extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); ++extern int rpmReadConfigFiles(const char * file, const char * target); ++extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); ++extern Header rpmdbNextIterator(rpmdbMatchIterator mi); ++extern rpmts rpmtsCreate(void); ++extern rpmts rpmtsFree(rpmts ts); ++extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag, ++ const void * keyp, size_t keylen); ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ++ LIBRPM_COMPAT=true ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++else ++ ++ LIBRPM_COMPAT=false ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ CFLAGS="$save_CFLAGS" ++ ++ if ! $LIBRPM_COMPAT; then ++ HAVE_DLOPEN_LIBRPM=false ++ fi ++ fi ++ ++ if $HAVE_DLOPEN_LIBRPM; then ++ DLOPEN_LIBRPM_STRING='"'"$DLOPEN_LIBRPM"'"' ++ ++cat >>confdefs.h <<_ACEOF ++#define DLOPEN_LIBRPM $DLOPEN_LIBRPM_STRING ++_ACEOF ++ ++ ++$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h ++ ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$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 ++ fi ++ ++ ++ ++ ++ ++ ++ ++if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then ++ if test -n "$ac_tool_prefix"; then ++ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. ++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 : ++ $as_echo_n "(cached) " >&6 ++else ++ case $PKG_CONFIG in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++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 ++ 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 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++fi ++PKG_CONFIG=$ac_cv_path_PKG_CONFIG ++if test -n "$PKG_CONFIG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 ++$as_echo "$PKG_CONFIG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ ++fi ++if test -z "$ac_cv_path_PKG_CONFIG"; then ++ ac_pt_PKG_CONFIG=$PKG_CONFIG ++ # Extract the first word of "pkg-config", so it can be a program name with args. ++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 : ++ $as_echo_n "(cached) " >&6 ++else ++ case $ac_pt_PKG_CONFIG in ++ [\\/]* | ?:[\\/]*) ++ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. ++ ;; ++ *) ++ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR ++for as_dir in $PATH ++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 ++ 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 ++ fi ++done ++ done ++IFS=$as_save_IFS ++ ++ ;; ++esac ++fi ++ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG ++if test -n "$ac_pt_PKG_CONFIG"; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 ++$as_echo "$ac_pt_PKG_CONFIG" >&6; } ++else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++fi ++ ++ if test "x$ac_pt_PKG_CONFIG" = x; then ++ PKG_CONFIG="" ++ else ++ case $cross_compiling:$ac_tool_warned in ++yes:) ++{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 ++$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ++ac_tool_warned=yes ;; ++esac ++ PKG_CONFIG=$ac_pt_PKG_CONFIG ++ fi ++else ++ PKG_CONFIG="$ac_cv_path_PKG_CONFIG" ++fi ++ ++fi ++if test -n "$PKG_CONFIG"; then ++ _pkg_min_version=0.9.0 ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 ++$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } ++ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ else ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ PKG_CONFIG="" ++ fi ++fi ++ ++pkg_failed=no ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for RPM" >&5 ++$as_echo_n "checking for RPM... " >&6; } ++ ++if test -n "$RPM_CFLAGS"; then ++ pkg_cv_RPM_CFLAGS="$RPM_CFLAGS" ++ elif test -n "$PKG_CONFIG"; then ++ if test -n "$PKG_CONFIG" && \ ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"rpm\""; } >&5 ++ ($PKG_CONFIG --exists --print-errors "rpm") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; then ++ pkg_cv_RPM_CFLAGS=`$PKG_CONFIG --cflags "rpm" 2>/dev/null` ++ test "x$?" != "x0" && pkg_failed=yes ++else ++ pkg_failed=yes ++fi ++ else ++ pkg_failed=untried ++fi ++if test -n "$RPM_LIBS"; then ++ pkg_cv_RPM_LIBS="$RPM_LIBS" ++ elif test -n "$PKG_CONFIG"; then ++ if test -n "$PKG_CONFIG" && \ ++ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"rpm\""; } >&5 ++ ($PKG_CONFIG --exists --print-errors "rpm") 2>&5 ++ ac_status=$? ++ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 ++ test $ac_status = 0; }; then ++ pkg_cv_RPM_LIBS=`$PKG_CONFIG --libs "rpm" 2>/dev/null` ++ test "x$?" != "x0" && pkg_failed=yes ++else ++ pkg_failed=yes ++fi ++ else ++ pkg_failed=untried ++fi ++ ++ ++ ++if test $pkg_failed = yes; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ ++if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then ++ _pkg_short_errors_supported=yes ++else ++ _pkg_short_errors_supported=no ++fi ++ if test $_pkg_short_errors_supported = yes; then ++ RPM_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "rpm" 2>&1` ++ else ++ RPM_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "rpm" 2>&1` ++ fi ++ # Put the nasty error message in config.log where it belongs ++ echo "$RPM_PKG_ERRORS" >&5 ++ ++ HAVE_LIBRPM=false ++elif test $pkg_failed = untried; then ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ HAVE_LIBRPM=false ++else ++ RPM_CFLAGS=$pkg_cv_RPM_CFLAGS ++ RPM_LIBS=$pkg_cv_RPM_LIBS ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ HAVE_LIBRPM=true ++fi ++ ++ if $HAVE_LIBRPM; then ++ ++ { $as_echo "$as_me:${as_lineno-$LINENO}: checking rpm library API compatibility" >&5 ++$as_echo_n "checking rpm library API compatibility... " >&6; } ++ # The compilation requires -Werror to verify anything. ++ save_CFLAGS="$CFLAGS" ++ CFLAGS="$CFLAGS -Werror" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++/* Duplicate here the declarations to verify they match "elfread.c". */ ++#include ++#include ++#include ++#include ++extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); ++extern int rpmReadConfigFiles(const char * file, const char * target); ++extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); ++extern Header rpmdbNextIterator(rpmdbMatchIterator mi); ++extern rpmts rpmtsCreate(void); ++extern rpmts rpmtsFree(rpmts ts); ++extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag, ++ const void * keyp, size_t keylen); ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_compile "$LINENO"; then : ++ ++ LIBRPM_COMPAT=true ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 ++$as_echo "yes" >&6; } ++ ++else ++ ++ LIBRPM_COMPAT=false ++ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 ++$as_echo "no" >&6; } ++ ++fi ++rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ++ CFLAGS="$save_CFLAGS" ++ ++ if ! $LIBRPM_COMPAT; then ++ HAVE_LIBRPM=false ++ RPM_PKG_ERRORS="Found $LIBRPM API is incompatibile with this GDB" ++ fi ++ fi ++ ++ if $HAVE_LIBRPM; then ++ ++$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h ++ ++ CFLAGS="$CFLAGS $RPM_CFLAGS" ++ LIBS="$LIBS $RPM_LIBS" ++ else ++ if $RPM_REQUIRE; then ++ 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;} ++ fi ++ fi ++ fi ++fi ++ + + + subdirs="$subdirs testsuite" +diff --git a/gdb/configure.ac b/gdb/configure.ac +--- a/gdb/configure.ac ++++ b/gdb/configure.ac +@@ -173,6 +173,200 @@ AC_DEFINE_DIR(AUTO_LOAD_SAFE_PATH, escape_dir, + [Directories safe to hold auto-loaded files.]) + AC_MSG_RESULT([$with_auto_load_safe_path]) + ++# Integration with rpm library to support missing debuginfo suggestions. ++# --without-rpm: Disable any rpm support. ++# --with-rpm=libname.so: Try to dynamically open `libname.so' during runtime. ++# Even with runtime missing `libname.so' GDB will still other run correctly. ++# Missing `libname.so' during ./configure will abort the configuration. ++# --with-rpm=librpm.so: Like `--with-rpm=libname.so' but try to find specific ++# minor version first such as `librpm-4.6.so' as minor version differences ++# mean API+ABI incompatibility. If the specific match versioned library name ++# could not be found still open dynamically at least `librpm.so'. ++# --with-rpm: Like `--with-rpm=librpm.so' but if any of its detection fails try ++# to find librpm for compilation-time linking by pkg-config. GDB binary will ++# be probably linked with the version specific library (as `librpm-4.6.so'). ++# Failure to find librpm by pkg-config will abort the configuration. ++# (default) --with-rpm=auto: Like `--with-rpm=librpm.so' but if even pkg-config ++# cannot find librpm use to the rpmless compilation (like `--without-rpm'). ++ ++AC_ARG_WITH([rpm], ++ [AS_HELP_STRING([--with-rpm], ++ [query rpm database for missing debuginfos (yes/no, def. auto=librpm.so)])], [], [with_rpm="auto"]) ++ ++m4_pattern_allow([^AC_MSG_ERROR$]) ++m4_pattern_allow([^AC_MSG_WARN$]) ++if test "x$with_rpm" != "xno"; then ++ if test "x$with_rpm" = "xyes"; then ++ LIBRPM="librpm.so" ++ RPM_REQUIRE=true ++ DLOPEN_REQUIRE=false ++ elif test "x$with_rpm" = "xauto"; then ++ LIBRPM="librpm.so" ++ RPM_REQUIRE=false ++ DLOPEN_REQUIRE=false ++ else ++ LIBRPM="$with_rpm" ++ RPM_REQUIRE=true ++ DLOPEN_REQUIRE=true ++ fi ++ LIBRPM_STRING='"'"$LIBRPM"'"' ++ ++ AC_MSG_CHECKING([specific librpm version]) ++ HAVE_DLOPEN_LIBRPM=false ++ save_LIBS="$LIBS" ++ LIBS="$LIBS -ldl" ++ AC_RUN_IFELSE(AC_LANG_PROGRAM([[ ++#include ++#include ++#include ++#include ++ ]], [[ ++ void *h; ++ const char *const *rpmverp; ++ FILE *f; ++ ++ f = fopen ("conftest.out", "w"); ++ if (!f) ++ { ++ fprintf (stderr, "Cannot write \"%s\": %s\n", "conftest.out", ++ strerror (errno)); ++ return 1; ++ } ++ h = dlopen ($LIBRPM_STRING, RTLD_LAZY); ++ if (!h) ++ { ++ fprintf (stderr, "dlopen (\"%s\"): %s\n", $LIBRPM_STRING, dlerror ()); ++ return 1; ++ } ++ rpmverp = dlsym (h, "RPMVERSION"); ++ if (!rpmverp) ++ { ++ fprintf (stderr, "dlsym (\"RPMVERSION\"): %s\n", dlerror ()); ++ return 1; ++ } ++ fprintf (stderr, "RPMVERSION is: \""); ++ fprintf (stderr, "%s\"\n", *rpmverp); ++ ++ /* Try to find the specific librpm version only for "librpm.so" as we do ++ not know how to assemble the version string otherwise. */ ++ ++ if (strcmp ("librpm.so", $LIBRPM_STRING) != 0) ++ { ++ fprintf (f, "%s\n", $LIBRPM_STRING); ++ return 0; ++ } ++ else ++ { ++ char *h2_name; ++ void *h2; ++ int major, minor; ++ ++ if (sscanf (*rpmverp, "%d.%d", &major, &minor) != 2) ++ { ++ fprintf (stderr, "Unable to parse RPMVERSION.\n"); ++ fprintf (f, "%s\n", $LIBRPM_STRING); ++ return 0; ++ } ++ /* Avoid the square brackets by malloc. */ ++ h2_name = malloc (64); ++ sprintf (h2_name, "librpm-%d.%d.so", major, minor); ++ h2 = dlopen (h2_name, RTLD_LAZY); ++ if (!h2) ++ { ++ fprintf (stderr, "dlopen (\"%s\"): %s\n", h2_name, dlerror ()); ++ fprintf (f, "%s\n", $LIBRPM_STRING); ++ return 0; ++ } ++ if (h2 != h) ++ { ++ fprintf (stderr, "dlopen of \"%s\" and \"%s\" are different.\n", ++ $LIBRPM_STRING, h2_name); ++ fprintf (f, "%s\n", $LIBRPM_STRING); ++ return 0; ++ } ++ /* Found the valid .so name with a specific version. */ ++ fprintf (f, "%s\n", h2_name); ++ return 0; ++ } ++ ]]), [ ++ DLOPEN_LIBRPM="`cat conftest.out`" ++ if test "x$DLOPEN_LIBRPM" != "x"; then ++ HAVE_DLOPEN_LIBRPM=true ++ AC_MSG_RESULT($DLOPEN_LIBRPM) ++ fi ++ ]) ++ rm -f conftest.out ++ ++ m4_define([CHECK_LIBRPM_COMPAT], [ ++ AC_MSG_CHECKING([rpm library API compatibility]) ++ # The compilation requires -Werror to verify anything. ++ save_CFLAGS="$CFLAGS" ++ CFLAGS="$CFLAGS -Werror" ++ AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[ ++/* Duplicate here the declarations to verify they match "elfread.c". */ ++#include ++#include ++#include ++#include ++extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); ++extern int rpmReadConfigFiles(const char * file, const char * target); ++extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); ++extern Header rpmdbNextIterator(rpmdbMatchIterator mi); ++extern rpmts rpmtsCreate(void); ++extern rpmts rpmtsFree(rpmts ts); ++extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag, ++ const void * keyp, size_t keylen); ++ ]]), [ ++ LIBRPM_COMPAT=true ++ AC_MSG_RESULT(yes) ++ ], [ ++ LIBRPM_COMPAT=false ++ AC_MSG_RESULT(no) ++ ]) ++ CFLAGS="$save_CFLAGS" ++ ]) ++ ++ if $HAVE_DLOPEN_LIBRPM; then ++ CHECK_LIBRPM_COMPAT ++ if ! $LIBRPM_COMPAT; then ++ HAVE_DLOPEN_LIBRPM=false ++ fi ++ fi ++ ++ if $HAVE_DLOPEN_LIBRPM; then ++ DLOPEN_LIBRPM_STRING='"'"$DLOPEN_LIBRPM"'"' ++ AC_DEFINE_UNQUOTED(DLOPEN_LIBRPM, $DLOPEN_LIBRPM_STRING, [librpm version specific library name to dlopen.]) ++ AC_DEFINE(HAVE_LIBRPM, 1, [Define if librpm library is being used.]) ++ else ++ AC_MSG_RESULT(no) ++ LIBS="$save_LIBS" ++ if $DLOPEN_REQUIRE; then ++ AC_MSG_ERROR([Specific name $LIBRPM was requested but it could not be opened.]) ++ fi ++ PKG_CHECK_MODULES(RPM, rpm, [HAVE_LIBRPM=true], [HAVE_LIBRPM=false]) ++ ++ if $HAVE_LIBRPM; then ++ CHECK_LIBRPM_COMPAT ++ if ! $LIBRPM_COMPAT; then ++ HAVE_LIBRPM=false ++ RPM_PKG_ERRORS="Found $LIBRPM API is incompatibile with this GDB" ++ fi ++ fi ++ ++ if $HAVE_LIBRPM; then ++ AC_DEFINE(HAVE_LIBRPM, 1, [Define if librpm library is being used.]) ++ CFLAGS="$CFLAGS $RPM_CFLAGS" ++ LIBS="$LIBS $RPM_LIBS" ++ else ++ if $RPM_REQUIRE; then ++ AC_MSG_ERROR($RPM_PKG_ERRORS) ++ else ++ AC_MSG_WARN($RPM_PKG_ERRORS) ++ fi ++ fi ++ fi ++fi ++ + AC_CONFIG_SUBDIRS(testsuite) + + # Check whether to support alternative target configurations +diff --git a/gdb/event-top.c b/gdb/event-top.c +--- a/gdb/event-top.c ++++ b/gdb/event-top.c +@@ -43,6 +43,7 @@ + #include "async-event.h" + #include "bt-utils.h" + #include "pager.h" ++#include "symfile.h" + + /* readline include files. */ + #include "readline/readline.h" +@@ -404,6 +405,8 @@ display_gdb_prompt (const char *new_prompt) + /* Reset the nesting depth used when trace-commands is set. */ + reset_command_nest_depth (); + ++ debug_flush_missing (); ++ + /* 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. */ +@@ -788,7 +791,10 @@ command_line_handler (gdb::unique_xmalloc_ptr &&rl) + command_handler (cmd); + + if (ui->prompt_state != PROMPTED) +- display_gdb_prompt (0); ++ { ++ debug_flush_missing (); ++ display_gdb_prompt (0); ++ } + } + } + +diff --git a/gdb/symfile.h b/gdb/symfile.h +--- a/gdb/symfile.h ++++ b/gdb/symfile.h +@@ -367,6 +367,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") + + /* From minidebug.c. */ diff --git a/gdb-6.6-buildid-locate-solib-missing-ids.patch b/gdb-6.6-buildid-locate-solib-missing-ids.patch new file mode 100644 index 0000000..f52fbd9 --- /dev/null +++ b/gdb-6.6-buildid-locate-solib-missing-ids.patch @@ -0,0 +1,238 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.6-buildid-locate-solib-missing-ids.patch + +;; Fix loading of core files without build-ids but with build-ids in executables. +;; Load strictly build-id-checked core files only if no executable is specified +;; (Jan Kratochvil, RH BZ 1339862). +;;=push+jan + +gdb returns an incorrect back trace when applying a debuginfo +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 +@@ -1320,14 +1320,28 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, + } + + { +- struct bfd_build_id *build_id; ++ struct bfd_build_id *build_id = NULL; + + strncpy (newobj->so_original_name, buffer.get (), SO_NAME_MAX_PATH_SIZE - 1); + newobj->so_original_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; + /* May get overwritten below. */ + strcpy (newobj->so_name, newobj->so_original_name); + +- build_id = build_id_addr_get (((lm_info_svr4 *) newobj->lm_info)->l_ld); ++ /* In the case the main executable was found according to its build-id ++ (from a core file) prevent loading a different build of a library ++ with accidentally the same SO_NAME. ++ ++ It suppresses bogus backtraces (and prints "??" there instead) if ++ the on-disk files no longer match the running program version. ++ ++ If the main executable was not loaded according to its build-id do ++ not do any build-id checking of the libraries. There may be missing ++ build-ids dumped in the core file and we would map all the libraries ++ to the only existing file loaded that time - the executable. */ ++ if (current_program_space->symfile_object_file != NULL ++ && (current_program_space->symfile_object_file->flags ++ & OBJF_BUILD_ID_CORE_LOADED) != 0) ++ build_id = build_id_addr_get (li->l_ld); + if (build_id != NULL) + { + char *name, *build_id_filename; +@@ -1342,23 +1356,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, + xfree (name); + } + else +- { +- debug_print_missing (newobj->so_name, build_id_filename); +- +- /* In the case the main executable was found according to +- its build-id (from a core file) prevent loading +- a different build of a library with accidentally the +- same SO_NAME. +- +- It suppresses bogus backtraces (and prints "??" there +- instead) if the on-disk files no longer match the +- running program version. */ +- +- if (current_program_space->symfile_object_file != NULL +- && (current_program_space->symfile_object_file->flags +- & OBJF_BUILD_ID_CORE_LOADED) != 0) +- newobj->so_name[0] = 0; +- } ++ debug_print_missing (newobj->so_name, build_id_filename); + + xfree (build_id_filename); + xfree (build_id); +diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c +@@ -0,0 +1,21 @@ ++/* Copyright 2010 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 . */ ++ ++void ++lib (void) ++{ ++} +diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c +@@ -0,0 +1,25 @@ ++/* Copyright 2010 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 . */ ++ ++extern void lib (void); ++ ++int ++main (void) ++{ ++ lib (); ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp +@@ -0,0 +1,105 @@ ++# Copyright 2016 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 . ++ ++if {[skip_shlib_tests]} { ++ return 0 ++} ++ ++set testfile "gcore-buildid-exec-but-not-solib" ++set srcmainfile ${testfile}-main.c ++set srclibfile ${testfile}-lib.c ++set libfile [standard_output_file ${testfile}-lib.so] ++set objfile [standard_output_file ${testfile}-main.o] ++set executable ${testfile}-main ++set binfile [standard_output_file ${executable}] ++set gcorefile [standard_output_file ${executable}.gcore] ++set outdir [file dirname $binfile] ++ ++if { [gdb_compile_shlib ${srcdir}/${subdir}/${srclibfile} ${libfile} "debug additional_flags=-Wl,--build-id"] != "" ++ || [gdb_compile ${srcdir}/${subdir}/${srcmainfile} ${objfile} object {debug}] != "" } { ++ unsupported "-Wl,--build-id compilation failed" ++ return -1 ++} ++set opts [list debug shlib=${libfile} "additional_flags=-Wl,--build-id"] ++if { [gdb_compile ${objfile} ${binfile} executable $opts] != "" } { ++ unsupported "-Wl,--build-id compilation failed" ++ return -1 ++} ++ ++clean_restart $executable ++gdb_load_shlib $libfile ++ ++# Does this gdb support gcore? ++set test "help gcore" ++gdb_test_multiple $test $test { ++ -re "Undefined command: .gcore.*\r\n$gdb_prompt $" { ++ # gcore command not supported -- nothing to test here. ++ unsupported "gdb does not support gcore on this target" ++ return -1; ++ } ++ -re "Save a core file .*\r\n$gdb_prompt $" { ++ pass $test ++ } ++} ++ ++if { ![runto lib] } then { ++ return -1 ++} ++ ++set escapedfilename [string_to_regexp ${gcorefile}] ++ ++set test "save a corefile" ++gdb_test_multiple "gcore ${gcorefile}" $test { ++ -re "Saved corefile ${escapedfilename}\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re "Can't create a corefile\r\n$gdb_prompt $" { ++ unsupported $test ++ return -1 ++ } ++} ++ ++# Now restart gdb and load the corefile. ++ ++clean_restart $executable ++gdb_load_shlib $libfile ++ ++set buildid [build_id_debug_filename_get $libfile] ++ ++regsub {\.debug$} $buildid {} buildid ++ ++set debugdir [standard_output_file ${testfile}-debugdir] ++file delete -force -- $debugdir ++ ++file mkdir $debugdir/[file dirname $libfile] ++file copy $libfile $debugdir/${libfile} ++ ++file mkdir $debugdir/[file dirname $buildid] ++file copy $libfile $debugdir/${buildid} ++ ++remote_exec build "ln -s /lib ${debugdir}/" ++remote_exec build "ln -s /lib64 ${debugdir}/" ++# /usr is not needed, all the libs are in /lib64: libm.so.6 libc.so.6 ld-linux-x86-64.so.2 ++ ++gdb_test "set solib-absolute-prefix $debugdir" ++ ++gdb_test_no_output "set debug-file-directory $debugdir" "set debug-file-directory" ++ ++gdb_test "core ${gcorefile}" "Core was generated by .*" "re-load generated corefile" ++ ++gdb_test "frame" "#0 \[^\r\n\]* lib .*" "library got loaded" ++ ++gdb_test "bt" ++gdb_test "info shared" diff --git a/gdb-6.6-buildid-locate.patch b/gdb-6.6-buildid-locate.patch new file mode 100644 index 0000000..c2d7077 --- /dev/null +++ b/gdb-6.6-buildid-locate.patch @@ -0,0 +1,1925 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.6-buildid-locate.patch + +;; New locating of the matching binaries from the pure core file (build-id). +;;=push+jan + +diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h +--- a/bfd/libbfd-in.h ++++ b/bfd/libbfd-in.h +@@ -110,7 +110,7 @@ static inline char * + bfd_strdup (const char *str) + { + size_t len = strlen (str) + 1; +- char *buf = bfd_malloc (len); ++ char *buf = (char *) bfd_malloc (len); + if (buf != NULL) + memcpy (buf, str, len); + return buf; +diff --git a/bfd/libbfd.h b/bfd/libbfd.h +--- a/bfd/libbfd.h ++++ b/bfd/libbfd.h +@@ -116,7 +116,7 @@ static inline char * + bfd_strdup (const char *str) + { + size_t len = strlen (str) + 1; +- char *buf = bfd_malloc (len); ++ char *buf = (char *) bfd_malloc (len); + if (buf != NULL) + memcpy (buf, str, len); + return buf; +diff --git a/gdb/build-id.c b/gdb/build-id.c +--- a/gdb/build-id.c ++++ b/gdb/build-id.c +@@ -24,14 +24,72 @@ + #include "gdbsupport/gdb_vecs.h" + #include "symfile.h" + #include "objfiles.h" ++#include ++#include "elf-bfd.h" ++#include "elf/common.h" ++#include "elf/external.h" ++#include "elf/internal.h" + #include "filenames.h" ++#include "gdb_bfd.h" ++#include "gdbcmd.h" + #include "gdbcore.h" + #include "cli/cli-style.h" ++#include "inferior.h" ++#include "objfiles.h" ++#include "observable.h" ++#include "symfile.h" ++ ++#define BUILD_ID_VERBOSE_NONE 0 ++#define BUILD_ID_VERBOSE_FILENAMES 1 ++#define BUILD_ID_VERBOSE_BINARY_PARSE 2 ++static int build_id_verbose = BUILD_ID_VERBOSE_FILENAMES; ++static void ++show_build_id_verbose (struct ui_file *file, int from_tty, ++ struct cmd_list_element *c, const char *value) ++{ ++ gdb_printf (file, _("Verbosity level of the build-id locator is %s.\n"), ++ value); ++} ++/* Locate NT_GNU_BUILD_ID and return its matching debug filename. ++ FIXME: NOTE decoding should be unified with the BFD core notes decoding. */ ++ ++static struct bfd_build_id * ++build_id_buf_get (bfd *templ, gdb_byte *buf, bfd_size_type size) ++{ ++ bfd_byte *p; ++ ++ p = buf; ++ while (p < buf + size) ++ { ++ /* FIXME: bad alignment assumption. */ ++ Elf_External_Note *xnp = (Elf_External_Note *) p; ++ size_t namesz = H_GET_32 (templ, xnp->namesz); ++ size_t descsz = H_GET_32 (templ, xnp->descsz); ++ bfd_byte *descdata = (gdb_byte *) xnp->name + BFD_ALIGN (namesz, 4); ++ ++ if (H_GET_32 (templ, xnp->type) == NT_GNU_BUILD_ID ++ && namesz == sizeof "GNU" ++ && memcmp (xnp->name, "GNU", sizeof "GNU") == 0) ++ { ++ size_t sz = descsz; ++ gdb_byte *data = (gdb_byte *) descdata; ++ struct bfd_build_id *retval; ++ ++ retval = (struct bfd_build_id *) xmalloc (sizeof *retval - 1 + sz); ++ retval->size = sz; ++ memcpy (retval->data, data, sz); ++ ++ return retval; ++ } ++ p = descdata + BFD_ALIGN (descsz, 4); ++ } ++ return NULL; ++} + + /* See build-id.h. */ + + const struct bfd_build_id * +-build_id_bfd_get (bfd *abfd) ++build_id_bfd_shdr_get (bfd *abfd) + { + /* Dynamic objfiles such as ones created by JIT reader API + have no underlying bfd structure (that is, objfile->obfd +@@ -50,6 +108,348 @@ build_id_bfd_get (bfd *abfd) + return NULL; + } + ++/* Core files may have missing (corrupt) SHDR but PDHR is correct there. ++ bfd_elf_bfd_from_remote_memory () has too much overhead by ++ allocating/reading all the available ELF PT_LOADs. */ ++ ++static struct bfd_build_id * ++build_id_phdr_get (bfd *templ, bfd_vma loadbase, unsigned e_phnum, ++ Elf_Internal_Phdr *i_phdr) ++{ ++ int i; ++ struct bfd_build_id *retval = NULL; ++ ++ for (i = 0; i < e_phnum; i++) ++ if (i_phdr[i].p_type == PT_NOTE && i_phdr[i].p_filesz > 0) ++ { ++ Elf_Internal_Phdr *hdr = &i_phdr[i]; ++ gdb_byte *buf; ++ int err; ++ ++ buf = (gdb_byte *) xmalloc (hdr->p_filesz); ++ err = target_read_memory (loadbase + i_phdr[i].p_vaddr, buf, ++ hdr->p_filesz); ++ if (err == 0) ++ retval = build_id_buf_get (templ, buf, hdr->p_filesz); ++ else ++ retval = NULL; ++ xfree (buf); ++ if (retval != NULL) ++ break; ++ } ++ return retval; ++} ++ ++/* First we validate the file by reading in the ELF header and checking ++ the magic number. */ ++ ++static inline bfd_boolean ++elf_file_p (Elf64_External_Ehdr *x_ehdrp64) ++{ ++ gdb_assert (sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr)); ++ gdb_assert (offsetof (Elf64_External_Ehdr, e_ident) ++ == offsetof (Elf32_External_Ehdr, e_ident)); ++ gdb_assert (sizeof (((Elf64_External_Ehdr *) 0)->e_ident) ++ == sizeof (((Elf32_External_Ehdr *) 0)->e_ident)); ++ ++ return ((x_ehdrp64->e_ident[EI_MAG0] == ELFMAG0) ++ && (x_ehdrp64->e_ident[EI_MAG1] == ELFMAG1) ++ && (x_ehdrp64->e_ident[EI_MAG2] == ELFMAG2) ++ && (x_ehdrp64->e_ident[EI_MAG3] == ELFMAG3)); ++} ++ ++/* Translate an ELF file header in external format into an ELF file header in ++ internal format. */ ++ ++#define H_GET_WORD(bfd, ptr) (is64 ? H_GET_64 (bfd, (ptr)) \ ++ : H_GET_32 (bfd, (ptr))) ++#define H_GET_SIGNED_WORD(bfd, ptr) (is64 ? H_GET_S64 (bfd, (ptr)) \ ++ : H_GET_S32 (bfd, (ptr))) ++ ++static void ++elf_swap_ehdr_in (bfd *abfd, ++ const Elf64_External_Ehdr *src64, ++ Elf_Internal_Ehdr *dst) ++{ ++ int is64 = bfd_get_arch_size (abfd) == 64; ++#define SRC(field) (is64 ? src64->field \ ++ : ((const Elf32_External_Ehdr *) src64)->field) ++ ++ int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; ++ memcpy (dst->e_ident, SRC (e_ident), EI_NIDENT); ++ dst->e_type = H_GET_16 (abfd, SRC (e_type)); ++ dst->e_machine = H_GET_16 (abfd, SRC (e_machine)); ++ dst->e_version = H_GET_32 (abfd, SRC (e_version)); ++ if (signed_vma) ++ dst->e_entry = H_GET_SIGNED_WORD (abfd, SRC (e_entry)); ++ else ++ dst->e_entry = H_GET_WORD (abfd, SRC (e_entry)); ++ dst->e_phoff = H_GET_WORD (abfd, SRC (e_phoff)); ++ dst->e_shoff = H_GET_WORD (abfd, SRC (e_shoff)); ++ dst->e_flags = H_GET_32 (abfd, SRC (e_flags)); ++ dst->e_ehsize = H_GET_16 (abfd, SRC (e_ehsize)); ++ dst->e_phentsize = H_GET_16 (abfd, SRC (e_phentsize)); ++ dst->e_phnum = H_GET_16 (abfd, SRC (e_phnum)); ++ dst->e_shentsize = H_GET_16 (abfd, SRC (e_shentsize)); ++ dst->e_shnum = H_GET_16 (abfd, SRC (e_shnum)); ++ dst->e_shstrndx = H_GET_16 (abfd, SRC (e_shstrndx)); ++ ++#undef SRC ++} ++ ++/* Translate an ELF program header table entry in external format into an ++ ELF program header table entry in internal format. */ ++ ++static void ++elf_swap_phdr_in (bfd *abfd, ++ const Elf64_External_Phdr *src64, ++ Elf_Internal_Phdr *dst) ++{ ++ int is64 = bfd_get_arch_size (abfd) == 64; ++#define SRC(field) (is64 ? src64->field \ ++ : ((const Elf32_External_Phdr *) src64)->field) ++ ++ int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; ++ ++ dst->p_type = H_GET_32 (abfd, SRC (p_type)); ++ dst->p_flags = H_GET_32 (abfd, SRC (p_flags)); ++ dst->p_offset = H_GET_WORD (abfd, SRC (p_offset)); ++ if (signed_vma) ++ { ++ dst->p_vaddr = H_GET_SIGNED_WORD (abfd, SRC (p_vaddr)); ++ dst->p_paddr = H_GET_SIGNED_WORD (abfd, SRC (p_paddr)); ++ } ++ else ++ { ++ dst->p_vaddr = H_GET_WORD (abfd, SRC (p_vaddr)); ++ dst->p_paddr = H_GET_WORD (abfd, SRC (p_paddr)); ++ } ++ dst->p_filesz = H_GET_WORD (abfd, SRC (p_filesz)); ++ dst->p_memsz = H_GET_WORD (abfd, SRC (p_memsz)); ++ dst->p_align = H_GET_WORD (abfd, SRC (p_align)); ++ ++#undef SRC ++} ++ ++#undef H_GET_SIGNED_WORD ++#undef H_GET_WORD ++ ++static Elf_Internal_Phdr * ++elf_get_phdr (bfd *templ, bfd_vma ehdr_vma, unsigned *e_phnum_pointer, ++ bfd_vma *loadbase_pointer) ++{ ++ /* sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr) */ ++ Elf64_External_Ehdr x_ehdr64; /* Elf file header, external form */ ++ Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */ ++ bfd_size_type x_phdrs_size; ++ gdb_byte *x_phdrs_ptr; ++ Elf_Internal_Phdr *i_phdrs; ++ int err; ++ unsigned int i; ++ bfd_vma loadbase; ++ int loadbase_set; ++ ++ gdb_assert (templ != NULL); ++ gdb_assert (sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr)); ++ ++ /* Read in the ELF header in external format. */ ++ err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr64, sizeof x_ehdr64); ++ if (err) ++ { ++ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) ++ warning (_("build-id: Error reading ELF header at address 0x%lx"), ++ (unsigned long) ehdr_vma); ++ return NULL; ++ } ++ ++ /* Now check to see if we have a valid ELF file, and one that BFD can ++ make use of. The magic number must match, the address size ('class') ++ and byte-swapping must match our XVEC entry. */ ++ ++ if (! elf_file_p (&x_ehdr64) ++ || x_ehdr64.e_ident[EI_VERSION] != EV_CURRENT ++ || !((bfd_get_arch_size (templ) == 64 ++ && x_ehdr64.e_ident[EI_CLASS] == ELFCLASS64) ++ || (bfd_get_arch_size (templ) == 32 ++ && x_ehdr64.e_ident[EI_CLASS] == ELFCLASS32))) ++ { ++ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) ++ warning (_("build-id: Unrecognized ELF header at address 0x%lx"), ++ (unsigned long) ehdr_vma); ++ return NULL; ++ } ++ ++ /* Check that file's byte order matches xvec's */ ++ switch (x_ehdr64.e_ident[EI_DATA]) ++ { ++ case ELFDATA2MSB: /* Big-endian */ ++ if (! bfd_header_big_endian (templ)) ++ { ++ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) ++ warning (_("build-id: Unrecognized " ++ "big-endian ELF header at address 0x%lx"), ++ (unsigned long) ehdr_vma); ++ return NULL; ++ } ++ break; ++ case ELFDATA2LSB: /* Little-endian */ ++ if (! bfd_header_little_endian (templ)) ++ { ++ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) ++ warning (_("build-id: Unrecognized " ++ "little-endian ELF header at address 0x%lx"), ++ (unsigned long) ehdr_vma); ++ return NULL; ++ } ++ break; ++ case ELFDATANONE: /* No data encoding specified */ ++ default: /* Unknown data encoding specified */ ++ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) ++ warning (_("build-id: Unrecognized " ++ "ELF header endianity at address 0x%lx"), ++ (unsigned long) ehdr_vma); ++ return NULL; ++ } ++ ++ elf_swap_ehdr_in (templ, &x_ehdr64, &i_ehdr); ++ ++ /* The file header tells where to find the program headers. ++ These are what we use to actually choose what to read. */ ++ ++ if (i_ehdr.e_phentsize != (bfd_get_arch_size (templ) == 64 ++ ? sizeof (Elf64_External_Phdr) ++ : sizeof (Elf32_External_Phdr)) ++ || i_ehdr.e_phnum == 0) ++ { ++ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) ++ warning (_("build-id: Invalid ELF program headers from the ELF header " ++ "at address 0x%lx"), (unsigned long) ehdr_vma); ++ return NULL; ++ } ++ ++ x_phdrs_size = (bfd_get_arch_size (templ) == 64 ? sizeof (Elf64_External_Phdr) ++ : sizeof (Elf32_External_Phdr)); ++ ++ i_phdrs = (Elf_Internal_Phdr *) xmalloc (i_ehdr.e_phnum * (sizeof *i_phdrs + x_phdrs_size)); ++ x_phdrs_ptr = (gdb_byte *) &i_phdrs[i_ehdr.e_phnum]; ++ err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs_ptr, ++ i_ehdr.e_phnum * x_phdrs_size); ++ if (err) ++ { ++ free (i_phdrs); ++ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) ++ warning (_("build-id: Error reading " ++ "ELF program headers at address 0x%lx"), ++ (unsigned long) (ehdr_vma + i_ehdr.e_phoff)); ++ return NULL; ++ } ++ ++ loadbase = ehdr_vma; ++ loadbase_set = 0; ++ for (i = 0; i < i_ehdr.e_phnum; ++i) ++ { ++ elf_swap_phdr_in (templ, (Elf64_External_Phdr *) ++ (x_phdrs_ptr + i * x_phdrs_size), &i_phdrs[i]); ++ /* IA-64 vDSO may have two mappings for one segment, where one mapping ++ is executable only, and one is read only. We must not use the ++ executable one (PF_R is the first one, PF_X the second one). */ ++ if (i_phdrs[i].p_type == PT_LOAD && (i_phdrs[i].p_flags & PF_R)) ++ { ++ /* Only the first PT_LOAD segment indicates the file bias. ++ Next segments may have P_VADDR arbitrarily higher. ++ If the first segment has P_VADDR zero any next segment must not ++ confuse us, the first one sets LOADBASE certainly enough. */ ++ if (!loadbase_set && i_phdrs[i].p_offset == 0) ++ { ++ loadbase = ehdr_vma - i_phdrs[i].p_vaddr; ++ loadbase_set = 1; ++ } ++ } ++ } ++ ++ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) ++ warning (_("build-id: Found ELF header at address 0x%lx, loadbase 0x%lx"), ++ (unsigned long) ehdr_vma, (unsigned long) loadbase); ++ ++ *e_phnum_pointer = i_ehdr.e_phnum; ++ *loadbase_pointer = loadbase; ++ return i_phdrs; ++} ++ ++/* BUILD_ID_ADDR_GET gets ADDR located somewhere in the object. ++ Find the first section before ADDR containing an ELF header. ++ We rely on the fact the sections from multiple files do not mix. ++ FIXME: We should check ADDR is contained _inside_ the section with possibly ++ missing content (P_FILESZ < P_MEMSZ). These omitted sections are currently ++ hidden by _BFD_ELF_MAKE_SECTION_FROM_PHDR. */ ++ ++static CORE_ADDR build_id_addr; ++struct build_id_addr_sect ++ { ++ struct build_id_addr_sect *next; ++ asection *sect; ++ }; ++static struct build_id_addr_sect *build_id_addr_sect; ++ ++static void build_id_addr_candidate (bfd *abfd, asection *sect, void *obj) ++{ ++ if (build_id_addr >= bfd_section_vma (sect)) ++ { ++ struct build_id_addr_sect *candidate; ++ ++ candidate = (struct build_id_addr_sect *) xmalloc (sizeof *candidate); ++ candidate->next = build_id_addr_sect; ++ build_id_addr_sect = candidate; ++ candidate->sect = sect; ++ } ++} ++ ++struct bfd_build_id * ++build_id_addr_get (CORE_ADDR addr) ++{ ++ struct build_id_addr_sect *candidate; ++ struct bfd_build_id *retval = NULL; ++ Elf_Internal_Phdr *i_phdr = NULL; ++ bfd_vma loadbase = 0; ++ unsigned e_phnum = 0; ++ ++ if (core_bfd == NULL) ++ return NULL; ++ ++ build_id_addr = addr; ++ gdb_assert (build_id_addr_sect == NULL); ++ bfd_map_over_sections (core_bfd, build_id_addr_candidate, NULL); ++ ++ /* Sections are sorted in the high-to-low VMAs order. ++ Stop the search on the first ELF header we find. ++ Do not continue the search even if it does not contain NT_GNU_BUILD_ID. */ ++ ++ for (candidate = build_id_addr_sect; candidate != NULL; ++ candidate = candidate->next) ++ { ++ i_phdr = elf_get_phdr (core_bfd, ++ bfd_section_vma (candidate->sect), ++ &e_phnum, &loadbase); ++ if (i_phdr != NULL) ++ break; ++ } ++ ++ if (i_phdr != NULL) ++ { ++ retval = build_id_phdr_get (core_bfd, loadbase, e_phnum, i_phdr); ++ xfree (i_phdr); ++ } ++ ++ while (build_id_addr_sect != NULL) ++ { ++ candidate = build_id_addr_sect; ++ build_id_addr_sect = candidate->next; ++ xfree (candidate); ++ } ++ ++ return retval; ++} ++ + /* See build-id.h. */ + + int +@@ -58,7 +458,7 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) + const struct bfd_build_id *found; + int retval = 0; + +- found = build_id_bfd_get (abfd); ++ found = build_id_bfd_shdr_get (abfd); + + if (found == NULL) + warning (_("File \"%s\" has no build-id, file skipped"), +@@ -73,63 +473,166 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) + return retval; + } + ++static char * ++link_resolve (const char *symlink, int level) ++{ ++ char buf[PATH_MAX + 1], *retval; ++ gdb::unique_xmalloc_ptr target; ++ ssize_t got; ++ ++ if (level > 10) ++ return xstrdup (symlink); ++ ++ got = readlink (symlink, buf, sizeof (buf)); ++ if (got < 0 || got >= sizeof (buf)) ++ return xstrdup (symlink); ++ buf[got] = '\0'; ++ ++ if (IS_ABSOLUTE_PATH (buf)) ++ target = make_unique_xstrdup (buf); ++ else ++ { ++ const std::string dir (ldirname (symlink)); ++ ++ target = xstrprintf ("%s" ++#ifndef HAVE_DOS_BASED_FILE_SYSTEM ++ "/" ++#else /* HAVE_DOS_BASED_FILE_SYSTEM */ ++ "\\" ++#endif /* HAVE_DOS_BASED_FILE_SYSTEM */ ++ "%s", dir.c_str(), buf); ++ } ++ ++ retval = link_resolve (target.get (), level + 1); ++ return retval; ++} ++ + /* Helper for build_id_to_debug_bfd. LINK is a path to a potential + build-id-based separate debug file, potentially a symlink to the real file. + If the file exists and matches BUILD_ID, return a BFD reference to it. */ + + static gdb_bfd_ref_ptr +-build_id_to_debug_bfd_1 (const std::string &link, size_t build_id_len, +- const bfd_byte *build_id) ++build_id_to_debug_bfd_1 (const std::string &orig_link, size_t build_id_len, ++ const bfd_byte *build_id, char **link_return) + { ++ gdb_bfd_ref_ptr ret_bfd = {}; ++ std::string ret_link; ++ + if (separate_debug_file_debug) + { +- gdb_printf (gdb_stdlog, _(" Trying %s..."), link.c_str ()); +- gdb_flush (gdb_stdlog); ++ gdb_printf (gdb_stdlog, _(" Trying %s..."), orig_link.c_str ()); ++ gdb_flush (gdb_stdout); + } + +- /* lrealpath() is expensive even for the usually non-existent files. */ +- gdb::unique_xmalloc_ptr filename_holder; +- const char *filename = nullptr; +- if (startswith (link, TARGET_SYSROOT_PREFIX)) +- filename = link.c_str (); +- else if (access (link.c_str (), F_OK) == 0) ++ for (unsigned seqno = 0;; seqno++) + { +- filename_holder.reset (lrealpath (link.c_str ())); +- filename = filename_holder.get (); +- } ++ std::string link = orig_link; + +- if (filename == NULL) +- { +- if (separate_debug_file_debug) +- gdb_printf (gdb_stdlog, +- _(" no, unable to compute real path\n")); ++ if (seqno > 0) ++ { ++ /* There can be multiple build-id symlinks pointing to real files ++ with the same build-id (such as hard links). Some of the real ++ files may not be installed. */ + +- return {}; +- } ++ string_appendf (link, ".%u", seqno); ++ } + +- /* We expect to be silent on the non-existing files. */ +- gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename, gnutarget); ++ ret_link = link; + +- if (debug_bfd == NULL) +- { +- if (separate_debug_file_debug) +- gdb_printf (gdb_stdlog, _(" no, unable to open.\n")); ++ struct stat statbuf_trash; ++ ++ /* `access' automatically dereferences LINK. */ ++ if (lstat (link.c_str (), &statbuf_trash) != 0) ++ { ++ /* Stop increasing SEQNO. */ ++ break; ++ } ++ ++ /* lrealpath() is expensive even for the usually non-existent files. */ ++ gdb::unique_xmalloc_ptr filename_holder; ++ const char *filename = nullptr; ++ if (startswith (link, TARGET_SYSROOT_PREFIX)) ++ filename = link.c_str (); ++ else if (access (link.c_str (), F_OK) == 0) ++ { ++ filename_holder.reset (lrealpath (link.c_str ())); ++ filename = filename_holder.get (); ++ } ++ ++ if (filename == NULL) ++ { ++ if (separate_debug_file_debug) ++ gdb_printf (gdb_stdlog, ++ _(" no, unable to compute real path\n")); ++ ++ continue; ++ } ++ ++ /* We expect to be silent on the non-existing files. */ ++ gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename, gnutarget); ++ ++ if (debug_bfd == NULL) ++ { ++ if (separate_debug_file_debug) ++ gdb_printf (gdb_stdlog, _(" no, unable to open.\n")); + +- return {}; ++ continue; ++ } ++ ++ if (!build_id_verify (debug_bfd.get(), build_id_len, build_id)) ++ { ++ if (separate_debug_file_debug) ++ gdb_printf (gdb_stdlog, ++ _(" no, build-id does not match.\n")); ++ ++ continue; ++ } ++ ++ ret_bfd = debug_bfd; ++ break; + } + +- if (!build_id_verify (debug_bfd.get(), build_id_len, build_id)) ++ std::string link_all; ++ ++ if (ret_bfd != NULL) + { + if (separate_debug_file_debug) +- gdb_printf (gdb_stdlog, _(" no, build-id does not match.\n")); ++ gdb_printf (gdb_stdlog, _(" yes!\n")); ++ } ++ else ++ { ++ /* If none of the real files is found report as missing file ++ always the non-.%u-suffixed file. */ ++ std::string link0 = orig_link; + +- return {}; ++ /* If the symlink has target request to install the target. ++ BASE-debuginfo.rpm contains the symlink but BASE.rpm may be missing. ++ https://bugzilla.redhat.com/show_bug.cgi?id=981154 */ ++ std::string link0_resolved (link_resolve (link0.c_str (), 0)); ++ ++ if (link_all.empty ()) ++ link_all = link0_resolved; ++ else ++ { ++ /* Use whitespace instead of DIRNAME_SEPARATOR to be compatible with ++ its possible use as an argument for installation command. */ ++ link_all += " " + link0_resolved; ++ } + } + +- if (separate_debug_file_debug) +- gdb_printf (gdb_stdlog, _(" yes!\n")); ++ if (link_return != NULL) ++ { ++ if (ret_bfd != NULL) ++ { ++ *link_return = xstrdup (ret_link.c_str ()); ++ } ++ else ++ { ++ *link_return = xstrdup (link_all.c_str ()); ++ } ++ } + +- return debug_bfd; ++ return ret_bfd; + } + + /* Common code for finding BFDs of a given build-id. This function +@@ -138,7 +641,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, +- const char *suffix) ++ const char *suffix, char **link_return) + { + /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will + cause "/.build-id/..." lookups. */ +@@ -161,16 +664,17 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, + if (size > 0) + { + size--; +- string_appendf (link, "%02x/", (unsigned) *data++); ++ string_appendf (link, "%02x", (unsigned) *data++); + } +- ++ if (size > 0) ++ link += "/"; + while (size-- > 0) + string_appendf (link, "%02x", (unsigned) *data++); + + link += suffix; + + gdb_bfd_ref_ptr debug_bfd +- = build_id_to_debug_bfd_1 (link, build_id_len, build_id); ++ = build_id_to_debug_bfd_1 (link, build_id_len, build_id, link_return); + if (debug_bfd != NULL) + return debug_bfd; + +@@ -181,7 +685,7 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, + if (!gdb_sysroot.empty ()) + { + link = gdb_sysroot + link; +- debug_bfd = build_id_to_debug_bfd_1 (link, build_id_len, build_id); ++ debug_bfd = build_id_to_debug_bfd_1 (link, build_id_len, build_id, NULL); + if (debug_bfd != NULL) + return debug_bfd; + } +@@ -190,31 +694,663 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, + return {}; + } + ++char * ++build_id_to_filename (const struct bfd_build_id *build_id, char **link_return) ++{ ++ gdb_bfd_ref_ptr abfd; ++ char *result; ++ ++ abfd = build_id_to_exec_bfd (build_id->size, build_id->data, link_return); ++ if (abfd == NULL) ++ return NULL; ++ ++ result = xstrdup (bfd_get_filename (abfd.get ())); ++ return result; ++} ++ ++void debug_flush_missing (void); ++ ++#ifdef HAVE_LIBRPM ++ ++#include ++#include ++#include ++#include ++#ifdef DLOPEN_LIBRPM ++#include ++#endif ++ ++/* Workarodun https://bugzilla.redhat.com/show_bug.cgi?id=643031 ++ librpm must not exit() an application on SIGINT ++ ++ Enable or disable a signal handler. SIGNUM: signal to enable (or disable ++ if negative). HANDLER: sa_sigaction handler (or NULL to use ++ rpmsqHandler()). Returns: no. of refs, -1 on error. */ ++extern int rpmsqEnable (int signum, /* rpmsqAction_t handler */ void *handler); ++int ++rpmsqEnable (int signum, /* rpmsqAction_t handler */ void *handler) ++{ ++ return 0; ++} ++ ++/* This MISSING_RPM_HASH tracker is used to collect all the missing rpm files ++ and avoid their duplicities during a single inferior run. */ ++ ++static struct htab *missing_rpm_hash; ++ ++/* This MISSING_RPM_LIST tracker is used to collect and print as a single line ++ all the rpms right before the nearest GDB prompt. It gets cleared after ++ each such print (it is questionable if we should clear it after the print). ++ */ ++ ++struct missing_rpm ++ { ++ struct missing_rpm *next; ++ char rpm[1]; ++ }; ++static struct missing_rpm *missing_rpm_list; ++static int missing_rpm_list_entries; ++ ++/* Returns the count of newly added rpms. */ ++ ++static int ++#ifndef GDB_INDEX_VERIFY_VENDOR ++missing_rpm_enlist (const char *filename) ++#else ++missing_rpm_enlist_1 (const char *filename, int verify_vendor) ++#endif ++{ ++ static int rpm_init_done = 0; ++ rpmts ts; ++ rpmdbMatchIterator mi; ++ int count = 0; ++ ++#ifdef DLOPEN_LIBRPM ++ /* Duplicate here the declarations to verify they match. The same sanity ++ check is present also in `configure.ac'. */ ++ extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); ++ static char *(*headerFormat_p) (Header h, const char * fmt, errmsg_t *errmsg); ++ extern int rpmReadConfigFiles(const char * file, const char * target); ++ static int (*rpmReadConfigFiles_p) (const char * file, const char * target); ++ extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); ++ static rpmdbMatchIterator (*rpmdbFreeIterator_p) (rpmdbMatchIterator mi); ++ extern Header rpmdbNextIterator(rpmdbMatchIterator mi); ++ static Header (*rpmdbNextIterator_p) (rpmdbMatchIterator mi); ++ extern rpmts rpmtsCreate(void); ++ static rpmts (*rpmtsCreate_p) (void); ++ extern rpmts rpmtsFree(rpmts ts); ++ static rpmts (*rpmtsFree_p) (rpmts ts); ++ extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, ++ const void * keyp, size_t keylen); ++ static rpmdbMatchIterator (*rpmtsInitIterator_p) (const rpmts ts, ++ rpmTag rpmtag, ++ const void *keyp, ++ size_t keylen); ++#else /* !DLOPEN_LIBRPM */ ++# define headerFormat_p headerFormat ++# define rpmReadConfigFiles_p rpmReadConfigFiles ++# define rpmdbFreeIterator_p rpmdbFreeIterator ++# define rpmdbNextIterator_p rpmdbNextIterator ++# define rpmtsCreate_p rpmtsCreate ++# define rpmtsFree_p rpmtsFree ++# define rpmtsInitIterator_p rpmtsInitIterator ++#endif /* !DLOPEN_LIBRPM */ ++ ++ gdb_assert (filename != NULL); ++ ++ if (strcmp (filename, BUILD_ID_MAIN_EXECUTABLE_FILENAME) == 0) ++ return 0; ++ ++ if (is_target_filename (filename)) ++ return 0; ++ ++ if (filename[0] != '/') ++ { ++ warning (_("Ignoring non-absolute filename: <%s>"), filename); ++ return 0; ++ } ++ ++ if (!rpm_init_done) ++ { ++ static int init_tried; ++ ++ /* Already failed the initialization before? */ ++ if (init_tried) ++ return 0; ++ init_tried = 1; ++ ++#ifdef DLOPEN_LIBRPM ++ { ++ void *h; ++ ++ h = dlopen (DLOPEN_LIBRPM, RTLD_LAZY); ++ if (!h) ++ { ++ warning (_("Unable to open \"%s\" (%s), " ++ "missing debuginfos notifications will not be displayed"), ++ DLOPEN_LIBRPM, dlerror ()); ++ return 0; ++ } ++ ++ if (!((headerFormat_p = (char *(*) (Header h, const char * fmt, errmsg_t *errmsg)) dlsym (h, "headerFormat")) ++ && (rpmReadConfigFiles_p = (int (*) (const char * file, const char * target)) dlsym (h, "rpmReadConfigFiles")) ++ && (rpmdbFreeIterator_p = (rpmdbMatchIterator (*) (rpmdbMatchIterator mi)) dlsym (h, "rpmdbFreeIterator")) ++ && (rpmdbNextIterator_p = (Header (*) (rpmdbMatchIterator mi)) dlsym (h, "rpmdbNextIterator")) ++ && (rpmtsCreate_p = (rpmts (*) (void)) dlsym (h, "rpmtsCreate")) ++ && (rpmtsFree_p = (rpmts (*) (rpmts ts)) dlsym (h, "rpmtsFree")) ++ && (rpmtsInitIterator_p = (rpmdbMatchIterator (*) (const rpmts ts, rpmTag rpmtag, const void *keyp, size_t keylen)) dlsym (h, "rpmtsInitIterator")))) ++ { ++ warning (_("Opened library \"%s\" is incompatible (%s), " ++ "missing debuginfos notifications will not be displayed"), ++ DLOPEN_LIBRPM, dlerror ()); ++ if (dlclose (h)) ++ warning (_("Error closing library \"%s\": %s\n"), DLOPEN_LIBRPM, ++ dlerror ()); ++ return 0; ++ } ++ } ++#endif /* DLOPEN_LIBRPM */ ++ ++ if (rpmReadConfigFiles_p (NULL, NULL) != 0) ++ { ++ warning (_("Error reading the rpm configuration files")); ++ return 0; ++ } ++ ++ rpm_init_done = 1; ++ } ++ ++ ts = rpmtsCreate_p (); ++ ++ mi = rpmtsInitIterator_p (ts, RPMTAG_BASENAMES, filename, 0); ++ if (mi != NULL) ++ { ++#ifndef GDB_INDEX_VERIFY_VENDOR ++ for (;;) ++#else ++ if (!verify_vendor) for (;;) ++#endif ++ { ++ Header h; ++ char *debuginfo, **slot, *s, *s2; ++ errmsg_t err; ++ size_t srcrpmlen = sizeof (".src.rpm") - 1; ++ size_t debuginfolen = sizeof ("-debuginfo") - 1; ++ rpmdbMatchIterator mi_debuginfo; ++ ++ h = rpmdbNextIterator_p (mi); ++ if (h == NULL) ++ break; ++ ++ /* Verify the debuginfo file is not already installed. */ ++ ++ debuginfo = headerFormat_p (h, "%{sourcerpm}-debuginfo.%{arch}", ++ &err); ++ if (!debuginfo) ++ { ++ warning (_("Error querying the rpm file `%s': %s"), filename, ++ err); ++ continue; ++ } ++ /* s = `.src.rpm-debuginfo.%{arch}' */ ++ s = strrchr (debuginfo, '-') - srcrpmlen; ++ s2 = NULL; ++ if (s > debuginfo && memcmp (s, ".src.rpm", srcrpmlen) == 0) ++ { ++ /* s2 = `-%{release}.src.rpm-debuginfo.%{arch}' */ ++ s2 = (char *) memrchr (debuginfo, '-', s - debuginfo); ++ } ++ if (s2) ++ { ++ /* s2 = `-%{version}-%{release}.src.rpm-debuginfo.%{arch}' */ ++ s2 = (char *) memrchr (debuginfo, '-', s2 - debuginfo); ++ } ++ if (!s2) ++ { ++ warning (_("Error querying the rpm file `%s': %s"), filename, ++ debuginfo); ++ xfree (debuginfo); ++ continue; ++ } ++ /* s = `.src.rpm-debuginfo.%{arch}' */ ++ /* s2 = `-%{version}-%{release}.src.rpm-debuginfo.%{arch}' */ ++ memmove (s2 + debuginfolen, s2, s - s2); ++ memcpy (s2, "-debuginfo", debuginfolen); ++ /* s = `XXXX.%{arch}' */ ++ /* strlen ("XXXX") == srcrpmlen + debuginfolen */ ++ /* s2 = `-debuginfo-%{version}-%{release}XX.%{arch}' */ ++ /* strlen ("XX") == srcrpmlen */ ++ memmove (s + debuginfolen, s + srcrpmlen + debuginfolen, ++ strlen (s + srcrpmlen + debuginfolen) + 1); ++ /* s = `-debuginfo-%{version}-%{release}.%{arch}' */ ++ ++ /* RPMDBI_PACKAGES requires keylen == sizeof (int). */ ++ /* RPMDBI_LABEL is an interface for NVR-based dbiFindByLabel(). */ ++ mi_debuginfo = rpmtsInitIterator_p (ts, (rpmTag) RPMDBI_LABEL, debuginfo, 0); ++ xfree (debuginfo); ++ if (mi_debuginfo) ++ { ++ rpmdbFreeIterator_p (mi_debuginfo); ++ count = 0; ++ break; ++ } ++ ++ /* The allocated memory gets utilized below for MISSING_RPM_HASH. */ ++ debuginfo = headerFormat_p (h, ++ "%{name}-%{version}-%{release}.%{arch}", ++ &err); ++ if (!debuginfo) ++ { ++ warning (_("Error querying the rpm file `%s': %s"), filename, ++ err); ++ continue; ++ } ++ ++ /* Base package name for `debuginfo-install'. We do not use the ++ `yum' command directly as the line ++ yum --enablerepo='*debug*' install NAME-debuginfo.ARCH ++ would be more complicated than just: ++ debuginfo-install NAME-VERSION-RELEASE.ARCH ++ Do not supply the rpm base name (derived from .src.rpm name) as ++ debuginfo-install is unable to install the debuginfo package if ++ the base name PKG binary rpm is not installed while for example ++ PKG-libs would be installed (RH Bug 467901). ++ FUTURE: After multiple debuginfo versions simultaneously installed ++ get supported the support for the VERSION-RELEASE tags handling ++ may need an update. */ ++ ++ if (missing_rpm_hash == NULL) ++ { ++ /* DEL_F is passed NULL as MISSING_RPM_LIST's HTAB_DELETE ++ should not deallocate the entries. */ ++ ++ missing_rpm_hash = htab_create_alloc (64, htab_hash_string, ++ (int (*) (const void *, const void *)) streq, ++ NULL, xcalloc, xfree); ++ } ++ slot = (char **) htab_find_slot (missing_rpm_hash, debuginfo, INSERT); ++ /* XCALLOC never returns NULL. */ ++ gdb_assert (slot != NULL); ++ if (*slot == NULL) ++ { ++ struct missing_rpm *missing_rpm; ++ ++ *slot = debuginfo; ++ ++ missing_rpm = (struct missing_rpm *) xmalloc (sizeof (*missing_rpm) + strlen (debuginfo)); ++ strcpy (missing_rpm->rpm, debuginfo); ++ missing_rpm->next = missing_rpm_list; ++ missing_rpm_list = missing_rpm; ++ missing_rpm_list_entries++; ++ } ++ else ++ xfree (debuginfo); ++ count++; ++ } ++#ifdef GDB_INDEX_VERIFY_VENDOR ++ else /* verify_vendor */ ++ { ++ int vendor_pass = 0, vendor_fail = 0; ++ ++ for (;;) ++ { ++ Header h; ++ errmsg_t err; ++ char *vendor; ++ ++ h = rpmdbNextIterator_p (mi); ++ if (h == NULL) ++ break; ++ ++ vendor = headerFormat_p (h, "%{vendor}", &err); ++ if (!vendor) ++ { ++ warning (_("Error querying the rpm file `%s': %s"), filename, ++ err); ++ continue; ++ } ++ if (strcmp (vendor, "Red Hat, Inc.") == 0) ++ vendor_pass = 1; ++ else ++ vendor_fail = 1; ++ xfree (vendor); ++ } ++ count = vendor_pass != 0 && vendor_fail == 0; ++ } ++#endif ++ ++ rpmdbFreeIterator_p (mi); ++ } ++ ++ rpmtsFree_p (ts); ++ ++ return count; ++} ++ ++#ifdef GDB_INDEX_VERIFY_VENDOR ++missing_rpm_enlist (const char *filename) ++{ ++ return missing_rpm_enlist_1 (filename, 0); ++} ++ ++extern int rpm_verify_vendor (const char *filename); ++int ++rpm_verify_vendor (const char *filename) ++{ ++ return missing_rpm_enlist_1 (filename, 1); ++} ++#endif ++ ++static bool ++missing_rpm_list_compar (const char *ap, const char *bp) ++{ ++ return strcoll (ap, bp) < 0; ++} ++ ++/* It returns a NULL-terminated array of strings needing to be FREEd. It may ++ also return only NULL. */ ++ ++static void ++missing_rpm_list_print (void) ++{ ++ struct missing_rpm *list_iter; ++ ++ if (missing_rpm_list_entries == 0) ++ return; ++ ++ std::vector array (missing_rpm_list_entries); ++ size_t idx = 0; ++ ++ for (list_iter = missing_rpm_list; list_iter != NULL; ++ list_iter = list_iter->next) ++ { ++ array[idx++] = list_iter->rpm; ++ } ++ gdb_assert (idx == missing_rpm_list_entries); ++ ++ std::sort (array.begin (), array.end (), missing_rpm_list_compar); ++ ++ /* We zero out the number of missing RPMs here because of a nasty ++ bug (see RHBZ 1801974). ++ ++ When we call 'puts_unfiltered' below, if pagination is on and if ++ the number of missing RPMs is big enough to trigger pagination, ++ we will end up in an infinite recursion. The call chain looks ++ like this: ++ ++ missing_rpm_list_print -> puts_unfiltered -> fputs_maybe_filtered ++ -> prompt_for_continue -> display_gdb_prompt -> ++ debug_flush_missing -> missing_rpm_list_print ... ++ ++ For this reason, we make sure MISSING_RPM_LIST_ENTRIES is zero ++ *before* calling any print function. ++ ++ Note: kevinb/2023-02-22: The code below used to call ++ puts_unfiltered() and printf_unfiltered(), but calls to these ++ functions have been replaced by calls to gdb_printf(). The call ++ chain shown above (probably) used to be the case at one time and ++ hopefully something similar is still the case now that ++ gdb_printf() is being used instead. */ ++ missing_rpm_list_entries = 0; ++ ++ gdb_printf (_("Missing separate debuginfos, use: %s"), ++#ifdef DNF_DEBUGINFO_INSTALL ++ "dnf " ++#endif ++ "debuginfo-install"); ++ for (const char *el : array) ++ { ++ gdb_printf (" %s", el); ++ } ++ gdb_printf ("\n"); ++ ++ while (missing_rpm_list != NULL) ++ { ++ list_iter = missing_rpm_list; ++ missing_rpm_list = list_iter->next; ++ xfree (list_iter); ++ } ++} ++ ++static void ++missing_rpm_change (void) ++{ ++ debug_flush_missing (); ++ ++ gdb_assert (missing_rpm_list == NULL); ++ if (missing_rpm_hash != NULL) ++ { ++ htab_delete (missing_rpm_hash); ++ missing_rpm_hash = NULL; ++ } ++} ++ ++enum missing_exec ++ { ++ /* Init state. EXEC_BFD also still could be NULL. */ ++ MISSING_EXEC_NOT_TRIED, ++ /* We saw a non-NULL EXEC_BFD but RPM has no info about it. */ ++ MISSING_EXEC_NOT_FOUND, ++ /* We found EXEC_BFD by RPM and we either have its symbols (either embedded ++ or separate) or the main executable's RPM is now contained in ++ MISSING_RPM_HASH. */ ++ MISSING_EXEC_ENLISTED ++ }; ++static enum missing_exec missing_exec = MISSING_EXEC_NOT_TRIED; ++ ++#endif /* HAVE_LIBRPM */ ++ ++void ++debug_flush_missing (void) ++{ ++#ifdef HAVE_LIBRPM ++ missing_rpm_list_print (); ++#endif ++} ++ ++/* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages ++ yum --enablerepo='*debug*' install ... ++ avoidance. */ ++ ++struct missing_filepair ++ { ++ char *binary; ++ char *debug; ++ char data[1]; ++ }; ++ ++static struct htab *missing_filepair_hash; ++static struct obstack missing_filepair_obstack; ++ ++static void * ++missing_filepair_xcalloc (size_t nmemb, size_t nmemb_size) ++{ ++ void *retval; ++ size_t size = nmemb * nmemb_size; ++ ++ retval = obstack_alloc (&missing_filepair_obstack, size); ++ memset (retval, 0, size); ++ return retval; ++} ++ ++static hashval_t ++missing_filepair_hash_func (const struct missing_filepair *elem) ++{ ++ hashval_t retval = 0; ++ ++ retval ^= htab_hash_string (elem->binary); ++ if (elem->debug != NULL) ++ retval ^= htab_hash_string (elem->debug); ++ ++ return retval; ++} ++ ++static int ++missing_filepair_eq (const struct missing_filepair *elem1, ++ const struct missing_filepair *elem2) ++{ ++ return strcmp (elem1->binary, elem2->binary) == 0 ++ && ((elem1->debug == NULL) == (elem2->debug == NULL)) ++ && (elem1->debug == NULL || strcmp (elem1->debug, elem2->debug) == 0); ++} ++ ++static void ++missing_filepair_change (void) ++{ ++ if (missing_filepair_hash != NULL) ++ { ++ obstack_free (&missing_filepair_obstack, NULL); ++ /* All their memory came just from missing_filepair_OBSTACK. */ ++ missing_filepair_hash = NULL; ++ } ++#ifdef HAVE_LIBRPM ++ missing_exec = MISSING_EXEC_NOT_TRIED; ++#endif ++} ++ ++static void ++debug_print_executable_changed (struct program_space *pspace, bool reload_p) ++{ ++#ifdef HAVE_LIBRPM ++ missing_rpm_change (); ++#endif ++ missing_filepair_change (); ++} ++ ++/* Notify user the file BINARY with (possibly NULL) associated separate debug ++ information file DEBUG is missing. DEBUG may or may not be the build-id ++ file such as would be: ++ /usr/lib/debug/.build-id/dd/b1d2ce632721c47bb9e8679f369e2295ce71be.debug ++ */ ++ ++void ++debug_print_missing (const char *binary, const char *debug) ++{ ++ size_t binary_len0 = strlen (binary) + 1; ++ size_t debug_len0 = debug ? strlen (debug) + 1 : 0; ++ struct missing_filepair missing_filepair_find; ++ struct missing_filepair *missing_filepair; ++ struct missing_filepair **slot; ++ ++ if (build_id_verbose < BUILD_ID_VERBOSE_FILENAMES) ++ return; ++ ++ if (missing_filepair_hash == NULL) ++ { ++ obstack_init (&missing_filepair_obstack); ++ missing_filepair_hash = htab_create_alloc (64, ++ (hashval_t (*) (const void *)) missing_filepair_hash_func, ++ (int (*) (const void *, const void *)) missing_filepair_eq, NULL, ++ missing_filepair_xcalloc, NULL); ++ } ++ ++ /* Use MISSING_FILEPAIR_FIND first instead of calling obstack_alloc with ++ obstack_free in the case of a (rare) match. The problem is ALLOC_F for ++ MISSING_FILEPAIR_HASH allocates from MISSING_FILEPAIR_OBSTACK maintenance ++ structures for MISSING_FILEPAIR_HASH. Calling obstack_free would possibly ++ not to free only MISSING_FILEPAIR but also some such structures (allocated ++ during the htab_find_slot call). */ ++ ++ missing_filepair_find.binary = (char *) binary; ++ missing_filepair_find.debug = (char *) debug; ++ slot = (struct missing_filepair **) htab_find_slot (missing_filepair_hash, ++ &missing_filepair_find, ++ INSERT); ++ ++ /* While it may be still printed duplicitely with the missing debuginfo file ++ * it is due to once printing about the binary file build-id link and once ++ * about the .debug file build-id link as both the build-id symlinks are ++ * located in the debuginfo package. */ ++ ++ if (*slot != NULL) ++ return; ++ ++ missing_filepair = (struct missing_filepair *) obstack_alloc (&missing_filepair_obstack, ++ sizeof (*missing_filepair) - 1 ++ + binary_len0 + debug_len0); ++ missing_filepair->binary = missing_filepair->data; ++ memcpy (missing_filepair->binary, binary, binary_len0); ++ if (debug != NULL) ++ { ++ missing_filepair->debug = missing_filepair->binary + binary_len0; ++ memcpy (missing_filepair->debug, debug, debug_len0); ++ } ++ else ++ missing_filepair->debug = NULL; ++ ++ *slot = missing_filepair; ++ ++#ifdef HAVE_LIBRPM ++ if (missing_exec == MISSING_EXEC_NOT_TRIED) ++ { ++ const char *execfilename = get_exec_file (0); ++ ++ if (execfilename != NULL) ++ { ++ if (missing_rpm_enlist (execfilename) == 0) ++ missing_exec = MISSING_EXEC_NOT_FOUND; ++ else ++ missing_exec = MISSING_EXEC_ENLISTED; ++ } ++ } ++ if (missing_exec != MISSING_EXEC_ENLISTED) ++ if ((binary[0] == 0 || missing_rpm_enlist (binary) == 0) ++ && (debug == NULL || missing_rpm_enlist (debug) == 0)) ++#endif /* HAVE_LIBRPM */ ++ { ++ /* We do not collect and flush these messages as each such message ++ already requires its own separate lines. */ ++ ++ gdb_printf (gdb_stdlog, ++ _("Missing separate debuginfo for %s.\n"), binary); ++ if (debug != NULL) ++ { ++ if (access (debug, F_OK) == 0) { ++ gdb_printf (gdb_stdlog, _("Try: %s %s\n"), ++#ifdef DNF_DEBUGINFO_INSTALL ++ "dnf" ++#else ++ "yum" ++#endif ++ " --enablerepo='*debug*' install", debug); ++ } else ++ gdb_printf (gdb_stdlog, _("The debuginfo package for this file is probably broken.\n")); ++ } ++ } ++} ++ + /* See build-id.h. */ + + gdb_bfd_ref_ptr +-build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id) ++build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id, ++ char **link_return) + { +- return build_id_to_bfd_suffix (build_id_len, build_id, ".debug"); ++ return build_id_to_bfd_suffix (build_id_len, build_id, ".debug", ++ link_return); + } + + /* See build-id.h. */ + + gdb_bfd_ref_ptr +-build_id_to_exec_bfd (size_t build_id_len, const bfd_byte *build_id) ++build_id_to_exec_bfd (size_t build_id_len, const bfd_byte *build_id, ++ char **link_return) + { +- return build_id_to_bfd_suffix (build_id_len, build_id, ""); ++ return build_id_to_bfd_suffix (build_id_len, build_id, "", link_return); + } + + /* See build-id.h. */ + + std::string + find_separate_debug_file_by_buildid (struct objfile *objfile, +- deferred_warnings *warnings) ++ deferred_warnings *warnings, ++ gdb::unique_xmalloc_ptr *build_id_filename_return) + { + const struct bfd_build_id *build_id; + +- build_id = build_id_bfd_get (objfile->obfd.get ()); ++ if (build_id_filename_return) ++ *build_id_filename_return = NULL; ++ ++ build_id = build_id_bfd_shdr_get (objfile->obfd.get ()); + if (build_id != NULL) + { + if (separate_debug_file_debug) +@@ -222,8 +1358,21 @@ find_separate_debug_file_by_buildid (struct objfile *objfile, + _("\nLooking for separate debug info (build-id) for " + "%s\n"), objfile_name (objfile)); + ++ char *build_id_filename_cstr = NULL; + gdb_bfd_ref_ptr abfd (build_id_to_debug_bfd (build_id->size, +- build_id->data)); ++ build_id->data, ++ (!build_id_filename_return ? NULL : &build_id_filename_cstr))); ++ if (build_id_filename_return) ++ { ++ if (!build_id_filename_cstr) ++ gdb_assert (!*build_id_filename_return); ++ else ++ { ++ *build_id_filename_return = gdb::unique_xmalloc_ptr (build_id_filename_cstr); ++ build_id_filename_cstr = NULL; ++ } ++ } ++ + /* Prevent looping on a stripped .debug file. */ + if (abfd != NULL + && filename_cmp (bfd_get_filename (abfd.get ()), +@@ -243,3 +1392,22 @@ find_separate_debug_file_by_buildid (struct objfile *objfile, + + return std::string (); + } ++ ++void _initialize_build_id (); ++ ++void ++_initialize_build_id () ++{ ++ add_setshow_zinteger_cmd ("build-id-verbose", no_class, &build_id_verbose, ++ _("\ ++Set debugging level of the build-id locator."), _("\ ++Show debugging level of the build-id locator."), _("\ ++Level 1 (default) enables printing the missing debug filenames,\n\ ++level 2 also prints the parsing of binaries to find the identificators."), ++ NULL, ++ show_build_id_verbose, ++ &setlist, &showlist); ++ ++ gdb::observers::executable_changed.attach (debug_print_executable_changed, ++ "build-id"); ++} +diff --git a/gdb/build-id.h b/gdb/build-id.h +--- a/gdb/build-id.h ++++ b/gdb/build-id.h +@@ -23,9 +23,10 @@ + #include "gdb_bfd.h" + #include "gdbsupport/rsp-low.h" + +-/* Locate NT_GNU_BUILD_ID from ABFD and return its content. */ ++/* Separate debuginfo files have corrupted PHDR but SHDR is correct there. ++ Locate NT_GNU_BUILD_ID from ABFD and return its content. */ + +-extern const struct bfd_build_id *build_id_bfd_get (bfd *abfd); ++extern const struct bfd_build_id *build_id_bfd_shdr_get (bfd *abfd); + + /* Return true if ABFD has NT_GNU_BUILD_ID matching the CHECK value. + Otherwise, issue a warning and return false. */ +@@ -38,14 +39,19 @@ extern int build_id_verify (bfd *abfd, + can be found, return NULL. */ + + extern gdb_bfd_ref_ptr build_id_to_debug_bfd (size_t build_id_len, +- const bfd_byte *build_id); ++ const bfd_byte *build_id, ++ char **link_return = NULL); ++ ++extern char *build_id_to_filename (const struct bfd_build_id *build_id, ++ char **link_return); + + /* Find and open a BFD for an executable file given a build-id. If no BFD + can be found, return NULL. The returned reference to the BFD must be + released by the caller. */ + + extern gdb_bfd_ref_ptr build_id_to_exec_bfd (size_t build_id_len, +- const bfd_byte *build_id); ++ const bfd_byte *build_id, ++ char **link_return); + + /* Find the separate debug file for OBJFILE, by using the build-id + associated with OBJFILE's BFD. If successful, returns the file name for the +@@ -58,7 +64,8 @@ extern gdb_bfd_ref_ptr build_id_to_exec_bfd (size_t build_id_len, + will be printed. */ + + extern std::string find_separate_debug_file_by_buildid +- (struct objfile *objfile, deferred_warnings *warnings); ++ (struct objfile *objfile, deferred_warnings *warnings, ++ gdb::unique_xmalloc_ptr *build_id_filename_return); + + /* Return an hex-string representation of BUILD_ID. */ + +diff --git a/gdb/coffread.c b/gdb/coffread.c +--- a/gdb/coffread.c ++++ b/gdb/coffread.c +@@ -729,7 +729,7 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) + { + deferred_warnings warnings; + std::string debugfile +- = find_separate_debug_file_by_buildid (objfile, &warnings); ++ = find_separate_debug_file_by_buildid (objfile, &warnings, NULL); + + if (debugfile.empty ()) + debugfile +diff --git a/gdb/corelow.c b/gdb/corelow.c +--- a/gdb/corelow.c ++++ b/gdb/corelow.c +@@ -22,6 +22,10 @@ + #include + #include + #include "frame.h" ++#include "auxv.h" ++#include "build-id.h" ++#include "elf/common.h" ++#include "gdbcmd.h" + #include "inferior.h" + #include "infrun.h" + #include "symtab.h" +@@ -380,6 +384,8 @@ add_to_thread_list (asection *asect, asection *reg_sect, inferior *inf) + switch_to_thread (thr); /* Yes, make it current. */ + } + ++static bool build_id_core_loads = true; ++ + /* Issue a message saying we have no core to debug, if FROM_TTY. */ + + static void +@@ -563,12 +569,14 @@ rename_vmcore_idle_reg_sections (bfd *abfd, inferior *inf) + static void + locate_exec_from_corefile_build_id (bfd *abfd, int from_tty) + { +- const bfd_build_id *build_id = build_id_bfd_get (abfd); ++ const bfd_build_id *build_id = build_id_bfd_shdr_get (abfd); + if (build_id == nullptr) + return; + ++ char *build_id_filename; + gdb_bfd_ref_ptr execbfd +- = build_id_to_exec_bfd (build_id->size, build_id->data); ++ = build_id_to_exec_bfd (build_id->size, build_id->data, ++ &build_id_filename); + + if (execbfd == nullptr) + { +@@ -596,7 +604,12 @@ locate_exec_from_corefile_build_id (bfd *abfd, int from_tty) + exec_file_attach (bfd_get_filename (execbfd.get ()), from_tty); + symbol_file_add_main (bfd_get_filename (execbfd.get ()), + symfile_add_flag (from_tty ? SYMFILE_VERBOSE : 0)); ++ if (current_program_space->symfile_object_file != NULL) ++ current_program_space->symfile_object_file->flags |= ++ OBJF_BUILD_ID_CORE_LOADED; + } ++ else ++ debug_print_missing (BUILD_ID_MAIN_EXECUTABLE_FILENAME, build_id_filename); + } + + /* See gdbcore.h. */ +@@ -1506,4 +1519,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, _("\ ++Set whether CORE-FILE loads the build-id associated files automatically."), _("\ ++Show whether CORE-FILE loads the build-id associated files automatically."), ++ NULL, NULL, NULL, ++ &setlist, &showlist); + } +diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo +--- a/gdb/doc/gdb.texinfo ++++ b/gdb/doc/gdb.texinfo +@@ -22296,6 +22296,27 @@ information files. + + @end table + ++You can also adjust the current verbosity of the @dfn{build id} locating. ++ ++@table @code ++ ++@kindex set build-id-verbose ++@item set build-id-verbose 0 ++No additional messages are printed. ++ ++@item set build-id-verbose 1 ++Missing separate debug filenames are printed. ++ ++@item set build-id-verbose 2 ++Missing separate debug filenames are printed and also all the parsing of the ++binaries to find their @dfn{build id} content is printed. ++ ++@kindex show build-id-verbose ++@item show build-id-verbose ++Show the current verbosity value for the @dfn{build id} content locating. ++ ++@end table ++ + @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/dwarf2/index-cache.c b/gdb/dwarf2/index-cache.c +--- a/gdb/dwarf2/index-cache.c ++++ b/gdb/dwarf2/index-cache.c +@@ -96,7 +96,7 @@ index_cache_store_context::index_cache_store_context (const index_cache &ic, + return; + + /* Get build id of objfile. */ +- const bfd_build_id *build_id = build_id_bfd_get (per_bfd->obfd); ++ const bfd_build_id *build_id = build_id_bfd_shdr_get (per_bfd->obfd); + if (build_id == nullptr) + { + index_cache_debug ("objfile %s has no build id", +@@ -111,7 +111,8 @@ index_cache_store_context::index_cache_store_context (const index_cache &ic, + + if (dwz != nullptr) + { +- const bfd_build_id *dwz_build_id = build_id_bfd_get (dwz->dwz_bfd.get ()); ++ const bfd_build_id *dwz_build_id ++ = build_id_bfd_shdr_get (dwz->dwz_bfd.get ()); + + if (dwz_build_id == nullptr) + { +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -3355,7 +3355,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_bfd *dwarf2_per_bfd) + { +- const bfd_build_id *build_id = build_id_bfd_get (obj->obfd.get ()); ++ const bfd_build_id *build_id = build_id_bfd_shdr_get (obj->obfd.get ()); + if (build_id == nullptr) + return {}; + +@@ -3368,7 +3368,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) + { +- const bfd_build_id *build_id = build_id_bfd_get (dwz->dwz_bfd.get ()); ++ const bfd_build_id *build_id = build_id_bfd_shdr_get (dwz->dwz_bfd.get ()); + if (build_id == nullptr) + return {}; + +diff --git a/gdb/elfread.c b/gdb/elfread.c +--- a/gdb/elfread.c ++++ b/gdb/elfread.c +@@ -1220,8 +1220,10 @@ elf_symfile_read_dwarf2 (struct objfile *objfile, + { + deferred_warnings warnings; + ++ gdb::unique_xmalloc_ptr build_id_filename; + std::string debugfile +- = find_separate_debug_file_by_buildid (objfile, &warnings); ++ = find_separate_debug_file_by_buildid (objfile, &warnings, ++ &build_id_filename); + + if (debugfile.empty ()) + debugfile = find_separate_debug_file_by_debuglink (objfile, &warnings); +@@ -1239,7 +1241,7 @@ elf_symfile_read_dwarf2 (struct objfile *objfile, + { + has_dwarf2 = false; + const struct bfd_build_id *build_id +- = build_id_bfd_get (objfile->obfd.get ()); ++ = build_id_bfd_shdr_get (objfile->obfd.get ()); + const char *filename = bfd_get_filename (objfile->obfd.get ()); + + if (build_id != nullptr) +@@ -1265,6 +1267,11 @@ elf_symfile_read_dwarf2 (struct objfile *objfile, + has_dwarf2 = true; + } + } ++ /* Check if any separate debug info has been extracted out. */ ++ else if (bfd_get_section_by_name (objfile->obfd.get (), ++ ".gnu_debuglink") ++ != NULL) ++ debug_print_missing (objfile_name (objfile), build_id_filename.get ()); + } + } + /* If all the methods to collect the debuginfo failed, print the +diff --git a/gdb/exec.c b/gdb/exec.c +--- a/gdb/exec.c ++++ b/gdb/exec.c +@@ -237,7 +237,7 @@ validate_exec_file (int from_tty) + current_exec_file = get_exec_file (0); + + const bfd_build_id *exec_file_build_id +- = build_id_bfd_get (current_program_space->exec_bfd ()); ++ = build_id_bfd_shdr_get (current_program_space->exec_bfd ()); + if (exec_file_build_id != nullptr) + { + /* Prepend the target prefix, to force gdb_bfd_open to open the +@@ -250,7 +250,7 @@ validate_exec_file (int from_tty) + 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 +@@ -884,6 +884,10 @@ struct objfile + bool object_format_has_copy_relocs = false; + }; + ++/* This file was loaded according to the BUILD_ID_CORE_LOADS rules. */ ++ ++#define OBJF_BUILD_ID_CORE_LOADED static_cast(1 << 12) ++ + /* A deleter for 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 +@@ -158,7 +158,7 @@ objfpy_get_build_id (PyObject *self, void *closure) + + try + { +- build_id = build_id_bfd_get (objfile->obfd.get ()); ++ build_id = build_id_bfd_shdr_get (objfile->obfd.get ()); + } + catch (const gdb_exception &except) + { +@@ -629,7 +629,7 @@ gdbpy_lookup_objfile (PyObject *self, PyObject *args, PyObject *kw) + if (obfd == nullptr) + return 0; + +- const bfd_build_id *obfd_build_id = build_id_bfd_get (obfd); ++ const bfd_build_id *obfd_build_id = build_id_bfd_shdr_get (obfd); + if (obfd_build_id == nullptr) + return 0; + +diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c +--- a/gdb/solib-svr4.c ++++ b/gdb/solib-svr4.c +@@ -44,6 +44,7 @@ + #include "auxv.h" + #include "gdb_bfd.h" + #include "probe.h" ++#include "build-id.h" + + #include + +@@ -1318,9 +1319,51 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, + continue; + } + +- strncpy (newobj->so_name, buffer.get (), SO_NAME_MAX_PATH_SIZE - 1); +- newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; +- strcpy (newobj->so_original_name, newobj->so_name); ++ { ++ struct bfd_build_id *build_id; ++ ++ strncpy (newobj->so_original_name, buffer.get (), SO_NAME_MAX_PATH_SIZE - 1); ++ newobj->so_original_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; ++ /* May get overwritten below. */ ++ strcpy (newobj->so_name, newobj->so_original_name); ++ ++ build_id = build_id_addr_get (((lm_info_svr4 *) newobj->lm_info)->l_ld); ++ if (build_id != NULL) ++ { ++ char *name, *build_id_filename; ++ ++ /* Missing the build-id matching separate debug info file ++ would be handled while SO_NAME gets loaded. */ ++ name = build_id_to_filename (build_id, &build_id_filename); ++ if (name != NULL) ++ { ++ strncpy (newobj->so_name, name, SO_NAME_MAX_PATH_SIZE - 1); ++ newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; ++ xfree (name); ++ } ++ else ++ { ++ debug_print_missing (newobj->so_name, build_id_filename); ++ ++ /* In the case the main executable was found according to ++ its build-id (from a core file) prevent loading ++ a different build of a library with accidentally the ++ same SO_NAME. ++ ++ It suppresses bogus backtraces (and prints "??" there ++ instead) if the on-disk files no longer match the ++ running program version. */ ++ ++ if (current_program_space->symfile_object_file != NULL ++ && (current_program_space->symfile_object_file->flags ++ & OBJF_BUILD_ID_CORE_LOADED) != 0) ++ newobj->so_name[0] = 0; ++ } ++ ++ xfree (build_id_filename); ++ xfree (build_id); ++ } ++ } + + /* 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 +@@ -1167,7 +1167,7 @@ open_source_file (struct symtab *s) + } + + const struct bfd_build_id *build_id +- = build_id_bfd_get (ofp->obfd.get ()); ++ = build_id_bfd_shdr_get (ofp->obfd.get ()); + + /* 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 +@@ -357,12 +357,18 @@ bool expand_symtabs_matching + void map_symbol_filenames (gdb::function_view fun, + bool need_fullname); + ++ + /* Target-agnostic function to load the sections of an executable into memory. + + ARGS should be in the form "EXECUTABLE [OFFSET]", where OFFSET is an + optional offset to apply to each section. */ + 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); ++#define BUILD_ID_MAIN_EXECUTABLE_FILENAME _("the main executable file") ++ + /* From minidebug.c. */ + + extern gdb_bfd_ref_ptr find_separate_debug_file_in_section (struct objfile *); +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 +@@ -347,3 +347,33 @@ gdb_test_multiple "core-file $corefile" $test { + pass $test + } + } ++ ++ ++# Test auto-loading of binary files through build-id from the core file. ++set buildid [build_id_debug_filename_get $binfile] ++set wholetest "binfile found by build-id" ++if {$buildid == ""} { ++ untested "$wholetest (binary has no build-id)" ++} else { ++ gdb_exit ++ gdb_start ++ ++ regsub {\.debug$} $buildid {} buildid ++ set debugdir [standard_output_file ${testfile}-debugdir] ++ file delete -force -- $debugdir ++ file mkdir $debugdir/[file dirname $buildid] ++ file copy $binfile $debugdir/$buildid ++ ++ set test "show debug-file-directory" ++ gdb_test_multiple $test $test { ++ -re "The directory where separate debug symbols are searched for is \"(.*)\"\\.\r\n$gdb_prompt $" { ++ set debugdir_orig $expect_out(1,string) ++ pass $test ++ } ++ } ++ gdb_test_no_output "set debug-file-directory $debugdir:$debugdir_orig" "set debug-file-directory" ++ gdb_test "show build-id-core-loads" {Whether CORE-FILE loads the build-id associated files automatically is on\.} ++ gdb_test "core-file $corefile" "\r\nProgram terminated with .*" "core-file without executable" ++ gdb_test "info files" "Local exec file:\r\n\[ \t\]*`[string_to_regexp $debugdir/$buildid]', file type .*" ++ pass $wholetest ++} +diff --git a/gdb/testsuite/gdb.base/gdbinit-history.exp b/gdb/testsuite/gdb.base/gdbinit-history.exp +--- a/gdb/testsuite/gdb.base/gdbinit-history.exp ++++ b/gdb/testsuite/gdb.base/gdbinit-history.exp +@@ -179,7 +179,8 @@ proc test_empty_history_filename { } { + global env + global gdb_prompt + +- set common_history [list "set height 0" "set width 0"] ++ set common_history [list "set height 0" "set width 0" \ ++ "set build-id-verbose 0"] + + set test_dir [standard_output_file history_test] + remote_exec host "mkdir -p $test_dir" +diff --git a/gdb/testsuite/gdb.base/new-ui-pending-input.exp b/gdb/testsuite/gdb.base/new-ui-pending-input.exp +--- a/gdb/testsuite/gdb.base/new-ui-pending-input.exp ++++ b/gdb/testsuite/gdb.base/new-ui-pending-input.exp +@@ -62,6 +62,7 @@ proc test_command_line_new_ui_pending_input {} { + set options "" + append options " -iex \"set height 0\"" + append options " -iex \"set width 0\"" ++ append options " -iex \"set build-id-verbose 0\"" + append options " -iex \"new-ui console $extra_tty_name\"" + append options " -ex \"b $bpline\"" + append options " -ex \"run\"" +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 +@@ -226,7 +226,8 @@ if ![info exists INTERNAL_GDBFLAGS] { + "-nx" \ + "-q" \ + {-iex "set height 0"} \ +- {-iex "set width 0"}]] ++ {-iex "set width 0"} \ ++ {-iex "set build-id-verbose 0"}]] + + # If DEBUGINFOD_URLS is set, gdb will try to download sources and + # debug info for f.i. system libraries. Prevent this. +@@ -2434,6 +2435,17 @@ proc default_gdb_start { } { + } + } + ++ # Turn off the missing warnings as the testsuite does not expect it. ++ send_gdb "set build-id-verbose 0\n" ++ gdb_expect 10 { ++ -re "$gdb_prompt $" { ++ verbose "Disabled the missing debug infos warnings." 2 ++ } ++ timeout { ++ warning "Could not disable the missing debug infos warnings.." ++ } ++ } ++ + gdb_debug_init + return 0 + } +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 +@@ -321,6 +321,16 @@ proc default_mi_gdb_start { { flags {} } } { + warning "Couldn't set the width to 0." + } + } ++ # Turn off the missing warnings as the testsuite does not expect it. ++ send_gdb "190-gdb-set build-id-verbose 0\n" ++ gdb_expect 10 { ++ -re ".*190-gdb-set build-id-verbose 0\r\n190\\\^done\r\n$mi_gdb_prompt$" { ++ verbose "Disabled the missing debug infos warnings." 2 ++ } ++ timeout { ++ warning "Could not disable the missing debug infos warnings.." ++ } ++ } + + if { $separate_inferior_pty } { + mi_create_inferior_pty diff --git a/gdb-6.6-bz229517-gcore-without-terminal.patch b/gdb-6.6-bz229517-gcore-without-terminal.patch new file mode 100644 index 0000000..863f615 --- /dev/null +++ b/gdb-6.6-bz229517-gcore-without-terminal.patch @@ -0,0 +1,188 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Jan Kratochvil +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.6-bz229517-gcore-without-terminal.patch + +;; Allow running `/usr/bin/gcore' with provided but inaccessible tty (BZ 229517). +;;=fedoratest + +2007-04-22 Jan Kratochvil + + * gdb_gcore.sh: Redirect GDB from ` + + * gdb.base/gcorebg.exp, gdb.base/gcorebg.c: New files. + +diff --git a/gdb/testsuite/gdb.base/gcorebg.c b/gdb/testsuite/gdb.base/gcorebg.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcorebg.c +@@ -0,0 +1,49 @@ ++#include ++#include ++#include ++#include ++#include ++#include ++#include ++ ++int main (int argc, char **argv) ++{ ++ pid_t pid = 0; ++ pid_t ppid; ++ char buf[1024*2 + 500]; ++ int gotint; ++ ++ if (argc != 4) ++ { ++ fprintf (stderr, "Syntax: %s {standard|detached} \n", ++ argv[0]); ++ exit (1); ++ } ++ ++ pid = fork (); ++ ++ switch (pid) ++ { ++ case 0: ++ if (strcmp (argv[1], "detached") == 0) ++ setpgrp (); ++ ppid = getppid (); ++ gotint = snprintf (buf, sizeof (buf), "sh %s -o %s %d", argv[2], argv[3], (int) ppid); ++ assert (gotint < sizeof (buf)); ++ system (buf); ++ fprintf (stderr, "Killing parent PID %d\n", ppid); ++ kill (ppid, SIGTERM); ++ break; ++ ++ case -1: ++ perror ("fork err\n"); ++ exit (1); ++ break; ++ ++ default: ++ fprintf (stderr,"Sleeping as PID %d\n", getpid ()); ++ sleep (60); ++ } ++ ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/gcorebg.exp b/gdb/testsuite/gdb.base/gcorebg.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcorebg.exp +@@ -0,0 +1,113 @@ ++# Copyright 2007 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 2 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, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. ++ ++# Please email any bugs, comments, and/or additions to this file to: ++# bug-gdb@prep.ai.mit.edu ++ ++# This file was written by Jan Kratochvil . ++# This is a test for `gdb_gcore.sh' functionality. ++# It also tests a regression with `gdb_gcore.sh' being run without its ++# accessible terminal. ++ ++if ![info exists GCORE] { ++ set GCORE "[standard_output_file ../../../../gcore]" ++} ++verbose "using GCORE = $GCORE" 2 ++ ++set testfile "gcorebg" ++set srcfile ${testfile}.c ++set binfile [standard_output_file ${testfile}] ++set corefile [standard_output_file ${testfile}.test] ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested gcorebg.exp ++ return -1 ++} ++ ++# Cleanup. ++ ++proc core_clean {} { ++ global corefile ++ ++ foreach file [glob -nocomplain [join [list $corefile *] ""]] { ++ verbose "Delete file $file" 1 ++ remote_file target delete $file ++ } ++} ++core_clean ++remote_file target delete "./gdb" ++ ++# Generate the core file. ++ ++# Provide `./gdb' for `gdb_gcore.sh' running it as a bare `gdb' command. ++# Setup also `$PATH' appropriately. ++# If GDB was not found let `gdb_gcore.sh' to find the system GDB by `$PATH'. ++if {$GDB != "gdb"} { ++ file link ./gdb $GDB ++} ++global env ++set oldpath $env(PATH) ++set env(PATH) [join [list . $env(PATH)] ":"] ++verbose "PATH = $env(PATH)" 2 ++ ++# Test file body. ++# $detached == "standard" || $detached == "detached" ++ ++proc test_body { detached } { ++ global binfile ++ global GCORE ++ global corefile ++ ++ set res [remote_spawn target "$binfile $detached $GCORE $corefile"] ++ if { $res < 0 || $res == "" } { ++ fail "Spawning $detached gcore" ++ return 1 ++ } ++ pass "Spawning $detached gcore" ++ remote_expect target 20 { ++ timeout { ++ fail "Spawned $detached gcore finished (timeout)" ++ remote_exec target "kill -9 -[exp_pid -i $res]" ++ return 1 ++ } ++ "Saved corefile .*\r\nKilling parent PID " { ++ pass "Spawned $detached gcore finished" ++ remote_wait target 20 ++ } ++ } ++ ++ if {1 == [llength [glob -nocomplain [join [list $corefile *] ""]]]} { ++ pass "Core file generated by $detached gcore" ++ } else { ++ fail "Core file generated by $detached gcore" ++ } ++ core_clean ++} ++ ++# First a general `gdb_gcore.sh' spawn with its controlling terminal available. ++ ++test_body standard ++ ++# And now `gdb_gcore.sh' spawn without its controlling terminal available. ++# It is spawned through `gcorebg.c' using setpgrp (). ++ ++test_body detached ++ ++ ++# Cleanup. ++ ++set env(PATH) $oldpath ++remote_file target delete "./gdb" diff --git a/gdb-6.6-bz237572-ppc-atomic-sequence-test.patch b/gdb-6.6-bz237572-ppc-atomic-sequence-test.patch new file mode 100644 index 0000000..6d04711 --- /dev/null +++ b/gdb-6.6-bz237572-ppc-atomic-sequence-test.patch @@ -0,0 +1,278 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Jan Kratochvil +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.6-bz237572-ppc-atomic-sequence-test.patch + +;; Support for stepping over PPC atomic instruction sequences (BZ 237572). +;;=fedoratest + +2007-06-25 Jan Kratochvil + + * gdb.threads/atomic-seq-threaded.c, + gdb.threads/atomic-seq-threaded.exp: New files. + +diff --git a/gdb/testsuite/gdb.threads/atomic-seq-threaded.c b/gdb/testsuite/gdb.threads/atomic-seq-threaded.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.threads/atomic-seq-threaded.c +@@ -0,0 +1,171 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2007 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 2 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, write to the Free Software ++ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, ++ MA 02110-1301, USA. */ ++ ++/* Test stepping over RISC atomic sequences. ++ This variant testcases the code for stepping another thread while skipping ++ over the atomic sequence in the former thread ++ (STEPPING_PAST_SINGLESTEP_BREAKPOINT). ++ Code comes from gcc/testsuite/gcc.dg/sync-2.c */ ++ ++/* { dg-options "-march=i486" { target { { i?86-*-* x86_64-*-* } && ilp32 } } } */ ++/* { dg-options "-mcpu=v9" { target sparc*-*-* } } */ ++ ++/* Test functionality of the intrinsics for 'short' and 'char'. */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define LOOPS 2 ++ ++static int unused; ++ ++static char AI[18]; ++static char init_qi[18] = { 3,5,7,9,0,0,0,0,-1,0,0,0,0,0,-1,0,0,0 }; ++static char test_qi[18] = { 3,5,7,9,1,4,22,-12,7,8,9,7,1,-12,7,8,9,7 }; ++ ++static void ++do_qi (void) ++{ ++ if (__sync_fetch_and_add(AI+4, 1) != 0) ++ abort (); ++ if (__sync_fetch_and_add(AI+5, 4) != 0) ++ abort (); ++ if (__sync_fetch_and_add(AI+6, 22) != 0) ++ abort (); ++ if (__sync_fetch_and_sub(AI+7, 12) != 0) ++ abort (); ++ if (__sync_fetch_and_and(AI+8, 7) != (char)-1) ++ abort (); ++ if (__sync_fetch_and_or(AI+9, 8) != 0) ++ abort (); ++ if (__sync_fetch_and_xor(AI+10, 9) != 0) ++ abort (); ++ if (__sync_fetch_and_nand(AI+11, 7) != 0) ++ abort (); ++ ++ if (__sync_add_and_fetch(AI+12, 1) != 1) ++ abort (); ++ if (__sync_sub_and_fetch(AI+13, 12) != (char)-12) ++ abort (); ++ if (__sync_and_and_fetch(AI+14, 7) != 7) ++ abort (); ++ if (__sync_or_and_fetch(AI+15, 8) != 8) ++ abort (); ++ if (__sync_xor_and_fetch(AI+16, 9) != 9) ++ abort (); ++ if (__sync_nand_and_fetch(AI+17, 7) != 7) ++ abort (); ++} ++ ++static short AL[18]; ++static short init_hi[18] = { 3,5,7,9,0,0,0,0,-1,0,0,0,0,0,-1,0,0,0 }; ++static short test_hi[18] = { 3,5,7,9,1,4,22,-12,7,8,9,7,1,-12,7,8,9,7 }; ++ ++static void ++do_hi (void) ++{ ++ if (__sync_fetch_and_add(AL+4, 1) != 0) ++ abort (); ++ if (__sync_fetch_and_add(AL+5, 4) != 0) ++ abort (); ++ if (__sync_fetch_and_add(AL+6, 22) != 0) ++ abort (); ++ if (__sync_fetch_and_sub(AL+7, 12) != 0) ++ abort (); ++ if (__sync_fetch_and_and(AL+8, 7) != -1) ++ abort (); ++ if (__sync_fetch_and_or(AL+9, 8) != 0) ++ abort (); ++ if (__sync_fetch_and_xor(AL+10, 9) != 0) ++ abort (); ++ if (__sync_fetch_and_nand(AL+11, 7) != 0) ++ abort (); ++ ++ if (__sync_add_and_fetch(AL+12, 1) != 1) ++ abort (); ++ if (__sync_sub_and_fetch(AL+13, 12) != -12) ++ abort (); ++ if (__sync_and_and_fetch(AL+14, 7) != 7) ++ abort (); ++ if (__sync_or_and_fetch(AL+15, 8) != 8) ++ abort (); ++ if (__sync_xor_and_fetch(AL+16, 9) != 9) ++ abort (); ++ if (__sync_nand_and_fetch(AL+17, 7) != 7) ++ abort (); ++} ++ ++static void * ++start1 (void *arg) ++{ ++ unsigned loop; ++ sleep(1); ++ ++ for (loop = 0; loop < LOOPS; loop++) ++ { ++ memcpy(AI, init_qi, sizeof(init_qi)); ++ ++ do_qi (); ++ ++ if (memcmp (AI, test_qi, sizeof(test_qi))) ++ abort (); ++ } ++ ++ return arg; /* _delete1_ */ ++} ++ ++static void * ++start2 (void *arg) ++{ ++ unsigned loop; ++ ++ for (loop = 0; loop < LOOPS; loop++) ++ { ++ memcpy(AL, init_hi, sizeof(init_hi)); ++ ++ do_hi (); ++ ++ if (memcmp (AL, test_hi, sizeof(test_hi))) ++ abort (); ++ } ++ ++ return arg; /* _delete2_ */ ++} ++ ++int ++main (int argc, char **argv) ++{ ++ pthread_t thread; ++ int i; ++ ++ i = pthread_create (&thread, NULL, start1, NULL); /* _create_ */ ++ assert (i == 0); /* _create_after_ */ ++ ++ sleep (1); ++ ++ start2 (NULL); ++ ++ i = pthread_join (thread, NULL); /* _delete_ */ ++ assert (i == 0); ++ ++ return 0; /* _exit_ */ ++} +diff --git a/gdb/testsuite/gdb.threads/atomic-seq-threaded.exp b/gdb/testsuite/gdb.threads/atomic-seq-threaded.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.threads/atomic-seq-threaded.exp +@@ -0,0 +1,84 @@ ++# atomic-seq-threaded.exp -- Test case for stepping over RISC atomic code seqs. ++# This variant testcases the code for stepping another thread while skipping ++# over the atomic sequence in the former thread ++# (STEPPING_PAST_SINGLESTEP_BREAKPOINT). ++# Copyright (C) 2007 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 2 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, write to the Free Software ++# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ ++ ++# Please email any bugs, comments, and/or additions to this file to: ++# bug-gdb@prep.ai.mit.edu ++ ++set testfile atomic-seq-threaded ++set srcfile ${testfile}.c ++set binfile [standard_output_file ${testfile}] ++ ++foreach opts {{} {compiler=gcc4} {FAIL}} { ++ if {$opts eq "FAIL"} { ++ return -1 ++ } ++ if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list debug $opts]] eq "" } { ++ break ++ } ++} ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++ ++gdb_load ${binfile} ++if ![runto_main] then { ++ fail "Can't run to main" ++ return 0 ++} ++ ++# pthread_create () will not pass even on x86_64 with software watchpoint. ++# Pass after pthread_create () without any watchpoint active. ++set line [gdb_get_line_number "_create_after_"] ++gdb_test "tbreak $line" \ ++ "reakpoint (\[0-9\]+) at .*$srcfile, line $line\..*" \ ++ "set breakpoint after pthread_create ()" ++gdb_test "c" \ ++ ".*/\\* _create_after_ \\*/.*" \ ++ "run till after pthread_create ()" ++ ++# Without a watchpoint being software no single-stepping would be used. ++set test "Start (software) watchpoint" ++gdb_test_multiple "watch unused" $test { ++ -re "Watchpoint \[0-9\]+: unused.*$gdb_prompt $" { ++ pass $test ++ } ++ -re "Hardware watchpoint \[0-9\]+: unused.*$gdb_prompt $" { ++ # We do not test the goal but still the whole testcase should pass. ++ unsupported $test ++ } ++} ++ ++# More thorough testing of the scheduling logic. ++gdb_test "set scheduler-locking step" "" ++ ++# Critical code path is stepped through at this point. ++set line [gdb_get_line_number "_exit_"] ++gdb_test "tbreak $line" \ ++ "reakpoint \[0-9\]+ at .*$srcfile, line $line\..*" \ ++ "set breakpoint at _exit_" ++gdb_test "c" \ ++ ".*/\\* _exit_ \\*/.*" \ ++ "run till _exit_" ++ ++# Just a nonproblematic program exit. ++gdb_test "c" \ ++ ".*Program exited normally\\..*" \ ++ "run till program exit" diff --git a/gdb-6.6-testsuite-timeouts.patch b/gdb-6.6-testsuite-timeouts.patch new file mode 100644 index 0000000..64102fa --- /dev/null +++ b/gdb-6.6-testsuite-timeouts.patch @@ -0,0 +1,32 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-6.6-testsuite-timeouts.patch + +;; Avoid too long timeouts on failing cases of "annota1.exp annota3.exp". +;;=fedoratest + +diff --git a/gdb/testsuite/gdb.base/annota1.exp b/gdb/testsuite/gdb.base/annota1.exp +--- a/gdb/testsuite/gdb.base/annota1.exp ++++ b/gdb/testsuite/gdb.base/annota1.exp +@@ -37,6 +37,8 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb + + clean_restart ${binfile} + ++gdb_test "set breakpoint pending off" "" "Avoid lockup on nonexisting functions" ++ + # The commands we test here produce many lines of output; disable "press + # to continue" prompts. + gdb_test_no_output "set height 0" +diff --git a/gdb/testsuite/gdb.base/annota3.exp b/gdb/testsuite/gdb.base/annota3.exp +--- a/gdb/testsuite/gdb.base/annota3.exp ++++ b/gdb/testsuite/gdb.base/annota3.exp +@@ -36,6 +36,8 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb + + clean_restart ${binfile} + ++gdb_test "set breakpoint pending off" "" "Avoid lockup on nonexisting functions" ++ + # The commands we test here produce many lines of output; disable "press + # to continue" prompts. + gdb_test_no_output "set height 0" diff --git a/gdb-add-index.sh-fix-bashism.patch b/gdb-add-index.sh-fix-bashism.patch new file mode 100644 index 0000000..6ca00b1 --- /dev/null +++ b/gdb-add-index.sh-fix-bashism.patch @@ -0,0 +1,21 @@ +[gdb-add-index.sh] Fix bashism + +--- + gdb/contrib/gdb-add-index.sh | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/gdb/contrib/gdb-add-index.sh b/gdb/contrib/gdb-add-index.sh +index 734110caa3b..00d3ae8b0ae 100755 +--- a/gdb/contrib/gdb-add-index.sh ++++ b/gdb/contrib/gdb-add-index.sh +@@ -38,7 +38,9 @@ fi + file="$1" + + if test -L "$file"; then +- if ! command -v readlink >/dev/null 2>&1; then ++ target=$(readlink "$file") ++ st=$? ++ if [ $st -eq 127 ]; then + echo "$myname: 'readlink' missing. Failed to follow symlink $1." 1>&2 + exit 1 + fi diff --git a/gdb-archer-next-over-throw-cxx-exec.patch b/gdb-archer-next-over-throw-cxx-exec.patch new file mode 100644 index 0000000..ce3c1aa --- /dev/null +++ b/gdb-archer-next-over-throw-cxx-exec.patch @@ -0,0 +1,88 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-archer-next-over-throw-cxx-exec.patch + +;; Fix follow-exec for C++ programs (bugreported by Martin Stransky). +;;=fedoratest + +Archer-upstreamed: +http://sourceware.org/ml/archer/2010-q2/msg00031.html + +diff --git a/gdb/testsuite/gdb.cp/cxxexec.cc b/gdb/testsuite/gdb.cp/cxxexec.cc +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.cp/cxxexec.cc +@@ -0,0 +1,25 @@ ++/* This test script is part of GDB, the GNU debugger. ++ ++ Copyright 2010 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 . */ ++ ++#include ++ ++int ++main() ++{ ++ execlp ("true", "true", NULL); ++ return 1; ++} +diff --git a/gdb/testsuite/gdb.cp/cxxexec.exp b/gdb/testsuite/gdb.cp/cxxexec.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.cp/cxxexec.exp +@@ -0,0 +1,42 @@ ++# Copyright 2010 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 . ++ ++if { [skip_cplus_tests] } { continue } ++ ++set testfile cxxexec ++if { [prepare_for_testing ${testfile}.exp ${testfile} ${testfile}.cc {c++ debug}] } { ++ return -1 ++} ++ ++runto_main ++ ++# We could stop after `continue' again at `main'. ++delete_breakpoints ++ ++set test "p _Unwind_DebugHook" ++gdb_test_multiple $test $test { ++ -re " = .* 0x\[0-9a-f\].*\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re "\r\nNo symbol .*\r\n$gdb_prompt $" { ++ xfail $test ++ untested ${testfile}.exp ++ return -1 ++ } ++} ++ ++# Run to end. The buggy GDB failed instead with: ++# Cannot access memory at address ADDR. ++gdb_continue_to_end "" "continue" 1 diff --git a/gdb-arm-fix-epilogue-frame-id.patch b/gdb-arm-fix-epilogue-frame-id.patch new file mode 100644 index 0000000..8b9abe9 --- /dev/null +++ b/gdb-arm-fix-epilogue-frame-id.patch @@ -0,0 +1,47 @@ +From 40b2857e42b477832ca7fc2771b6cde910e22f05 Mon Sep 17 00:00:00 2001 +From: Thiago Jung Bauermann +Date: Tue, 23 Jan 2024 14:11:33 -0300 +Subject: [PATCH 4/7] gdb/arm: Fix epilogue frame id + +arm_epilogue_frame_this_id has a comment saying that it fall backs to using +the current PC if the function start address can't be identified, but it +actually uses only the PC to make the frame id. + +This patch makes the code match the comment. Another hint that it's what +is intended is that arm_prologue_this_id, a function almost identical to +it, does that. + +The problem was found by code inspection. It fixes the following testsuite +failures: + +FAIL: gdb.base/unwind-on-each-insn.exp: foo: instruction 9: check frame-id matches +FAIL: gdb.reverse/solib-reverse.exp: reverse-next third shr1 +FAIL: gdb.reverse/solib-reverse.exp: reverse-next second shr1 +FAIL: gdb.reverse/solib-reverse.exp: reverse-next first shr1 +FAIL: gdb.reverse/solib-reverse.exp: reverse-next generic +FAIL: gdb.reverse/solib-reverse.exp: reverse-step into solib function one +FAIL: gdb.reverse/solib-reverse.exp: reverse-step within solib function one +FAIL: gdb.reverse/solib-reverse.exp: reverse-step into solib function two +FAIL: gdb.reverse/solib-reverse.exp: reverse-step within solib function two + +Tested on arm-linux-gnueabi-hf. +--- + gdb/arm-tdep.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c +index 3b1682a2aea..21dad198dc7 100644 +--- a/gdb/arm-tdep.c ++++ b/gdb/arm-tdep.c +@@ -3252,7 +3252,7 @@ arm_epilogue_frame_this_id (frame_info_ptr this_frame, + + arm_gdbarch_tdep *tdep + = gdbarch_tdep (get_frame_arch (this_frame)); +- *this_id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep), pc); ++ *this_id = frame_id_build (arm_cache_get_prev_sp_value (cache, tdep), func); + } + + /* Implementation of function hook 'prev_register' in +-- +2.35.3 + diff --git a/gdb-arm-remove-thumb-bit-in-arm_adjust_breakpoint_ad.patch b/gdb-arm-remove-thumb-bit-in-arm_adjust_breakpoint_ad.patch new file mode 100644 index 0000000..f6620c7 --- /dev/null +++ b/gdb-arm-remove-thumb-bit-in-arm_adjust_breakpoint_ad.patch @@ -0,0 +1,77 @@ +From 51a5415b3313470cb62fda7ad6762fc1c41c8cbd Mon Sep 17 00:00:00 2001 +From: Simon Marchi +Date: Tue, 7 Nov 2023 11:11:18 -0500 +Subject: [PATCH] gdb/arm: remove thumb bit in arm_adjust_breakpoint_address + +When compiling gdb with -fsanitize=address on ARM, I get a crash in test +gdb.arch/arm-disp-step.exp, reproduced easily with: + + $ ./gdb -nx -q --data-directory=data-directory testsuite/outputs/gdb.arch/arm-disp-step/arm-disp-step -ex "break *test_call_end" + Reading symbols from testsuite/outputs/gdb.arch/arm-disp-step/arm-disp-step... + ================================================================= + ==23295==ERROR: AddressSanitizer: heap-buffer-overflow on address 0xb4a14fd1 at pc 0x01a48871 bp 0xbeab8490 sp 0xbeab8494 + +Since it doesn't require running the program, it can be reproduced locally on a +dev machine other than ARM, after acquiring the test binary. + +The length of the allocate buffer `buf` is 1, and we try to extract an +integer of size 2 from it. The length of 1 comes from the subtraction +`bpaddr - boundary`. Normally, on ARM, all instructions are aligned on +a multiple of 2, so it's weird for this subtraction to result in 1. In +this case, boundary comes from the result of find_pc_partial_function +returning 0x549: + + (gdb) p/x bpaddr + $2 = 0x54a + (gdb) p/x boundary + $3 = 0x549 + (gdb) p/x bpaddr - boundary + $4 = 0x1 + +0x549 is the address of the test_call_subr label, 0x548, with the thumb +bit enabled. Before doing some math with the address, I think we need +to strip the thumb bit, like is done elsewhere (for instance for bpaddr +earlier in the same function). + +I wonder if find_pc_partial_function should do that itself, in order to +return an address that is suitable for arithmetic. In any case, that +would be a change with a broad impact, so for now just fix the issue +locally. + +After the patch: + + $ ./gdb -nx -q --data-directory=data-directory testsuite/outputs/gdb.arch/arm-disp-step/arm-disp-step -ex "break *test_call_end" + Reading symbols from testsuite/outputs/gdb.arch/arm-disp-step/arm-disp-step... + Breakpoint 1 at 0x54a: file /home/smarchi/src/binutils-gdb/gdb/testsuite/gdb.arch/arm-disp-step.S, line 103. + +Change-Id: I74fc458dbea0d2c1e1f5eadd90755188df089288 +Approved-By: Luis Machado +--- + gdb/arm-tdep.c | 9 ++++++--- + 1 file changed, 6 insertions(+), 3 deletions(-) + +diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c +index 21dad198dc7..e61342f3ccb 100644 +--- a/gdb/arm-tdep.c ++++ b/gdb/arm-tdep.c +@@ -5340,9 +5340,12 @@ arm_adjust_breakpoint_address (struct gdbarch *gdbarch, CORE_ADDR bpaddr) + + bpaddr = gdbarch_addr_bits_remove (gdbarch, bpaddr); + +- if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL) +- && func_start > boundary) +- boundary = func_start; ++ if (find_pc_partial_function (bpaddr, NULL, &func_start, NULL)) ++ { ++ func_start = gdbarch_addr_bits_remove (gdbarch, func_start); ++ if (func_start > boundary) ++ boundary = func_start; ++ } + + /* Search for a candidate IT instruction. We have to do some fancy + footwork to distinguish a real IT instruction from the second + +base-commit: eafca1ce3d589c731927e5481199db715bcbeff3 +-- +2.35.3 + diff --git a/gdb-arm-remove-tpidruro-register-from-non-freebsd-ta.patch b/gdb-arm-remove-tpidruro-register-from-non-freebsd-ta.patch new file mode 100644 index 0000000..554c88f --- /dev/null +++ b/gdb-arm-remove-tpidruro-register-from-non-freebsd-ta.patch @@ -0,0 +1,219 @@ +From 7973eaf11e33ddd405830b9bd29495991db5901d Mon Sep 17 00:00:00 2001 +From: Thiago Jung Bauermann +Date: Mon, 26 Feb 2024 19:11:45 -0300 +Subject: [PATCH 2/7] gdb/arm: Remove tpidruro register from non-FreeBSD target + descriptions + +Commit 92d48a1e4eac ("Add an arm-tls feature which includes the tpidruro +register from CP15.") introduced the org.gnu.gdb.arm.tls feature, which +adds the tpidruro register, and unconditionally enabled it in +aarch32_create_target_description. + +In Linux, the tpidruro register isn't available via ptrace in the 32-bit +kernel but it is available for an aarch32 program running under an arm64 +kernel via the ptrace compat interface. This isn't currently implemented +however, which causes GDB on arm-linux with 64-bit kernel to list the +register but show it as unavailable, as reported by Tom de Vries: + + $ gdb -q -batch a.out -ex start -ex 'p $tpidruro' + Temporary breakpoint 1 at 0x512 + + Temporary breakpoint 1, 0xaaaaa512 in main () + $1 = + +Simon Marchi then clarified: + +> The only time we should be seeing some "unavailable" registers or memory +> is in the context of tracepoints, for things that are not collected. +> Seeing an unavailable register here is a sign that something is not +> right. + +Therefore, disable the TLS feature in aarch32 target descriptions for Linux +and NetBSD targets (the latter also doesn't seem to support accessing +tpidruro either, based on a quick look at arm-netbsd-nat.c). + +This patch fixes the following tests: + +Running gdb.base/inline-frame-cycle-unwind.exp ... +FAIL: gdb.base/inline-frame-cycle-unwind.exp: cycle at level 3: backtrace when the unwind is broken at frame 3 +FAIL: gdb.base/inline-frame-cycle-unwind.exp: cycle at level 5: backtrace when the unwind is broken at frame 5 +FAIL: gdb.base/inline-frame-cycle-unwind.exp: cycle at level 1: backtrace when the unwind is broken at frame 1 + +Tested with Ubuntu 22.04.3 on armv8l-linux-gnueabihf in native, +native-gdbserver and native-extended-gdbserver targets with no regressions. + +PR tdep/31418 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31418 + +Approved-By: John Baldwin +--- + gdb/aarch32-tdep.c | 15 ++++++++++----- + gdb/aarch32-tdep.h | 2 +- + gdb/aarch64-linux-nat.c | 2 +- + gdb/arch/aarch32.c | 5 +++-- + gdb/arch/aarch32.h | 2 +- + gdb/arm-fbsd-tdep.c | 2 +- + gdb/arm-linux-nat.c | 2 +- + gdb/arm-linux-tdep.c | 2 +- + gdb/arm-netbsd-nat.c | 2 +- + gdbserver/linux-aarch32-tdesc.cc | 2 +- + 10 files changed, 21 insertions(+), 15 deletions(-) + +diff --git a/gdb/aarch32-tdep.c b/gdb/aarch32-tdep.c +index bfa88a96522..395328936e4 100644 +--- a/gdb/aarch32-tdep.c ++++ b/gdb/aarch32-tdep.c +@@ -22,15 +22,20 @@ + #include "gdbsupport/common-regcache.h" + #include "arch/aarch32.h" + +-static struct target_desc *tdesc_aarch32; ++static struct target_desc *tdesc_aarch32_list[2]; + + /* See aarch32-tdep.h. */ + + const target_desc * +-aarch32_read_description () ++aarch32_read_description (bool tls) + { +- if (tdesc_aarch32 == nullptr) +- tdesc_aarch32 = aarch32_create_target_description (); ++ struct target_desc *tdesc = tdesc_aarch32_list[tls]; + +- return tdesc_aarch32; ++ if (tdesc == nullptr) ++ { ++ tdesc = aarch32_create_target_description (tls); ++ tdesc_aarch32_list[tls] = tdesc; ++ } ++ ++ return tdesc; + } +diff --git a/gdb/aarch32-tdep.h b/gdb/aarch32-tdep.h +index bee4d4e9fc0..efc93351298 100644 +--- a/gdb/aarch32-tdep.h ++++ b/gdb/aarch32-tdep.h +@@ -22,6 +22,6 @@ struct target_desc; + + /* Get the AArch32 target description. */ + +-const target_desc *aarch32_read_description (); ++const target_desc *aarch32_read_description (bool tls); + + #endif /* aarch32-tdep.h. */ +diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c +index 768748a20db..c680d6de0c9 100644 +--- a/gdb/aarch64-linux-nat.c ++++ b/gdb/aarch64-linux-nat.c +@@ -887,7 +887,7 @@ aarch64_linux_nat_target::read_description () + + ret = ptrace (PTRACE_GETREGSET, tid, NT_ARM_VFP, &iovec); + if (ret == 0) +- return aarch32_read_description (); ++ return aarch32_read_description (false); + + CORE_ADDR hwcap = linux_get_hwcap (); + CORE_ADDR hwcap2 = linux_get_hwcap2 (); +diff --git a/gdb/arch/aarch32.c b/gdb/arch/aarch32.c +index 5be2cc0156e..b7510ee41e9 100644 +--- a/gdb/arch/aarch32.c ++++ b/gdb/arch/aarch32.c +@@ -25,7 +25,7 @@ + /* See aarch32.h. */ + + target_desc * +-aarch32_create_target_description () ++aarch32_create_target_description (bool tls) + { + target_desc_up tdesc = allocate_target_description (); + +@@ -39,7 +39,8 @@ aarch32_create_target_description () + /* Create a vfpv3 feature, then a blank NEON feature. */ + regnum = create_feature_arm_arm_vfpv3 (tdesc.get (), regnum); + tdesc_create_feature (tdesc.get (), "org.gnu.gdb.arm.neon"); +- regnum = create_feature_arm_arm_tls (tdesc.get (), regnum); ++ if (tls) ++ regnum = create_feature_arm_arm_tls (tdesc.get (), regnum); + + return tdesc.release (); + } +diff --git a/gdb/arch/aarch32.h b/gdb/arch/aarch32.h +index 6b24ae94335..e06e260e370 100644 +--- a/gdb/arch/aarch32.h ++++ b/gdb/arch/aarch32.h +@@ -22,6 +22,6 @@ + + /* Create the AArch32 target description. */ + +-target_desc *aarch32_create_target_description (); ++target_desc *aarch32_create_target_description (bool tls); + + #endif /* aarch32.h. */ +diff --git a/gdb/arm-fbsd-tdep.c b/gdb/arm-fbsd-tdep.c +index b46fa91d0a0..a4cea77f388 100644 +--- a/gdb/arm-fbsd-tdep.c ++++ b/gdb/arm-fbsd-tdep.c +@@ -228,7 +228,7 @@ arm_fbsd_read_description_auxv (const gdb::optional &auxv, + if (arm_hwcap & HWCAP_VFP) + { + if (arm_hwcap & HWCAP_NEON) +- return aarch32_read_description (); ++ return aarch32_read_description (tls); + else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPD32)) + == (HWCAP_VFPv3 | HWCAP_VFPD32)) + return arm_read_description (ARM_FP_TYPE_VFPV3, tls); +diff --git a/gdb/arm-linux-nat.c b/gdb/arm-linux-nat.c +index 70c6bc684fa..07af23d3881 100644 +--- a/gdb/arm-linux-nat.c ++++ b/gdb/arm-linux-nat.c +@@ -568,7 +568,7 @@ arm_linux_nat_target::read_description () + /* NEON implies VFPv3-D32 or no-VFP unit. Say that we only support + Neon with VFPv3-D32. */ + if (arm_hwcap & HWCAP_NEON) +- return aarch32_read_description (); ++ return aarch32_read_description (false); + else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3) + return arm_read_description (ARM_FP_TYPE_VFPV3, false); + +diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c +index dfa816990ff..33748731cfd 100644 +--- a/gdb/arm-linux-tdep.c ++++ b/gdb/arm-linux-tdep.c +@@ -740,7 +740,7 @@ arm_linux_core_read_description (struct gdbarch *gdbarch, + /* NEON implies VFPv3-D32 or no-VFP unit. Say that we only support + Neon with VFPv3-D32. */ + if (arm_hwcap & HWCAP_NEON) +- return aarch32_read_description (); ++ return aarch32_read_description (false); + else if ((arm_hwcap & (HWCAP_VFPv3 | HWCAP_VFPv3D16)) == HWCAP_VFPv3) + return arm_read_description (ARM_FP_TYPE_VFPV3, false); + +diff --git a/gdb/arm-netbsd-nat.c b/gdb/arm-netbsd-nat.c +index d83714a46c3..018964b010d 100644 +--- a/gdb/arm-netbsd-nat.c ++++ b/gdb/arm-netbsd-nat.c +@@ -350,7 +350,7 @@ arm_netbsd_nat_target::read_description () + + len = sizeof(flag); + if (sysctlbyname("machdep.neon_present", &flag, &len, NULL, 0) == 0 && flag) +- return aarch32_read_description (); ++ return aarch32_read_description (false); + + return arm_read_description (ARM_FP_TYPE_VFPV3, false); + } +diff --git a/gdbserver/linux-aarch32-tdesc.cc b/gdbserver/linux-aarch32-tdesc.cc +index e1380fa2a40..443f91e3585 100644 +--- a/gdbserver/linux-aarch32-tdesc.cc ++++ b/gdbserver/linux-aarch32-tdesc.cc +@@ -32,7 +32,7 @@ aarch32_linux_read_description () + { + if (tdesc_aarch32 == nullptr) + { +- tdesc_aarch32 = aarch32_create_target_description (); ++ tdesc_aarch32 = aarch32_create_target_description (false); + + static const char *expedite_regs[] = { "r11", "sp", "pc", 0 }; + init_target_desc (tdesc_aarch32, expedite_regs); +-- +2.35.3 + diff --git a/gdb-build-fix-gdbserver-linux-aarch64-low.cc-build.patch b/gdb-build-fix-gdbserver-linux-aarch64-low.cc-build.patch new file mode 100644 index 0000000..8edcbe7 --- /dev/null +++ b/gdb-build-fix-gdbserver-linux-aarch64-low.cc-build.patch @@ -0,0 +1,41 @@ +From 0397481ff25b76d43b123f3d51828982ceb92834 Mon Sep 17 00:00:00 2001 +From: Mark Wielaard +Date: Fri, 3 May 2024 15:17:42 +0200 +Subject: [PATCH] [gdb/build] Fix gdbserver/linux-aarch64-low.cc build + +Commit 0ee25f97d21e ("Fix regression on aarch64-linux gdbserver") +removed the last use of i in gdbserver/linux-aarch64-low.cc +(aarch64_target::low_stopped_data_address). Breaking the build on +aarch64 with: + +gdbserver/linux-aarch64-low.cc: In member function ?virtual CORE_ADDR aarch64_target::low_stopped_data_address()?: +gdbserver/linux-aarch64-low.cc:557:12: error: unused variable ?i? [-Werror=unused-variable] + 557 | int pid, i; + | ^ +cc1plus: all warnings being treated as errors + +Fix this by removing the variable i completely. + +Fixes: 0ee25f97d21e ("Fix regression on aarch64-linux gdbserver") +--- + gdbserver/linux-aarch64-low.cc | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdbserver/linux-aarch64-low.cc b/gdbserver/linux-aarch64-low.cc +index 14346b89822..ce0029b885f 100644 +--- a/gdbserver/linux-aarch64-low.cc ++++ b/gdbserver/linux-aarch64-low.cc +@@ -555,7 +555,7 @@ CORE_ADDR + aarch64_target::low_stopped_data_address () + { + siginfo_t siginfo; +- int pid, i; ++ int pid; + struct aarch64_debug_reg_state *state; + + pid = lwpid_of (current_thread); + +base-commit: b33811a85ff53af77cdad995ad8cb50431c8c362 +-- +2.35.3 + diff --git a/gdb-bz634108-solib_address.patch b/gdb-bz634108-solib_address.patch new file mode 100644 index 0000000..bc7ef8a --- /dev/null +++ b/gdb-bz634108-solib_address.patch @@ -0,0 +1,41 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-bz634108-solib_address.patch + +;; Verify GDB Python built-in function gdb.solib_address exists (BZ # 634108). +;;=fedoratest + +Fix gdb.solib_address (fix by Phil Muldoon). + +s/solib_address/solib_name/ during upstreaming. + +diff --git a/gdb/testsuite/gdb.python/rh634108-solib_address.exp b/gdb/testsuite/gdb.python/rh634108-solib_address.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.python/rh634108-solib_address.exp +@@ -0,0 +1,24 @@ ++# Copyright (C) 2008, 2009, 2010 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 . ++ ++# https://bugzilla.redhat.com/show_bug.cgi?id=634108 ++ ++gdb_exit ++gdb_start ++ ++# Skip all tests if Python scripting is not enabled. ++if { [skip_python_tests] } { continue } ++ ++gdb_test "python print (gdb.solib_name(-1))" "None" "gdb.solib_name exists" diff --git a/gdb-cli-add-ignore-errors-command.patch b/gdb-cli-add-ignore-errors-command.patch new file mode 100644 index 0000000..1e8ab5d --- /dev/null +++ b/gdb-cli-add-ignore-errors-command.patch @@ -0,0 +1,201 @@ +From 0bb6f49bb9ad577667075550ca2ad4cb49931078 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 18 Apr 2024 14:27:04 +0200 +Subject: [PATCH 2/2] gdb-cli-add-ignore-errors-command + +[gdb/cli] Add ignore-errors command + +While trying to reproduce a failing test-case from the testsuite on the +command line using a gdb command script, I ran into the problem that a command +failed which stopped script execution. + +I could work around this by splitting the script at each error, but I realized +it would be nice if I could tell gdb to ignore the error. + +A python workaround ignore-errors exists, mentioned here ( +https://sourceware.org/legacy-ml/gdb/2010-06/msg00100.html ), which is +already supplied by distros like Fedora and openSUSE. + +FTR, a more elaborate try-catch solution was posted here ( +https://sourceware.org/bugzilla/show_bug.cgi?id=8487 ). + +This patch adds native ignore-errors support (so no python needed). + +So with this script: +... +$ cat script.gdb +ignore-errors run +echo here +... +we have: +... +$ gdb -q -batch -x script.gdb +No executable file specified. +Use the "file" or "exec-file" command. +here$ +... + +Note that quit is not caught: +... +$ gdb -q +(gdb) ignore-errors quit +$ +... +which is the same behaviour as with the python implementation. + +Tested on x86_64-linux. + +gdb/ChangeLog: + +2021-05-18 Tom de Vries + + * cli/cli-cmds.c (ignore_errors_command_completer) + (ignore_errors_command): New function. + (_initialize_cli_cmds): Add "ignore-errors" cmd. + +gdb/doc/ChangeLog: + +2021-05-18 Tom de Vries + + * gdb.texinfo (Command Files): Document command ignore-errors. + +gdb/testsuite/ChangeLog: + +2021-05-18 Tom de Vries + + * gdb.base/ignore-errors.exp: New test. + * gdb.base/ignore-errors.gdb: New command file. +--- + gdb/cli/cli-cmds.c | 35 ++++++++++++++++++++++++ + gdb/doc/gdb.texinfo | 8 +++++- + gdb/testsuite/gdb.base/ignore-errors.exp | 24 ++++++++++++++++ + gdb/testsuite/gdb.base/ignore-errors.gdb | 2 ++ + 4 files changed, 68 insertions(+), 1 deletion(-) + create mode 100644 gdb/testsuite/gdb.base/ignore-errors.exp + create mode 100644 gdb/testsuite/gdb.base/ignore-errors.gdb + +diff --git a/gdb/cli/cli-cmds.c b/gdb/cli/cli-cmds.c +index cfe7b71b0b7..0ae5530c558 100644 +--- a/gdb/cli/cli-cmds.c ++++ b/gdb/cli/cli-cmds.c +@@ -40,6 +40,7 @@ + #include "location.h" + #include "block.h" + #include "valprint.h" ++#include "event-top.h" + + #include "ui-out.h" + #include "interps.h" +@@ -2544,6 +2545,34 @@ shell_internal_fn (struct gdbarch *gdbarch, + return value::allocate_optimized_out (int_type); + } + ++/* Completer for "ignore-errors". */ ++ ++static void ++ignore_errors_command_completer (cmd_list_element *ignore, ++ completion_tracker &tracker, ++ const char *text, const char * /*word*/) ++{ ++ complete_nested_command_line (tracker, text); ++} ++ ++/* Implementation of the ignore-errors command. */ ++ ++static void ++ignore_errors_command (const char *args, int from_tty) ++{ ++ try ++ { ++ execute_command (args, from_tty); ++ } ++ catch (const gdb_exception_error &ex) ++ { ++ exception_print (gdb_stderr, ex); ++ ++ /* See also execute_gdb_command. */ ++ async_enable_stdin (); ++ } ++} ++ + void _initialize_cli_cmds (); + void + _initialize_cli_cmds () +@@ -2942,4 +2971,10 @@ when GDB is started."), GDBINIT).release (); + c = add_cmd ("source", class_support, source_command, + source_help_text, &cmdlist); + set_cmd_completer (c, filename_completer); ++ ++ c = add_cmd ("ignore-errors", class_support, ignore_errors_command, ++ _("Execute a single command, ignoring all errors.\n" ++ "Only one-line commands are supported.\n" ++ "This is primarily useful in scripts."), &cmdlist); ++ set_cmd_completer (c, ignore_errors_command_completer); + } +diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo +index 1abf91c4470..c277c16297c 100644 +--- a/gdb/doc/gdb.texinfo ++++ b/gdb/doc/gdb.texinfo +@@ -29250,7 +29250,8 @@ The lines in a command file are generally executed sequentially, + unless the order of execution is changed by one of the + @emph{flow-control commands} described below. The commands are not + printed as they are executed. An error in any command terminates +-execution of the command file and control is returned to the console. ++execution of the command file and control is returned to the console, ++unless the line is prefixed with the @code{ignore-errors} command. + + @value{GDBN} first searches for @var{filename} in the current directory. + If the file is not found there, and @var{filename} does not specify a +@@ -29345,6 +29346,11 @@ the controlling expression. + @item end + Terminate the block of commands that are the body of @code{if}, + @code{else}, or @code{while} flow-control commands. ++ ++@kindex ignore-errors ++@item ignore-errors ++This command executes the command specified by its arguments, but ++doesn't stop execution of the script if the command fails. + @end table + + +diff --git a/gdb/testsuite/gdb.base/ignore-errors.exp b/gdb/testsuite/gdb.base/ignore-errors.exp +new file mode 100644 +index 00000000000..30dac7a94e2 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/ignore-errors.exp +@@ -0,0 +1,24 @@ ++# Copyright 2021 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . */ ++ ++# Check command ignore-errors. ++ ++clean_restart ++ ++gdb_test "source ignore-errors.gdb" \ ++ [multi_line \ ++ "No executable file specified\\." \ ++ "Use the \"file\" or \"exec-file\" command\\." \ ++ "here"] +diff --git a/gdb/testsuite/gdb.base/ignore-errors.gdb b/gdb/testsuite/gdb.base/ignore-errors.gdb +new file mode 100644 +index 00000000000..5962ff49b11 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/ignore-errors.gdb +@@ -0,0 +1,2 @@ ++ignore-errors run ++echo here\n +-- +2.35.3 + diff --git a/gdb-core-open-vdso-warning.patch b/gdb-core-open-vdso-warning.patch new file mode 100644 index 0000000..cc9910a --- /dev/null +++ b/gdb-core-open-vdso-warning.patch @@ -0,0 +1,58 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-core-open-vdso-warning.patch + +;; Fix GNU/Linux core open: Can't read pathname for load map: Input/output error. +;; Fix regression of undisplayed missing shared libraries caused by a fix for. +;;=fedoratest: It should be in glibc: libc-alpha: <20091004161706.GA27450@.*> + +http://sourceware.org/ml/gdb-patches/2009-10/msg00142.html +Subject: [patch] Fix GNU/Linux core open: Can't read pathname for load map: Input/output error. + +[ New patch variant. ] + +commit 7d760051ffb8a23cdc51342d4e6243fbc462f73f +Author: Ulrich Weigand +Date: Wed Sep 25 11:52:50 2013 +0000 + +diff --git a/gdb/testsuite/gdb.base/solib-symbol.exp b/gdb/testsuite/gdb.base/solib-symbol.exp +--- a/gdb/testsuite/gdb.base/solib-symbol.exp ++++ b/gdb/testsuite/gdb.base/solib-symbol.exp +@@ -27,6 +27,7 @@ set testfile "solib-symbol-main" + set srcfile ${srcdir}/${subdir}/${testfile}.c + set binfile [standard_output_file ${testfile}] + set bin_flags [list debug shlib=${binfile_lib}] ++set executable ${testfile} + + if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} $lib_flags] != "" + || [gdb_compile ${srcfile} ${binfile} executable $bin_flags] != "" } { +@@ -61,4 +62,28 @@ gdb_test "br foo2" \ + "Breakpoint.*: foo2. .2 locations..*" \ + "foo2 in mdlib" + ++# Test GDB warns for shared libraris which have not been found. ++ ++gdb_test "info sharedlibrary" "/${libname}.*" ++ ++clean_restart ${executable} ++gdb_breakpoint "main" ++gdb_run_cmd ++set test "no warning for missing libraries" ++gdb_test_multiple "" $test { ++ -re "warning: Could not load shared library symbols for \[0-9\]+ libraries,.*\r\n$gdb_prompt $" { ++ fail $test ++ } ++ -re "Breakpoint \[0-9\]+, main .*\r\n$gdb_prompt $" { ++ pass $test ++ } ++} ++ ++clean_restart ${executable} ++gdb_test_no_output "set solib-absolute-prefix /doESnotEXIST" ++gdb_breakpoint "main" ++gdb_run_cmd ++gdb_test "" "warning: Could not load shared library symbols for \[0-9\]+ libraries,.*\r\nBreakpoint \[0-9\]+, main .*" \ ++ "warning for missing libraries" ++ + gdb_exit diff --git a/gdb-exp-fix-cast-handling-for-indirection.patch b/gdb-exp-fix-cast-handling-for-indirection.patch new file mode 100644 index 0000000..e174e2d --- /dev/null +++ b/gdb-exp-fix-cast-handling-for-indirection.patch @@ -0,0 +1,150 @@ +From b96d3adafdb636898913710ec40ee86647665ae8 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 3 May 2024 09:37:19 +0200 +Subject: [PATCH 24/48] [gdb/exp] Fix cast handling for indirection + +Consider a test-case compiled without debug info, containing: +... +char a = 'a'; + +char * +a_loc (void) +{ + return &a; +} +... + +We get: +... +(gdb) p (char)*a_loc () +Cannot access memory at address 0x10 +... + +There's a bug in unop_ind_base_operation::evaluate that evaluates +"(char)*a_loc ()" the same as: +... +(gdb) p (char)*(char)a_loc () +Cannot access memory at address 0x10 +... + +Fix this by instead doing: +... +(gdb) p (char)*a_loc () +'a_loc' has unknown return type; cast the call to its declared return type +... + +Tested on x86_64-linux. + +PR exp/31693 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31693 +--- + gdb/expop.h | 5 +-- + gdb/testsuite/gdb.base/cast-indirection.c | 31 ++++++++++++++++ + gdb/testsuite/gdb.base/cast-indirection.exp | 41 +++++++++++++++++++++ + 3 files changed, 74 insertions(+), 3 deletions(-) + create mode 100644 gdb/testsuite/gdb.base/cast-indirection.c + create mode 100644 gdb/testsuite/gdb.base/cast-indirection.exp + +diff --git a/gdb/expop.h b/gdb/expop.h +index 25769d5b810..25d50fe00d0 100644 +--- a/gdb/expop.h ++++ b/gdb/expop.h +@@ -1513,9 +1513,8 @@ class unop_ind_base_operation + struct expression *exp, + enum noside noside) override + { +- if (expect_type != nullptr && expect_type->code () == TYPE_CODE_PTR) +- expect_type = check_typedef (expect_type)->target_type (); +- value *val = std::get<0> (m_storage)->evaluate (expect_type, exp, noside); ++ value *val ++ = std::get<0> (m_storage)->evaluate (nullptr, exp, noside); + return eval_op_ind (expect_type, exp, noside, val); + } + +diff --git a/gdb/testsuite/gdb.base/cast-indirection.c b/gdb/testsuite/gdb.base/cast-indirection.c +new file mode 100644 +index 00000000000..d59c66ead35 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/cast-indirection.c +@@ -0,0 +1,31 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2024 Free Software Foundation, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++char a = 'a'; ++ ++char * ++a_loc (void) ++{ ++ return &a; ++} ++ ++int ++main (void) ++{ ++ int res = *a_loc () == 'a'; ++ return !res; ++} +diff --git a/gdb/testsuite/gdb.base/cast-indirection.exp b/gdb/testsuite/gdb.base/cast-indirection.exp +new file mode 100644 +index 00000000000..f1fe4302d27 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/cast-indirection.exp +@@ -0,0 +1,41 @@ ++# Copyright (C) 2024 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++# Check that "p (char)*a_loc ()" is handled as "p (char)*(char *)a_loc ()". ++ ++standard_testfile ++ ++if { [prepare_for_testing "failed to prepare" $testfile $srcfile \ ++ {nodebug}] == -1} { ++ return -1 ++} ++ ++if ![runto_main] { ++ return -1 ++} ++ ++gdb_test "p a_loc ()" \ ++ "'a_loc' has unknown return type; cast the call to its declared return type" ++ ++gdb_test "p *a_loc ()" \ ++ "'a_loc' has unknown return type; cast the call to its declared return type" ++ ++gdb_test "p *(char *)a_loc ()" " = 97 'a'" ++ ++gdb_test "p (char)*(char *)a_loc ()" " = 97 'a'" ++ ++# Regression test for PR31693. ++gdb_test "p (char)*a_loc ()" \ ++ "'a_loc' has unknown return type; cast the call to its declared return type" +-- +2.35.3 + diff --git a/gdb-exp-fix-printing-of-out-of-bounds-struct-members.patch b/gdb-exp-fix-printing-of-out-of-bounds-struct-members.patch new file mode 100644 index 0000000..d036c43 --- /dev/null +++ b/gdb-exp-fix-printing-of-out-of-bounds-struct-members.patch @@ -0,0 +1,365 @@ +From 86e379aa22ba5e77ba0c6fa26588c5fd1d9e6abe Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Mon, 19 Feb 2024 09:59:15 +0100 +Subject: [PATCH 13/48] [gdb/exp] Fix printing of out of bounds struct members + +When building gdb with -O0 -fsanitize=address, and running test-case +gdb.ada/uninitialized_vars.exp, I run into: +... +(gdb) info locals +a = 0 +z = (a => 1, b => false, c => 2.0) +================================================================= +==66372==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000097f58 at pc 0xffff52c0da1c bp 0xffffc90a1d40 sp 0xffffc90a1d80 +READ of size 4 at 0x602000097f58 thread T0 + #0 0xffff52c0da18 in memmove (/lib64/libasan.so.8+0x6da18) + #1 0xbcab24 in unsigned char* std::__copy_move_backward::__copy_move_b(unsigned char const*, unsigned char const*, unsigned char*) /usr/include/c++/13/bits/stl_algobase.h:748 + #2 0xbc9bf4 in unsigned char* std::__copy_move_backward_a2(unsigned char const*, unsigned char const*, unsigned char*) /usr/include/c++/13/bits/stl_algobase.h:769 + #3 0xbc898c in unsigned char* std::__copy_move_backward_a1(unsigned char const*, unsigned char const*, unsigned char*) /usr/include/c++/13/bits/stl_algobase.h:778 + #4 0xbc715c in unsigned char* std::__copy_move_backward_a(unsigned char const*, unsigned char const*, unsigned char*) /usr/include/c++/13/bits/stl_algobase.h:807 + #5 0xbc4e6c in unsigned char* std::copy_backward(unsigned char const*, unsigned char const*, unsigned char*) /usr/include/c++/13/bits/stl_algobase.h:867 + #6 0xbc2934 in void gdb::copy(gdb::array_view, gdb::array_view) gdb/../gdbsupport/array-view.h:223 + #7 0x20e0100 in value::contents_copy_raw(value*, long, long, long) gdb/value.c:1239 + #8 0x20e9830 in value::primitive_field(long, int, type*) gdb/value.c:3078 + #9 0x20e98f8 in value_field(value*, int) gdb/value.c:3095 + #10 0xcafd64 in print_field_values gdb/ada-valprint.c:658 + #11 0xcb0fa0 in ada_val_print_struct_union gdb/ada-valprint.c:857 + #12 0xcb1bb4 in ada_value_print_inner(value*, ui_file*, int, value_print_options const*) gdb/ada-valprint.c:1042 + #13 0xc66e04 in ada_language::value_print_inner(value*, ui_file*, int, value_print_options const*) const (/home/vries/gdb/build/gdb/gdb+0xc66e04) + #14 0x20ca1e8 in common_val_print(value*, ui_file*, int, value_print_options const*, language_defn const*) gdb/valprint.c:1092 + #15 0x20caabc in common_val_print_checked(value*, ui_file*, int, value_print_options const*, language_defn const*) gdb/valprint.c:1184 + #16 0x196c524 in print_variable_and_value(char const*, symbol*, frame_info_ptr, ui_file*, int) gdb/printcmd.c:2355 + #17 0x1d99ca0 in print_variable_and_value_data::operator()(char const*, symbol*) gdb/stack.c:2308 + #18 0x1dabca0 in gdb::function_view::bind(print_variable_and_value_data&)::{lambda(gdb::fv_detail::erased_callable, char const*, symbol*)#1}::operator()(gdb::fv_detail::erased_callable, char const*, symbol*) const gdb/../gdbsupport/function-view.h:305 + #19 0x1dabd14 in gdb::function_view::bind(print_variable_and_value_data&)::{lambda(gdb::fv_detail::erased_callable, char const*, symbol*)#1}::_FUN(gdb::fv_detail::erased_callable, char const*, symbol*) gdb/../gdbsupport/function-view.h:299 + #20 0x1dab34c in gdb::function_view::operator()(char const*, symbol*) const gdb/../gdbsupport/function-view.h:289 + #21 0x1d9963c in iterate_over_block_locals gdb/stack.c:2240 + #22 0x1d99790 in iterate_over_block_local_vars(block const*, gdb::function_view) gdb/stack.c:2259 + #23 0x1d9a598 in print_frame_local_vars gdb/stack.c:2380 + #24 0x1d9afac in info_locals_command(char const*, int) gdb/stack.c:2458 + #25 0xfd7b30 in do_simple_func gdb/cli/cli-decode.c:95 + #26 0xfe5a2c in cmd_func(cmd_list_element*, char const*, int) gdb/cli/cli-decode.c:2735 + #27 0x1f03790 in execute_command(char const*, int) gdb/top.c:575 + #28 0x1384080 in command_handler(char const*) gdb/event-top.c:566 + #29 0x1384e2c in command_line_handler(std::unique_ptr >&&) gdb/event-top.c:802 + #30 0x1f731e4 in tui_command_line_handler gdb/tui/tui-interp.c:104 + #31 0x1382a58 in gdb_rl_callback_handler gdb/event-top.c:259 + #32 0x21dbb80 in rl_callback_read_char readline/readline/callback.c:290 + #33 0x1382510 in gdb_rl_callback_read_char_wrapper_noexcept gdb/event-top.c:195 + #34 0x138277c in gdb_rl_callback_read_char_wrapper gdb/event-top.c:234 + #35 0x1fe9b40 in stdin_event_handler gdb/ui.c:155 + #36 0x35ff1bc in handle_file_event gdbsupport/event-loop.cc:573 + #37 0x35ff9d8 in gdb_wait_for_event gdbsupport/event-loop.cc:694 + #38 0x35fd284 in gdb_do_one_event(int) gdbsupport/event-loop.cc:264 + #39 0x1768080 in start_event_loop gdb/main.c:408 + #40 0x17684c4 in captured_command_loop gdb/main.c:472 + #41 0x176cfc8 in captured_main gdb/main.c:1342 + #42 0x176d088 in gdb_main(captured_main_args*) gdb/main.c:1361 + #43 0xb73edc in main gdb/gdb.c:39 + #44 0xffff519b09d8 in __libc_start_call_main (/lib64/libc.so.6+0x309d8) + #45 0xffff519b0aac in __libc_start_main@@GLIBC_2.34 (/lib64/libc.so.6+0x30aac) + #46 0xb73c2c in _start (/home/vries/gdb/build/gdb/gdb+0xb73c2c) + +0x602000097f58 is located 0 bytes after 8-byte region [0x602000097f50,0x602000097f58) +allocated by thread T0 here: + #0 0xffff52c65218 in calloc (/lib64/libasan.so.8+0xc5218) + #1 0xcbc278 in xcalloc gdb/alloc.c:97 + #2 0x35f21e8 in xzalloc(unsigned long) gdbsupport/common-utils.cc:29 + #3 0x20de270 in value::allocate_contents(bool) gdb/value.c:937 + #4 0x20edc08 in value::fetch_lazy() gdb/value.c:4033 + #5 0x20dadc0 in value::entirely_covered_by_range_vector(std::vector > const&) gdb/value.c:229 + #6 0xcb2298 in value::entirely_optimized_out() gdb/value.h:560 + #7 0x20ca6fc in value_check_printable gdb/valprint.c:1133 + #8 0x20caa8c in common_val_print_checked(value*, ui_file*, int, value_print_options const*, language_defn const*) gdb/valprint.c:1182 + #9 0x196c524 in print_variable_and_value(char const*, symbol*, frame_info_ptr, ui_file*, int) gdb/printcmd.c:2355 + #10 0x1d99ca0 in print_variable_and_value_data::operator()(char const*, symbol*) gdb/stack.c:2308 + #11 0x1dabca0 in gdb::function_view::bind(print_variable_and_value_data&)::{lambda(gdb::fv_detail::erased_callable, char const*, symbol*)#1}::operator()(gdb::fv_detail::erased_callable, char const*, symbol*) const gdb/../gdbsupport/function-view.h:305 + #12 0x1dabd14 in gdb::function_view::bind(print_variable_and_value_data&)::{lambda(gdb::fv_detail::erased_callable, char const*, symbol*)#1}::_FUN(gdb::fv_detail::erased_callable, char const*, symbol*) gdb/../gdbsupport/function-view.h:299 + #13 0x1dab34c in gdb::function_view::operator()(char const*, symbol*) const gdb/../gdbsupport/function-view.h:289 + #14 0x1d9963c in iterate_over_block_locals gdb/stack.c:2240 + #15 0x1d99790 in iterate_over_block_local_vars(block const*, gdb::function_view) gdb/stack.c:2259 + #16 0x1d9a598 in print_frame_local_vars gdb/stack.c:2380 + #17 0x1d9afac in info_locals_command(char const*, int) gdb/stack.c:2458 + #18 0xfd7b30 in do_simple_func gdb/cli/cli-decode.c:95 + #19 0xfe5a2c in cmd_func(cmd_list_element*, char const*, int) gdb/cli/cli-decode.c:2735 + #20 0x1f03790 in execute_command(char const*, int) gdb/top.c:575 + #21 0x1384080 in command_handler(char const*) gdb/event-top.c:566 + #22 0x1384e2c in command_line_handler(std::unique_ptr >&&) gdb/event-top.c:802 + #23 0x1f731e4 in tui_command_line_handler gdb/tui/tui-interp.c:104 + #24 0x1382a58 in gdb_rl_callback_handler gdb/event-top.c:259 + #25 0x21dbb80 in rl_callback_read_char readline/readline/callback.c:290 + #26 0x1382510 in gdb_rl_callback_read_char_wrapper_noexcept gdb/event-top.c:195 + #27 0x138277c in gdb_rl_callback_read_char_wrapper gdb/event-top.c:234 + #28 0x1fe9b40 in stdin_event_handler gdb/ui.c:155 + #29 0x35ff1bc in handle_file_event gdbsupport/event-loop.cc:573 + +SUMMARY: AddressSanitizer: heap-buffer-overflow (/lib64/libasan.so.8+0x6da18) in memmove +... + +The error happens when trying to print either variable y or y2: +... + type Variable_Record (A : Boolean := True) is record + case A is + when True => + B : Integer; + when False => + C : Float; + D : Integer; + end case; + end record; + Y : Variable_Record := (A => True, B => 1); + Y2 : Variable_Record := (A => False, C => 1.0, D => 2); +... +when the variables are uninitialized. + +The error happens only when printing the entire variable: +... +(gdb) p y.a +$2 = 216 +(gdb) p y.b +There is no member named b. +(gdb) p y.c +$3 = 9.18340949e-41 +(gdb) p y.d +$4 = 1 +(gdb) p y + +... + +The error happens as follows: +- field a functions as discriminant, choosing either the b, or c+d variant. +- when y.a happens to be set to 216, as above, gdb interprets this as the + variable having the c+d variant (which is why trying to print y.b fails). +- when printing y, gdb allocates a value, copies the bytes into it from the + target, and then prints the value. +- gdb allocates the value using the type size, which is 8. It's 8 because + that's what the DW_AT_byte_size indicates. Note that for valid values of a, + it gives correct results: if a is 0 (c+d variant), size is 12, if a is 1 + (b variant), size is 8. +- gdb tries to print field d, which is at an 8 byte offset, and that results + in a out-of-bounds access for the allocated 8-byte value. + +Fix this by handling this case in value::contents_copy_raw, such that we have: +... +(gdb) p y +$1 = (a => 24, c => 9.18340949e-41, + d => ) +... + +An alternative (additional) fix could be this: in compute_variant_fields_inner +gdb reads the discriminant y.a to decide which variant is active. It would be +nice to detect that the value (y.a == 24) is not a valid Boolean, and give up +on choosing a variant altoghether. However, the situation regarding the +internal type CODE_TYPE_BOOL is currently ambiguous (see PR31282) and it's not +possible to reliably decide what valid values are. + +The test-case source file gdb.ada/uninitialized-variable-record/parse.adb is +a reduced version of gdb.ada/uninitialized_vars/parse.adb, so it copies the +copyright years. + +Note that the test-case needs gcc-12 or newer, it's unsupported for older gcc +versions. [ So, it would be nice to rewrite it into a dwarf assembly +test-case. ] + +The test-case loops over all languages. This is inherited from an earlier +attempt to fix this, which had language-specific fixes (in print_field_values, +cp_print_value_fields, pascal_object_print_value_fields and +f_language::value_print_inner). I've left this in, but I suppose it's not +strictly necessary anymore. + +Tested on x86_64-linux. + +PR exp/31258 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31258 +--- + .../gdb.ada/uninitialized-variable-record.exp | 122 ++++++++++++++++++ + .../uninitialized-variable-record/parse.adb | 33 +++++ + gdb/value.c | 3 + + 3 files changed, 158 insertions(+) + create mode 100644 gdb/testsuite/gdb.ada/uninitialized-variable-record.exp + create mode 100644 gdb/testsuite/gdb.ada/uninitialized-variable-record/parse.adb + +diff --git a/gdb/testsuite/gdb.ada/uninitialized-variable-record.exp b/gdb/testsuite/gdb.ada/uninitialized-variable-record.exp +new file mode 100644 +index 00000000000..7fc72395edf +--- /dev/null ++++ b/gdb/testsuite/gdb.ada/uninitialized-variable-record.exp +@@ -0,0 +1,122 @@ ++# Copyright 2024 Free Software Foundation, Inc. ++# ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++load_lib "ada.exp" ++ ++require allow_ada_tests ++ ++standard_ada_testfile parse ++ ++if {[gdb_compile_ada "${srcfile}" "${binfile}" executable {debug}] != "" } { ++ return -1 ++} ++ ++clean_restart ${testfile} ++ ++set bp_location [gdb_get_line_number "START" ${testdir}/parse.adb] ++runto "parse.adb:$bp_location" ++ ++# Check that we have the expected value for variable y2. ++ ++gdb_test "p y2" [string_to_regexp " = (a => false, c => 1.0, d => 2)"] ++ ++# Shorthand. ++ ++proc set_lang { lang } { ++ gdb_test_multiple "set language $lang" "" { ++ -re -wrap "" { ++ } ++ } ++} ++ ++# Calculate the offset of y2.d. ++ ++set re_cast [string_to_regexp "(access integer)"] ++gdb_test_multiple "print &y2.d - &y2" "" { ++ -re -wrap " = $re_cast ($hex)" { ++ set offset_d $expect_out(1,string) ++ pass $gdb_test_name ++ } ++} ++ ++# Try to find a interesting discriminator value, such that at the same time: ++# - the d field is part of the variable, and ++# - the type size is too small to contain d. ++ ++set interesting_discriminator -1 ++set_lang c ++for { set i 0 } { $i < 256 } { incr i } { ++ with_test_prefix $i { ++ ++ # Patch in the discriminator value. ++ gdb_test_multiple "set var *(unsigned char *)(&y2.a)=$i" "" { ++ -re -wrap "" { ++ } ++ } ++ ++ # Check that we have the variant with fields c+d instead of b. ++ set have_b 0 ++ gdb_test_multiple "with language ada -- print y2.b" "" { ++ -re -wrap " = $decimal" { ++ set have_b 1 ++ } ++ -re -wrap "" { ++ } ++ } ++ if { $have_b } { ++ # This is the variant with field b. ++ continue ++ } ++ ++ set size 0 ++ gdb_test_multiple "print sizeof (y2)" "" { ++ -re -wrap " = (.*)" { ++ set size $expect_out(1,string) ++ } ++ } ++ ++ if { ! $size } { ++ continue ++ } ++ ++ if { [expr $size > $offset_d] } { ++ # Field d fits in the size. ++ continue ++ } ++ ++ set interesting_discriminator $i ++ break ++ } ++} ++ ++require {expr $interesting_discriminator != -1} ++ ++foreach lang [gdb_supported_languages] { ++ with_test_prefix $lang { ++ set_lang $lang ++ ++ gdb_test_multiple "print y2" "" { ++ -re -wrap ", d => $decimal.*" { ++ fail $gdb_test_name ++ } ++ -re -wrap ", d = $decimal.*" { ++ fail $gdb_test_name ++ } ++ -re -wrap "" { ++ pass $gdb_test_name ++ } ++ } ++ } ++} +diff --git a/gdb/testsuite/gdb.ada/uninitialized-variable-record/parse.adb b/gdb/testsuite/gdb.ada/uninitialized-variable-record/parse.adb +new file mode 100644 +index 00000000000..f00c75ca2dc +--- /dev/null ++++ b/gdb/testsuite/gdb.ada/uninitialized-variable-record/parse.adb +@@ -0,0 +1,33 @@ ++-- Copyright 2009-2024 Free Software Foundation, Inc. ++-- ++-- This program is free software; you can redistribute it and/or modify ++-- it under the terms of the GNU General Public License as published by ++-- the Free Software Foundation; either version 3 of the License, or ++-- (at your option) any later version. ++-- ++-- This program is distributed in the hope that it will be useful, ++-- but WITHOUT ANY WARRANTY; without even the implied warranty of ++-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++-- GNU General Public License for more details. ++-- ++-- You should have received a copy of the GNU General Public License ++-- along with this program. If not, see . ++ ++-- Based on gdb.ada/uninitialized_vars/parse.adb. ++ ++procedure Parse is ++ ++ type Variable_Record (A : Boolean := True) is record ++ case A is ++ when True => ++ B : Integer; ++ when False => ++ C : Float; ++ D : Integer; ++ end case; ++ end record; ++ Y2 : Variable_Record := (A => False, C => 1.0, D => 2); ++ ++begin ++ null; -- START ++end Parse; +diff --git a/gdb/value.c b/gdb/value.c +index 1cc32625629..56ae9db6603 100644 +--- a/gdb/value.c ++++ b/gdb/value.c +@@ -1188,6 +1188,9 @@ value::contents_copy_raw (struct value *dst, LONGEST dst_offset, + gdb_assert (!dst->bits_any_optimized_out (TARGET_CHAR_BIT * dst_offset, + TARGET_CHAR_BIT * length)); + ++ if ((src_offset + copy_length) * unit_size > enclosing_type ()-> length ()) ++ error (_("access outside bounds of object")); ++ + /* Copy the data. */ + gdb::array_view dst_contents + = dst->contents_all_raw ().slice (dst_offset * unit_size, +-- +2.35.3 + diff --git a/gdb-exp-redo-cast-handling-for-indirection.patch b/gdb-exp-redo-cast-handling-for-indirection.patch new file mode 100644 index 0000000..3000d9b --- /dev/null +++ b/gdb-exp-redo-cast-handling-for-indirection.patch @@ -0,0 +1,86 @@ +From a6800d9c8145f25001dd39afc3571e3350573e81 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Mon, 6 May 2024 14:23:25 +0200 +Subject: [PATCH] [gdb/exp] Redo cast handling for indirection + +In commit ed8fd0a342f ("[gdb/exp] Fix cast handling for indirection"), I +introduced the behaviour that even though we have: +... +(gdb) p *a_loc () +'a_loc' has unknown return type; cast the call to its declared return type +... +we get: +... +(gdb) p (char)*a_loc () +$1 = 97 'a' +... + +In other words, the unknown return type of a_loc is inferred from the cast, +effectually evaluating: +... +(gdb) p (char)*(char *)a_loc () +... + +This is convient for the case that errno is defined as: +... + #define errno (*__errno_location ()) +... +and the return type of __errno_location is unknown but the macro definition is +known, such that we can use: +... +(gdb) p (int)errno +... +instead of +... +(gdb) p *(int *)__errno_location () +... + +However, as Pedro has pointed out in post-commit review [1], this makes it +harder to reason about the semantics of an expression. + +For instance, this: +... +(gdb) p (long long)*a_loc ()" +... +would be evaluated without debug info as: +... +(gdb) p (long long)*(long long *)a_loc ()" +... +but with debug info as: +... +(gdb) p (long long)*(char *)a_loc ()" +... + +Fix this by instead simply erroring out for this case: +... +(gdb) p (char)*a_loc () +'a_loc' has unknown return type; cast the call to its declared return type +... + +Tested on x86_64-linux. + +Approved-By: Pedro Alves + +[1] https://sourceware.org/pipermail/gdb-patches/2024-May/208821.html +--- + gdb/testsuite/gdb.base/cast-indirection.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.base/cast-indirection.exp b/gdb/testsuite/gdb.base/cast-indirection.exp +index f1fe4302d27..7b9b5a5d677 100644 +--- a/gdb/testsuite/gdb.base/cast-indirection.exp ++++ b/gdb/testsuite/gdb.base/cast-indirection.exp +@@ -13,7 +13,7 @@ + # You should have received a copy of the GNU General Public License + # along with this program. If not, see . + +-# Check that "p (char)*a_loc ()" is handled as "p (char)*(char *)a_loc ()". ++# Check that "p (char)*a_loc ()" is handled correctly. + + standard_testfile + + +base-commit: fc73000faa1798573090994167b7e2d451c211db +-- +2.35.3 + diff --git a/gdb-fedora-libncursesw.patch b/gdb-fedora-libncursesw.patch new file mode 100644 index 0000000..6bf6aa3 --- /dev/null +++ b/gdb-fedora-libncursesw.patch @@ -0,0 +1,333 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-fedora-libncursesw.patch + +;; Force libncursesw over libncurses to match the includes (RH BZ 1270534). +;;=push+jan + +Fedora: Force libncursesw over libncurses to match the includes. +https://bugzilla.redhat.com/show_bug.cgi?id=1270534 + +diff --git a/gdb/configure b/gdb/configure +--- a/gdb/configure ++++ b/gdb/configure +@@ -780,9 +780,6 @@ ENABLE_BFD_64_BIT_TRUE + subdirs + RPM_LIBS + RPM_CFLAGS +-PKG_CONFIG_LIBDIR +-PKG_CONFIG_PATH +-PKG_CONFIG + GDB_DATADIR + DEBUGDIR + MAKEINFO_EXTRA_FLAGS +@@ -990,12 +987,12 @@ PKG_CONFIG_PATH + PKG_CONFIG_LIBDIR + MAKEINFO + MAKEINFOFLAGS ++RPM_CFLAGS ++RPM_LIBS + AMD_DBGAPI_CFLAGS + AMD_DBGAPI_LIBS + DEBUGINFOD_CFLAGS + DEBUGINFOD_LIBS +-RPM_CFLAGS +-RPM_LIBS + YACC + YFLAGS + ZSTD_CFLAGS +@@ -1684,11 +1681,11 @@ Optional Packages: + [--with-auto-load-dir] + --without-auto-load-safe-path + do not restrict auto-loaded files locations ++ --with-rpm query rpm database for missing debuginfos (yes/no, ++ def. auto=librpm.so) + --with-amd-dbgapi support for the amd-dbgapi target (yes / no / auto) + --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 +@@ -1761,6 +1758,8 @@ Some influential environment variables: + MAKEINFO Parent configure detects if it is of sufficient version. + MAKEINFOFLAGS + Parameters for MAKEINFO. ++ RPM_CFLAGS C compiler flags for RPM, overriding pkg-config ++ RPM_LIBS linker flags for RPM, overriding pkg-config + AMD_DBGAPI_CFLAGS + C compiler flags for AMD_DBGAPI, overriding pkg-config + AMD_DBGAPI_LIBS +@@ -1769,8 +1768,6 @@ 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'. +@@ -11495,7 +11492,7 @@ else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +-#line 11486 "configure" ++#line 11495 "configure" + #include "confdefs.h" + + #if HAVE_DLFCN_H +@@ -11601,7 +11598,7 @@ else + lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 + lt_status=$lt_dlunknown + cat > conftest.$ac_ext <<_LT_EOF +-#line 11592 "configure" ++#line 11601 "configure" + #include "confdefs.h" + + #if HAVE_DLFCN_H +@@ -18102,8 +18099,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. */ +@@ -18275,132 +18272,12 @@ $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 + +- +- +- +- +- +- +-if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then +- if test -n "$ac_tool_prefix"; then +- # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. +-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 : +- $as_echo_n "(cached) " >&6 +-else +- case $PKG_CONFIG in +- [\\/]* | ?:[\\/]*) +- ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. +- ;; +- *) +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-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 +- 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 +- fi +-done +- done +-IFS=$as_save_IFS +- +- ;; +-esac +-fi +-PKG_CONFIG=$ac_cv_path_PKG_CONFIG +-if test -n "$PKG_CONFIG"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 +-$as_echo "$PKG_CONFIG" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- +-fi +-if test -z "$ac_cv_path_PKG_CONFIG"; then +- ac_pt_PKG_CONFIG=$PKG_CONFIG +- # Extract the first word of "pkg-config", so it can be a program name with args. +-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 : +- $as_echo_n "(cached) " >&6 +-else +- case $ac_pt_PKG_CONFIG in +- [\\/]* | ?:[\\/]*) +- ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. +- ;; +- *) +- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +-for as_dir in $PATH +-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 +- 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 +- fi +-done +- done +-IFS=$as_save_IFS +- +- ;; +-esac +-fi +-ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG +-if test -n "$ac_pt_PKG_CONFIG"; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 +-$as_echo "$ac_pt_PKG_CONFIG" >&6; } +-else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +-fi +- +- if test "x$ac_pt_PKG_CONFIG" = x; then +- PKG_CONFIG="" +- else +- case $cross_compiling:$ac_tool_warned in +-yes:) +-{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 +-$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} +-ac_tool_warned=yes ;; +-esac +- PKG_CONFIG=$ac_pt_PKG_CONFIG +- fi +-else +- PKG_CONFIG="$ac_cv_path_PKG_CONFIG" +-fi +- +-fi +-if test -n "$PKG_CONFIG"; then +- _pkg_min_version=0.9.0 +- { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 +-$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } +- if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +-$as_echo "yes" >&6; } +- else +- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +-$as_echo "no" >&6; } +- PKG_CONFIG="" +- fi +-fi +- + pkg_failed=no +-{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for RPM" >&5 +-$as_echo_n "checking for RPM... " >&6; } ++{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rpm" >&5 ++$as_echo_n "checking for rpm... " >&6; } + + if test -n "$RPM_CFLAGS"; then + pkg_cv_RPM_CFLAGS="$RPM_CFLAGS" +@@ -18437,6 +18314,30 @@ fi + pkg_failed=untried + fi + ++if test $pkg_failed = no; then ++ pkg_save_LDFLAGS="$LDFLAGS" ++ LDFLAGS="$LDFLAGS $pkg_cv_RPM_LIBS" ++ cat confdefs.h - <<_ACEOF >conftest.$ac_ext ++/* end confdefs.h. */ ++ ++int ++main () ++{ ++ ++ ; ++ return 0; ++} ++_ACEOF ++if ac_fn_c_try_link "$LINENO"; then : ++ ++else ++ pkg_failed=yes ++fi ++rm -f core conftest.err conftest.$ac_objext \ ++ conftest$ac_exeext conftest.$ac_ext ++ LDFLAGS=$pkg_save_LDFLAGS ++fi ++ + + + if test $pkg_failed = yes; then +@@ -18531,7 +18432,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;} +@@ -21164,6 +21065,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. ++ # Fedora: Force libncursesw over libncurses to match the includes. + { $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 : +@@ -21188,7 +21090,7 @@ return waddstr (); + return 0; + } + _ACEOF +-for ac_lib in '' ncursesw ncurses cursesX curses; do ++for ac_lib in '' ncursesw; do + if test -z "$ac_lib"; then + ac_res="none required" + else +@@ -21260,6 +21162,7 @@ case $host_os in + esac + + # These are the libraries checked by Readline. ++# Fedora: Force libncursesw over libncurses to match the includes. + { $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 : +@@ -21284,7 +21187,7 @@ return tgetent (); + return 0; + } + _ACEOF +-for ac_lib in '' termcap tinfow tinfo curses ncursesw ncurses; do ++for ac_lib in '' ncursesw; do + if test -z "$ac_lib"; then + ac_res="none required" + else +diff --git a/gdb/configure.ac b/gdb/configure.ac +--- a/gdb/configure.ac ++++ b/gdb/configure.ac +@@ -749,7 +749,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. +- AC_SEARCH_LIBS(waddstr, [ncursesw ncurses cursesX curses], ++ # Fedora: Force libncursesw over libncurses to match the includes. ++ AC_SEARCH_LIBS(waddstr, [ncursesw], + [curses_found=yes + AC_DEFINE([HAVE_LIBCURSES], [1], + [Define to 1 if curses is enabled.]) +@@ -789,7 +790,8 @@ case $host_os in + esac + + # These are the libraries checked by Readline. +-AC_SEARCH_LIBS(tgetent, [termcap tinfow tinfo curses ncursesw ncurses]) ++# Fedora: Force libncursesw over libncurses to match the includes. ++AC_SEARCH_LIBS(tgetent, [ncursesw]) + + if test "$ac_cv_search_tgetent" = no; then + CONFIG_OBS="$CONFIG_OBS stub-termcap.o" diff --git a/gdb-fix-heap-use-after-free-in-select_event_lwp.patch b/gdb-fix-heap-use-after-free-in-select_event_lwp.patch new file mode 100644 index 0000000..b362a6e --- /dev/null +++ b/gdb-fix-heap-use-after-free-in-select_event_lwp.patch @@ -0,0 +1,144 @@ +From 350172ea215c7074601e8424ff636563612f91e8 Mon Sep 17 00:00:00 2001 +From: Pedro Alves +Date: Wed, 21 Feb 2024 16:23:55 +0000 +Subject: [PATCH 14/48] [gdb] Fix heap-use-after-free in select_event_lwp + +PR gdb/31259 reveals one scenario where we run into a +heap-use-after-free reported by thread sanitizer, while running +gdb.base/vfork-follow-parent.exp. + +The heap-use-after-free happens during the following scenario: + + - linux_nat_wait_1 is about to return an event for T2. It stops all + other threads, and while doing so, stop_wait_callback -> wait_lwp + sees T1 exit, and decides to leave the exit event pending. It + should have set the lp->stopped flag too, but does not -- this is + the bug. + + - The event for T2 is reported, is processed by infrun, and we're + back at linux_nat_wait_1. + + - linux_nat_wait_1 selects LWP T1 with the pending exit status to + report. + + - it sets variable lp to point to the corresponding lwp_info. + + - it calls stop_callback and stop_wait_callback for all threads + (because !target_is_non_stop_p ()). + + - it calls select_event_lwp to maybe pick another thread than T1, to + prevent starvation. + +The problem is the following: + + - while calling stop_wait_callback for all threads, it also does this + for T1. While doing so, the corresponding lwp_info is deleted + (callstack stop_wait_callback -> wait_lwp -> exit_lwp -> + delete_lwp), leaving variable lp as a dangling pointer. + + - variable lp is passed to select_event_lwp, which derefences it, + which causes the heap-use-after-free. + +Note that the comment here mentions "all other LWP's": +... + /* Now stop all other LWP's ... */ + iterate_over_lwps (minus_one_ptid, stop_callback); + /* ... and wait until all of them have reported back that + they're no longer running. */ + iterate_over_lwps (minus_one_ptid, stop_wait_callback); +... + +The reason the comments say "all other LWP's", and doesn't bother +filtering out LP is that lp->stopped should be true at this point, and +the callbacks (both stop_callback and stop_wait_callback) check that +flag, and do nothing if set. I.e., they skip already-stopped threads, +so they should skip LP. + +In this particular scenario, though, we missed setting the stopped +flag right in the first step described above, so LP was iterated over +incorrectly. + +The fix is to make wait_lwp set the lp->stopped flag when it decides +to leave the exit event pending. However, going a bit further, +gdbserver has a mark_lwp_dead function to centralize setting up +various lwp flags such that the rest of the code doesn't mishandle +them, and it seems like a good idea to do a similar thing in gdb as +well. That is what this patch does. + +PR gdb/31259 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31259 +Co-Authored-By: Tom de Vries +Change-Id: I4a6169976f89bf714c478cbb2b7d4c32365e62a9 +--- + gdb/linux-nat.c | 34 +++++++++++++++++++++++++--------- + 1 file changed, 25 insertions(+), 9 deletions(-) + +diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c +index 7e36ced6292..ed445c5e5bb 100644 +--- a/gdb/linux-nat.c ++++ b/gdb/linux-nat.c +@@ -2029,6 +2029,27 @@ wait_for_signal () + } + } + ++/* Mark LWP dead, with STATUS as exit status pending to report ++ later. */ ++ ++static void ++mark_lwp_dead (lwp_info *lp, int status) ++{ ++ /* Store the exit status lp->waitstatus, because lp->status would be ++ ambiguous (W_EXITCODE(0,0) == 0). */ ++ lp->waitstatus = host_status_to_waitstatus (status); ++ ++ /* If we're processing LP's status, there should be no other event ++ already recorded as pending. */ ++ gdb_assert (lp->status == 0); ++ ++ /* Dead LWPs aren't expected to report a pending sigstop. */ ++ lp->signalled = 0; ++ ++ /* Prevent trying to stop it. */ ++ lp->stopped = 1; ++} ++ + /* Wait for LP to stop. Returns the wait status, or 0 if the LWP has + exited. */ + +@@ -2114,9 +2135,8 @@ wait_lwp (struct lwp_info *lp) + + /* If this is the leader exiting, it means the whole + process is gone. Store the status to report to the +- core. Store it in lp->waitstatus, because lp->status +- would be ambiguous (W_EXITCODE(0,0) == 0). */ +- lp->waitstatus = host_status_to_waitstatus (status); ++ core. */ ++ mark_lwp_dead (lp, status); + return 0; + } + +@@ -2908,12 +2928,7 @@ linux_nat_filter_event (int lwpid, int status) + linux_nat_debug_printf ("LWP %ld exited (resumed=%d)", + lp->ptid.lwp (), lp->resumed); + +- /* Dead LWP's aren't expected to reported a pending sigstop. */ +- lp->signalled = 0; +- +- /* Store the pending event in the waitstatus, because +- W_EXITCODE(0,0) == 0. */ +- lp->waitstatus = host_status_to_waitstatus (status); ++ mark_lwp_dead (lp, status); + return; + } + +@@ -3248,6 +3263,7 @@ linux_nat_wait_1 (ptid_t ptid, struct target_waitstatus *ourstatus, + } + + gdb_assert (lp); ++ gdb_assert (lp->stopped); + + status = lp->status; + lp->status = 0; +-- +2.35.3 + diff --git a/gdb-fix-segfault-in-for_each_block-part-1.patch b/gdb-fix-segfault-in-for_each_block-part-1.patch new file mode 100644 index 0000000..8dad7a1 --- /dev/null +++ b/gdb-fix-segfault-in-for_each_block-part-1.patch @@ -0,0 +1,636 @@ +From 1d02ba0f4adcba2595a67e88fb1ba6d35c7f8e5b Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 7 May 2024 11:33:57 +0200 +Subject: [PATCH] [gdb] Fix segfault in for_each_block, part 1 + +When running test-case gdb.base/vfork-follow-parent.exp on powerpc64 (likewise +on s390x), I run into: +... +(gdb) PASS: gdb.base/vfork-follow-parent.exp: \ + exec_file=vfork-follow-parent-exit: target-non-stop=on: non-stop=off: \ + resolution_method=schedule-multiple: print unblock_parent = 1 +continue^M +Continuing.^M +Reading symbols from vfork-follow-parent-exit...^M +^M +^M +Fatal signal: Segmentation fault^M +----- Backtrace -----^M +0x1027d3e7 gdb_internal_backtrace_1^M + src/gdb/bt-utils.c:122^M +0x1027d54f _Z22gdb_internal_backtracev^M + src/gdb/bt-utils.c:168^M +0x1057643f handle_fatal_signal^M + src/gdb/event-top.c:889^M +0x10576677 handle_sigsegv^M + src/gdb/event-top.c:962^M +0x3fffa7610477 ???^M +0x103f2144 for_each_block^M + src/gdb/dcache.c:199^M +0x103f235b _Z17dcache_invalidateP13dcache_struct^M + src/gdb/dcache.c:251^M +0x10bde8c7 _Z24target_dcache_invalidatev^M + src/gdb/target-dcache.c:50^M +... +or similar. + +The root cause for the segmentation fault is that linux_is_uclinux gives an +incorrect result: it should always return false, given that we're running on a +regular linux system, but instead it returns first true, then false. + +In more detail, the segmentation fault happens as follows: +- a program space with an address space is created +- a second program space is about to be created. maybe_new_address_space + is called, and because linux_is_uclinux returns true, maybe_new_address_space + returns false, and no new address space is created +- a second program space with the same address space is created +- a program space is deleted. Because linux_is_uclinux now returns false, + gdbarch_has_shared_address_space (current_inferior ()->arch ()) returns + false, and the address space is deleted +- when gdb uses the address space of the remaining program space, we run into + the segfault, because the address space is deleted. + +Hardcoding linux_is_uclinux to false makes the test-case pass. + +We leave addressing the root cause for the following commit in this series. + +For now, prevent the segmentation fault by making the address space a refcounted +object. + +This was already suggested here [1]: +... +A better solution might be to have the address spaces be reference counted +... + +Tested on top of trunk on x86_64-linux and ppc64le-linux. +Tested on top of gdb-14-branch on ppc64-linux. + +Co-Authored-By: Simon Marchi + +PR gdb/30547 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30547 + +[1] https://sourceware.org/pipermail/gdb-patches/2023-October/202928.html +--- + gdb/breakpoint.c | 29 ++++++++------- + gdb/inferior.c | 8 ++--- + gdb/inferior.h | 2 +- + gdb/infrun.c | 18 +++++----- + gdb/linux-nat.c | 2 +- + gdb/process-stratum-target.c | 2 +- + gdb/progspace.c | 22 +++++------- + gdb/progspace.h | 64 +++++++++++++++++++++------------- + gdb/record-btrace.c | 2 +- + gdb/regcache.c | 2 +- + gdb/scoped-mock-context.h | 2 +- + gdb/target-dcache.c | 11 +++--- + gdbsupport/refcounted-object.h | 17 +++++++++ + 13 files changed, 102 insertions(+), 79 deletions(-) + +diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c +index 01f187ca4fe..a22bdb091cd 100644 +--- a/gdb/breakpoint.c ++++ b/gdb/breakpoint.c +@@ -1723,7 +1723,7 @@ one_breakpoint_xfer_memory (gdb_byte *readbuf, gdb_byte *writebuf, + int bptoffset = 0; + + if (!breakpoint_address_match (target_info->placed_address_space, 0, +- current_program_space->aspace, 0)) ++ current_program_space->aspace.get (), 0)) + { + /* The breakpoint is inserted in a different address space. */ + return; +@@ -2409,7 +2409,7 @@ should_be_inserted (struct bp_location *bl) + a breakpoint. */ + if ((bl->loc_type == bp_loc_software_breakpoint + || bl->loc_type == bp_loc_hardware_breakpoint) +- && stepping_past_instruction_at (bl->pspace->aspace, ++ && stepping_past_instruction_at (bl->pspace->aspace.get (), + bl->address) + /* The single-step breakpoint may be inserted at the location + we're trying to step if the instruction branches to itself. +@@ -2847,7 +2847,7 @@ insert_bp_location (struct bp_location *bl, + read the breakpoint instead of returning the data saved in + the breakpoint location's shadow contents. */ + bl->target_info.reqstd_address = bl->address; +- bl->target_info.placed_address_space = bl->pspace->aspace; ++ bl->target_info.placed_address_space = bl->pspace->aspace.get (); + bl->target_info.length = bl->length; + + /* When working with target-side conditions, we must pass all the conditions +@@ -4429,7 +4429,7 @@ bp_location_inserted_here_p (const struct bp_location *bl, + const address_space *aspace, CORE_ADDR pc) + { + if (bl->inserted +- && breakpoint_address_match (bl->pspace->aspace, bl->address, ++ && breakpoint_address_match (bl->pspace->aspace.get (), bl->address, + aspace, pc)) + { + /* An unmapped overlay can't be a match. */ +@@ -4508,7 +4508,7 @@ hardware_watchpoint_inserted_in_range (const address_space *aspace, + continue; + + for (bp_location &loc : bpt.locations ()) +- if (loc.pspace->aspace == aspace && loc.inserted) ++ if (loc.pspace->aspace.get () == aspace && loc.inserted) + { + CORE_ADDR l, h; + +@@ -7330,10 +7330,10 @@ breakpoint_location_address_match (struct bp_location *bl, + const address_space *aspace, + CORE_ADDR addr) + { +- return (breakpoint_address_match (bl->pspace->aspace, bl->address, ++ return (breakpoint_address_match (bl->pspace->aspace.get (), bl->address, + aspace, addr) + || (bl->length +- && breakpoint_address_match_range (bl->pspace->aspace, ++ && breakpoint_address_match_range (bl->pspace->aspace.get (), + bl->address, bl->length, + aspace, addr))); + } +@@ -7350,7 +7350,7 @@ breakpoint_location_address_range_overlap (struct bp_location *bl, + CORE_ADDR addr, int len) + { + if (gdbarch_has_global_breakpoints (target_gdbarch ()) +- || bl->pspace->aspace == aspace) ++ || bl->pspace->aspace.get () == aspace) + { + int bl_len = bl->length != 0 ? bl->length : 1; + +@@ -7407,8 +7407,10 @@ breakpoint_locations_match (const struct bp_location *loc1, + /* We compare bp_location.length in order to cover ranged + breakpoints. Keep this in sync with + bp_location_is_less_than. */ +- return (breakpoint_address_match (loc1->pspace->aspace, loc1->address, +- loc2->pspace->aspace, loc2->address) ++ return (breakpoint_address_match (loc1->pspace->aspace.get (), ++ loc1->address, ++ loc2->pspace->aspace.get (), ++ loc2->address) + && (loc1->loc_type == loc2->loc_type || sw_hw_bps_match) + && loc1->length == loc2->length); + } +@@ -9568,8 +9570,9 @@ ranged_breakpoint::breakpoint_hit (const struct bp_location *bl, + || ws.sig () != GDB_SIGNAL_TRAP) + return 0; + +- return breakpoint_address_match_range (bl->pspace->aspace, bl->address, +- bl->length, aspace, bp_addr); ++ return breakpoint_address_match_range (bl->pspace->aspace.get (), ++ bl->address, bl->length, aspace, ++ bp_addr); + } + + /* Implement the "resources_needed" method for ranged breakpoints. */ +@@ -12018,7 +12021,7 @@ code_breakpoint::breakpoint_hit (const struct bp_location *bl, + || ws.sig () != GDB_SIGNAL_TRAP) + return 0; + +- if (!breakpoint_address_match (bl->pspace->aspace, bl->address, ++ if (!breakpoint_address_match (bl->pspace->aspace.get (), bl->address, + aspace, bp_addr)) + return 0; + +diff --git a/gdb/inferior.c b/gdb/inferior.c +index 550bbd2827c..461f4fc076a 100644 +--- a/gdb/inferior.c ++++ b/gdb/inferior.c +@@ -831,15 +831,13 @@ remove_inferior_command (const char *args, int from_tty) + struct inferior * + add_inferior_with_spaces (void) + { +- struct address_space *aspace; + struct program_space *pspace; + struct inferior *inf; + + /* If all inferiors share an address space on this system, this + doesn't really return a new address space; otherwise, it + really does. */ +- aspace = maybe_new_address_space (); +- pspace = new program_space (aspace); ++ pspace = new program_space (maybe_new_address_space ()); + inf = add_inferior (0); + inf->pspace = pspace; + inf->aspace = pspace->aspace; +@@ -1002,15 +1000,13 @@ clone_inferior_command (const char *args, int from_tty) + + for (i = 0; i < copies; ++i) + { +- struct address_space *aspace; + struct program_space *pspace; + struct inferior *inf; + + /* If all inferiors share an address space on this system, this + doesn't really return a new address space; otherwise, it + really does. */ +- aspace = maybe_new_address_space (); +- pspace = new program_space (aspace); ++ pspace = new program_space (maybe_new_address_space ()); + inf = add_inferior (0); + inf->pspace = pspace; + inf->aspace = pspace->aspace; +diff --git a/gdb/inferior.h b/gdb/inferior.h +index 29c90d15efa..4139791740f 100644 +--- a/gdb/inferior.h ++++ b/gdb/inferior.h +@@ -577,7 +577,7 @@ class inferior : public refcounted_object, + bool removable = false; + + /* The address space bound to this inferior. */ +- struct address_space *aspace = NULL; ++ address_space_ref_ptr aspace; + + /* The program space bound to this inferior. */ + struct program_space *pspace = NULL; +diff --git a/gdb/infrun.c b/gdb/infrun.c +index 7be98cfc252..3854c66bf6c 100644 +--- a/gdb/infrun.c ++++ b/gdb/infrun.c +@@ -531,8 +531,8 @@ holding the child stopped. Try \"set detach-on-fork\" or \ + } + else + { +- child_inf->aspace = new address_space (); +- child_inf->pspace = new program_space (child_inf->aspace); ++ child_inf->pspace = new program_space (new_address_space ()); ++ child_inf->aspace = child_inf->pspace->aspace; + child_inf->removable = true; + clone_program_space (child_inf->pspace, parent_inf->pspace); + } +@@ -610,8 +610,8 @@ holding the child stopped. Try \"set detach-on-fork\" or \ + + child_inf->aspace = parent_inf->aspace; + child_inf->pspace = parent_inf->pspace; +- parent_inf->aspace = new address_space (); +- parent_inf->pspace = new program_space (parent_inf->aspace); ++ parent_inf->pspace = new program_space (new_address_space ()); ++ parent_inf->aspace = parent_inf->pspace->aspace; + clone_program_space (parent_inf->pspace, child_inf->pspace); + + /* The parent inferior is still the current one, so keep things +@@ -620,8 +620,8 @@ holding the child stopped. Try \"set detach-on-fork\" or \ + } + else + { +- child_inf->aspace = new address_space (); +- child_inf->pspace = new program_space (child_inf->aspace); ++ child_inf->pspace = new program_space (new_address_space ()); ++ child_inf->aspace = child_inf->pspace->aspace; + child_inf->removable = true; + child_inf->symfile_flags = SYMFILE_NO_READ; + clone_program_space (child_inf->pspace, parent_inf->pspace); +@@ -1031,7 +1031,6 @@ handle_vfork_child_exec_or_exit (int exec) + if (vfork_parent->pending_detach) + { + struct program_space *pspace; +- struct address_space *aspace; + + /* follow-fork child, detach-on-fork on. */ + +@@ -1056,9 +1055,8 @@ handle_vfork_child_exec_or_exit (int exec) + of" a hack. */ + + pspace = inf->pspace; +- aspace = inf->aspace; +- inf->aspace = nullptr; + inf->pspace = nullptr; ++ address_space_ref_ptr aspace = std::move (inf->aspace); + + if (print_inferior_events) + { +@@ -5906,7 +5904,7 @@ handle_inferior_event (struct execution_control_state *ecs) + = get_thread_arch_aspace_regcache (parent_inf, + ecs->ws.child_ptid (), + gdbarch, +- parent_inf->aspace); ++ parent_inf->aspace.get ()); + /* Read PC value of parent process. */ + parent_pc = regcache_read_pc (regcache); + +diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c +index ed445c5e5bb..c8991cc3da4 100644 +--- a/gdb/linux-nat.c ++++ b/gdb/linux-nat.c +@@ -4365,7 +4365,7 @@ linux_nat_target::thread_address_space (ptid_t ptid) + + inf = find_inferior_pid (this, pid); + gdb_assert (inf != NULL); +- return inf->aspace; ++ return inf->aspace.get (); + } + + /* Return the cached value of the processor core for thread PTID. */ +diff --git a/gdb/process-stratum-target.c b/gdb/process-stratum-target.c +index 5c031203e89..4bcca4f39c2 100644 +--- a/gdb/process-stratum-target.c ++++ b/gdb/process-stratum-target.c +@@ -37,7 +37,7 @@ process_stratum_target::thread_address_space (ptid_t ptid) + "address space of thread %s\n"), + target_pid_to_str (ptid).c_str ()); + +- return inf->aspace; ++ return inf->aspace.get (); + } + + struct gdbarch * +diff --git a/gdb/progspace.c b/gdb/progspace.c +index 1dbcd5875dd..b4d25ba6196 100644 +--- a/gdb/progspace.c ++++ b/gdb/progspace.c +@@ -55,8 +55,8 @@ address_space::address_space () + return a pointer to an existing address space, in case inferiors + share an address space on this target system. */ + +-struct address_space * +-maybe_new_address_space (void) ++address_space_ref_ptr ++maybe_new_address_space () + { + int shared_aspace = gdbarch_has_shared_address_space (target_gdbarch ()); + +@@ -66,7 +66,7 @@ maybe_new_address_space (void) + return program_spaces[0]->aspace; + } + +- return new address_space (); ++ return new_address_space (); + } + + /* Start counting over from scratch. */ +@@ -94,9 +94,9 @@ remove_program_space (program_space *pspace) + + /* See progspace.h. */ + +-program_space::program_space (address_space *aspace_) ++program_space::program_space (address_space_ref_ptr aspace_) + : num (++last_program_space_num), +- aspace (aspace_) ++ aspace (std::move (aspace_)) + { + program_spaces.push_back (this); + gdb::observers::new_program_space.notify (this); +@@ -121,8 +121,6 @@ program_space::~program_space () + /* Defer breakpoint re-set because we don't want to create new + locations for this pspace which we're tearing down. */ + clear_symtab_users (SYMFILE_DEFER_BP_RESET); +- if (!gdbarch_has_shared_address_space (target_gdbarch ())) +- delete this->aspace; + } + + /* See progspace.h. */ +@@ -408,18 +406,14 @@ update_address_spaces (void) + + if (shared_aspace) + { +- struct address_space *aspace = new address_space (); ++ address_space_ref_ptr aspace = new_address_space (); + +- delete current_program_space->aspace; + for (struct program_space *pspace : program_spaces) + pspace->aspace = aspace; + } + else + for (struct program_space *pspace : program_spaces) +- { +- delete pspace->aspace; +- pspace->aspace = new address_space (); +- } ++ pspace->aspace = new_address_space (); + + for (inferior *inf : all_inferiors ()) + if (gdbarch_has_global_solist (target_gdbarch ())) +@@ -456,5 +450,5 @@ initialize_progspace (void) + modules have done that. Do this before + initialize_current_architecture, because that accesses the ebfd + of current_program_space. */ +- current_program_space = new program_space (new address_space ()); ++ current_program_space = new program_space (new_address_space ()); + } +diff --git a/gdb/progspace.h b/gdb/progspace.h +index ee12d89c173..12f113f6d9c 100644 +--- a/gdb/progspace.h ++++ b/gdb/progspace.h +@@ -28,6 +28,8 @@ + #include "solist.h" + #include "gdbsupport/next-iterator.h" + #include "gdbsupport/safe-iterator.h" ++#include "gdbsupport/refcounted-object.h" ++#include "gdbsupport/gdb_ref_ptr.h" + #include + #include + +@@ -42,6 +44,40 @@ struct so_list; + + typedef std::list> objfile_list; + ++/* An address space. It is used for comparing if ++ pspaces/inferior/threads see the same address space and for ++ associating caches to each address space. */ ++struct address_space : public refcounted_object ++{ ++ /* Create a new address space object, and add it to the list. */ ++ address_space (); ++ DISABLE_COPY_AND_ASSIGN (address_space); ++ ++ /* Returns the integer address space id of this address space. */ ++ int num () const ++ { ++ return m_num; ++ } ++ ++ /* Per aspace data-pointers required by other GDB modules. */ ++ registry registry_fields; ++ ++private: ++ int m_num; ++}; ++ ++using address_space_ref_ptr ++ = gdb::ref_ptr>; ++ ++/* Create a new address space. */ ++ ++static inline address_space_ref_ptr ++new_address_space () ++{ ++ return address_space_ref_ptr::new_reference (new address_space); ++} ++ + /* An iterator that wraps an iterator over std::unique_ptr, + and dereferences the returned object. This is useful for iterating + over a list of shared pointers and returning raw pointers -- which +@@ -191,7 +227,7 @@ struct program_space + { + /* Constructs a new empty program space, binds it to ASPACE, and + adds it to the program space list. */ +- explicit program_space (address_space *aspace); ++ explicit program_space (address_space_ref_ptr aspace); + + /* Releases a program space, and all its contents (shared libraries, + objfiles, and any other references to the program space in other +@@ -336,7 +372,7 @@ struct program_space + are global, then this field is ignored (we don't currently + support inferiors sharing a program space if the target doesn't + make breakpoints global). */ +- struct address_space *aspace = NULL; ++ address_space_ref_ptr aspace; + + /* True if this program space's section offsets don't yet represent + the final offsets of the "live" address space (that is, the +@@ -383,28 +419,6 @@ struct program_space + target_section_table m_target_sections; + }; + +-/* An address space. It is used for comparing if +- pspaces/inferior/threads see the same address space and for +- associating caches to each address space. */ +-struct address_space +-{ +- /* Create a new address space object, and add it to the list. */ +- address_space (); +- DISABLE_COPY_AND_ASSIGN (address_space); +- +- /* Returns the integer address space id of this address space. */ +- int num () const +- { +- return m_num; +- } +- +- /* Per aspace data-pointers required by other GDB modules. */ +- registry registry_fields; +- +-private: +- int m_num; +-}; +- + /* The list of all program spaces. There's always at least one. */ + extern std::vectorprogram_spaces; + +@@ -447,7 +461,7 @@ class scoped_restore_current_program_space + /* Maybe create a new address space object, and add it to the list, or + return a pointer to an existing address space, in case inferiors + share an address space. */ +-extern struct address_space *maybe_new_address_space (void); ++extern address_space_ref_ptr maybe_new_address_space (); + + /* Update all program spaces matching to address spaces. The user may + have created several program spaces, and loaded executables into +diff --git a/gdb/record-btrace.c b/gdb/record-btrace.c +index 97447d3e8f8..a4d6c1b5bf2 100644 +--- a/gdb/record-btrace.c ++++ b/gdb/record-btrace.c +@@ -2321,7 +2321,7 @@ record_btrace_replay_at_breakpoint (struct thread_info *tp) + if (insn == NULL) + return 0; + +- return record_check_stopped_by_breakpoint (tp->inf->aspace, insn->pc, ++ return record_check_stopped_by_breakpoint (tp->inf->aspace.get (), insn->pc, + &btinfo->stop_reason); + } + +diff --git a/gdb/regcache.c b/gdb/regcache.c +index 91b20b7a2a2..a78fe0a80e7 100644 +--- a/gdb/regcache.c ++++ b/gdb/regcache.c +@@ -1628,7 +1628,7 @@ get_thread_arch_aspace_regcache_and_check (inferior *inf_for_target_calls, + the current inferior's gdbarch. Also use the current inferior's address + space. */ + gdbarch *arch = inf_for_target_calls->gdbarch; +- address_space *aspace = inf_for_target_calls->aspace; ++ address_space *aspace = inf_for_target_calls->aspace.get (); + regcache *regcache = get_thread_arch_aspace_regcache (inf_for_target_calls, + ptid, arch, aspace); + +diff --git a/gdb/scoped-mock-context.h b/gdb/scoped-mock-context.h +index 9ad7ebf5f0c..5f25dc7ed6b 100644 +--- a/gdb/scoped-mock-context.h ++++ b/gdb/scoped-mock-context.h +@@ -38,7 +38,7 @@ struct scoped_mock_context + + Target mock_target; + ptid_t mock_ptid {1, 1}; +- program_space mock_pspace {new address_space ()}; ++ program_space mock_pspace {new_address_space ()}; + inferior mock_inferior {mock_ptid.pid ()}; + thread_info mock_thread {&mock_inferior, mock_ptid}; + +diff --git a/gdb/target-dcache.c b/gdb/target-dcache.c +index 13c2888e7ea..b1b772ab76e 100644 +--- a/gdb/target-dcache.c ++++ b/gdb/target-dcache.c +@@ -33,7 +33,7 @@ int + target_dcache_init_p (void) + { + DCACHE *dcache +- = target_dcache_aspace_key.get (current_program_space->aspace); ++ = target_dcache_aspace_key.get (current_program_space->aspace.get ()); + + return (dcache != NULL); + } +@@ -44,7 +44,7 @@ void + target_dcache_invalidate (void) + { + DCACHE *dcache +- = target_dcache_aspace_key.get (current_program_space->aspace); ++ = target_dcache_aspace_key.get (current_program_space->aspace.get ()); + + if (dcache != NULL) + dcache_invalidate (dcache); +@@ -56,7 +56,7 @@ target_dcache_invalidate (void) + DCACHE * + target_dcache_get (void) + { +- return target_dcache_aspace_key.get (current_program_space->aspace); ++ return target_dcache_aspace_key.get (current_program_space->aspace.get ()); + } + + /* Return the target dcache. If it is not initialized yet, initialize +@@ -66,12 +66,13 @@ DCACHE * + target_dcache_get_or_init (void) + { + DCACHE *dcache +- = target_dcache_aspace_key.get (current_program_space->aspace); ++ = target_dcache_aspace_key.get (current_program_space->aspace.get ()); + + if (dcache == NULL) + { + dcache = dcache_init (); +- target_dcache_aspace_key.set (current_program_space->aspace, dcache); ++ target_dcache_aspace_key.set (current_program_space->aspace.get (), ++ dcache); + } + + return dcache; +diff --git a/gdbsupport/refcounted-object.h b/gdbsupport/refcounted-object.h +index d8fdb950043..294fd873df1 100644 +--- a/gdbsupport/refcounted-object.h ++++ b/gdbsupport/refcounted-object.h +@@ -67,4 +67,21 @@ struct refcounted_object_ref_policy + } + }; + ++/* A policy class to interface gdb::ref_ptr with a refcounted_object, that ++ deletes the object once the refcount reaches 0.. */ ++ ++template ++struct refcounted_object_delete_ref_policy ++{ ++ static void incref (T *obj) ++ { obj->incref (); } ++ ++ static void decref (T *obj) ++ { ++ obj->decref (); ++ if (obj->refcount () == 0) ++ delete obj; ++ } ++}; ++ + #endif /* COMMON_REFCOUNTED_OBJECT_H */ + +base-commit: 0bb6f49bb9ad577667075550ca2ad4cb49931078 +-- +2.35.3 + diff --git a/gdb-fix-segfault-in-for_each_block-part-2.patch b/gdb-fix-segfault-in-for_each_block-part-2.patch new file mode 100644 index 0000000..00df214 --- /dev/null +++ b/gdb-fix-segfault-in-for_each_block-part-2.patch @@ -0,0 +1,168 @@ +From 3490f51a80a10d46dc1885ba672d9390a8221170 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 2 Nov 2023 14:51:02 +0100 +Subject: [PATCH] Fix segfault in for_each_block, part 2 + +The previous commit describes PR gdb/30547, a segfault when running test-case +gdb.base/vfork-follow-parent.exp on powerpc64 (likewise on s390x). + +The root cause for the segmentation fault is that linux_is_uclinux gives an +incorrect result: it returns true instead of false. + +So, why does linux_is_uclinux: +... +int +linux_is_uclinux (void) +{ + CORE_ADDR dummy; + + return (target_auxv_search (AT_NULL, &dummy) > 0 + && target_auxv_search (AT_PAGESZ, &dummy) == 0); +... +return true? + +This is because ppc_linux_target_wordsize returns 4 instead of 8, causing +ppc_linux_nat_target::auxv_parse to misinterpret the auxv vector. + +So, why does ppc_linux_target_wordsize: +... +int +ppc_linux_target_wordsize (int tid) +{ + int wordsize = 4; + + /* Check for 64-bit inferior process. This is the case when the host is + 64-bit, and in addition the top bit of the MSR register is set. */ + long msr; + + errno = 0; + msr = (long) ptrace (PTRACE_PEEKUSER, tid, PT_MSR * 8, 0); + if (errno == 0 && ppc64_64bit_inferior_p (msr)) + wordsize = 8; + + return wordsize; +} +... +return 4? + +Specifically, we get this result because because tid == 0, so we get +errno == ESRCH. + +The tid == 0 is caused by the switch_to_no_thread in +handle_vfork_child_exec_or_exit: +... + /* Switch to no-thread while running clone_program_space, so + that clone_program_space doesn't want to read the + selected frame of a dead process. */ + scoped_restore_current_thread restore_thread; + switch_to_no_thread (); + + inf->pspace = new program_space (maybe_new_address_space ()); +... +but moving the maybe_new_address_space call to before that gives us the +same result. The tid is no longer 0, but we still get ESRCH because the +thread has exited. + +Fix this in handle_vfork_child_exec_or_exit by doing the +maybe_new_address_space call in the context of the vfork parent. + +Tested on top of trunk on x86_64-linux and ppc64le-linux. +Tested on top of gdb-14-branch on ppc64-linux. + +Co-Authored-By: Simon Marchi + +PR gdb/30547 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30547 +--- + gdb/infrun.c | 16 +++++++++++----- + gdb/nat/ppc-linux.c | 2 ++ + gdb/ppc-linux-nat.c | 2 ++ + gdb/s390-linux-nat.c | 5 ++++- + 4 files changed, 19 insertions(+), 6 deletions(-) + +diff --git a/gdb/infrun.c b/gdb/infrun.c +index 3854c66bf6c..d259e81df84 100644 +--- a/gdb/infrun.c ++++ b/gdb/infrun.c +@@ -1105,13 +1105,19 @@ handle_vfork_child_exec_or_exit (int exec) + go ahead and create a new one for this exiting + inferior. */ + +- /* Switch to no-thread while running clone_program_space, so +- that clone_program_space doesn't want to read the +- selected frame of a dead process. */ + scoped_restore_current_thread restore_thread; +- switch_to_no_thread (); + +- inf->pspace = new program_space (maybe_new_address_space ()); ++ /* Temporarily switch to the vfork parent, to facilitate ptrace ++ calls done during maybe_new_address_space. */ ++ switch_to_thread (any_live_thread_of_inferior (vfork_parent)); ++ address_space_ref_ptr aspace = maybe_new_address_space (); ++ ++ /* Switch back to the vfork child inferior. Switch to no-thread ++ while running clone_program_space, so that clone_program_space ++ doesn't want to read the selected frame of a dead process. */ ++ switch_to_inferior_no_thread (inf); ++ ++ inf->pspace = new program_space (std::move (aspace)); + inf->aspace = inf->pspace->aspace; + set_current_program_space (inf->pspace); + inf->removable = true; +diff --git a/gdb/nat/ppc-linux.c b/gdb/nat/ppc-linux.c +index 0957d1b58a7..74549754806 100644 +--- a/gdb/nat/ppc-linux.c ++++ b/gdb/nat/ppc-linux.c +@@ -78,6 +78,8 @@ ppc64_64bit_inferior_p (long msr) + int + ppc_linux_target_wordsize (int tid) + { ++ gdb_assert (tid != 0); ++ + int wordsize = 4; + + /* Check for 64-bit inferior process. This is the case when the host is +diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c +index d14aba694e5..817505ea73e 100644 +--- a/gdb/ppc-linux-nat.c ++++ b/gdb/ppc-linux-nat.c +@@ -1914,6 +1914,8 @@ ppc_linux_nat_target::auxv_parse (const gdb_byte **readptr, + const gdb_byte *endptr, CORE_ADDR *typep, + CORE_ADDR *valp) + { ++ gdb_assert (inferior_ptid != null_ptid); ++ + int tid = inferior_ptid.lwp (); + if (tid == 0) + tid = inferior_ptid.pid (); +diff --git a/gdb/s390-linux-nat.c b/gdb/s390-linux-nat.c +index 8f54e9f6322..54167f49480 100644 +--- a/gdb/s390-linux-nat.c ++++ b/gdb/s390-linux-nat.c +@@ -949,10 +949,12 @@ s390_target_wordsize (void) + /* Check for 64-bit inferior process. This is the case when the host is + 64-bit, and in addition bit 32 of the PSW mask is set. */ + #ifdef __s390x__ ++ int tid = s390_inferior_tid (); ++ gdb_assert (tid != 0); + long pswm; + + errno = 0; +- pswm = (long) ptrace (PTRACE_PEEKUSER, s390_inferior_tid (), PT_PSWMASK, 0); ++ pswm = (long) ptrace (PTRACE_PEEKUSER, tid, PT_PSWMASK, 0); + if (errno == 0 && (pswm & 0x100000000ul) != 0) + wordsize = 8; + #endif +@@ -965,6 +967,7 @@ s390_linux_nat_target::auxv_parse (const gdb_byte **readptr, + const gdb_byte *endptr, CORE_ADDR *typep, + CORE_ADDR *valp) + { ++ gdb_assert (inferior_ptid != null_ptid); + int sizeof_auxv_field = s390_target_wordsize (); + enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); + const gdb_byte *ptr = *readptr; + +base-commit: 1d02ba0f4adcba2595a67e88fb1ba6d35c7f8e5b +-- +2.35.3 + diff --git a/gdb-ftbs-swapped-calloc-args.patch b/gdb-ftbs-swapped-calloc-args.patch new file mode 100644 index 0000000..30d4a4a --- /dev/null +++ b/gdb-ftbs-swapped-calloc-args.patch @@ -0,0 +1,42 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Kevin Buettner +Date: Wed, 17 Jan 2024 12:53:53 -0700 +Subject: gdb-ftbs-swapped-calloc-args.patch + +Backport upstream commit 54195469c18ec9873cc5ba6907f768509473fa9b +which fixes a build problem in which arguments to calloc were swapped. + +[opcodes] ARC + PPC: Fix -Walloc-size warnings + +Recently, -Walloc-size warnings started to kick in. Fix these two +calloc() calls to match the intended usage pattern. + +opcodes/ChangeLog: + + * arc-dis.c (init_arc_disasm_info): Fix calloc() call. + * ppc-dis.c (powerpc_init_dialect): Ditto. + +diff --git a/opcodes/arc-dis.c b/opcodes/arc-dis.c +--- a/opcodes/arc-dis.c ++++ b/opcodes/arc-dis.c +@@ -147,7 +147,7 @@ static bool + init_arc_disasm_info (struct disassemble_info *info) + { + struct arc_disassemble_info *arc_infop +- = calloc (sizeof (*arc_infop), 1); ++ = calloc (1, sizeof (*arc_infop)); + + if (arc_infop == NULL) + return false; +diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c +--- a/opcodes/ppc-dis.c ++++ b/opcodes/ppc-dis.c +@@ -348,7 +348,7 @@ powerpc_init_dialect (struct disassemble_info *info) + { + ppc_cpu_t dialect = 0; + ppc_cpu_t sticky = 0; +- struct dis_private *priv = calloc (sizeof (*priv), 1); ++ struct dis_private *priv = calloc (1, sizeof (*priv)); + + if (priv == NULL) + return; diff --git a/gdb-gcore-bash.patch b/gdb-gcore-bash.patch new file mode 100644 index 0000000..724b5ea --- /dev/null +++ b/gdb-gcore-bash.patch @@ -0,0 +1,10 @@ +diff --git a/gdb/gcore.in b/gdb/gcore.in +index b9770ea415..3149f6e1fe 100644 +--- a/gdb/gcore.in ++++ b/gdb/gcore.in +@@ -1,4 +1,4 @@ +-#!/usr/bin/env bash ++#!/bin/bash + + # Copyright (C) 2003-2023 Free Software Foundation, Inc. + diff --git a/gdb-glibc-strstr-workaround.patch b/gdb-glibc-strstr-workaround.patch new file mode 100644 index 0000000..c2f50ff --- /dev/null +++ b/gdb-glibc-strstr-workaround.patch @@ -0,0 +1,132 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-glibc-strstr-workaround.patch + +;; Workaround PR libc/14166 for inferior calls of strstr. +;;=fedoratest: Compatibility with RHELs (unchecked which ones). + +diff --git a/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp b/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp +@@ -0,0 +1,119 @@ ++# Copyright (C) 2012 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 . ++ ++# Workaround for: ++# invalid IFUNC DW_AT_linkage_name: memmove strstr time ++# http://sourceware.org/bugzilla/show_bug.cgi?id=14166 ++ ++if {[skip_shlib_tests]} { ++ return 0 ++} ++ ++set testfile "gnu-ifunc-strstr-workaround" ++set executable ${testfile} ++set srcfile start.c ++set binfile [standard_output_file ${executable}] ++ ++if [prepare_for_testing ${testfile}.exp $executable $srcfile] { ++ return -1 ++} ++ ++if ![runto_main] { ++ return 0 ++} ++ ++set test "ptype atoi" ++gdb_test_multiple $test $test { ++ -re "type = int \\(const char \\*\\)\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re "type = int \\(\\)\r\n$gdb_prompt $" { ++ untested "$test (no DWARF)" ++ return 0 ++ } ++ -re "type = \\(\\)\r\n$gdb_prompt $" { ++ untested "$test (no DWARF)" ++ return 0 ++ } ++} ++ ++set addr "" ++set test "print strstr" ++gdb_test_multiple $test $test { ++ -re " = {} (0x\[0-9a-f\]+) \r\n$gdb_prompt $" { ++ set addr $expect_out(1,string) ++ pass $test ++ } ++ -re " = {} (0x\[0-9a-f\]+) <__strstr>\r\n$gdb_prompt $" { ++ set addr $expect_out(1,string) ++ pass "$test (GDB workaround)" ++ } ++ -re " = {} (0x\[0-9a-f\]+) <__libc_strstr>\r\n$gdb_prompt $" { ++ set addr $expect_out(1,string) ++ pass "$test (fixed glibc)" ++ } ++ -re " = {} (0x\[0-9a-f\]+) <__libc_strstr_ifunc>\r\n$gdb_prompt $" { ++ set addr $expect_out(1,string) ++ pass "$test (fixed glibc)" ++ } ++ -re " = {char \\*\\(const char \\*, const char \\*\\)} 0x\[0-9a-f\]+ \r\n$gdb_prompt $" { ++ untested "$test (gnu-ifunc not in use by glibc)" ++ return 0 ++ } ++} ++ ++set test "info sym" ++gdb_test_multiple "info sym $addr" $test { ++ -re "strstr in section \\.text of /lib\[^/\]*/libc.so.6\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re " = {char \\*\\(const char \\*, const char \\*\\)} 0x\[0-9a-f\]+ \r\n$gdb_prompt $" { ++ # unexpected ++ xfail "$test (not in libc.so.6)" ++ return 0 ++ } ++} ++ ++set test "info addr strstr" ++gdb_test_multiple $test $test { ++ -re "Symbol \"strstr\" is a function at address $addr\\.\r\n$gdb_prompt $" { ++ fail "$test (DWARF for strstr)" ++ } ++ -re "Symbol \"strstr\" is at $addr in a file compiled without debugging\\.\r\n$gdb_prompt $" { ++ pass "$test" ++ } ++} ++ ++set test "print strstr second time" ++gdb_test_multiple "print strstr" $test { ++ -re " = {} $addr \r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re " = {} $addr <__strstr>\r\n$gdb_prompt $" { ++ pass "$test (GDB workaround)" ++ } ++ -re " = {} $addr <__libc_strstr>\r\n$gdb_prompt $" { ++ pass "$test (fixed glibc)" ++ } ++ -re " = {} $addr <__libc_strstr_ifunc>\r\n$gdb_prompt $" { ++ pass "$test (fixed glibc)" ++ } ++ -re " = {void \\*\\(void\\)} 0x\[0-9a-f\]+ \r\n$gdb_prompt $" { ++ fail $test ++ } ++} ++ ++gdb_test {print (char *)strstr("abc","b")} { = 0x[0-9a-f]+ "bc"} ++gdb_test {print (char *)strstr("def","e")} { = 0x[0-9a-f]+ "ef"} diff --git a/gdb-gstack.man b/gdb-gstack.man new file mode 100644 index 0000000..f5bcea6 --- /dev/null +++ b/gdb-gstack.man @@ -0,0 +1,48 @@ +.\" +.\" gstack manual page. +.\" Copyright (c) 1999 Ross Thompson +.\" Copyright (c) 2001, 2002, 2004, 2008 Red Hat, Inc. +.\" +.\" Original author: Ross Thompson +.\" +.\" 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 2, 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; see the file COPYING. If not, write to +.\" the Free Software Foundation, 59 Temple Place - Suite 330, +.\" Boston, MA 02111-1307, USA. +.\" +.TH GSTACK 1 "Feb 15 2008" "Red Hat Linux" "Linux Programmer's Manual" + +.SH NAME +gstack \- print a stack trace of a running process + +.SH SYNOPSIS +.B gstack +pid + +.SH DESCRIPTION + +\f3gstack\f1 attaches to the active process named by the \f3pid\f1 on +the command line, and prints out an execution stack trace. If ELF +symbols exist in the binary (usually the case unless you have run +strip(1)), then symbolic addresses are printed as well. + +If the process is part of a thread group, then \f3gstack\f1 will print +out a stack trace for each of the threads in the group. + +.SH SEE ALSO +nm(1), ptrace(2), gdb(1) + +.SH AUTHORS +Ross Thompson + +Red Hat, Inc. diff --git a/gdb-linux_perf-bundle.patch b/gdb-linux_perf-bundle.patch new file mode 100644 index 0000000..36dbe9f --- /dev/null +++ b/gdb-linux_perf-bundle.patch @@ -0,0 +1,226 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-linux_perf-bundle.patch + +;; [dts+el7] [x86*] Bundle linux_perf.h for libipt (RH BZ 1256513). +;;=fedora + +diff --git a/gdb/gdb.c b/gdb/gdb.c +--- a/gdb/gdb.c ++++ b/gdb/gdb.c +@@ -21,6 +21,10 @@ + #include "interps.h" + #include "run-on-main-thread.h" + ++#ifdef PERF_ATTR_SIZE_VER5_BUNDLE ++extern "C" void __libipt_init(void); ++#endif ++ + int + main (int argc, char **argv) + { +@@ -32,6 +36,10 @@ main (int argc, char **argv) + + struct captured_main_args args; + ++#ifdef PERF_ATTR_SIZE_VER5_BUNDLE ++ __libipt_init(); ++#endif ++ + memset (&args, 0, sizeof args); + args.argc = argc; + args.argv = argv; +diff --git a/gdb/nat/linux-btrace.h b/gdb/nat/linux-btrace.h +--- a/gdb/nat/linux-btrace.h ++++ b/gdb/nat/linux-btrace.h +@@ -28,6 +28,177 @@ + # include + #endif + ++#ifdef PERF_ATTR_SIZE_VER5_BUNDLE ++#ifndef HAVE_LINUX_PERF_EVENT_H ++# error "PERF_ATTR_SIZE_VER5_BUNDLE && !HAVE_LINUX_PERF_EVENT_H" ++#endif ++#ifndef PERF_ATTR_SIZE_VER5 ++#define PERF_ATTR_SIZE_VER5 ++#define perf_event_mmap_page perf_event_mmap_page_bundle ++// kernel-headers-3.10.0-493.el7.x86_64/usr/include/linux/perf_event.h ++/* ++ * Structure of the page that can be mapped via mmap ++ */ ++struct perf_event_mmap_page { ++ __u32 version; /* version number of this structure */ ++ __u32 compat_version; /* lowest version this is compat with */ ++ ++ /* ++ * Bits needed to read the hw events in user-space. ++ * ++ * u32 seq, time_mult, time_shift, index, width; ++ * u64 count, enabled, running; ++ * u64 cyc, time_offset; ++ * s64 pmc = 0; ++ * ++ * do { ++ * seq = pc->lock; ++ * barrier() ++ * ++ * enabled = pc->time_enabled; ++ * running = pc->time_running; ++ * ++ * if (pc->cap_usr_time && enabled != running) { ++ * cyc = rdtsc(); ++ * time_offset = pc->time_offset; ++ * time_mult = pc->time_mult; ++ * time_shift = pc->time_shift; ++ * } ++ * ++ * index = pc->index; ++ * count = pc->offset; ++ * if (pc->cap_user_rdpmc && index) { ++ * width = pc->pmc_width; ++ * pmc = rdpmc(index - 1); ++ * } ++ * ++ * barrier(); ++ * } while (pc->lock != seq); ++ * ++ * NOTE: for obvious reason this only works on self-monitoring ++ * processes. ++ */ ++ __u32 lock; /* seqlock for synchronization */ ++ __u32 index; /* hardware event identifier */ ++ __s64 offset; /* add to hardware event value */ ++ __u64 time_enabled; /* time event active */ ++ __u64 time_running; /* time event on cpu */ ++ union { ++ __u64 capabilities; ++ struct { ++ __u64 cap_bit0 : 1, /* Always 0, deprecated, see commit 860f085b74e9 */ ++ cap_bit0_is_deprecated : 1, /* Always 1, signals that bit 0 is zero */ ++ ++ cap_user_rdpmc : 1, /* The RDPMC instruction can be used to read counts */ ++ cap_user_time : 1, /* The time_* fields are used */ ++ cap_user_time_zero : 1, /* The time_zero field is used */ ++ cap_____res : 59; ++ }; ++ }; ++ ++ /* ++ * If cap_user_rdpmc this field provides the bit-width of the value ++ * read using the rdpmc() or equivalent instruction. This can be used ++ * to sign extend the result like: ++ * ++ * pmc <<= 64 - width; ++ * pmc >>= 64 - width; // signed shift right ++ * count += pmc; ++ */ ++ __u16 pmc_width; ++ ++ /* ++ * If cap_usr_time the below fields can be used to compute the time ++ * delta since time_enabled (in ns) using rdtsc or similar. ++ * ++ * u64 quot, rem; ++ * u64 delta; ++ * ++ * quot = (cyc >> time_shift); ++ * rem = cyc & (((u64)1 << time_shift) - 1); ++ * delta = time_offset + quot * time_mult + ++ * ((rem * time_mult) >> time_shift); ++ * ++ * Where time_offset,time_mult,time_shift and cyc are read in the ++ * seqcount loop described above. This delta can then be added to ++ * enabled and possible running (if index), improving the scaling: ++ * ++ * enabled += delta; ++ * if (index) ++ * running += delta; ++ * ++ * quot = count / running; ++ * rem = count % running; ++ * count = quot * enabled + (rem * enabled) / running; ++ */ ++ __u16 time_shift; ++ __u32 time_mult; ++ __u64 time_offset; ++ /* ++ * If cap_usr_time_zero, the hardware clock (e.g. TSC) can be calculated ++ * from sample timestamps. ++ * ++ * time = timestamp - time_zero; ++ * quot = time / time_mult; ++ * rem = time % time_mult; ++ * cyc = (quot << time_shift) + (rem << time_shift) / time_mult; ++ * ++ * And vice versa: ++ * ++ * quot = cyc >> time_shift; ++ * rem = cyc & (((u64)1 << time_shift) - 1); ++ * timestamp = time_zero + quot * time_mult + ++ * ((rem * time_mult) >> time_shift); ++ */ ++ __u64 time_zero; ++ __u32 size; /* Header size up to __reserved[] fields. */ ++ ++ /* ++ * Hole for extension of the self monitor capabilities ++ */ ++ ++ __u8 __reserved[118*8+4]; /* align to 1k. */ ++ ++ /* ++ * Control data for the mmap() data buffer. ++ * ++ * User-space reading the @data_head value should issue an smp_rmb(), ++ * after reading this value. ++ * ++ * When the mapping is PROT_WRITE the @data_tail value should be ++ * written by userspace to reflect the last read data, after issueing ++ * an smp_mb() to separate the data read from the ->data_tail store. ++ * In this case the kernel will not over-write unread data. ++ * ++ * See perf_output_put_handle() for the data ordering. ++ * ++ * data_{offset,size} indicate the location and size of the perf record ++ * buffer within the mmapped area. ++ */ ++ __u64 data_head; /* head in the data section */ ++ __u64 data_tail; /* user-space written tail */ ++ __u64 data_offset; /* where the buffer starts */ ++ __u64 data_size; /* data buffer size */ ++ ++ /* ++ * AUX area is defined by aux_{offset,size} fields that should be set ++ * by the userspace, so that ++ * ++ * aux_offset >= data_offset + data_size ++ * ++ * prior to mmap()ing it. Size of the mmap()ed area should be aux_size. ++ * ++ * Ring buffer pointers aux_{head,tail} have the same semantics as ++ * data_{head,tail} and same ordering rules apply. ++ */ ++ __u64 aux_head; ++ __u64 aux_tail; ++ __u64 aux_offset; ++ __u64 aux_size; ++}; ++#endif // PERF_ATTR_SIZE_VER5 ++#endif // PERF_ATTR_SIZE_VER5_BUNDLE ++ + 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 +@@ -168,7 +168,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-orphanripper.c b/gdb-orphanripper.c new file mode 100644 index 0000000..0f2ade5 --- /dev/null +++ b/gdb-orphanripper.c @@ -0,0 +1,752 @@ +/* + * Copyright 2006-2007 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 2 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, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * Reap any leftover children possibly holding file descriptors. + * Children are identified by the stale file descriptor or PGID / SID. + * Both can be missed but only the stale file descriptors are important for us. + * PGID / SID may be set by the children on their own. + * If we fine a candidate we kill it will all its process tree (grandchildren). + * The child process is run with `2>&1' redirection (due to forkpty(3)). + * 2007-07-10 Jan Kratochvil + */ + +/* For getpgid(2). */ +#define _GNU_SOURCE 1 + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define LENGTH(x) (sizeof (x) / sizeof (*(x))) + +static const char *progname; + +static volatile pid_t child; + +static void signal_chld (int signo) +{ +} + +static volatile int signal_alrm_hit = 0; + +static void signal_alrm (int signo) +{ + signal_alrm_hit = 1; +} + +static char childptyname[LINE_MAX]; + +static void print_child_error (const char *reason, char **argv) +{ + char **sp; + + fprintf (stderr, "%s: %d %s:", progname, (int) child, reason); + for (sp = argv; *sp != NULL; sp++) + { + fputc (' ', stderr); + fputs (*sp, stderr); + } + fputc ('\n', stderr); +} + +static int read_out (int amaster) +{ + char buf[LINE_MAX]; + ssize_t buf_got; + + buf_got = read (amaster, buf, sizeof buf); + if (buf_got == 0) + return 0; + /* Weird but at least after POLLHUP we get EIO instead of just EOF. */ + if (buf_got == -1 && errno == EIO) + return 0; + if (buf_got == -1 && errno == EAGAIN) + return 0; + if (buf_got < 0) + { + perror ("read (amaster)"); + exit (EXIT_FAILURE); + } + if (write (STDOUT_FILENO, buf, buf_got) != buf_got) + { + perror ("write(2)"); + exit (EXIT_FAILURE); + } + return 1; +} + +/* kill (child, 0) == 0 sometimes even when CHILD's state is already "Z". */ + +static int child_exited (void) +{ + char buf[200]; + int fd, i, retval; + ssize_t got; + char state[3]; + + snprintf (buf, sizeof (buf), "/proc/%ld/stat", (long) child); + fd = open (buf, O_RDONLY); + if (fd == -1) + { + perror ("open (/proc/CHILD/stat)"); + exit (EXIT_FAILURE); + } + got = read (fd, buf, sizeof(buf)); + if (got <= 0) + { + perror ("read (/proc/CHILD/stat)"); + exit (EXIT_FAILURE); + } + if (close (fd) != 0) + { + perror ("close (/proc/CHILD/stat)"); + exit (EXIT_FAILURE); + } + /* RHEL-5 does not support %ms. */ + i = sscanf (buf, "%*d%*s%2s", state); + if (i != 1) + { + perror ("sscanf (/proc/CHILD/stat)"); + exit (EXIT_FAILURE); + } + retval = strcmp (state, "Z") == 0; + return retval; +} + +static int spawn (char **argv, int timeout) +{ + pid_t child_got; + int status, amaster, i, rc; + struct sigaction act; + sigset_t set; + struct termios termios; + unsigned alarm_orig; + + /* We do not use signal(2) to be sure we do not have SA_RESTART. */ + memset (&act, 0, sizeof (act)); + act.sa_handler = signal_chld; + i = sigemptyset (&act.sa_mask); + assert (i == 0); + act.sa_flags = 0; /* !SA_RESTART */ + i = sigaction (SIGCHLD, &act, NULL); + assert (i == 0); + + i = sigemptyset (&set); + assert (i == 0); + i = sigaddset (&set, SIGCHLD); + assert (i == 0); + i = sigprocmask (SIG_SETMASK, &set, NULL); + assert (i == 0); + + /* With TERMP passed as NULL we get "\n" -> "\r\n". */ + termios.c_iflag = IGNBRK | IGNPAR; + termios.c_oflag = 0; + termios.c_cflag = CS8 | CREAD | CLOCAL | HUPCL | B9600; + termios.c_lflag = IEXTEN | NOFLSH; + memset (termios.c_cc, _POSIX_VDISABLE, sizeof (termios.c_cc)); + termios.c_cc[VTIME] = 0; + termios.c_cc[VMIN ] = 1; + cfmakeraw (&termios); +#ifdef FLUSHO + /* Workaround a readline deadlock bug in _get_tty_settings(). */ + termios.c_lflag &= ~FLUSHO; +#endif + child = forkpty (&amaster, childptyname, &termios, NULL); + switch (child) + { + case -1: + perror ("forkpty(3)"); + exit (EXIT_FAILURE); + case 0: + /* Do not replace STDIN as inferiors query its termios. */ +#if 0 + i = close (STDIN_FILENO); + assert (i == 0); + i = open ("/dev/null", O_RDONLY); + assert (i == STDIN_FILENO); +#endif + + i = sigemptyset (&set); + assert (i == 0); + i = sigprocmask (SIG_SETMASK, &set, NULL); + assert (i == 0); + + /* Do not setpgrp(2) in the parent process as the process-group + is shared for the whole sh(1) pipeline we could be a part + of. The process-group is set according to PID of the first + command in the pipeline. + We would rip even vi(1) in the case of: + ./orphanripper sh -c 'sleep 1&' | vi - + */ + /* Do not setpgrp(2) as our pty would not be ours and we would + get `SIGSTOP' later, particularly after spawning gdb(1). + setsid(3) was already executed by forkpty(3) and it would fail if + executed again. */ + if (getpid() != getpgrp ()) + { + perror ("getpgrp(2)"); + exit (EXIT_FAILURE); + } + execvp (argv[0], argv); + perror ("execvp(2)"); + exit (EXIT_FAILURE); + default: + break; + } + i = fcntl (amaster, F_SETFL, O_RDWR | O_NONBLOCK); + if (i != 0) + { + perror ("fcntl (amaster, F_SETFL, O_NONBLOCK)"); + exit (EXIT_FAILURE); + } + + /* We do not use signal(2) to be sure we do not have SA_RESTART. */ + act.sa_handler = signal_alrm; + i = sigaction (SIGALRM, &act, NULL); + assert (i == 0); + + alarm_orig = alarm (timeout); + assert (alarm_orig == 0); + + i = sigemptyset (&set); + assert (i == 0); + + while (!signal_alrm_hit) + { + struct pollfd pollfd; + + pollfd.fd = amaster; + pollfd.events = POLLIN; + i = ppoll (&pollfd, 1, NULL, &set); + if (i == -1 && errno == EINTR) + { + if (child_exited ()) + break; + /* Non-CHILD child may have exited. */ + continue; + } + assert (i == 1); + /* Data available? Process it first. */ + if (pollfd.revents & POLLIN) + { + if (!read_out (amaster)) + { + fprintf (stderr, "%s: Unexpected EOF\n", progname); + exit (EXIT_FAILURE); + } + } + if (pollfd.revents & POLLHUP) + break; + if ((pollfd.revents &= ~POLLIN) != 0) + { + fprintf (stderr, "%s: ppoll(2): revents 0x%x\n", progname, + (unsigned) pollfd.revents); + exit (EXIT_FAILURE); + } + /* Child exited? */ + if (child_exited ()) + break; + } + + if (signal_alrm_hit) + { + i = kill (child, SIGKILL); + assert (i == 0); + } + else + alarm (0); + + /* WNOHANG still could fail. */ + child_got = waitpid (child, &status, 0); + if (child != child_got) + { + fprintf (stderr, "waitpid (%d) = %d: %m\n", (int) child, (int) child_got); + exit (EXIT_FAILURE); + } + if (signal_alrm_hit) + { + char *buf; + + if (asprintf (&buf, "Timed out after %d seconds", timeout) != -1) + { + print_child_error (buf, argv); + free (buf); + } + rc = 128 + SIGALRM; + } + else if (WIFEXITED (status)) + rc = WEXITSTATUS (status); + else if (WIFSIGNALED (status)) + { + print_child_error (strsignal (WTERMSIG (status)), argv); + rc = 128 + WTERMSIG (status); + } + else if (WIFSTOPPED (status)) + { + fprintf (stderr, "waitpid (%d): WIFSTOPPED - WSTOPSIG is %d\n", + (int) child, WSTOPSIG (status)); + exit (EXIT_FAILURE); + } + else + { + fprintf (stderr, "waitpid (%d): !WIFEXITED (%d)\n", (int) child, status); + exit (EXIT_FAILURE); + } + + /* Not used in fact. */ + i = sigprocmask (SIG_SETMASK, &set, NULL); + assert (i == 0); + + /* Do not unset O_NONBLOCK as a stale child (the whole purpose of this + program) having open its output pty would block us in read_out. */ +#if 0 + i = fcntl (amaster, F_SETFL, O_RDONLY /* !O_NONBLOCK */); + if (i != 0) + { + perror ("fcntl (amaster, F_SETFL, O_RDONLY /* !O_NONBLOCK */)"); + exit (EXIT_FAILURE); + } +#endif + + while (read_out (amaster)); + + /* Do not close the master FD as the child would have `/dev/pts/23 (deleted)' + entries which are not expected (and expecting ` (deleted)' would be + a race. */ +#if 0 + i = close (amaster); + if (i != 0) + { + perror ("close (forkpty ()'s amaster)"); + exit (EXIT_FAILURE); + } +#endif + + return rc; +} + +/* Detected commandline may look weird due to a race: + Original command: + ./orphanripper sh -c 'sleep 1&' & + Correct output: + [1] 29610 + ./orphanripper: Killed -9 orphan PID 29612 (PGID 29611): sleep 1 + Raced output (sh(1) child still did not update its argv[]): + [1] 29613 + ./orphanripper: Killed -9 orphan PID 29615 (PGID 29614): sh -c sleep 1& + We could delay a bit before ripping the children. */ +static const char *read_cmdline (pid_t pid) +{ + char cmdline_fname[32]; + static char cmdline[LINE_MAX]; + int fd; + ssize_t got; + char *s; + + if (snprintf (cmdline_fname, sizeof cmdline_fname, "/proc/%d/cmdline", + (int) pid) < 0) + return NULL; + fd = open (cmdline_fname, O_RDONLY); + if (fd == -1) + { + /* It may have already exited - ENOENT. */ +#if 0 + fprintf (stderr, "%s: open (\"%s\"): %m\n", progname, cmdline_fname); +#endif + return NULL; + } + got = read (fd, cmdline, sizeof (cmdline) - 1); + if (got == -1) + fprintf (stderr, "%s: read (\"%s\"): %m\n", progname, + cmdline_fname); + if (close (fd) != 0) + fprintf (stderr, "%s: close (\"%s\"): %m\n", progname, + cmdline_fname); + if (got < 0) + return NULL; + /* Convert '\0' argument delimiters to spaces. */ + for (s = cmdline; s < cmdline + got; s++) + if (!*s) + *s = ' '; + /* Trim the trailing spaces (typically single '\0'->' '). */ + while (s > cmdline && isspace (s[-1])) + s--; + *s = 0; + return cmdline; +} + +static int dir_scan (const char *dirname, + int (*callback) (struct dirent *dirent, const char *pathname)) +{ + DIR *dir; + struct dirent *dirent; + int rc = 0; + + dir = opendir (dirname); + if (dir == NULL) + { + if (errno == EACCES || errno == ENOENT) + return rc; + fprintf (stderr, "%s: opendir (\"%s\"): %m\n", progname, dirname); + exit (EXIT_FAILURE); + } + while ((errno = 0, dirent = readdir (dir))) + { + char pathname[LINE_MAX]; + int pathname_len; + + pathname_len = snprintf (pathname, sizeof pathname, "%s/%s", + dirname, dirent->d_name); + if (pathname_len <= 0 || pathname_len >= (int) sizeof pathname) + { + fprintf (stderr, "entry file name too long: `%s' / `%s'\n", + dirname, dirent->d_name); + continue; + } + /* RHEL-4.5 on s390x never fills in D_TYPE. */ + if (dirent->d_type == DT_UNKNOWN) + { + struct stat statbuf; + int i; + + /* We are not interested in the /proc/PID/fd/ links targets. */ + i = lstat (pathname, &statbuf); + if (i == -1) + { + if (errno == EACCES || errno == ENOENT) + continue; + fprintf (stderr, "%s: stat (\"%s\"): %m\n", progname, pathname); + exit (EXIT_FAILURE); + } + if (S_ISDIR (statbuf.st_mode)) + dirent->d_type = DT_DIR; + if (S_ISLNK (statbuf.st_mode)) + dirent->d_type = DT_LNK; + /* No other D_TYPE types used in this code. */ + } + rc = (*callback) (dirent, pathname); + if (rc != 0) + { + errno = 0; + break; + } + } + if (errno != 0) + { + fprintf (stderr, "%s: readdir (\"%s\"): %m\n", progname, dirname); + exit (EXIT_FAILURE); + } + if (closedir (dir) != 0) + { + fprintf (stderr, "%s: closedir (\"%s\"): %m\n", progname, dirname); + exit (EXIT_FAILURE); + } + return rc; +} + +static int fd_fs_scan (pid_t pid, int (*func) (pid_t pid, const char *link)) +{ + char dirname[64]; + + if (snprintf (dirname, sizeof dirname, "/proc/%d/fd", (int) pid) < 0) + { + perror ("snprintf(3)"); + exit (EXIT_FAILURE); + } + + int callback (struct dirent *dirent, const char *pathname) + { + char buf[LINE_MAX]; + ssize_t buf_len; + + if ((dirent->d_type != DT_DIR && dirent->d_type != DT_LNK) + || (dirent->d_type == DT_DIR && strcmp (dirent->d_name, ".") != 0 + && strcmp (dirent->d_name, "..") != 0) + || (dirent->d_type == DT_LNK && strspn (dirent->d_name, "0123456789") + != strlen (dirent->d_name))) + { + fprintf (stderr, "Unexpected entry \"%s\" (d_type %u)" + " on readdir (\"%s\"): %m\n", + dirent->d_name, (unsigned) dirent->d_type, dirname); + return 0; + } + if (dirent->d_type == DT_DIR) + return 0; + buf_len = readlink (pathname, buf, sizeof buf - 1); + if (buf_len <= 0 || buf_len >= (ssize_t) sizeof buf - 1) + { + if (errno != ENOENT && errno != EACCES) + fprintf (stderr, "Error reading link \"%s\": %m\n", pathname); + return 0; + } + buf[buf_len] = 0; + return (*func) (pid, buf); + } + + return dir_scan (dirname, callback); +} + +static void pid_fs_scan (void (*func) (pid_t pid, void *data), void *data) +{ + int callback (struct dirent *dirent, const char *pathname) + { + if (dirent->d_type != DT_DIR + || strspn (dirent->d_name, "0123456789") != strlen (dirent->d_name)) + return 0; + (*func) (atoi (dirent->d_name), data); + return 0; + } + + dir_scan ("/proc", callback); +} + +static int rip_check_ptyname (pid_t pid, const char *link) +{ + assert (pid != getpid ()); + + return strcmp (link, childptyname) == 0; +} + +struct pid + { + struct pid *next; + pid_t pid; + }; +static struct pid *pid_list; + +static int pid_found (pid_t pid) +{ + struct pid *entry; + + for (entry = pid_list; entry != NULL; entry = entry->next) + if (entry->pid == pid) + return 1; + return 0; +} + +/* Single pass is not enough, a (multithreaded) process was seen to survive. + Repeated killing of the same process is not enough, zombies can be killed. + */ +static int cleanup_acted; + +static void pid_record (pid_t pid) +{ + struct pid *entry; + + if (pid_found (pid)) + return; + cleanup_acted = 1; + + entry = malloc (sizeof (*entry)); + if (entry == NULL) + { + fprintf (stderr, "%s: malloc: %m\n", progname); + exit (EXIT_FAILURE); + } + entry->pid = pid; + entry->next = pid_list; + pid_list = entry; +} + +static void pid_forall (void (*func) (pid_t pid)) +{ + struct pid *entry; + + for (entry = pid_list; entry != NULL; entry = entry->next) + (*func) (entry->pid); +} + +/* Returns 0 on failure. */ +static pid_t pid_get_parent (pid_t pid) +{ + char fname[64]; + FILE *f; + char line[LINE_MAX]; + pid_t retval = 0; + + if (snprintf (fname, sizeof fname, "/proc/%d/status", (int) pid) < 0) + { + perror ("snprintf(3)"); + exit (EXIT_FAILURE); + } + f = fopen (fname, "r"); + if (f == NULL) + { + return 0; + } + while (errno = 0, fgets (line, sizeof line, f) == line) + { + if (strncmp (line, "PPid:\t", sizeof "PPid:\t" - 1) != 0) + continue; + retval = atoi (line + sizeof "PPid:\t" - 1); + errno = 0; + break; + } + if (errno != 0) + { + fprintf (stderr, "%s: fgets (\"%s\"): %m\n", progname, fname); + exit (EXIT_FAILURE); + } + if (fclose (f) != 0) + { + fprintf (stderr, "%s: fclose (\"%s\"): %m\n", progname, fname); + exit (EXIT_FAILURE); + } + return retval; +} + +static void killtree (pid_t pid); + +static void killtree_pid_fs_scan (pid_t pid, void *data) +{ + pid_t parent_pid = *(pid_t *) data; + + /* Do not optimize it as we could miss some newly spawned processes. + Always traverse all the leaves. */ +#if 0 + /* Optimization. */ + if (pid_found (pid)) + return; +#endif + + if (pid_get_parent (pid) != parent_pid) + return; + + killtree (pid); +} + +static void killtree (pid_t pid) +{ + pid_record (pid); + pid_fs_scan (killtree_pid_fs_scan, &pid); +} + +static void rip_pid_fs_scan (pid_t pid, void *data) +{ + pid_t pgid; + + /* Shouldn't happen. */ + if (pid == getpid ()) + return; + + /* Check both PGID and the stale file descriptors. */ + pgid = getpgid (pid); + if (pgid == child + || fd_fs_scan (pid, rip_check_ptyname) != 0) + killtree (pid); +} + +static void killproc (pid_t pid) +{ + const char *cmdline; + + cmdline = read_cmdline (pid); + /* Avoid printing the message for already gone processes. */ + if (kill (pid, 0) != 0 && errno == ESRCH) + return; + if (cmdline == NULL) + cmdline = ""; + fprintf (stderr, "%s: Killed -9 orphan PID %d: %s\n", progname, (int) pid, cmdline); + if (kill (pid, SIGKILL) == 0) + cleanup_acted = 1; + else if (errno != ESRCH) + fprintf (stderr, "%s: kill (%d, SIGKILL): %m\n", progname, (int) pid); + /* RHEL-3 kernels cannot SIGKILL a `T (stopped)' process. */ + kill (pid, SIGCONT); + /* Do not waitpid(2) as it cannot be our direct descendant and it gets + cleaned up by init(8). */ +#if 0 + pid_t pid_got; + pid_got = waitpid (pid, NULL, 0); + if (pid != pid_got) + { + fprintf (stderr, "%s: waitpid (%d) != %d: %m\n", progname, + (int) pid, (int) pid_got); + return; + } +#endif +} + +static void rip (void) +{ + cleanup_acted = 0; + do + { + if (cleanup_acted) + usleep (1000000 / 10); + cleanup_acted = 0; + pid_fs_scan (rip_pid_fs_scan, NULL); + pid_forall (killproc); + } + while (cleanup_acted); +} + +int main (int argc, char **argv) +{ + int timeout = 0; + int rc; + + progname = *argv++; + argc--; + + if (argc < 1 || strcmp (*argv, "-h") == 0 + || strcmp (*argv, "--help") == 0) + { + puts ("Syntax: orphanripper [-t ] "); + exit (EXIT_FAILURE); + } + if ((*argv)[0] == '-' && (*argv)[1] == 't') + { + char *timeout_s = NULL; + + if ((*argv)[2] == 0) + timeout_s = *++argv; + else if (isdigit ((*argv)[2])) + timeout_s = (*argv) + 2; + if (timeout_s != NULL) + { + long l; + char *endptr; + + argv++; + l = strtol (timeout_s, &endptr, 0); + timeout = l; + if ((endptr != NULL && *endptr != 0) || timeout < 0 || timeout != l) + { + fprintf (stderr, "%s: Invalid timeout value: %s\n", progname, + timeout_s); + exit (EXIT_FAILURE); + } + } + } + + rc = spawn (argv, timeout); + rip (); + return rc; +} diff --git a/gdb-python-finishbreakpoint-update.patch b/gdb-python-finishbreakpoint-update.patch new file mode 100644 index 0000000..0638499 --- /dev/null +++ b/gdb-python-finishbreakpoint-update.patch @@ -0,0 +1,447 @@ +From adfcabe4cc43766996a61bdf08ce1e9db7f18dcc Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 18 Apr 2024 14:27:04 +0200 +Subject: [PATCH] gdb-python-finishbreakpoint-update + +[gdb/python] FinishBreakPoint update + +I. + +Consider the python gdb.FinishBreakpoint class, an extension of the +gdb.Breakpoint class. + +It sets a temporary breakpoint on the return address of a frame. + +This type of breakpoints is thread-specific. + +II. + +If the FinishBreakpoint is hit, it is deleted, and the method return_value +can be used to get the value returned by the function. + +Let's demonstrate this: +... +$ cat -n test.c + 1 int foo (int a) { return a + 2; } + 2 int main () { return foo (1); } +$ gcc -g test.c +$ gdb -q -batch a.out -ex "set trace-commands on" -ex "tbreak foo" -ex run \ + -ex "python bp = gdb.FinishBreakpoint()" -ex "info breakpoints" \ + -ex continue -ex "info breakpoints" -ex "python print (bp.return_value)" ++tbreak foo +Temporary breakpoint 1 at 0x40049e: file test.c, line 1. ++run + +Temporary breakpoint 1, foo (a=1) at test.c:1 +1 int foo (int a) { return a + 2; } ++python bp = gdb.FinishBreakpoint() +Temporary breakpoint 2 at 0x4004b4: file test.c, line 2. ++info breakpoints +Num Type Disp Enb Address What +2 breakpoint del y 0x004004b4 in main at test.c:2 thread 1 + stop only in thread 1 ++continue + +Temporary breakpoint 2, 0x004004b4 in main () at test.c:2 +2 int main () { return foo (1); } ++info breakpoints +No breakpoints or watchpoints. ++python print (bp.return_value) +3 +... + +III. + +Another possibility is that the FinishBreakpoint is not hit, because the +function did not terminate, f.i. because of longjmp, C++ exceptions, or GDB +return command. + +Let's demonstrate this, using C++ exceptions: +... +$ cat -n test.c + 1 int foo (int a) { throw 1; return a + 2; } + 2 int main () { + 3 try { return foo (1); } catch (...) {}; + 4 return 1; + 5 } +$ g++ -g test.c +$ gdb -q -batch a.out -ex "set trace-commands on" -ex "tbreak foo" -ex run \ + -ex "python bp = gdb.FinishBreakpoint()" -ex "info breakpoints" \ + -ex continue -ex "info breakpoints" -ex "python print (bp.return_value)" ++tbreak foo +Temporary breakpoint 1 at 0x400712: file test.c, line 1. ++run + +Temporary breakpoint 1, foo (a=1) at test.c:1 +1 int foo (int a) { throw 1; return a + 2; } ++python bp = gdb.FinishBreakpoint() +Temporary breakpoint 2 at 0x400742: file test.c, line 3. ++info breakpoints +Num Type Disp Enb Address What +2 breakpoint del y 0x00400742 in main() at test.c:3 thread 1 + stop only in thread 1 ++continue +[Inferior 1 (process 25269) exited with code 01] +Thread-specific breakpoint 2 deleted - thread 1 no longer in the thread list. ++info breakpoints +No breakpoints or watchpoints. ++python print (bp.return_value) +None +... + +Indeed, we do not hit the FinishBreakpoint. Instead, it's deleted when the +thread disappears, like any other thread-specific breakpoint. + +I think this is a bug: the deletion is meant to be handled by FinishBreakpoint +itself. + +IV. + +Fix aforementioned bug by: +- adding an observer of the thread_exit event in FinishBreakpoint +- making sure that this observer is called before the + remove_threaded_breakpoints observer of that same event. + +This changes the behaviour to: +... ++continue +[Inferior 1 (process 30256) exited with code 01] ++info breakpoints +No breakpoints or watchpoints. ++python print (bp.return_value) +None +... + +V. + +An out_of_scope callback can be defined to make this more verbose: +... +$ cat fbp.py +class FBP(gdb.FinishBreakpoint): + def __init__(self): + gdb.FinishBreakpoint.__init__(self) + + def out_of_scope(self): + try: + frame = gdb.selected_frame () + sal = frame.find_sal () + print ("out_of_scope triggered at %s:%s" + % (sal.symtab.fullname(), sal.line)) + except gdb.error as e: + print ("out_of_scope triggered at thread/inferior exit") +... +and using that gets us: +... ++continue +[Inferior 1 (process 30742) exited with code 01] +out_of_scope triggered at thread/inferior exit ++info breakpoints +No breakpoints or watchpoints. ++python print (bp.return_value) +None +... + +VI. + +This out_of_scope event can be triggered earlier than inferior/thread exit. + +Let's demonstrate this: +... +$ cat -n test.c + 1 int bar (int a) { throw 1; return a + 2; } + 2 int foo (int a) { + 3 int res = a; + 4 try + 5 { + 6 res += bar (1); + 7 } + 8 catch (...) + 9 { + 10 } + 11 return res; + 12 } + 13 int main () { + 14 int res = 0; + 15 res += foo (1); + 16 res += 2; + 17 return res * 2; + 18 } +$ g++ -g test.c +$ gdb -q -batch -ex "source fbp.py" a.out -ex "set trace-commands on" \ + -ex "tbreak bar" -ex run -ex "python bp = FBP()" -ex "info breakpoints" \ + -ex "tbreak 16" -ex continue -ex "info breakpoints" \ + -ex "python print (bp.return_value)" ++tbreak bar +Temporary breakpoint 1 at 0x400712: file test.c, line 1. ++run + +Temporary breakpoint 1, bar (a=1) at test.c:1 +1 int bar (int a) { throw 1; return a + 2; } ++python bp = FBP() +Temporary breakpoint 2 at 0x40074f: file test.c, line 6. ++info breakpoints +Num Type Disp Enb Address What +2 breakpoint del y 0x0040074f in foo(int) at test.c:6 thread 1 + stop only in thread 1 ++tbreak 16 +Temporary breakpoint 3 at 0x400784: file test.c, line 16. ++continue + +Temporary breakpoint 3, main () at test.c:16 +16 res += 2; +out_of_scope triggered at /home/vries/gdb_versions/devel/test.c:16 ++info breakpoints +No breakpoints or watchpoints. ++python print (bp.return_value) +None +... + +Note that the out_of_scope event triggers at the breakpoint we set at +test.c:16. If we'd set that breakpoint at line 17, the out_of_scope event +would trigger at line 17 instead. + +Also note that it can't be triggered earlier, say by setting the breakpoint in +foo at line 11. We would get instead "out_of_scope triggered at +thread/inferior exit". + +VII. + +Now consider a reduced version of +src/gdb/testsuite/gdb.python/py-finish-breakpoint2.cc: +... +$ cat -n test.c + 1 #include + 2 + 3 void + 4 throw_exception_1 (int e) + 5 { + 6 throw new int (e); + 7 } + 8 + 9 int + 10 main (void) + 11 { + 12 int i; + 13 try + 14 { + 15 throw_exception_1 (10); + 16 } + 17 catch (const int *e) + 18 { + 19 std::cerr << "Exception #" << *e << std::endl; + 20 } + 21 i += 1; + 22 + 23 return i; + 24 } +$ g++ -g test.c +... + +Now let's try to see if the FinishBreakPoint triggers: +... +$ gdb -q -batch -ex "source fbp.py" a.out -ex "set trace-commands on" \ + -ex "tbreak throw_exception_1" -ex run -ex "python bp = FBP()" \ + -ex "info breakpoints" -ex continue -ex "info breakpoints" \ + -ex "python print (bp.return_value)" ++tbreak throw_exception_1 +Temporary breakpoint 1 at 0x400bd5: file test.c, line 6. ++run + +Temporary breakpoint 1, throw_exception_1 (e=10) at test.c:6 +6 throw new int (e); ++python bp = FBP() +Temporary breakpoint 2 at 0x400c2f: file test.c, line 21. ++info breakpoints +Num Type Disp Enb Address What +2 breakpoint del y 0x00400c2f in main() at test.c:21 thread 1 + stop only in thread 1 ++continue +Exception #10 + +Temporary breakpoint 2, main () at test.c:21 +21 i += 1; ++info breakpoints +No breakpoints or watchpoints. ++python print (bp.return_value) +None +... + +Surprisingly, it did. The explanation is that FinishBreakPoint is really a +frame-return-address breakpoint, and that address happens to be at line 21, +which is still executed after the throw in throw_exception_1. + +Interestingly, with -m32 the FinishBreakPoint doesn't trigger, because the +frame-return-address happens to be an instruction which is part of line 15. + +VIII. + +In conclusion, the FinishBreakpoint is a frame-return-address breakpoint. + +After being set, either: +- it triggers, or +- an out-of-scope event will be generated. + +If an out-of-scope event is generated, it will be due to incomplete function +termination. + +OTOH, incomplete function termination does not guarantee an out-of-scope event +instead of hitting the breakpoint. + +IX. + +The documentation states that 'A finish breakpoint is a temporary breakpoint +set at the return address of a frame, based on the finish command'. + +It's indeed somewhat similar to the finish command, at least in the sense that +both may stop at the frame-return-address. + +But the finish command can accurately detect function termination. + +And the finish command will stop at any other address that is the first +address not in the original function. + +The documentation needs updating to accurately describe what it does. + +X. + +A better implementation of a finish breakpoint would be one that borrows from +the finish command implementation. That one: +- installs a thread_fsm, and +- continues + +A finish breakpoint would do the same minus the continue, but it requires gdb +to handle multiple thread_fsms at a time (because other commands may wish to +install their own thread_fsm), which AFAICT is not supported yet. + +XI. + +This patch repairs a minor part of the functionality, and updates +documentation and test-cases to match actual behaviour. + +The question remains how useful the functionality is, as it is now +( see f.i. discussion at +https://sourceware.org/pipermail/gdb-patches/2021-January/175290.html ). +Perhaps it would be better to deprecate this in a follow-up patch in some form +or another, say by disabling it by default and introducing a maintenance +command that switches it on, with the warning that it is deprecated. + +Tested on x86_64-linux with native and target board unix/-m32, by rebuilding +and running the test-cases: +- gdb.python/py-finish-breakpoint.exp +- gdb.python/py-finish-breakpoint2.exp +--- + gdb/breakpoint.c | 10 ++++++++++ + gdb/doc/python.texi | 6 ++++-- + gdb/python/py-finishbreakpoint.c | 20 +++++++++++++++++++ + .../gdb.python/py-finish-breakpoint2.exp | 1 + + 4 files changed, 35 insertions(+), 2 deletions(-) + +diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c +index db7d2e6a8e5..01f187ca4fe 100644 +--- a/gdb/breakpoint.c ++++ b/gdb/breakpoint.c +@@ -14683,6 +14683,10 @@ breakpoint_free_objfile (struct objfile *objfile) + + static struct cmd_list_element *enablebreaklist = NULL; + ++#if HAVE_PYTHON ++extern gdb::observers::token bpfinishpy_handle_thread_exit_observer_token; ++#endif ++ + /* See breakpoint.h. */ + + cmd_list_element *commands_cmd_element = nullptr; +@@ -15243,8 +15247,14 @@ This is useful for formatted output in user-defined commands.")); + + gdb::observers::about_to_proceed.attach (breakpoint_about_to_proceed, + "breakpoint"); ++#if HAVE_PYTHON ++ gdb::observers::thread_exit.attach ++ (remove_threaded_breakpoints, "breakpoint", ++ { &bpfinishpy_handle_thread_exit_observer_token }); ++#else + gdb::observers::thread_exit.attach (remove_threaded_breakpoints, + "breakpoint"); ++#endif + gdb::observers::inferior_removed.attach (remove_inferior_breakpoints, + "breakpoint"); + } +diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi +index 99670cca025..ba414b4e2c3 100644 +--- a/gdb/doc/python.texi ++++ b/gdb/doc/python.texi +@@ -6648,7 +6648,7 @@ is not writable. + @tindex gdb.FinishBreakpoint + + A finish breakpoint is a temporary breakpoint set at the return address of +-a frame, based on the @code{finish} command. @code{gdb.FinishBreakpoint} ++a frame. @code{gdb.FinishBreakpoint} + extends @code{gdb.Breakpoint}. The underlying breakpoint will be disabled + and deleted when the execution will run out of the breakpoint scope (i.e.@: + @code{Breakpoint.stop} or @code{FinishBreakpoint.out_of_scope} triggered). +@@ -6667,7 +6667,9 @@ details about this argument. + In some circumstances (e.g.@: @code{longjmp}, C@t{++} exceptions, @value{GDBN} + @code{return} command, @dots{}), a function may not properly terminate, and + thus never hit the finish breakpoint. When @value{GDBN} notices such a +-situation, the @code{out_of_scope} callback will be triggered. ++situation, the @code{out_of_scope} callback will be triggered. Note ++though that improper function termination does not guarantee that the ++finish breakpoint is not hit. + + You may want to sub-class @code{gdb.FinishBreakpoint} and override this + method: +diff --git a/gdb/python/py-finishbreakpoint.c b/gdb/python/py-finishbreakpoint.c +index 42a7e0706d2..fa7ec43fbb4 100644 +--- a/gdb/python/py-finishbreakpoint.c ++++ b/gdb/python/py-finishbreakpoint.c +@@ -433,6 +433,24 @@ bpfinishpy_handle_exit (struct inferior *inf) + bpfinishpy_detect_out_scope_cb (&bp, nullptr, true); + } + ++/* Attached to `thread_exit' notifications, triggers all the necessary out of ++ scope notifications. */ ++ ++static void ++bpfinishpy_handle_thread_exit (struct thread_info *tp, gdb::optional, bool) ++{ ++ gdbpy_enter enter_py (target_gdbarch (), current_language); ++ ++ for (breakpoint &bp : all_breakpoints_safe ()) ++ { ++ if (tp->global_num == bp.thread) ++ bpfinishpy_detect_out_scope_cb (&bp, nullptr, true); ++ } ++} ++ ++extern gdb::observers::token bpfinishpy_handle_thread_exit_observer_token; ++gdb::observers::token bpfinishpy_handle_thread_exit_observer_token; ++ + /* Initialize the Python finish breakpoint code. */ + + static int CPYCHECKER_NEGATIVE_RESULT_SETS_EXCEPTION +@@ -452,6 +470,8 @@ gdbpy_initialize_finishbreakpoints (void) + "py-finishbreakpoint"); + gdb::observers::inferior_exit.attach (bpfinishpy_handle_exit, + "py-finishbreakpoint"); ++ gdb::observers::thread_exit.attach ++ (bpfinishpy_handle_thread_exit, "py-finishbreakpoint"); + + return 0; + } +diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint2.exp b/gdb/testsuite/gdb.python/py-finish-breakpoint2.exp +index 66587b8b9a0..31479a05e6f 100644 +--- a/gdb/testsuite/gdb.python/py-finish-breakpoint2.exp ++++ b/gdb/testsuite/gdb.python/py-finish-breakpoint2.exp +@@ -87,6 +87,7 @@ if { $need_continue } { + gdb_test "continue" ".*Breakpoint.* throw_exception_1.*" \ + "continue to second exception" + } ++ + gdb_test "python ExceptionFinishBreakpoint(gdb.newest_frame())" \ + "init ExceptionFinishBreakpoint" "set FinishBP after the exception again" + + +base-commit: 6de9111c512de99fd8cb3ea89f9890b1d72f6ef0 +-- +2.35.3 + diff --git a/gdb-python-fix-gdb.python-py-disasm.exp-on-arm-linux.patch b/gdb-python-fix-gdb.python-py-disasm.exp-on-arm-linux.patch new file mode 100644 index 0000000..a8e39f6 --- /dev/null +++ b/gdb-python-fix-gdb.python-py-disasm.exp-on-arm-linux.patch @@ -0,0 +1,125 @@ +From 4c7dab250c3581e691c2da87395e80244074d8bf Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Mon, 10 Jun 2024 17:53:30 +0200 +Subject: [PATCH] [gdb/python] Fix gdb.python/py-disasm.exp on arm-linux + +After fixing test-case gdb.python/py-disasm.exp to recognize the arm nop: +... + nop {0} +... +we run into: +... +disassemble test^M +Dump of assembler code for function test:^M + 0x004004d8 <+0>: push {r11} @ (str r11, [sp, #-4]!)^M + 0x004004dc <+4>: add r11, sp, #0^M + 0x004004e0 <+8>: nop {0}^M +=> 0x004004e4 <+12>: Python Exception : Buffer \ + returned from read_memory is sized 0 instead of the expected 4^M +^M +unknown disassembler error (error = -1)^M +(gdb) FAIL: $exp: global_disassembler=ShowInfoRepr: disassemble test +... + +This is caused by this code in gdbpy_disassembler::read_memory_func: +... + gdbpy_ref<> result_obj (PyObject_CallMethod ((PyObject *) obj, + "read_memory", + "KL", len, offset)); +... +where len has type "unsigned int", while "K" means "unsigned long long" [1]. + +Fix this by using "I" instead, meaning "unsigned int". + +Also, offset has type LONGEST, which is typedef'ed to int64_t, while "L" means +"long long". + +Fix this by using type gdb_py_longest for offset, in combination with format +character "GDB_PY_LL_ARG". Likewise in disasmpy_info_read_memory. + +Tested on arm-linux. + +Reviewed-By: Alexandra Petlanova Hajkova +Approved-By: Tom Tromey + +PR python/31845 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31845 + +[1] https://docs.python.org/3/c-api/arg.html + +(cherry picked from commit 4cd214dce4579f86a85a96c882e0fc8c4d94601c) +--- + gdb/python/py-disasm.c | 12 +++++++----- + gdb/testsuite/gdb.python/py-disasm.exp | 2 +- + gdb/testsuite/gdb.python/py-disasm.py | 2 +- + 3 files changed, 9 insertions(+), 7 deletions(-) + +diff --git a/gdb/python/py-disasm.c b/gdb/python/py-disasm.c +index 6f0fed137e6..b2e95b3cba6 100644 +--- a/gdb/python/py-disasm.c ++++ b/gdb/python/py-disasm.c +@@ -668,12 +668,13 @@ disasmpy_info_read_memory (PyObject *self, PyObject *args, PyObject *kw) + disasm_info_object *obj = (disasm_info_object *) self; + DISASMPY_DISASM_INFO_REQUIRE_VALID (obj); + +- LONGEST length, offset = 0; ++ gdb_py_longest length, offset = 0; + gdb::unique_xmalloc_ptr buffer; + static const char *keywords[] = { "length", "offset", nullptr }; + +- if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "L|L", keywords, +- &length, &offset)) ++ if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, ++ GDB_PY_LL_ARG "|" GDB_PY_LL_ARG, ++ keywords, &length, &offset)) + return nullptr; + + /* The apparent address from which we are reading memory. Note that in +@@ -850,13 +851,14 @@ gdbpy_disassembler::read_memory_func (bfd_vma memaddr, gdb_byte *buff, + /* The DisassembleInfo.read_memory method expects an offset from the + address stored within the DisassembleInfo object; calculate that + offset here. */ +- LONGEST offset = (LONGEST) memaddr - (LONGEST) obj->address; ++ gdb_py_longest offset ++ = (gdb_py_longest) memaddr - (gdb_py_longest) obj->address; + + /* Now call the DisassembleInfo.read_memory method. This might have been + overridden by the user. */ + gdbpy_ref<> result_obj (PyObject_CallMethod ((PyObject *) obj, + "read_memory", +- "KL", len, offset)); ++ "I" GDB_PY_LL_ARG, len, offset)); + + /* Handle any exceptions. */ + if (result_obj == nullptr) +diff --git a/gdb/testsuite/gdb.python/py-disasm.exp b/gdb/testsuite/gdb.python/py-disasm.exp +index f2f9225168a..9d0f6ec1d01 100644 +--- a/gdb/testsuite/gdb.python/py-disasm.exp ++++ b/gdb/testsuite/gdb.python/py-disasm.exp +@@ -65,7 +65,7 @@ proc py_remove_all_disassemblers {} { + # + # Each different disassembler tests some different feature of the + # Python disassembler API. +-set nop "(nop|nop\t0)" ++set nop "(nop|nop\t0|[string_to_regexp nop\t{0}])" + set unknown_error_pattern "unknown disassembler error \\(error = -1\\)" + set addr_pattern "\r\n=> ${curr_pc_pattern} <\[^>\]+>:\\s+" + set base_pattern "${addr_pattern}${nop}" +diff --git a/gdb/testsuite/gdb.python/py-disasm.py b/gdb/testsuite/gdb.python/py-disasm.py +index 67ba6756ea9..6a39b0764e6 100644 +--- a/gdb/testsuite/gdb.python/py-disasm.py ++++ b/gdb/testsuite/gdb.python/py-disasm.py +@@ -46,7 +46,7 @@ def check_building_disassemble_result(): + + + def is_nop(s): +- return s == "nop" or s == "nop\t0" ++ return s == "nop" or s == "nop\t0" or s == "nop\t{0}" + + + # Remove all currently registered disassemblers. + +base-commit: 22383ac8031b0e626e8ecd62e4378266065d067c +-- +2.35.3 + diff --git a/gdb-python-make-gdb.unwindinfo.add_saved_register-mo-fixup.patch b/gdb-python-make-gdb.unwindinfo.add_saved_register-mo-fixup.patch new file mode 100644 index 0000000..757228c --- /dev/null +++ b/gdb-python-make-gdb.unwindinfo.add_saved_register-mo-fixup.patch @@ -0,0 +1,70 @@ +From fc73000faa1798573090994167b7e2d451c211db Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 10 May 2024 08:46:21 +0200 +Subject: [PATCH] [gdb/python] Make gdb.UnwindInfo.add_saved_register more + robust (fixup) + +In commit 2236c5e384d ("[gdb/python] Make gdb.UnwindInfo.add_saved_register +more robust") I added this code in unwind_infopy_add_saved_register: +... + if (value->optimized_out () || !value->entirely_available ()) +... +which may throw c++ exceptions. + +This needs to be caught and transformed into a python exception. + +Fix this by using GDB_PY_HANDLE_EXCEPTION. + +Tested on x86_64-linux. + +Approved-By: Tom Tromey + +Fixes: 2236c5e384d ("[gdb/python] Make gdb.UnwindInfo.add_saved_register more robust") +(cherry picked from commit 408bc9c5fc757bd4b8adb1c3d54ecd672beaedb7) +--- + gdb/python/py-unwind.c | 26 +++++++++++++++++--------- + 1 file changed, 17 insertions(+), 9 deletions(-) + +diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c +index 471eb851674..e57c8c1adcf 100644 +--- a/gdb/python/py-unwind.c ++++ b/gdb/python/py-unwind.c +@@ -354,16 +354,24 @@ unwind_infopy_add_saved_register (PyObject *self, PyObject *args, PyObject *kw) + return nullptr; + } + +- if (value->optimized_out () || !value->entirely_available ()) ++ ++ try ++ { ++ if (value->optimized_out () || !value->entirely_available ()) ++ { ++ /* If we allow this value to be registered here, pyuw_sniffer is going ++ to run into an exception when trying to access its contents. ++ Throwing an exception here just puts a burden on the user to ++ implement the same checks on the user side. We could return False ++ here and True otherwise, but again that might require changes in ++ user code. So, handle this with minimal impact for the user, while ++ improving robustness: silently ignore the register/value pair. */ ++ Py_RETURN_NONE; ++ } ++ } ++ catch (const gdb_exception &except) + { +- /* If we allow this value to be registered here, pyuw_sniffer is going +- to run into an exception when trying to access its contents. +- Throwing an exception here just puts a burden on the user to +- implement the same checks on the user side. We could return False +- here and True otherwise, but again that might require changes in user +- code. So, handle this with minimal impact for the user, while +- improving robustness: silently ignore the register/value pair. */ +- Py_RETURN_NONE; ++ GDB_PY_HANDLE_EXCEPTION (except); + } + + gdbpy_ref<> new_value = gdbpy_ref<>::new_reference (pyo_reg_value); + +base-commit: a6f598be3d0477c5c59bd490573a5d457949658e +-- +2.35.3 + diff --git a/gdb-python-make-gdb.unwindinfo.add_saved_register-mo.patch b/gdb-python-make-gdb.unwindinfo.add_saved_register-mo.patch new file mode 100644 index 0000000..19ed99f --- /dev/null +++ b/gdb-python-make-gdb.unwindinfo.add_saved_register-mo.patch @@ -0,0 +1,61 @@ +From eafca1ce3d589c731927e5481199db715bcbeff3 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sat, 2 Mar 2024 09:35:22 +0100 +Subject: [PATCH 2/2] [gdb/python] Make gdb.UnwindInfo.add_saved_register more + robust + +On arm-linux, until commit bbb12eb9c84 ("gdb/arm: Remove tpidruro register +from non-FreeBSD target descriptions") I ran into: +... +FAIL: gdb.base/inline-frame-cycle-unwind.exp: cycle at level 5: \ + backtrace when the unwind is broken at frame 5 +... + +What happens is the following: +- the TestUnwinder from inline-frame-cycle-unwind.py calls + gdb.UnwindInfo.add_saved_register with reg == tpidruro and value + "", +- pyuw_sniffer calls value->contents ().data () to access the value of the + register, which throws an UNAVAILABLE_ERROR, +- this causes the TestUnwinder unwinder to fail, after which another unwinder + succeeds and returns the correct frame, and +- the test-case fails because it's counting on the TestUnwinder to succeed and + return an incorrect frame. + +Fix this by checking for !value::entirely_available as well as +valued::optimized_out in unwind_infopy_add_saved_register. + +Tested on x86_64-linux and arm-linux. + +PR python/31437 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31437 +--- + gdb/python/py-unwind.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/gdb/python/py-unwind.c b/gdb/python/py-unwind.c +index 1856e41e2a1..471eb851674 100644 +--- a/gdb/python/py-unwind.c ++++ b/gdb/python/py-unwind.c +@@ -354,6 +354,18 @@ unwind_infopy_add_saved_register (PyObject *self, PyObject *args, PyObject *kw) + return nullptr; + } + ++ if (value->optimized_out () || !value->entirely_available ()) ++ { ++ /* If we allow this value to be registered here, pyuw_sniffer is going ++ to run into an exception when trying to access its contents. ++ Throwing an exception here just puts a burden on the user to ++ implement the same checks on the user side. We could return False ++ here and True otherwise, but again that might require changes in user ++ code. So, handle this with minimal impact for the user, while ++ improving robustness: silently ignore the register/value pair. */ ++ Py_RETURN_NONE; ++ } ++ + gdbpy_ref<> new_value = gdbpy_ref<>::new_reference (pyo_reg_value); + bool found = false; + for (saved_reg ® : *unwind_info->saved_regs) +-- +2.35.3 + diff --git a/gdb-remote-fix-abort-on-remote_close_error.patch b/gdb-remote-fix-abort-on-remote_close_error.patch new file mode 100644 index 0000000..d6a9a46 --- /dev/null +++ b/gdb-remote-fix-abort-on-remote_close_error.patch @@ -0,0 +1,229 @@ +From 0ad71e3088f345101085a1f72e81a000a100db18 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sat, 27 Apr 2024 17:48:22 +0200 +Subject: [PATCH 25/48] [gdb/remote] Fix abort on REMOTE_CLOSE_ERROR + +When running test-case gdb.server/connect-with-no-symbol-file.exp on +aarch64-linux (specifically, an opensuse leap 15.5 container on a +fedora asahi 39 system), I run into: +... +(gdb) detach^M +Detaching from program: target:connect-with-no-symbol-file, process 185104^M +Ending remote debugging.^M +terminate called after throwing an instance of 'gdb_exception_error'^M +... + +The detailed backtrace of the corefile is: +... + (gdb) bt + #0 0x0000ffff75504f54 in raise () from /lib64/libpthread.so.0 + #1 0x00000000007a86b4 in handle_fatal_signal (sig=6) + at gdb/event-top.c:926 + #2 + #3 0x0000ffff74b977b4 in raise () from /lib64/libc.so.6 + #4 0x0000ffff74b98c18 in abort () from /lib64/libc.so.6 + #5 0x0000ffff74ea26f4 in __gnu_cxx::__verbose_terminate_handler() () + from /usr/lib64/libstdc++.so.6 + #6 0x0000ffff74ea011c in ?? () from /usr/lib64/libstdc++.so.6 + #7 0x0000ffff74ea0180 in std::terminate() () from /usr/lib64/libstdc++.so.6 + #8 0x0000ffff74ea0464 in __cxa_throw () from /usr/lib64/libstdc++.so.6 + #9 0x0000000001548870 in throw_it (reason=RETURN_ERROR, + error=TARGET_CLOSE_ERROR, fmt=0x16c7810 "Remote connection closed", ap=...) + at gdbsupport/common-exceptions.cc:203 + #10 0x0000000001548920 in throw_verror (error=TARGET_CLOSE_ERROR, + fmt=0x16c7810 "Remote connection closed", ap=...) + at gdbsupport/common-exceptions.cc:211 + #11 0x0000000001548a00 in throw_error (error=TARGET_CLOSE_ERROR, + fmt=0x16c7810 "Remote connection closed") + at gdbsupport/common-exceptions.cc:226 + #12 0x0000000000ac8f2c in remote_target::readchar (this=0x233d3d90, timeout=2) + at gdb/remote.c:9856 + #13 0x0000000000ac9f04 in remote_target::getpkt (this=0x233d3d90, + buf=0x233d40a8, forever=false, is_notif=0x0) at gdb/remote.c:10326 + #14 0x0000000000acf3d0 in remote_target::remote_hostio_send_command + (this=0x233d3d90, command_bytes=13, which_packet=17, + remote_errno=0xfffff1a3cf38, attachment=0xfffff1a3ce88, + attachment_len=0xfffff1a3ce90) at gdb/remote.c:12567 + #15 0x0000000000ad03bc in remote_target::fileio_fstat (this=0x233d3d90, fd=3, + st=0xfffff1a3d020, remote_errno=0xfffff1a3cf38) + at gdb/remote.c:12979 + #16 0x0000000000c39878 in target_fileio_fstat (fd=0, sb=0xfffff1a3d020, + target_errno=0xfffff1a3cf38) at gdb/target.c:3315 + #17 0x00000000007eee5c in target_fileio_stream::stat (this=0x233d4400, + abfd=0x2323fc40, sb=0xfffff1a3d020) at gdb/gdb_bfd.c:467 + #18 0x00000000007f012c in ::operator()(bfd *, + void *, stat *) const (__closure=0x0, abfd=0x2323fc40, stream=0x233d4400, + sb=0xfffff1a3d020) at gdb/gdb_bfd.c:955 + #19 0x00000000007f015c in ::_FUN(bfd *, void *, + stat *) () at gdb/gdb_bfd.c:956 + #20 0x0000000000f9b838 in opncls_bstat (abfd=0x2323fc40, sb=0xfffff1a3d020) + at bfd/opncls.c:665 + #21 0x0000000000f90adc in bfd_stat (abfd=0x2323fc40, statbuf=0xfffff1a3d020) + at bfd/bfdio.c:431 + #22 0x000000000065fe20 in reopen_exec_file () at gdb/corefile.c:52 + #23 0x0000000000c3a3e8 in generic_mourn_inferior () + at gdb/target.c:3642 + #24 0x0000000000abf3f0 in remote_unpush_target (target=0x233d3d90) + at gdb/remote.c:6067 + #25 0x0000000000aca8b0 in remote_target::mourn_inferior (this=0x233d3d90) + at gdb/remote.c:10587 + #26 0x0000000000c387cc in target_mourn_inferior ( + ptid=) + at gdb/target.c:2738 + #27 0x0000000000abfff0 in remote_target::remote_detach_1 (this=0x233d3d90, + inf=0x22fce540, from_tty=1) at gdb/remote.c:6421 + #28 0x0000000000ac0094 in remote_target::detach (this=0x233d3d90, + inf=0x22fce540, from_tty=1) at gdb/remote.c:6436 + #29 0x0000000000c37c3c in target_detach (inf=0x22fce540, from_tty=1) + at gdb/target.c:2526 + #30 0x0000000000860424 in detach_command (args=0x0, from_tty=1) + at gdb/infcmd.c:2817 + #31 0x000000000060b594 in do_simple_func (args=0x0, from_tty=1, c=0x231431a0) + at gdb/cli/cli-decode.c:94 + #32 0x00000000006108c8 in cmd_func (cmd=0x231431a0, args=0x0, from_tty=1) + at gdb/cli/cli-decode.c:2741 + #33 0x0000000000c65a94 in execute_command (p=0x232e52f6 "", from_tty=1) + at gdb/top.c:570 + #34 0x00000000007a7d2c in command_handler (command=0x232e52f0 "") + at gdb/event-top.c:566 + #35 0x00000000007a8290 in command_line_handler (rl=...) + at gdb/event-top.c:802 + #36 0x0000000000c9092c in tui_command_line_handler (rl=...) + at gdb/tui/tui-interp.c:103 + #37 0x00000000007a750c in gdb_rl_callback_handler (rl=0x23385330 "detach") + at gdb/event-top.c:258 + #38 0x0000000000d910f4 in rl_callback_read_char () + at readline/readline/callback.c:290 + #39 0x00000000007a7338 in gdb_rl_callback_read_char_wrapper_noexcept () + at gdb/event-top.c:194 + #40 0x00000000007a73f0 in gdb_rl_callback_read_char_wrapper + (client_data=0x22fbf640) at gdb/event-top.c:233 + #41 0x0000000000cbee1c in stdin_event_handler (error=0, client_data=0x22fbf640) + at gdb/ui.c:154 + #42 0x000000000154ed60 in handle_file_event (file_ptr=0x232be730, ready_mask=1) + at gdbsupport/event-loop.cc:572 + #43 0x000000000154f21c in gdb_wait_for_event (block=1) + at gdbsupport/event-loop.cc:693 + #44 0x000000000154dec4 in gdb_do_one_event (mstimeout=-1) + at gdbsupport/event-loop.cc:263 + #45 0x0000000000910f98 in start_event_loop () at gdb/main.c:400 + #46 0x0000000000911130 in captured_command_loop () at gdb/main.c:464 + #47 0x0000000000912b5c in captured_main (data=0xfffff1a3db58) + at gdb/main.c:1338 + #48 0x0000000000912bf4 in gdb_main (args=0xfffff1a3db58) + at gdb/main.c:1357 + #49 0x00000000004170f4 in main (argc=10, argv=0xfffff1a3dcc8) + at gdb/gdb.c:38 + (gdb) +... + +The abort happens because a c++ exception escapes to c code, specifically +opncls_bstat in bfd/opncls.c. Compiling with -fexceptions works around this. + +Fix this by catching the exception just before it escapes, in stat_trampoline +and likewise in few similar spot. + +Add a new template catch_exceptions to do so in a consistent way. + +Tested on aarch64-linux. + +Approved-by: Pedro Alves + +PR remote/31577 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31577 +--- + gdb/gdb_bfd.c | 59 ++++++++++++++++++++++++++++++++++++++++++++++++--- + 1 file changed, 56 insertions(+), 3 deletions(-) + +diff --git a/gdb/gdb_bfd.c b/gdb/gdb_bfd.c +index 217753cf914..3c34cc5693f 100644 +--- a/gdb/gdb_bfd.c ++++ b/gdb/gdb_bfd.c +@@ -887,6 +887,29 @@ gdb_bfd_openw (const char *filename, const char *target) + return gdb_bfd_ref_ptr::new_reference (result); + } + ++/* Wrap f (args) and handle exceptions by: ++ - returning val, and ++ - calling set_quit_flag or set_force_quit_flag, if needed. */ ++ ++template ++static R ++catch_exceptions (F &&f, Args&&... args) ++{ ++ try ++ { ++ return f (std::forward (args)...); ++ } ++ catch (const gdb_exception &ex) ++ { ++ if (ex.reason == RETURN_QUIT) ++ set_quit_flag (); ++ else if (ex.reason == RETURN_FORCED_QUIT) ++ set_force_quit_flag (); ++ } ++ ++ return val; ++} ++ + /* See gdb_bfd.h. */ + + gdb_bfd_ref_ptr +@@ -896,21 +919,51 @@ gdb_bfd_openr_iovec (const char *filename, const char *target, + auto do_open = [] (bfd *nbfd, void *closure) -> void * + { + auto real_opener = static_cast (closure); +- return (*real_opener) (nbfd); ++ /* Prevent exceptions from escaping to C code and triggering an abort. */ ++ auto res = catch_exceptions ([&] ++ { ++ return (*real_opener) (nbfd); ++ }); ++ if (res == nullptr) ++ { ++ errno = EIO; ++ bfd_set_error (bfd_error_system_call); ++ } ++ return res; + }; + + auto read_trampoline = [] (bfd *nbfd, void *stream, void *buf, + file_ptr nbytes, file_ptr offset) -> file_ptr + { + gdb_bfd_iovec_base *obj = static_cast (stream); +- return obj->read (nbfd, buf, nbytes, offset); ++ /* Prevent exceptions from escaping to C code and triggering an abort. */ ++ auto res = catch_exceptions ([&] ++ { ++ return obj->read (nbfd, buf, nbytes, offset); ++ }); ++ if (res == -1) ++ { ++ errno = EIO; ++ bfd_set_error (bfd_error_system_call); ++ } ++ return res; + }; + + auto stat_trampoline = [] (struct bfd *abfd, void *stream, + struct stat *sb) -> int + { + gdb_bfd_iovec_base *obj = static_cast (stream); +- return obj->stat (abfd, sb); ++ /* Prevent exceptions from escaping to C code and triggering an abort. */ ++ auto res = catch_exceptions ([&] ++ { ++ return obj->stat (abfd, sb); ++ }); ++ if (res == -1) ++ { ++ errno = EIO; ++ bfd_set_error (bfd_error_system_call); ++ } ++ return res; + }; + + auto close_trampoline = [] (struct bfd *nbfd, void *stream) -> int +-- +2.35.3 + diff --git a/gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch b/gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch new file mode 100644 index 0000000..0b2e9a1 --- /dev/null +++ b/gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch @@ -0,0 +1,264 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Andrew Burgess +Date: Sat, 25 Nov 2023 10:35:37 +0000 +Subject: gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch + +;; Back-port upstream commit acc117b57f7 as part of a fix for +;; non-deterministic gdb-index generation (RH BZ 2232086). + +gdb: C++-ify mapped_symtab from dwarf2/index-write.c + +Make static the functions add_index_entry, find_slot, and hash_expand, +member functions of the mapped_symtab class. + +Fold an additional snippet of code from write_gdbindex into +mapped_symtab::minimize, this code relates to minimisation, so this +seems like a good home for it. + +Make the n_elements, data, and m_string_obstack member variables of +mapped_symtab private. Provide a new obstack() member function to +provide access to the obstack when needed, and also add member +functions begin(), end(), cbegin(), and cend() so that the +mapped_symtab class can be treated like a contained and iterated +over. + +I've also taken this opportunity to split out the logic for whether +the hash table (m_data) needs expanding, this is the new function +hash_needs_expanding. This will be useful in a later commit. + +There should be no user visible changes after this commit. + +Approved-By: Tom Tromey + +diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c +--- a/gdb/dwarf2/index-write.c ++++ b/gdb/dwarf2/index-write.c +@@ -187,86 +187,135 @@ struct mapped_symtab + { + mapped_symtab () + { +- data.resize (1024); ++ m_data.resize (1024); + } + +- /* Minimize each entry in the symbol table, removing duplicates. */ ++ /* If there are no elements in the symbol table, then reduce the table ++ size to zero. Otherwise call symtab_index_entry::minimize each entry ++ in the symbol table. */ ++ + void minimize () + { +- for (symtab_index_entry &item : data) ++ if (m_element_count == 0) ++ m_data.resize (0); ++ ++ for (symtab_index_entry &item : m_data) + item.minimize (); + } + +- offset_type n_elements = 0; +- std::vector data; ++ /* Add an entry to SYMTAB. NAME is the name of the symbol. CU_INDEX is ++ the index of the CU in which the symbol appears. IS_STATIC is one if ++ the symbol is static, otherwise zero (global). */ ++ ++ void add_index_entry (const char *name, int is_static, ++ gdb_index_symbol_kind kind, offset_type cu_index); ++ ++ /* Access the obstack. */ ++ struct obstack *obstack () ++ { return &m_string_obstack; } ++ ++private: ++ ++ /* Find a slot in SYMTAB for the symbol NAME. Returns a reference to ++ the slot. ++ ++ Function is used only during write_hash_table so no index format ++ backward compatibility is needed. */ ++ ++ symtab_index_entry &find_slot (const char *name); ++ ++ /* Expand SYMTAB's hash table. */ ++ ++ void hash_expand (); ++ ++ /* Return true if the hash table in data needs to grow. */ ++ ++ bool hash_needs_expanding () const ++ { return 4 * m_element_count / 3 >= m_data.size (); } ++ ++ /* A vector that is used as a hash table. */ ++ std::vector m_data; ++ ++ /* The number of elements stored in the m_data hash. */ ++ offset_type m_element_count = 0; + + /* Temporary storage for names. */ + auto_obstack m_string_obstack; +-}; + +-/* Find a slot in SYMTAB for the symbol NAME. Returns a reference to +- the slot. ++public: ++ using iterator = decltype (m_data)::iterator; ++ using const_iterator = decltype (m_data)::const_iterator; + +- Function is used only during write_hash_table so no index format backward +- compatibility is needed. */ ++ iterator begin () ++ { return m_data.begin (); } + +-static symtab_index_entry & +-find_slot (struct mapped_symtab *symtab, const char *name) ++ iterator end () ++ { return m_data.end (); } ++ ++ const_iterator cbegin () ++ { return m_data.cbegin (); } ++ ++ const_iterator cend () ++ { return m_data.cend (); } ++}; ++ ++/* See class definition. */ ++ ++symtab_index_entry & ++mapped_symtab::find_slot (const char *name) + { + offset_type index, step, hash = mapped_index_string_hash (INT_MAX, name); + +- index = hash & (symtab->data.size () - 1); +- step = ((hash * 17) & (symtab->data.size () - 1)) | 1; ++ index = hash & (m_data.size () - 1); ++ step = ((hash * 17) & (m_data.size () - 1)) | 1; + + for (;;) + { +- if (symtab->data[index].name == NULL +- || strcmp (name, symtab->data[index].name) == 0) +- return symtab->data[index]; +- index = (index + step) & (symtab->data.size () - 1); ++ if (m_data[index].name == NULL ++ || strcmp (name, m_data[index].name) == 0) ++ return m_data[index]; ++ index = (index + step) & (m_data.size () - 1); + } + } + +-/* Expand SYMTAB's hash table. */ ++/* See class definition. */ + +-static void +-hash_expand (struct mapped_symtab *symtab) ++void ++mapped_symtab::hash_expand () + { +- auto old_entries = std::move (symtab->data); ++ auto old_entries = std::move (m_data); + +- symtab->data.clear (); +- symtab->data.resize (old_entries.size () * 2); ++ gdb_assert (m_data.size () == 0); ++ m_data.resize (old_entries.size () * 2); + + for (auto &it : old_entries) + if (it.name != NULL) + { +- auto &ref = find_slot (symtab, it.name); ++ auto &ref = this->find_slot (it.name); + ref = std::move (it); + } + } + +-/* Add an entry to SYMTAB. NAME is the name of the symbol. +- CU_INDEX is the index of the CU in which the symbol appears. +- IS_STATIC is one if the symbol is static, otherwise zero (global). */ ++/* See class definition. */ + +-static void +-add_index_entry (struct mapped_symtab *symtab, const char *name, +- int is_static, gdb_index_symbol_kind kind, +- offset_type cu_index) ++void ++mapped_symtab::add_index_entry (const char *name, int is_static, ++ gdb_index_symbol_kind kind, ++ offset_type cu_index) + { +- symtab_index_entry *slot = &find_slot (symtab, name); ++ symtab_index_entry *slot = &this->find_slot (name); + if (slot->name == NULL) + { + /* This is a new element in the hash table. */ +- ++symtab->n_elements; ++ ++this->m_element_count; + + /* We might need to grow the hash table. */ +- if (4 * symtab->n_elements / 3 >= symtab->data.size ()) ++ if (this->hash_needs_expanding ()) + { +- hash_expand (symtab); ++ this->hash_expand (); + + /* This element will have a different slot in the new table. */ +- slot = &find_slot (symtab, name); ++ slot = &this->find_slot (name); + + /* But it should still be a new element in the hash table. */ + gdb_assert (slot->name == nullptr); +@@ -387,7 +436,7 @@ write_hash_table (mapped_symtab *symtab, data_buf &output, data_buf &cpool) + + /* We add all the index vectors to the constant pool first, to + ensure alignment is ok. */ +- for (symtab_index_entry &entry : symtab->data) ++ for (symtab_index_entry &entry : *symtab) + { + if (entry.name == NULL) + continue; +@@ -416,7 +465,7 @@ write_hash_table (mapped_symtab *symtab, data_buf &output, data_buf &cpool) + + /* Now write out the hash table. */ + std::unordered_map str_table; +- for (const auto &entry : symtab->data) ++ for (const auto &entry : *symtab) + { + offset_type str_off, vec_off; + +@@ -1151,7 +1200,7 @@ write_cooked_index (cooked_index *table, + const auto it = cu_index_htab.find (entry->per_cu); + gdb_assert (it != cu_index_htab.cend ()); + +- const char *name = entry->full_name (&symtab->m_string_obstack); ++ const char *name = entry->full_name (symtab->obstack ()); + + if (entry->per_cu->lang () == language_ada) + { +@@ -1159,7 +1208,7 @@ write_cooked_index (cooked_index *table, + gdb, it has to use the encoded name, with any + suffixes stripped. */ + std::string encoded = ada_encode (name, false); +- name = obstack_strdup (&symtab->m_string_obstack, ++ name = obstack_strdup (symtab->obstack (), + encoded.c_str ()); + } + else if (entry->per_cu->lang () == language_cplus +@@ -1191,8 +1240,8 @@ write_cooked_index (cooked_index *table, + else + kind = GDB_INDEX_SYMBOL_KIND_TYPE; + +- add_index_entry (symtab, name, (entry->flags & IS_STATIC) != 0, +- kind, it->second); ++ symtab->add_index_entry (name, (entry->flags & IS_STATIC) != 0, ++ kind, it->second); + } + } + +@@ -1267,8 +1316,6 @@ write_gdbindex (dwarf2_per_bfd *per_bfd, cooked_index *table, + symtab.minimize (); + + data_buf symtab_vec, constant_pool; +- if (symtab.n_elements == 0) +- symtab.data.resize (0); + + write_hash_table (&symtab, symtab_vec, constant_pool); + diff --git a/gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch b/gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch new file mode 100644 index 0000000..15365e6 --- /dev/null +++ b/gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch @@ -0,0 +1,101 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Andrew Burgess +Date: Mon, 27 Nov 2023 13:19:39 +0000 +Subject: gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch + +;; Back-port upstream commit 3644f41dc80 as part of a fix for +;; non-deterministic gdb-index generation (RH BZ 2232086). + +gdb: generate dwarf-5 index identically as worker-thread count changes + +Similar to the previous commit, this commit ensures that the dwarf-5 +index files are generated identically as the number of worker-threads +changes. + +Building the dwarf-5 index makes use of a closed hash table, the +bucket_hash local within debug_names::build(). Entries are added to +bucket_hash from m_name_to_value_set, which, in turn, is populated +by calls to debug_names::insert() in write_debug_names. The insert +calls are ordered based on the entries within the cooked_index, and +the ordering within cooked_index depends on the number of worker +threads that GDB is using. + +My proposal is to sort each chain within the bucket_hash closed hash +table prior to using this to build the dwarf-5 index. + +The buckets within bucket_hash will always have the same ordering (for +a given GDB build with a given executable), and by sorting the chains +within each bucket, we can be sure that GDB will see each entry in a +deterministic order. + +I've extended the index creation test to cover this case. + +Approved-By: Tom Tromey + +diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c +--- a/gdb/dwarf2/index-write.c ++++ b/gdb/dwarf2/index-write.c +@@ -452,6 +452,11 @@ class c_str_view + return strcmp (m_cstr, other.m_cstr) == 0; + } + ++ bool operator< (const c_str_view &other) const ++ { ++ return strcmp (m_cstr, other.m_cstr) < 0; ++ } ++ + /* Return the underlying C string. Note, the returned string is + only a reference with lifetime of this object. */ + const char *c_str () const +@@ -771,10 +776,18 @@ class debug_names + } + for (size_t bucket_ix = 0; bucket_ix < bucket_hash.size (); ++bucket_ix) + { +- const std::forward_list &hashitlist +- = bucket_hash[bucket_ix]; ++ std::forward_list &hashitlist = bucket_hash[bucket_ix]; + if (hashitlist.empty ()) + continue; ++ ++ /* Sort the items within each bucket. This ensures that the ++ generated index files will be the same no matter the order in ++ which symbols were added into the index. */ ++ hashitlist.sort ([] (const hash_it_pair &a, const hash_it_pair &b) ++ { ++ return a.it->first < b.it->first; ++ }); ++ + uint32_t &bucket_slot = m_bucket_table[bucket_ix]; + /* The hashes array is indexed starting at 1. */ + store_unsigned_integer (reinterpret_cast (&bucket_slot), +diff --git a/gdb/testsuite/gdb.gdb/index-file.exp b/gdb/testsuite/gdb.gdb/index-file.exp +--- a/gdb/testsuite/gdb.gdb/index-file.exp ++++ b/gdb/testsuite/gdb.gdb/index-file.exp +@@ -47,6 +47,9 @@ remote_exec host "mkdir -p ${dir1}" + with_timeout_factor $timeout_factor { + gdb_test_no_output "save gdb-index $dir1" \ + "create gdb-index file" ++ ++ gdb_test_no_output "save gdb-index -dwarf-5 $dir1" \ ++ "create dwarf-index files" + } + + # Close GDB. +@@ -143,13 +146,16 @@ if { $worker_threads > 1 } { + with_timeout_factor $timeout_factor { + gdb_test_no_output "save gdb-index $dir2" \ + "create second gdb-index file" ++ ++ gdb_test_no_output "save gdb-index -dwarf-5 $dir2" \ ++ "create second dwarf-index files" + } + + # Close GDB. + gdb_exit + + # Now check that the index files are identical. +- foreach suffix { gdb-index } { ++ foreach suffix { gdb-index debug_names debug_str } { + set result \ + [remote_exec host \ + "cmp -s \"$dir1/${index_filename_base}.${suffix}\" \"$dir2/${index_filename_base}.${suffix}\""] diff --git a/gdb-rhbz-2232086-generate-gdb-index-consistently.patch b/gdb-rhbz-2232086-generate-gdb-index-consistently.patch new file mode 100644 index 0000000..0d78380 --- /dev/null +++ b/gdb-rhbz-2232086-generate-gdb-index-consistently.patch @@ -0,0 +1,230 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Andrew Burgess +Date: Fri, 24 Nov 2023 12:04:36 +0000 +Subject: gdb-rhbz-2232086-generate-gdb-index-consistently.patch + +;; Back-port upstream commit aff250145af as part of a fix for +;; non-deterministic gdb-index generation (RH BZ 2232086). + +gdb: generate gdb-index identically regardless of work thread count + +It was observed that changing the number of worker threads that GDB +uses (maintenance set worker-threads NUM) would have an impact on the +layout of the generated gdb-index. + +The cause seems to be how the CU are distributed between threads, and +then symbols that appear in multiple CU can be encountered earlier or +later depending on whether a particular CU moves between threads. + +I certainly found this behaviour was reproducible when generating an +index for GDB itself, like: + + gdb -q -nx -nh -batch \ + -eiex 'maint set worker-threads NUM' \ + -ex 'save gdb-index /tmp/' + +And then setting different values for NUM will change the generated +index. + +Now, the question is: does this matter? + +I would like to suggest that yes, this does matter. At Red Hat we +generate a gdb-index as part of the build process, and we would +ideally like to have reproducible builds: for the same source, +compiled with the same tool-chain, we should get the exact same output +binary. And we do .... except for the index. + +Now we could simply force GDB to only use a single worker thread when +we build the index, but, I don't think the idea of reproducible builds +is that strange, so I think we should ensure that our generated +indexes are always reproducible. + +To achieve this, I propose that we add an extra step when building the +gdb-index file. After constructing the initial symbol hash table +contents, we will pull all the symbols out of the hash, sort them, +then re-insert them in sorted order. This will ensure that the +structure of the generated hash will remain consistent (given the same +set of symbols). + +I've extended the existing index-file test to check that the generated +index doesn't change if we adjust the number of worker threads used. +Given that this test is already rather slow, I've only made one change +to the worker-thread count. Maybe this test should be changed to use +a smaller binary, which is quicker to load, and for which we could +then try many different worker thread counts. + +Approved-By: Tom Tromey + +diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c +--- a/gdb/dwarf2/index-write.c ++++ b/gdb/dwarf2/index-write.c +@@ -210,6 +210,13 @@ struct mapped_symtab + void add_index_entry (const char *name, int is_static, + gdb_index_symbol_kind kind, offset_type cu_index); + ++ /* When entries are originally added into the data hash the order will ++ vary based on the number of worker threads GDB is configured to use. ++ This function will rebuild the hash such that the final layout will be ++ deterministic regardless of the number of worker threads used. */ ++ ++ void sort (); ++ + /* Access the obstack. */ + struct obstack *obstack () + { return &m_string_obstack; } +@@ -296,6 +303,65 @@ mapped_symtab::hash_expand () + } + } + ++/* See mapped_symtab class declaration. */ ++ ++void mapped_symtab::sort () ++{ ++ /* Move contents out of this->data vector. */ ++ std::vector original_data = std::move (m_data); ++ ++ /* Restore the size of m_data, this will avoid having to expand the hash ++ table (and rehash all elements) when we reinsert after sorting. ++ However, we do reset the element count, this allows for some sanity ++ checking asserts during the reinsert phase. */ ++ gdb_assert (m_data.size () == 0); ++ m_data.resize (original_data.size ()); ++ m_element_count = 0; ++ ++ /* Remove empty entries from ORIGINAL_DATA, this makes sorting quicker. */ ++ auto it = std::remove_if (original_data.begin (), original_data.end (), ++ [] (const symtab_index_entry &entry) -> bool ++ { ++ return entry.name == nullptr; ++ }); ++ original_data.erase (it, original_data.end ()); ++ ++ /* Sort the existing contents. */ ++ std::sort (original_data.begin (), original_data.end (), ++ [] (const symtab_index_entry &a, ++ const symtab_index_entry &b) -> bool ++ { ++ /* Return true if A is before B. */ ++ gdb_assert (a.name != nullptr); ++ gdb_assert (b.name != nullptr); ++ ++ return strcmp (a.name, b.name) < 0; ++ }); ++ ++ /* Re-insert each item from the sorted list. */ ++ for (auto &entry : original_data) ++ { ++ /* We know that ORIGINAL_DATA contains no duplicates, this data was ++ taken from a hash table that de-duplicated entries for us, so ++ count this as a new item. ++ ++ As we retained the original size of m_data (see above) then we ++ should never need to grow m_data_ during this re-insertion phase, ++ assert that now. */ ++ ++m_element_count; ++ gdb_assert (!this->hash_needs_expanding ()); ++ ++ /* Lookup a slot. */ ++ symtab_index_entry &slot = this->find_slot (entry.name); ++ ++ /* As discussed above, we should not find duplicates. */ ++ gdb_assert (slot.name == nullptr); ++ ++ /* Move this item into the slot we found. */ ++ slot = std::move (entry); ++ } ++} ++ + /* See class definition. */ + + void +@@ -1311,6 +1377,9 @@ write_gdbindex (dwarf2_per_bfd *per_bfd, cooked_index *table, + for (auto map : table->get_addrmaps ()) + write_address_map (map, addr_vec, cu_index_htab); + ++ /* Ensure symbol hash is built domestically. */ ++ symtab.sort (); ++ + /* Now that we've processed all symbols we can shrink their cu_indices + lists. */ + symtab.minimize (); +diff --git a/gdb/testsuite/gdb.gdb/index-file.exp b/gdb/testsuite/gdb.gdb/index-file.exp +--- a/gdb/testsuite/gdb.gdb/index-file.exp ++++ b/gdb/testsuite/gdb.gdb/index-file.exp +@@ -38,6 +38,9 @@ with_timeout_factor $timeout_factor { + clean_restart $filename + } + ++# Record how many worker threads GDB is using. ++set worker_threads [gdb_get_worker_threads] ++ + # Generate an index file. + set dir1 [standard_output_file "index_1"] + remote_exec host "mkdir -p ${dir1}" +@@ -116,3 +119,41 @@ proc check_symbol_table_usage { filename } { + + set index_filename_base [file tail $filename] + check_symbol_table_usage "$dir1/${index_filename_base}.gdb-index" ++ ++# If GDB is using more than 1 worker thread then reduce the number of ++# worker threads, regenerate the index, and check that we get the same ++# index file back. At one point the layout of the index would vary ++# based on the number of worker threads used. ++if { $worker_threads > 1 } { ++ # Start GDB, but don't load a file yet. ++ clean_restart ++ ++ # Adjust the number of threads to use. ++ set reduced_threads [expr $worker_threads / 2] ++ gdb_test_no_output "maint set worker-threads $reduced_threads" ++ ++ with_timeout_factor $timeout_factor { ++ # Now load the test binary. ++ gdb_file_cmd $filename ++ } ++ ++ # Generate an index file. ++ set dir2 [standard_output_file "index_2"] ++ remote_exec host "mkdir -p ${dir2}" ++ with_timeout_factor $timeout_factor { ++ gdb_test_no_output "save gdb-index $dir2" \ ++ "create second gdb-index file" ++ } ++ ++ # Close GDB. ++ gdb_exit ++ ++ # Now check that the index files are identical. ++ foreach suffix { gdb-index } { ++ set result \ ++ [remote_exec host \ ++ "cmp -s \"$dir1/${index_filename_base}.${suffix}\" \"$dir2/${index_filename_base}.${suffix}\""] ++ gdb_assert { [lindex $result 0] == 0 } \ ++ "$suffix files are identical" ++ } ++} +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 +@@ -10033,6 +10033,21 @@ proc is_target_non_stop { {testname ""} } { + return $is_non_stop + } + ++# Return the number of worker threads that GDB is currently using. ++ ++proc gdb_get_worker_threads { {testname ""} } { ++ set worker_threads "UNKNOWN" ++ gdb_test_multiple "maintenance show worker-threads" $testname { ++ -wrap -re "The number of worker threads GDB can use is unlimited \\(currently ($::decimal)\\)\\." { ++ set worker_threads $expect_out(1,string) ++ } ++ -wrap -re "The number of worker threads GDB can use is ($::decimal)\\." { ++ set worker_threads $expect_out(1,string) ++ } ++ } ++ return $worker_threads ++} ++ + # Check if the compiler emits epilogue information associated + # with the closing brace or with the last statement line. + # diff --git a/gdb-rhbz-2232086-reduce-size-of-gdb-index.patch b/gdb-rhbz-2232086-reduce-size-of-gdb-index.patch new file mode 100644 index 0000000..41b495e --- /dev/null +++ b/gdb-rhbz-2232086-reduce-size-of-gdb-index.patch @@ -0,0 +1,222 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Andrew Burgess +Date: Fri, 24 Nov 2023 11:50:35 +0000 +Subject: gdb-rhbz-2232086-reduce-size-of-gdb-index.patch + +;; Back-port upstream commit aa19bc1d259 as part of a fix for +;; non-deterministic gdb-index generation (RH BZ 2232086). + +gdb: reduce size of generated gdb-index file + +I noticed in passing that out algorithm for generating the gdb-index +file is incorrect. When building the hash table in add_index_entry we +count every incoming entry rehash when the number of entries gets too +large. However, some of the incoming entries will be duplicates, +which don't actually result in new items being added to the hash +table. + +As a result, we grow the gdb-index hash table far too often. + +With an unmodified GDB, generating a gdb-index for GDB, I see a file +size of 90M, with a hash usage (in the generated index file) of just +2.6%. + +With a patched GDB, generating a gdb-index for the _same_ GDB binary, +I now see a gdb-index file size of 30M, with a hash usage of 41.9%. + +This is a 67% reduction in gdb-index file size. + +Obviously, not every gdb-index file is going to see such big savings, +however, the larger a program, and the more symbols that are +duplicated between compilation units, the more GDB would over count, +and so, over-grow the index. + +The gdb-index hash table we create has a minimum size of 1024, and +then we grow the hash when it is 75% full, doubling the hash table at +that time. Given this, then we expect that either: + + a. The hash table is size 1024, and less than 75% full, or + b. The hash table is between 37.5% and 75% full. + +I've include a test that checks some of these constraints -- I've not +bothered to check the upper limit, and over full hash table isn't +really a problem here, but if the fill percentage is less than 37.5% +then this indicates that we've done something wrong (obviously, I also +check for the 1024 minimum size). + +Approved-By: Tom Tromey + +diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c +--- a/gdb/dwarf2/index-write.c ++++ b/gdb/dwarf2/index-write.c +@@ -254,20 +254,29 @@ add_index_entry (struct mapped_symtab *symtab, const char *name, + int is_static, gdb_index_symbol_kind kind, + offset_type cu_index) + { +- offset_type cu_index_and_attrs; ++ symtab_index_entry *slot = &find_slot (symtab, name); ++ if (slot->name == NULL) ++ { ++ /* This is a new element in the hash table. */ ++ ++symtab->n_elements; + +- ++symtab->n_elements; +- if (4 * symtab->n_elements / 3 >= symtab->data.size ()) +- hash_expand (symtab); ++ /* We might need to grow the hash table. */ ++ if (4 * symtab->n_elements / 3 >= symtab->data.size ()) ++ { ++ hash_expand (symtab); + +- symtab_index_entry &slot = find_slot (symtab, name); +- if (slot.name == NULL) +- { +- slot.name = name; ++ /* This element will have a different slot in the new table. */ ++ slot = &find_slot (symtab, name); ++ ++ /* But it should still be a new element in the hash table. */ ++ gdb_assert (slot->name == nullptr); ++ } ++ ++ slot->name = name; + /* index_offset is set later. */ + } + +- cu_index_and_attrs = 0; ++ offset_type cu_index_and_attrs = 0; + DW2_GDB_INDEX_CU_SET_VALUE (cu_index_and_attrs, cu_index); + DW2_GDB_INDEX_SYMBOL_STATIC_SET_VALUE (cu_index_and_attrs, is_static); + DW2_GDB_INDEX_SYMBOL_KIND_SET_VALUE (cu_index_and_attrs, kind); +@@ -279,7 +288,7 @@ add_index_entry (struct mapped_symtab *symtab, const char *name, + the last entry pushed), but a symbol could have multiple kinds in one CU. + To keep things simple we don't worry about the duplication here and + sort and uniquify the list after we've processed all symbols. */ +- slot.cu_indices.push_back (cu_index_and_attrs); ++ slot->cu_indices.push_back (cu_index_and_attrs); + } + + /* See symtab_index_entry. */ +diff --git a/gdb/testsuite/gdb.gdb/index-file.exp b/gdb/testsuite/gdb.gdb/index-file.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.gdb/index-file.exp +@@ -0,0 +1,118 @@ ++# Copyright 2023 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++# Load the GDB executable, and then 'save gdb-index', and make some ++# checks of the generated index file. ++ ++load_lib selftest-support.exp ++ ++# Can't save an index with readnow. ++if {[readnow]} { ++ untested "cannot create an index when readnow is in use" ++ return -1 ++} ++ ++# A multiplier used to ensure slow tasks are less likely to timeout. ++set timeout_factor 20 ++ ++set filename [selftest_prepare] ++if { $filename eq "" } { ++ unsupported "${gdb_test_file_name}.exp" ++ return -1 ++} ++ ++with_timeout_factor $timeout_factor { ++ # Start GDB, load FILENAME. ++ clean_restart $filename ++} ++ ++# Generate an index file. ++set dir1 [standard_output_file "index_1"] ++remote_exec host "mkdir -p ${dir1}" ++with_timeout_factor $timeout_factor { ++ gdb_test_no_output "save gdb-index $dir1" \ ++ "create gdb-index file" ++} ++ ++# Close GDB. ++gdb_exit ++ ++# Validate that the index-file FILENAME has made efficient use of its ++# symbol hash table. Calculate the number of symbols in the hash ++# table and the total hash table size. The hash table starts with ++# 1024 entries, and then doubles each time it is filled to 75%. At ++# 75% filled, doubling the size takes it to 37.5% filled. ++# ++# Thus, the hash table is correctly filled if: ++# 1. Its size is 1024 (i.e. it has not yet had its first doubling), or ++# 2. Its filled percentage is over 37% ++# ++# We could check that it is not over filled, but I don't as that's not ++# really an issue. But we did once have a bug where the table was ++# doubled incorrectly, in which case we'd see a filled percentage of ++# around 2% in some cases, which is a huge waste of disk space. ++proc check_symbol_table_usage { filename } { ++ # Open the file in binary mode and read-only mode. ++ set fp [open $filename rb] ++ ++ # Configure the channel to use binary translation. ++ fconfigure $fp -translation binary ++ ++ # Read the first 8 bytes of the file, which contain the header of ++ # the index section. ++ set header [read $fp [expr 7 * 4]] ++ ++ # Scan the header to get the version, the CU list offset, and the ++ # types CU list offset. ++ binary scan $header iiiiii version \ ++ _ _ _ symbol_table_offset shortcut_offset ++ ++ # The length of the symbol hash table (in entries). ++ set len [expr ($shortcut_offset - $symbol_table_offset) / 8] ++ ++ # Now walk the hash table and count how many entries are in use. ++ set offset $symbol_table_offset ++ set count 0 ++ while { $offset < $shortcut_offset } { ++ seek $fp $offset ++ set entry [read $fp 8] ++ binary scan $entry ii name_ptr flags ++ if { $name_ptr != 0 } { ++ incr count ++ } ++ ++ incr offset 8 ++ } ++ ++ # Close the file. ++ close $fp ++ ++ # Calculate how full the cache is. ++ set pct [expr (100 * double($count)) / $len] ++ ++ # Write our results out to the gdb.log. ++ verbose -log "Hash table size: $len" ++ verbose -log "Hash table entries: $count" ++ verbose -log "Percentage usage: $pct%" ++ ++ # The minimum fill percentage is actually 37.5%, but we give TCL a ++ # little flexibility in case the FP maths give a result a little ++ # off. ++ gdb_assert { $len == 1024 || $pct > 37 } \ ++ "symbol hash table usage" ++} ++ ++set index_filename_base [file tail $filename] ++check_symbol_table_usage "$dir1/${index_filename_base}.gdb-index" diff --git a/gdb-rhbz-818343-set-solib-absolute-prefix-testcase.patch b/gdb-rhbz-818343-set-solib-absolute-prefix-testcase.patch new file mode 100644 index 0000000..5a5af92 --- /dev/null +++ b/gdb-rhbz-818343-set-solib-absolute-prefix-testcase.patch @@ -0,0 +1,83 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-rhbz-818343-set-solib-absolute-prefix-testcase.patch + +;; Testcase for `Setting solib-absolute-prefix breaks vDSO' (BZ 818343). +;;=fedoratest + +diff --git a/gdb/testsuite/gdb.base/set-solib-absolute-prefix.c b/gdb/testsuite/gdb.base/set-solib-absolute-prefix.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/set-solib-absolute-prefix.c +@@ -0,0 +1,26 @@ ++/* Copyright (C) 2012 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 ++#include ++ ++int ++main (int argc, char *argv[]) ++{ ++ printf ("Hello, World.\n"); ++ abort (); ++} +diff --git a/gdb/testsuite/gdb.base/set-solib-absolute-prefix.exp b/gdb/testsuite/gdb.base/set-solib-absolute-prefix.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/set-solib-absolute-prefix.exp +@@ -0,0 +1,39 @@ ++# Copyright 2012 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 . ++ ++set testfile "set-solib-absolute-prefix" ++set srcfile ${testfile}.c ++ ++# It is necessary to verify if the binary is 32-bit, so that the system ++# call `__kernel_vsyscall' originates from vDSO. ++ ++if { ![is_ilp32_target] } { ++ return -1 ++} ++ ++if { [prepare_for_testing $testfile.exp $testfile $srcfile] } { ++ return -1 ++} ++ ++if { ![runto_main] } { ++ return -1 ++} ++ ++gdb_test "continue" "Program received signal SIGABRT, Aborted.*" \ ++ "continue until abort" ++gdb_test "set solib-absolute-prefix /BOGUS_DIRECT" \ ++ ".*warning: Unable to find dynamic linker breakpoint function.*" \ ++ "set solib-absolute-prefix" ++gdb_test "bt" "__kernel_vsyscall.*" "backtrace with __kernel_vsyscall" diff --git a/gdb-rhbz1007614-memleak-infpy_read_memory-test.patch b/gdb-rhbz1007614-memleak-infpy_read_memory-test.patch new file mode 100644 index 0000000..6eecc8f --- /dev/null +++ b/gdb-rhbz1007614-memleak-infpy_read_memory-test.patch @@ -0,0 +1,170 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-rhbz1007614-memleak-infpy_read_memory-test.patch + +;; Fix 'memory leak in infpy_read_memory()' (RH BZ 1007614) +;;=fedoratest + +Original message by Tom Tromey: + + + Message-ID: <871uoc1va3.fsf@fleche.redhat.com> + +Comment from Sergio Durigan Junior: + + In order to correctly test this patch, I wrote a testcase based on Jan + Kratochvil's . The + testcase, which can be seen below, tests GDB in order to see if the + amount of memory being leaked is minimal, as requested in the bugzilla. + It is hard to define what "minimum" is, so I ran the testcase on all + supported RHEL architectures and came up with an average. + +commit cc0265cdda9dc7e8665e8bfcf5b4477489daf27c +Author: Tom Tromey +Date: Wed Mar 28 17:38:08 2012 +0000 + + * python/py-inferior.c (infpy_read_memory): Remove cleanups and + explicitly free 'buffer' on exit paths. Decref 'membuf_object' + before returning. + +diff --git a/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.c b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.c +@@ -0,0 +1,27 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2014 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 . */ ++ ++static struct x ++ { ++ char unsigned u[4096]; ++ } x, *px = &x; ++ ++int ++main (int argc, char *argv[]) ++{ ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.exp b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.exp +@@ -0,0 +1,68 @@ ++# Copyright 2014 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 . ++ ++set testfile py-gdb-rhbz1007614-memleak-infpy_read_memory ++set srcfile ${testfile}.c ++set binfile [standard_output_file ${testfile}] ++ ++if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { ++ return -1 ++} ++ ++if { [skip_python_tests] } { continue } ++ ++set pid_of_gdb [exp_pid -i [board_info host fileid]] ++ ++proc memory_v_pages_get {} { ++ global pid_of_gdb ++ set fd [open "/proc/$pid_of_gdb/statm"] ++ gets $fd line ++ close $fd ++ # number of pages of virtual memory ++ scan $line "%d" drs ++ return $drs ++} ++ ++if { ![runto_main] } { ++ untested $testfile.exp ++ return -1 ++} ++ ++set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}.py] ++ ++gdb_test "source ${remote_python_file}" "" ++ ++gdb_test "hello-world" "" ++ ++set kbytes_before [memory_v_pages_get] ++verbose -log "kbytes_before = $kbytes_before" ++ ++gdb_test "hello-world" "" ++ ++set kbytes_after [memory_v_pages_get] ++verbose -log "kbytes_after = $kbytes_after" ++ ++set kbytes_diff [expr $kbytes_after - $kbytes_before] ++verbose -log "kbytes_diff = $kbytes_diff" ++ ++# The value "1000" was calculated by running a few GDB sessions with this ++# testcase, and seeing how much (in average) the memory consumption ++# increased after the "hello-world" command issued above. The average ++# was around 500 bytes, so I chose 1000 as a high estimate. ++if { $kbytes_diff > 1000 } { ++ fail "there is a memory leak on GDB (RHBZ 1007614)" ++} else { ++ pass "there is not a memory leak on GDB (RHBZ 1007614)" ++} +diff --git a/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.py b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.py +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.py +@@ -0,0 +1,30 @@ ++# Copyright (C) 2014 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 . ++ ++class HelloWorld (gdb.Command): ++ """Greet the whole world.""" ++ ++ def __init__ (self): ++ super (HelloWorld, self).__init__ ("hello-world", ++ gdb.COMMAND_OBSCURE) ++ ++ def invoke (self, arg, from_tty): ++ px = gdb.parse_and_eval("px") ++ core = gdb.inferiors()[0] ++ for i in range(256 * 1024): ++ chunk = core.read_memory(px, 4096) ++ print "Hello, World!" ++ ++HelloWorld () diff --git a/gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch b/gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch new file mode 100644 index 0000000..e6bd797 --- /dev/null +++ b/gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch @@ -0,0 +1,235 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch + +;; Fix '[ppc64] and [s390x] wrong prologue skip on -O2 -g code' (Jan +;; Kratochvil, RH BZ 1084404). +;;=fedoratest + +These testcases have been created by compiling glibc-2.17-78 on +RHEL-7.1 s390x/ppc64 boxes, and then taking the "select.o" file +present at $builddir/misc/select.o. + +diff --git a/gdb/testsuite/gdb.arch/ppc64-prologue-skip.exp b/gdb/testsuite/gdb.arch/ppc64-prologue-skip.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.arch/ppc64-prologue-skip.exp +@@ -0,0 +1,34 @@ ++# Copyright 2015 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 . ++ ++if { ![istarget powerpc64-*linux-*] || ![is_lp64_target] } { ++ verbose "Skipping ppc64-prologue-skip.exp" ++ return ++} ++ ++set testfile "ppc64-prologue-skip" ++set uufile "${srcdir}/${subdir}/${testfile}.o.uu" ++set ofile "${srcdir}/${subdir}/${testfile}.o" ++ ++if { [catch "system \"uudecode -o ${ofile} ${uufile}\"" ] != 0 } { ++ untested "failed uudecode" ++ return -1 ++} ++ ++gdb_exit ++gdb_start ++gdb_load $ofile ++ ++gdb_test "break ___newselect_nocancel" "Breakpoint $decimal at 0xc: file ../sysdeps/unix/syscall-template.S, line 81." "breakpoint on ___newselect_nocancel" +diff --git a/gdb/testsuite/gdb.arch/ppc64-prologue-skip.o.uu b/gdb/testsuite/gdb.arch/ppc64-prologue-skip.o.uu +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.arch/ppc64-prologue-skip.o.uu +@@ -0,0 +1,70 @@ ++begin 644 ppc64-skip-prologue.o.uu ++M?T5,1@("`0`````````````!`!4````!```````````````````````````` ++M``-(``````!```````!``!0`$8%-B-`L"@``0,(`-#@``(Y$```"3.,`('P( ++M`J;X`0`0^"'_D4@```%@````Z`$`@#@A`'!\"`.F3H``(/@A_X%]*`*F^2$` ++MD/CA`-#XP0#(^*$`P/B!`+CX80"P2````6````#X80!PZ.$`T.C!`,CHH0#` ++MZ($`N.AA`+`X``".1````GP``";X80!X^`$`B.AA`'!(```!8````.DA`)#H ++M`0"(Z&$`>'TH`Z9\#_$@."$`@$SC`"!+__]@```````,($``````````O``( ++M7U]S96QE8W0```````````````````````````!6``(````Y!`'[#@T``0$! ++M`0````$```$N+B]S>7-D97!S+W5N:7@``'-Y"]S>7-C86QL+71E;7!L871E ++M+E,`+W)O;W0O9VQI8F,O9VQI8F,M,BXQ-RTW."YE;#$$!&PP!```` ++M`#`````8`````````+P`20YP$4%^1`X`009!0@Z``4(107Y2$49_20X`!D$& ++M1@``````+G-Y;71A8@`N`````````!(````$@````$`````````"``````````8```` ++M)@````$``````````P```````````````````1@````````````````````` ++M``````````$``````````````"P````(``````````,````````````````` ++M``$8```````````````````````````````!```````````````V`````0`` ++M```````#```````````````````!&``````````0```````````````````` ++M"```````````````,0````0`````````````````````````````"L`````` ++M````,````!(````%``````````@`````````&````#L````!```````````` ++M``````````````````$H```````````````````````````````!```````` ++M``````!0`````0`````````````````````````````!*`````````!:```` ++M`````````````````0``````````````2P````0````````````````````` ++M````````"O``````````&````!(````(``````````@`````````&````&$` ++M```!``````````````````````````````&"`````````),````````````` ++M```````!``````````````!<````!``````````````````````````````+ ++M"`````````!@````$@````H`````````"``````````8````;0````$````` ++M`````````````````````````A4`````````%`````````````````````$` ++M`````````````(`````!``````````````````````````````(P```````` ++M`#`````````````````````0``````````````![````!``````````````` ++M```````````````+:``````````P````$@````T`````````"``````````8 ++M````E`````$``````````@```````````````````F``````````2``````` ++M``````````````@``````````````(\````$```````````````````````` ++M``````N8`````````!@````2````#P`````````(`````````!@````1```` ++M`P`````````````````````````````"J`````````">```````````````` ++M`````0```````````````0````(`````````````````````````````"$@` ++M```````!L````!,````+``````````@`````````&`````D````#```````` ++M``````````````````````GX`````````'H````````````````````!```` ++M`````````````````````````````````````````````P```0`````````` ++M`````````````````P```P```````````````````````````P``!``````` ++M`````````````````````P``!0```````````````````````````P``"@`` ++M`````````````````````````P``#````````````````````````````P`` ++M"````````````````````````````P``#0`````````````````````````` ++M`P``#P```````````````````````````P``!P`````````````````````` ++M```!$@``!0```````````````````-@````*$@```0`````````,```````` ++M`#`````@$``````````````````````````````P$``````````````````` ++M``````````!*$`````````````````````````````!E(@``!0`````````` ++M`````````-@```!S(@``!0```````````````````-@`7U]S96QE8W0`7U]? ++M;F5W6YC8V%N8V5L`%]?;&EB8U]D:7-A8FQE7V%S>6YC8V%N8V5L`%]? ++M;&EB8U]S96QE8W0`. ++ ++if { ![istarget s390x-*linux-*] || ![is_lp64_target] } { ++ verbose "Skipping s390x-prologue-skip.exp" ++ return ++} ++ ++set testfile "s390x-prologue-skip" ++set uufile "${srcdir}/${subdir}/${testfile}.o.uu" ++set ofile "${srcdir}/${subdir}/${testfile}.o" ++ ++if { [catch "system \"uudecode -o ${ofile} ${uufile}\"" ] != 0 } { ++ untested "failed uudecode" ++ return -1 ++} ++ ++gdb_exit ++gdb_start ++gdb_load $ofile ++ ++gdb_test "break select" "Breakpoint $decimal at 0x48: file ../sysdeps/unix/syscall-template.S, line 81." "breakpoint on select" +diff --git a/gdb/testsuite/gdb.arch/s390x-prologue-skip.o.uu b/gdb/testsuite/gdb.arch/s390x-prologue-skip.o.uu +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.arch/s390x-prologue-skip.o.uu +@@ -0,0 +1,64 @@ ++begin 644 s390x-prologue-skip.o.uu ++M?T5,1@("`0`````````````!`!8````!```````````````````````````` ++M``+```````!```````!``!(`#^LE\!``).O?\&@`)+D$`.^G^_]@X^#P```D ++MP.4`````N00``NLE\+``!`J.N00`TKD$`"#`Y0````"Y!``MZ]_Q"``$I_0` ++M"L`0`````+\/$`"G=/_7"HZG2?`!N2$`),"T``````?^````5@`"````.0$! ++M^PX-``$!`0$````!```!+BXO7-C86QL+71E;7!L ++M871E+E,``0`````)`@```````````]```0)F$P("``$!````CP`"``````@! ++M```````````````````````````N+B]S>7-D97!S+W5N:7@OE(``7@. ++M`1L,#Z`!````````&````!P`````````1`!,CP6.!HT'2`[``@```!`````X ++M`````````"```````"YS>6UT86(`+G-T``````````&````!`````&``````````@````````` ++M&````%<````!``````````````````````````````$"`````````),````` ++M```````````````!``````````````!2````!``````````````````````` ++M```````)^`````````!@````$`````@`````````"``````````8````8P`` ++M``$``````````````````````````````94`````````%``````````````` ++M``````$``````````````'8````!``````````````````````````````&P ++M`````````#`````````````````````0``````````````!Q````!``````` ++M```````````````````````*6``````````P````$`````L`````````"``` ++M```````8````B@````$``````````@```````````````````>`````````` ++M2`````````````````````@``````````````(4````$```````````````` ++M``````````````J(`````````#`````0````#0`````````(`````````!@` ++M```1`````P`````````````````````````````"*`````````"4```````` ++M`````````````0```````````````0````(````````````````````````` ++M````!T`````````!L````!$````*``````````@`````````&`````D````# ++M``````````````````````````````CP`````````(X````````````````` ++M```!`````````````````````````````````````````````````P```0`` ++M`````````````````````````P```P```````````````````````````P`` ++M!````````````````````````````P``"``````````````````````````` ++M`P``"@```````````````````````````P``!@`````````````````````` ++M`````P``"P```````````````````````````P``#0`````````````````` ++M`````````P``!0`````````````````````````!$``````````````````` ++M```````````;$``````````````````````````````V$@```0````````!( ++M`````````"`````_$`````````````````````````````!7$@```0`````` ++M``!6`````````!````!I$`````````````````````````````!Y(@```0`` ++M``````!(`````````"````"'(@```0````````!(`````````"``7U]L:6)C ++M7V5N86)L95]A +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-rhbz1149205-catch-syscall-after-fork-test.patch + +;; Fix '`catch syscall' doesn't work for parent after `fork' is called' +;; (Philippe Waroquiers, RH BZ 1149205). +;;=fedoratest + +URL: +Message-ID: <1368136582.30058.7.camel@soleil> + + From: Philippe Waroquiers + To: gdb-patches at sourceware dot org + Subject: RFA: fix gdb_assert caused by 'catch signal ...' and fork + Date: Thu, 09 May 2013 23:56:22 +0200 + + The attached patch fixes a gdb_assert caused by the combination of catch + signal and fork: + break-catch-sig.c:152: internal-error: signal_catchpoint_remove_location: Assertion `signal_catch_counts[iter] > 0' failed. + + The problem is that the signal_catch_counts is decremented by detach_breakpoints. + The fix consists in not detaching breakpoint locations of type bp_loc_other. + The patch introduces a new test. + +Comments by Sergio Durigan Junior: + + I addded a specific testcase for this patch, which tests exactly the + issue that the customer is facing. This patch does not solve the + whole problem of catching a syscall and forking (for more details, + see , + specifically comment #3), but it solves the issue reported by the + customer. + + I also removed the original testcase of this patch, because it + relied on "catch signal", which is a command that is not implemented + in this version of GDB. + +commit bd9673a4ded96ea5c108601501c8e59003ea1be6 +Author: Philippe Waroquiers +Date: Tue May 21 18:47:05 2013 +0000 + + Fix internal error caused by interaction between catch signal and fork + +diff --git a/gdb/testsuite/gdb.base/gdb-rhbz1149205-catch-syscall-fork.c b/gdb/testsuite/gdb.base/gdb-rhbz1149205-catch-syscall-fork.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gdb-rhbz1149205-catch-syscall-fork.c +@@ -0,0 +1,11 @@ ++#include ++#include ++ ++int ++main (int argc, char **argv) ++{ ++ if (fork () == 0) ++ sleep (1); ++ chdir ("."); ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/gdb-rhbz1149205-catch-syscall-fork.exp b/gdb/testsuite/gdb.base/gdb-rhbz1149205-catch-syscall-fork.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gdb-rhbz1149205-catch-syscall-fork.exp +@@ -0,0 +1,58 @@ ++# Copyright 2015 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 . ++ ++if { [is_remote target] || ![isnative] } then { ++ continue ++} ++ ++set testfile "gdb-rhbz1149205-catch-syscall-fork" ++set srcfile ${testfile}.c ++set binfile [standard_output_file ${testfile}] ++ ++# Until "catch syscall" is implemented on other targets... ++if {![istarget "hppa*-hp-hpux*"] && ![istarget "*-linux*"]} then { ++ continue ++} ++ ++# This shall be updated whenever 'catch syscall' is implemented ++# on some architecture. ++#if { ![istarget "i\[34567\]86-*-linux*"] ++if { ![istarget "x86_64-*-linux*"] && ![istarget "i\[34567\]86-*-linux*"] ++ && ![istarget "powerpc-*-linux*"] && ![istarget "powerpc64-*-linux*"] ++ && ![istarget "sparc-*-linux*"] && ![istarget "sparc64-*-linux*"] } { ++ continue ++} ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ untested ${testfile}.exp ++ return -1 ++} ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++gdb_load $binfile ++ ++if { ![runto_main] } { ++ return -1 ++} ++ ++gdb_test "catch syscall chdir" \ ++ "Catchpoint $decimal \\\(syscall (.)?chdir(.)? \\\[$decimal\\\]\\\)" \ ++ "catch syscall chdir" ++ ++gdb_test "continue" \ ++ "Continuing\.\r\n.*\r\nCatchpoint $decimal \\\(call to syscall .?chdir.?.*" \ ++ "continue from catch syscall after fork" diff --git a/gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch b/gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch new file mode 100644 index 0000000..3a5e2d4 --- /dev/null +++ b/gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch @@ -0,0 +1,104 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch + +;; [aarch64] Fix hardware watchpoints (RH BZ 1261564). +;;=fedoratest + +diff --git a/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.c b/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.c +@@ -0,0 +1,33 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2016 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 . */ ++ ++__attribute__((aligned(16))) struct ++{ ++ int var0, var4, var8; ++} aligned; ++ ++int ++main (void) ++{ ++ aligned.var0 = 1; ++ aligned.var4 = 2; ++ aligned.var8 = 3; ++ ++ aligned.var4 = aligned.var0; ++ ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.exp b/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.exp +@@ -0,0 +1,53 @@ ++# Copyright (C) 2016 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 . ++ ++if { [prepare_for_testing rhbz1261564-aarch64-watchpoint.exp "rhbz1261564-aarch64-watchpoint"] } { ++ return -1 ++} ++ ++if { ! [ runto main ] } then { return 0 } ++ ++set test "rwatch aligned.var4" ++if [istarget "s390*-*-*"] { ++ gdb_test $test {Target does not support this type of hardware watchpoint\.} ++ untested "s390* does not support hw read watchpoint" ++ return ++} ++gdb_test $test "Hardware read watchpoint \[0-9\]+: aligned.var4" ++ ++proc checkvar { address } { ++ global gdb_prompt ++ ++ set test "p &aligned.var$address" ++ gdb_test_multiple $test $test { ++ -re " = \\(int \\*\\) 0x\[0-9a-f\]+$address \r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re "\r\n$gdb_prompt $" { ++ untested "$test (unexpected ELF layout)" ++ return 0 ++ } ++ } ++ return 1 ++} ++if ![checkvar "0"] { return } ++if ![checkvar "4"] { return } ++if ![checkvar "8"] { return } ++ ++# Assumes: PPC_PTRACE_GETHWDBGINFO::data_bp_alignment == 8 ++# 'lwz' does read only 4 bytes but the hw watchpoint is 8 bytes wide. ++setup_xfail "powerpc*-*-*" ++ ++gdb_continue_to_end diff --git a/gdb-rhbz2232086-refactor-selftest-support.patch b/gdb-rhbz2232086-refactor-selftest-support.patch new file mode 100644 index 0000000..c19ef46 --- /dev/null +++ b/gdb-rhbz2232086-refactor-selftest-support.patch @@ -0,0 +1,77 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Andrew Burgess +Date: Fri, 24 Nov 2023 11:10:08 +0000 +Subject: gdb-rhbz2232086-refactor-selftest-support.patch + +;; Back-port upstream commit 1f0fab7ff86 as part of a fix for +;; non-deterministic gdb-index generation (RH BZ 2232086). + +gdb/testsuite: small refactor in selftest-support.exp + +Split out the code that makes a copy of the GDB executable ready for +self testing into a new proc. A later commit in this series wants to +load the GDB executable into GDB (for creating an on-disk debug +index), but doesn't need to make use of the full do_self_tests proc. + +There should be no changes in what is tested after this commit. + +Approved-By: Tom Tromey + +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 +@@ -92,11 +92,13 @@ proc selftest_setup { executable function } { + return 0 + } + +-# A simple way to run some self-tests. +- +-proc do_self_tests {function body} { +- global GDB tool +- ++# Prepare for running a self-test by moving the GDB executable to a ++# location where we can use it as the inferior. Return the filename ++# of the new location. ++# ++# If the current testing setup is not suitable for running a ++# self-test, then return an empty string. ++proc selftest_prepare {} { + # Are we testing with a remote board? In that case, the target + # won't have access to the GDB's auxilliary data files + # (data-directory, etc.). It's simpler to just skip. +@@ -120,19 +122,31 @@ proc do_self_tests {function body} { + # Run the test with self. Copy the file executable file in case + # this OS doesn't like to edit its own text space. + +- set GDB_FULLPATH [find_gdb $GDB] ++ set gdb_fullpath [find_gdb $::GDB] + + if {[is_remote host]} { +- set xgdb x$tool ++ set xgdb x$::tool + } else { +- set xgdb [standard_output_file x$tool] ++ set xgdb [standard_output_file x$::tool] + } + + # Remove any old copy lying around. + remote_file host delete $xgdb + ++ set filename [remote_download host $gdb_fullpath $xgdb] ++ ++ return $filename ++} ++ ++# A simple way to run some self-tests. ++ ++proc do_self_tests {function body} { ++ set file [selftest_prepare] ++ if { $file eq "" } { ++ return ++ } ++ + gdb_start +- set file [remote_download host $GDB_FULLPATH $xgdb] + + # When debugging GDB with GDB, some operations can take a relatively long + # time, especially if the build is non-optimized. Bump the timeout for the diff --git a/gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch b/gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch new file mode 100644 index 0000000..1aa07a6 --- /dev/null +++ b/gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch @@ -0,0 +1,48 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= +Date: Mon, 8 Jan 2024 13:24:05 +0100 +Subject: gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch + +gdb/python: avoid use of _PyOS_ReadlineTState + +In python/py-gdb-readline.c we make use of _PyOS_ReadlineTState, +however, this variable is no longer public in Python 3.13, and so GDB +no longer builds. + +We are making use of _PyOS_ReadlineTState in order to re-acquire the +Python Global Interpreter Lock (GIL). The _PyOS_ReadlineTState +variable is set in Python's outer readline code prior to calling the +user (GDB) supplied readline callback function, which for us is +gdbpy_readline_wrapper. The gdbpy_readline_wrapper function is called +without the GIL held. + +Instead of using _PyOS_ReadlineTState, I propose that we switch to +calling PyGILState_Ensure() and PyGILState_Release(). These functions +will acquire the GIL based on the current thread. I think this should +be sufficient; I can't imagine why we'd be running +gdbpy_readline_wrapper on one thread on behalf of a different Python +thread.... that would be unexpected I think. + +Approved-By: Tom Tromey + +diff --git a/gdb/python/py-gdb-readline.c b/gdb/python/py-gdb-readline.c +--- a/gdb/python/py-gdb-readline.c ++++ b/gdb/python/py-gdb-readline.c +@@ -56,13 +56,11 @@ gdbpy_readline_wrapper (FILE *sys_stdin, FILE *sys_stdout, + if (except.reason == RETURN_QUIT) + return NULL; + +- /* The thread state is nulled during gdbpy_readline_wrapper, +- with the original value saved in the following undocumented +- variable (see Python's Parser/myreadline.c and +- Modules/readline.c). */ +- PyEval_RestoreThread (_PyOS_ReadlineTState); ++ ++ /* This readline callback is called without the GIL held. */ ++ gdbpy_gil gil; ++ + gdbpy_convert_exception (except); +- PyEval_SaveThread (); + return NULL; + } + diff --git a/gdb-rhbz2250652-gdbpy_gil.patch b/gdb-rhbz2250652-gdbpy_gil.patch new file mode 100644 index 0000000..c51d512 --- /dev/null +++ b/gdb-rhbz2250652-gdbpy_gil.patch @@ -0,0 +1,81 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= +Date: Mon, 8 Jan 2024 13:12:15 +0100 +Subject: gdb-rhbz2250652-gdbpy_gil.patch + +gdb: move gdbpy_gil into python-internal.h + +Move gdbpy_gil class into python-internal.h, the next +commit wants to make use of this class from a file other +than python.c. + +Approved-By: Tom Tromey + +diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h +--- a/gdb/python/python-internal.h ++++ b/gdb/python/python-internal.h +@@ -754,6 +754,30 @@ class gdbpy_allow_threads + PyThreadState *m_save; + }; + ++/* 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; ++}; ++ + /* Use this after a TRY_EXCEPT to throw the appropriate Python + exception. */ + #define GDB_PY_HANDLE_EXCEPTION(Exception) \ +diff --git a/gdb/python/python.c b/gdb/python/python.c +--- a/gdb/python/python.c ++++ b/gdb/python/python.c +@@ -257,30 +257,6 @@ gdbpy_enter::finalize () + python_gdbarch = target_gdbarch (); + } + +-/* 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 diff --git a/gdb-rhbz2261580-intrusive_list-assertion-fix.patch b/gdb-rhbz2261580-intrusive_list-assertion-fix.patch new file mode 100644 index 0000000..8ec30bc --- /dev/null +++ b/gdb-rhbz2261580-intrusive_list-assertion-fix.patch @@ -0,0 +1,55 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Kevin Buettner +Date: Mon, 29 Jan 2024 14:51:22 -0700 +Subject: gdb-rhbz2261580-intrusive_list-assertion-fix.patch + +;; Backport upstream workaround for GCC 14 problem which cause assertion +;; failures in GDB. + +[gdb/build] Workaround gcc PR113599 + +Since gcc commit d3f48f68227 ("c++: non-dependent .* operand folding +[PR112427]"), with gdb we run into PR gcc/113599 [1], a wrong-code bug, as +reported in PR build/31281. + +Work around this by flipping inherit order: +... +-class thread_info : public refcounted_object, +- public intrusive_list_node ++class thread_info : public intrusive_list_node, ++ public refcounted_object +... + +An argument could be made that this isn't necessary, because this occurred in +an unreleased gcc version. + +However, I think it could be useful when bisecting gcc for other problems in +building gdb. Having this workaround means the bisect won't reintroduce the +problem. Furthermore, the workaround is harmless. + +Tested on Fedora rawhide x86_64. + +Approved-By: Tom Tromey + +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31281 + +[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113599 + +diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h +--- a/gdb/gdbthread.h ++++ b/gdb/gdbthread.h +@@ -242,10 +242,11 @@ using private_thread_info_up = std::unique_ptr; + strong reference, and is thus not accounted for in the thread's + refcount. + +- The intrusive_list_node base links threads in a per-inferior list. */ ++ The intrusive_list_node base links threads in a per-inferior list. ++ We place it first in the inherit order to work around PR gcc/113599. */ + +-class thread_info : public refcounted_object, +- public intrusive_list_node ++class thread_info : public intrusive_list_node, ++ public refcounted_object + { + public: + explicit thread_info (inferior *inf, ptid_t ptid); diff --git a/gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch b/gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch new file mode 100644 index 0000000..c4b1a01 --- /dev/null +++ b/gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch @@ -0,0 +1,147 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch + +;; Import regression test for `gdb/findvar.c:417: internal-error: +;; read_var_value: Assertion `frame' failed.' (RH BZ 947564) from RHEL 6.5. +;;=fedoratest + +diff --git a/gdb/testsuite/gdb.threads/tls-rhbz947564.cc b/gdb/testsuite/gdb.threads/tls-rhbz947564.cc +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.threads/tls-rhbz947564.cc +@@ -0,0 +1,53 @@ ++#include ++#include ++ ++class x ++ { ++ public: ++ int n; ++ ++ x() : n(0) {} ++ }; ++ ++class y ++ { ++ public: ++ int v; ++ ++ y() : v(0) {} ++ static __thread x *xp; ++ }; ++ ++__thread x *y::xp; ++ ++static void ++foo (y *yp) ++{ ++ yp->v = 1; /* foo_marker */ ++} ++ ++static void * ++bar (void *unused) ++{ ++ x xinst; ++ y::xp= &xinst; ++ ++ y yy; ++ foo(&yy); ++ ++ return NULL; ++} ++ ++int ++main(int argc, char *argv[]) ++{ ++ pthread_t t[2]; ++ ++ pthread_create (&t[0], NULL, bar, NULL); ++ pthread_create (&t[1], NULL, bar, NULL); ++ ++ pthread_join (t[0], NULL); ++ pthread_join (t[1], NULL); ++ ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.threads/tls-rhbz947564.exp b/gdb/testsuite/gdb.threads/tls-rhbz947564.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.threads/tls-rhbz947564.exp +@@ -0,0 +1,75 @@ ++# Copyright (C) 2013 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 . */ ++ ++set testfile tls-rhbz947564 ++set srcfile ${testfile}.cc ++set binfile [standard_output_file ${testfile}] ++ ++if [istarget "*-*-linux"] then { ++ set target_cflags "-D_MIT_POSIX_THREADS" ++} else { ++ set target_cflags "" ++} ++ ++if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list c++ debug]] != "" } { ++ return -1 ++} ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++ ++gdb_load ${binfile} ++ ++if { ![runto_main] } { ++ fail "Can't run to function main" ++ return 0 ++} ++ ++gdb_breakpoint "foo" ++gdb_continue_to_breakpoint "foo" ".* foo_marker .*" ++ ++proc get_xp_val {try} { ++ global expect_out ++ global gdb_prompt ++ global hex ++ ++ set xp_val "" ++ gdb_test_multiple "print *yp" "print yp value" { ++ -re { = \{v = 0, static xp = (0x[0-9a-f]+)\}.* } { ++ pass "print $try value of *yp" ++ set xp_val $expect_out(1,string) ++ } ++ -re "$gdb_prompt $" { ++ fail "print $try value of *yp" ++ } ++ timeout { ++ fail "print $try value of *yp (timeout)" ++ } ++ } ++ return $xp_val ++} ++ ++set first_run [get_xp_val "first"] ++ ++gdb_test "continue" "Breakpoint \[0-9\]+, foo \\\(yp=$hex\\\) at.*" ++ ++set second_run [get_xp_val "second"] ++ ++if { $first_run != $second_run } { ++ pass "different values for TLS variable" ++} else { ++ fail "different values for TLS variable" ++} diff --git a/gdb-rpmlintrc b/gdb-rpmlintrc new file mode 100644 index 0000000..0abda80 --- /dev/null +++ b/gdb-rpmlintrc @@ -0,0 +1,16 @@ +# This line is mandatory to access the configuration functions +from Config import * + +# The testresult logs contain part of the build log and thus +# necessarily mention the buildroot +addFilter ("gdb-testresults.*file-contains-buildroot") + +# Historically libinproctrace was always in gdbserver. It's +# LD_PRELOADed into processes, so there are no direct ELF +# dependencies to it. It's required on the remote side (where +# gdbserver is) so it makes sense to put it in the same package. +# This never was a problem for rpmlint before because libinproctrace +# had no SONAME, so the check wasn't active. Now it has, so it's checked +# and because the gdbserver binary has no direct ELF visible dependency +# it's thought to be necessary to follow shlib policy. That's not the case. +addFilter ("gdbserver.*shlib-policy-name-error.*libinproctrace") diff --git a/gdb-s390-add-arch14-record-replay-support.patch b/gdb-s390-add-arch14-record-replay-support.patch new file mode 100644 index 0000000..185e315 --- /dev/null +++ b/gdb-s390-add-arch14-record-replay-support.patch @@ -0,0 +1,50 @@ +From 6cfb7bf81be3ab6f131dbc6a27eefca516cf7517 Mon Sep 17 00:00:00 2001 +From: Andreas Arnez +Date: Tue, 13 Feb 2024 18:55:29 +0100 +Subject: [PATCH 2/2] gdb: s390: Add arch14 record/replay support + +Enable recording of the new "arch14" instructions on z/Architecture +targets, except for the specialized-function-assist instruction NNPA. +--- + gdb/s390-tdep.c | 13 +++++++++++++ + 1 file changed, 13 insertions(+) + +diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c +index 54b5c89e5e3..dcac407caef 100644 +--- a/gdb/s390-tdep.c ++++ b/gdb/s390-tdep.c +@@ -5534,6 +5534,14 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + case 0xe635: /* VLRL - vector load rightmost with immed. length */ + case 0xe637: /* VLRLR - vector load rightmost with length */ + case 0xe649: /* VLIP - vector load immediate decimal */ ++ case 0xe656: /* VCLFNH - vector fp convert and lengthen from NNP high */ ++ case 0xe65e: /* VCLFNL - vector fp convert and lengthen from NNP low */ ++ case 0xe655: /* VCNF - vector fp convert to NNP */ ++ case 0xe65d: /* VCFN - vector fp convert from NNP */ ++ case 0xe674: /* VSCHP - decimal scale and convert to HFP */ ++ case 0xe675: /* VCRNF - vector fp convert and round to NNP */ ++ case 0xe67c: /* VSCSHP - decimal scale and convert and split to HFP */ ++ case 0xe67d: /* VCSPH - vector convert HFP to scaled decimal */ + case 0xe700: /* VLEB - vector load element */ + case 0xe701: /* VLEH - vector load element */ + case 0xe702: /* VLEG - vector load element */ +@@ -5791,11 +5799,16 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + + /* 0xe747-0xe749 undefined */ + ++ case 0xe651: /* VCLZDP - vector count leading zero digits */ ++ case 0xe654: /* VUPKZH - vector unpack zoned high */ + case 0xe658: /* VCVD - vector convert to decimal 32 bit */ + case 0xe659: /* VSRP - vector shift and round decimal */ + case 0xe65a: /* VCVDG - vector convert to decimal 64 bit*/ + case 0xe65b: /* VPSOP - vector perform sign operation decimal */ ++ case 0xe65c: /* VUPKZL - vector unpack zoned low */ ++ case 0xe670: /* VPKZR - vector pack zoned register */ + case 0xe671: /* VAP - vector add decimal */ ++ case 0xe672: /* VSRPR - vector shift and round decimal register */ + case 0xe673: /* VSP - vector subtract decimal */ + case 0xe678: /* VMP - vector multiply decimal */ + case 0xe679: /* VMSP - vector multiply decimal */ +-- +2.35.3 + diff --git a/gdb-simultaneous-step-resume-breakpoint-test.patch b/gdb-simultaneous-step-resume-breakpoint-test.patch new file mode 100644 index 0000000..ad4a1f2 --- /dev/null +++ b/gdb-simultaneous-step-resume-breakpoint-test.patch @@ -0,0 +1,162 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-simultaneous-step-resume-breakpoint-test.patch + +;; New test for step-resume breakpoint placed in multiple threads at once. +;;=fedoratest + +diff --git a/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.c b/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.c +@@ -0,0 +1,79 @@ ++/* Copyright 2009 Free Software Foundation, Inc. ++ ++ Written by Fred Fish of Cygnus Support ++ Contributed by Cygnus Support ++ ++ 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 . */ ++ ++/* Test multiple threads stepping into a .debug_line-less function with ++ a breakpoint placed on its return-to-caller point. */ ++ ++#include ++#include ++#include ++#include ++#include ++ ++#define THREADS 3 ++ ++static void * ++func (void *unused) ++{ ++ int i; ++ ++ errno = 0; ++ i = 0xdeadf00d; ++ i = sleep (THREADS); /* sleep-call */ ++ if (errno != 0) /* sleep-after */ ++ perror ("sleep"); ++ ++ /* The GDB bug with forgotten step-resume breakpoint could leave stale ++ breakpoint on the I assignment making it a nop. */ ++ if (i == 0xdeadf00d) ++ assert (0); ++ ++ assert (i == 0); ++ ++ pthread_exit (NULL); ++} ++ ++int ++main (void) ++{ ++ pthread_t threads[THREADS]; ++ int threadi; ++ ++ for (threadi = 0; threadi < THREADS; threadi++) ++ { ++ int i; ++ ++ i = pthread_create (&threads[threadi], NULL, func, NULL); ++ assert (i == 0); ++ ++ i = sleep (1); ++ assert (i == 0); ++ } ++ ++ for (threadi = 0; threadi < THREADS; threadi++) ++ { ++ int i; ++ ++ i = pthread_join (threads[threadi], NULL); ++ assert (i == 0); ++ } ++ ++ return 0; /* final-exit */ ++} +diff --git a/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.exp b/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.exp +@@ -0,0 +1,65 @@ ++# Copyright (C) 2009 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 multiple threads stepping into a .debug_line-less function with ++# a breakpoint placed on its return-to-caller point. ++ ++set testfile simultaneous-step-resume-breakpoint ++set srcfile ${testfile}.c ++set binfile [standard_output_file ${testfile}] ++ ++if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { ++ return -1 ++} ++ ++gdb_exit ++gdb_start ++gdb_reinitialize_dir $srcdir/$subdir ++ ++# Ensure we have no debuginfo for the `sleep' call itself (=for libc). ++gdb_test "set debug-file-directory /DoesNotExist" ++ ++gdb_load ${binfile} ++if ![runto_main] { ++ return -1 ++} ++ ++# Red Hat vendor patch does set it to "step" by default. ++gdb_test "set scheduler-locking off" ++ ++gdb_breakpoint [gdb_get_line_number "final-exit"] ++ ++gdb_breakpoint [gdb_get_line_number "sleep-call"] ++gdb_continue_to_breakpoint "sleep-call" ++ ++gdb_test "step" "sleep-call.*" "step thread 1" ++gdb_test "step" "sleep-call.*" "step thread 2" ++gdb_test "step" "sleep-after.*" "step thread 3" ++ ++set test "first continue" ++gdb_test_multiple "continue" $test { ++ -re "final-exit.*$gdb_prompt $" { ++ # gdb-7.0. ++ pass $test ++ return ++ } ++ -re "sleep-after.*$gdb_prompt $" { ++ # Fedora/RHEL branch. ++ pass $test ++ } ++} ++ ++gdb_test "continue" "sleep-after.*" "second continue" ++gdb_test "continue" "final-exit.*" "third continue" diff --git a/gdb-symtab-add-producer_is_gas.patch b/gdb-symtab-add-producer_is_gas.patch new file mode 100644 index 0000000..3ede8a8 --- /dev/null +++ b/gdb-symtab-add-producer_is_gas.patch @@ -0,0 +1,125 @@ +From aa8ba17b9a3fdfeeb65df4c3e0731a0e9e96cbf7 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Wed, 1 Nov 2023 00:33:12 +0100 +Subject: [PATCH 1/2] [gdb/symtab] Add producer_is_gas + +Add producer_is_gas, a generic way to get the gas version from the +producer string. + +Tested on x86_64-linux. +--- + gdb/dwarf2/read.c | 4 ++-- + gdb/producer.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++ + gdb/producer.h | 5 +++++ + 3 files changed, 63 insertions(+), 2 deletions(-) + +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index 970dd54c7a5..472684a5817 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -13376,8 +13376,8 @@ check_producer (struct dwarf2_cu *cu) + cu->producer_is_codewarrior = true; + else if (producer_is_clang (cu->producer, &major, &minor)) + cu->producer_is_clang = true; +- else if (startswith (cu->producer, "GNU AS 2.39.0")) +- cu->producer_is_gas_2_39 = true; ++ else if (producer_is_gas (cu->producer, &major, &minor)) ++ cu->producer_is_gas_2_39 = major == 2 && minor == 39; + else + { + /* For other non-GCC compilers, expect their behavior is DWARF version +diff --git a/gdb/producer.c b/gdb/producer.c +index 9fcf749e3d4..cd83dfce128 100644 +--- a/gdb/producer.c ++++ b/gdb/producer.c +@@ -81,6 +81,45 @@ producer_is_gcc (const char *producer, int *major, int *minor) + + /* See producer.h. */ + ++bool ++producer_is_gas (const char *producer, int *major, int *minor) ++{ ++ if (producer == nullptr) ++ { ++ /* No producer, don't know. */ ++ return false; ++ } ++ ++ /* Detect prefix. */ ++ const char prefix[] = "GNU AS "; ++ if (!startswith (producer, prefix)) ++ { ++ /* Producer is not gas. */ ++ return false; ++ } ++ ++ /* Skip prefix. */ ++ const char *cs = &producer[strlen (prefix)]; ++ ++ /* Ensure that major/minor are not nullptrs. */ ++ int maj, min; ++ if (major == nullptr) ++ major = &maj; ++ if (minor == nullptr) ++ minor = &min; ++ ++ int scanned = sscanf (cs, "%d.%d", major, minor); ++ if (scanned != 2) ++ { ++ /* Unable to scan major/minor version. */ ++ return false; ++ } ++ ++ return true; ++} ++ ++ /* See producer.h. */ ++ + bool + producer_is_icc_ge_19 (const char *producer) + { +@@ -251,6 +290,23 @@ Version 18.0 Beta"; + SELF_CHECK (!producer_is_gcc (flang_llvm_exp, &major, &minor)); + SELF_CHECK (producer_is_llvm (flang_llvm_exp)); + } ++ ++ { ++ static const char gas_exp[] = "GNU AS 2.39.0"; ++ int major = 0, minor = 0; ++ SELF_CHECK (!producer_is_gcc (gas_exp, &major, &minor)); ++ SELF_CHECK (producer_is_gas (gas_exp, &major, &minor)); ++ SELF_CHECK (major == 2 && minor == 39); ++ ++ static const char gas_incomplete_exp[] = "GNU AS "; ++ SELF_CHECK (!producer_is_gas (gas_incomplete_exp, &major, &minor)); ++ SELF_CHECK (!producer_is_gcc (gas_incomplete_exp, &major, &minor)); ++ ++ static const char gas_incomplete_exp_2[] = "GNU AS 2"; ++ SELF_CHECK (!producer_is_gas (gas_incomplete_exp_2, &major, &minor)); ++ SELF_CHECK (!producer_is_gcc (gas_incomplete_exp_2, &major, &minor)); ++ } ++ + } + } + } +diff --git a/gdb/producer.h b/gdb/producer.h +index c915979b122..00718511775 100644 +--- a/gdb/producer.h ++++ b/gdb/producer.h +@@ -30,6 +30,11 @@ extern int producer_is_gcc_ge_4 (const char *producer); + is NULL or it isn't GCC. */ + extern int producer_is_gcc (const char *producer, int *major, int *minor); + ++/* Returns nonzero if the given PRODUCER string is GAS and sets the MAJOR ++ and MINOR versions when not NULL. Returns zero if the given PRODUCER ++ is NULL or it isn't GAS. */ ++bool producer_is_gas (const char *producer, int *major, int *minor); ++ + /* Check for Intel compilers >= 19.0. */ + extern bool producer_is_icc_ge_19 (const char *producer); + + +base-commit: 39553c1e285c426946188ec2a890c1c1cb933060 +-- +2.35.3 + diff --git a/gdb-symtab-don-t-defer-backward-refs-inter-cu-intra-.patch b/gdb-symtab-don-t-defer-backward-refs-inter-cu-intra-.patch new file mode 100644 index 0000000..5bf0f52 --- /dev/null +++ b/gdb-symtab-don-t-defer-backward-refs-inter-cu-intra-.patch @@ -0,0 +1,74 @@ +From 0218e033b415df76be0a14871447bbd94dce62a3 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sat, 16 Sep 2023 04:07:22 +0200 +Subject: [PATCH 10/13] [gdb/symtab] Don't defer backward refs, inter-cu + intra-shard case + +In patch "[gdb/symtab] Resolve deferred entries, inter-shard case" we've +solved the generic case of handling deferred entries. + +Add an optimization that doesn't defer inter-CU intra-shard dependencies that +are present in the shard's parent map. + +Tested on x86_64-linux. +--- + gdb/dwarf2/read.c | 29 ++++++++++++++++++++++++++++- + 1 file changed, 28 insertions(+), 1 deletion(-) + +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index a97f738a54e..e7904532434 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -4709,6 +4709,12 @@ class cooked_index_storage + m_index->set_parent_valid (start, end); + } + ++ /* Return true if find_parents can be relied upon. */ ++ bool parent_valid (CORE_ADDR addr) ++ { ++ return m_index->parent_valid (addr); ++ } ++ + private: + + /* Hash function for a cutu_reader. */ +@@ -4857,6 +4863,12 @@ class cooked_indexer + { + m_index_storage->set_parent_valid (start, end); + } ++ ++ /* Return true if find_parents can be relied upon. */ ++ bool parent_valid (CORE_ADDR addr) ++ { ++ return m_index_storage->parent_valid (addr); ++ } + }; + + /* Subroutine of dwarf2_build_psymtabs_hard to simplify it. +@@ -16482,7 +16494,22 @@ cooked_indexer::scan_attributes (dwarf2_per_cu_data *scanning_per_cu, + else + { + /* Inter-CU case. */ +- *maybe_defer = addr; ++ if (parent_valid (addr)) ++ { ++ auto tmp = find_parent (addr); ++ if (tmp == &parent_map::deferred) ++ { ++ /* Defer because origin is deferred. */ ++ *maybe_defer = addr; ++ } ++ else ++ *parent_entry = tmp; ++ } ++ else ++ { ++ /* Defer because origin is in other shard. */ ++ *maybe_defer = addr; ++ } + } + } + +-- +2.35.3 + diff --git a/gdb-symtab-factor-out-m_deferred_entries-usage.patch b/gdb-symtab-factor-out-m_deferred_entries-usage.patch new file mode 100644 index 0000000..a3dfe4f --- /dev/null +++ b/gdb-symtab-factor-out-m_deferred_entries-usage.patch @@ -0,0 +1,76 @@ +From 8a444a93d4bd78355fc4e6ecb1935cc2b0a6a997 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 15 Sep 2023 08:38:00 +0200 +Subject: [PATCH 04/13] [gdb/symtab] Factor out m_deferred_entries usage + +Factor out usage of cooked_indexer::m_deferred_entries in new member +functions defer_entry, handle_deferred_entries and resolve_deferred_entry. + +Tested on x86_64-linux. +--- + gdb/dwarf2/read.c | 35 ++++++++++++++++++++++++++++------- + 1 file changed, 28 insertions(+), 7 deletions(-) + +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index d48f3010063..afdf9e870a8 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -4822,6 +4822,32 @@ class cooked_indexer + we'll know the containing context of all the DIEs that we might + have scanned. This vector stores these deferred entries. */ + std::vector m_deferred_entries; ++ ++ /* Defer creating a cooked_index_entry corresponding to deferred_entry DE. */ ++ void defer_entry (const deferred_entry &de) ++ { ++ m_deferred_entries.push_back (de); ++ } ++ ++ /* Create a cooked_index_entry corresponding to deferred_entry DE with ++ parent PARENT_ENTRY. */ ++ const cooked_index_entry *resolve_deferred_entry ++ (const deferred_entry &de, const cooked_index_entry *parent_entry) ++ { ++ return m_index_storage->add (de.die_offset, de.tag, de.flags, de.name, ++ parent_entry, m_per_cu); ++ } ++ ++ /* Create cooked_index_entries for the deferred entries. */ ++ void handle_deferred_entries () ++ { ++ for (const auto &entry : m_deferred_entries) ++ { ++ const cooked_index_entry *parent_entry ++ = find_parent (entry.spec_offset); ++ resolve_deferred_entry (entry, parent_entry); ++ } ++ } + }; + + /* Subroutine of dwarf2_build_psymtabs_hard to simplify it. +@@ -16611,7 +16637,7 @@ cooked_indexer::index_dies (cutu_reader *reader, + if (name != nullptr) + { + if (defer != 0) +- m_deferred_entries.push_back ({ ++ defer_entry ({ + this_die, name, defer, abbrev->tag, flags + }); + else +@@ -16716,12 +16742,7 @@ cooked_indexer::make_index (cutu_reader *reader) + return; + index_dies (reader, reader->info_ptr, nullptr, false); + +- for (const auto &entry : m_deferred_entries) +- { +- const cooked_index_entry *parent = find_parent (entry.spec_offset); +- m_index_storage->add (entry.die_offset, entry.tag, entry.flags, +- entry.name, parent, m_per_cu); +- } ++ handle_deferred_entries (); + } + + /* An implementation of quick_symbol_functions for the cooked DWARF +-- +2.35.3 + diff --git a/gdb-symtab-factor-out-m_die_range_map-usage.patch b/gdb-symtab-factor-out-m_die_range_map-usage.patch new file mode 100644 index 0000000..c827f0e --- /dev/null +++ b/gdb-symtab-factor-out-m_die_range_map-usage.patch @@ -0,0 +1,151 @@ +From b2f260d117dc11b8e90d4e9bf7f4b2cbd63d1d49 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 22 Aug 2023 13:17:47 +0200 +Subject: [PATCH 02/13] [gdb/symtab] Factor out m_die_range_map usage + +Factor out usage of cooked_indexer::m_die_range_map into new class parent_map +with member functions find_parent and set_parent, and static member function +form_addr. + +Tested on x86_64-linux. +--- + gdb/dwarf2/cooked-index.h | 32 +++++++++++++++++++++++++++ + gdb/dwarf2/read.c | 46 ++++++++++++++++++++------------------- + 2 files changed, 56 insertions(+), 22 deletions(-) + +diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h +index 5aacb321c91..979541fbf60 100644 +--- a/gdb/dwarf2/cooked-index.h ++++ b/gdb/dwarf2/cooked-index.h +@@ -239,6 +239,38 @@ struct cooked_index_entry : public allocate_on_obstack + bool for_name) const; + }; + ++class parent_map ++{ ++public: ++ /* A helper function to turn a section offset into an address that ++ can be used in a parent_map. */ ++ static CORE_ADDR form_addr (sect_offset offset, bool is_dwz) ++ { ++ CORE_ADDR value = to_underlying (offset); ++ if (is_dwz) ++ value |= ((CORE_ADDR) 1) << (8 * sizeof (CORE_ADDR) - 1); ++ return value; ++ } ++ ++ /* Find the parent of DIE LOOKUP. */ ++ const cooked_index_entry *find_parent (CORE_ADDR lookup) const ++ { ++ const void *obj = m_parent_map.find (lookup); ++ return static_cast (obj); ++ } ++ ++ /* Set the parent of DIES in range [START, END] to PARENT_ENTRY. */ ++ void set_parent (CORE_ADDR start, CORE_ADDR end, ++ const cooked_index_entry *parent_entry) ++ { ++ m_parent_map.set_empty (start, end, (void *)parent_entry); ++ } ++ ++private: ++ /* An addrmap that maps from section offsets to cooked_index_entry *. */ ++ addrmap_mutable m_parent_map; ++}; ++ + class cooked_index; + + /* An index of interesting DIEs. This is "cooked", in contrast to a +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index 466d3e59878..d48f3010063 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -4722,16 +4722,6 @@ class cooked_indexer + + private: + +- /* A helper function to turn a section offset into an address that +- can be used in an addrmap. */ +- CORE_ADDR form_addr (sect_offset offset, bool is_dwz) +- { +- CORE_ADDR value = to_underlying (offset); +- if (is_dwz) +- value |= ((CORE_ADDR) 1) << (8 * sizeof (CORE_ADDR) - 1); +- return value; +- } +- + /* A helper function to scan the PC bounds of READER and record them + in the storage's addrmap. */ + void check_bounds (cutu_reader *reader); +@@ -4799,7 +4789,20 @@ class cooked_indexer + /* An addrmap that maps from section offsets (see the form_addr + method) to newly-created entries. See m_deferred_entries to + understand this. */ +- addrmap_mutable m_die_range_map; ++ parent_map m_die_range_map; ++ ++ /* Find the parent of DIE LOOKUP. */ ++ const cooked_index_entry *find_parent (CORE_ADDR lookup) const ++ { ++ return m_die_range_map.find_parent (lookup); ++ } ++ ++ /* Set the parent of DIES in range [START, END] to PARENT_ENTRY. */ ++ void set_parent (CORE_ADDR start, CORE_ADDR end, ++ const cooked_index_entry *parent_entry) ++ { ++ m_die_range_map.set_parent (start, end, parent_entry); ++ } + + /* A single deferred entry. */ + struct deferred_entry +@@ -16412,15 +16415,13 @@ cooked_indexer::scan_attributes (dwarf2_per_cu_data *scanning_per_cu, + + if (*parent_entry == nullptr) + { +- CORE_ADDR addr = form_addr (origin_offset, origin_is_dwz); ++ CORE_ADDR addr ++ = parent_map::form_addr (origin_offset, origin_is_dwz); + if (new_reader->cu == reader->cu + && new_info_ptr > watermark_ptr) + *maybe_defer = addr; + else +- { +- void *obj = m_die_range_map.find (addr); +- *parent_entry = static_cast (obj); +- } ++ *parent_entry = find_parent (addr); + } + + unsigned int bytes_read; +@@ -16538,11 +16539,13 @@ cooked_indexer::recurse (cutu_reader *reader, + { + /* Both start and end are inclusive, so use both "+ 1" and "- 1" to + limit the range to the children of parent_entry. */ +- CORE_ADDR start = form_addr (parent_entry->die_offset + 1, +- reader->cu->per_cu->is_dwz); +- CORE_ADDR end = form_addr (sect_offset (info_ptr - 1 - reader->buffer), ++ CORE_ADDR start ++ = parent_map::form_addr (parent_entry->die_offset + 1, ++ reader->cu->per_cu->is_dwz); ++ CORE_ADDR end ++ = parent_map::form_addr (sect_offset (info_ptr - 1 - reader->buffer), + reader->cu->per_cu->is_dwz); +- m_die_range_map.set_empty (start, end, (void *) parent_entry); ++ set_parent (start, end, parent_entry); + } + + return info_ptr; +@@ -16715,8 +16718,7 @@ cooked_indexer::make_index (cutu_reader *reader) + + for (const auto &entry : m_deferred_entries) + { +- void *obj = m_die_range_map.find (entry.spec_offset); +- cooked_index_entry *parent = static_cast (obj); ++ const cooked_index_entry *parent = find_parent (entry.spec_offset); + m_index_storage->add (entry.die_offset, entry.tag, entry.flags, + entry.name, parent, m_per_cu); + } +-- +2.35.3 + diff --git a/gdb-symtab-fix-dw_tag_inlined_subroutine-entries-in-.patch b/gdb-symtab-fix-dw_tag_inlined_subroutine-entries-in-.patch new file mode 100644 index 0000000..0f20941 --- /dev/null +++ b/gdb-symtab-fix-dw_tag_inlined_subroutine-entries-in-.patch @@ -0,0 +1,112 @@ +From c79ecacd3f75cfb0ec1a3afc49ca3f30b1759009 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 11 Aug 2023 01:36:50 +0200 +Subject: [PATCH 13/13] [gdb/symtab] Fix DW_TAG_inlined_subroutine entries in + the cooked index + +We get incorrect qualified names in the cooked index for +DW_TAG_inlined_subroutine DIEs with abstract origin, due to the fact that the +DIE parent is used instead of the abstract origin. + +Fix this by preferring the abstract origin parent, if available. + +Tested on x86_64-linux. + +PR symtab/30728 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30728 +--- + gdb/dwarf2/read.c | 67 ++++++++++++++++++++++------------------------- + 1 file changed, 32 insertions(+), 35 deletions(-) + +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index 93708ef11b9..a4f982962ae 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -16464,52 +16464,49 @@ cooked_indexer::scan_attributes (dwarf2_per_cu_data *scanning_per_cu, + const gdb_byte *new_info_ptr = (new_reader->buffer + + to_underlying (origin_offset)); + +- if (*parent_entry == nullptr) ++ gdb_assert (reader->cu->per_cu->is_debug_types ++ == new_reader->cu->per_cu->is_debug_types); ++ CORE_ADDR addr ++ = parent_map::form_addr (origin_offset, origin_is_dwz, ++ reader->cu->per_cu->is_debug_types); ++ if (new_reader->cu == reader->cu) + { +- gdb_assert (reader->cu->per_cu->is_debug_types +- == new_reader->cu->per_cu->is_debug_types); +- CORE_ADDR addr +- = parent_map::form_addr (origin_offset, origin_is_dwz, +- reader->cu->per_cu->is_debug_types); +- if (new_reader->cu == reader->cu) ++ /* Intra-CU case. */ ++ if (new_info_ptr > watermark_ptr) + { +- /* Intra-CU case. */ +- if (new_info_ptr > watermark_ptr) +- { +- /* Defer because origin is not read yet. */ +- *maybe_defer = addr; +- } +- else +- { +- auto tmp = find_parent (addr); +- if (tmp == &parent_map::deferred) +- { +- /* Defer because origin is deferred. */ +- *maybe_defer = addr; +- } +- else +- *parent_entry = tmp; +- } ++ /* Defer because origin is not read yet. */ ++ *maybe_defer = addr; + } + else + { +- /* Inter-CU case. */ +- if (parent_valid (addr)) ++ auto tmp = find_parent (addr); ++ if (tmp == &parent_map::deferred) + { +- auto tmp = find_parent (addr); +- if (tmp == &parent_map::deferred) +- { +- /* Defer because origin is deferred. */ +- *maybe_defer = addr; +- } +- else +- *parent_entry = tmp; ++ /* Defer because origin is deferred. */ ++ *maybe_defer = addr; + } + else ++ *parent_entry = tmp; ++ } ++ } ++ else ++ { ++ /* Inter-CU case. */ ++ if (parent_valid (addr)) ++ { ++ auto tmp = find_parent (addr); ++ if (tmp == &parent_map::deferred) + { +- /* Defer because origin is in other shard. */ ++ /* Defer because origin is deferred. */ + *maybe_defer = addr; + } ++ else ++ *parent_entry = tmp; ++ } ++ else ++ { ++ /* Defer because origin is in other shard. */ ++ *maybe_defer = addr; + } + } + +-- +2.35.3 + diff --git a/gdb-symtab-handle-nullptr-parent-in-parent_map-set_p.patch b/gdb-symtab-handle-nullptr-parent-in-parent_map-set_p.patch new file mode 100644 index 0000000..21f26df --- /dev/null +++ b/gdb-symtab-handle-nullptr-parent-in-parent_map-set_p.patch @@ -0,0 +1,37 @@ +From bc970668f83cf142c4955d1cbeaa24e8bcc4b238 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 25 Aug 2023 09:30:54 +0200 +Subject: [PATCH 03/13] [gdb/symtab] Handle nullptr parent in + parent_map::set_parent + +Set_parent uses m_die_range_map.set_empty, which doesn't allow +parent_entry == nullptr. + +So it may be necessary to guard calls to set_parent with +"if (parent_entry != nullptr)". + +Fix this by handling the parent_entry == nullptr case in set_parent. + +Tested on x86_64-linux. +--- + gdb/dwarf2/cooked-index.h | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h +index 979541fbf60..79fbfe88c03 100644 +--- a/gdb/dwarf2/cooked-index.h ++++ b/gdb/dwarf2/cooked-index.h +@@ -263,7 +263,9 @@ class parent_map + void set_parent (CORE_ADDR start, CORE_ADDR end, + const cooked_index_entry *parent_entry) + { +- m_parent_map.set_empty (start, end, (void *)parent_entry); ++ /* Calling set_empty with nullptr is currently not allowed. */ ++ if (parent_entry != nullptr) ++ m_parent_map.set_empty (start, end, (void *)parent_entry); + } + + private: +-- +2.35.3 + diff --git a/gdb-symtab-keep-track-of-all-parents-for-cooked-inde.patch b/gdb-symtab-keep-track-of-all-parents-for-cooked-inde.patch new file mode 100644 index 0000000..03acf13 --- /dev/null +++ b/gdb-symtab-keep-track-of-all-parents-for-cooked-inde.patch @@ -0,0 +1,38 @@ +From 0e706742f37ee90629350780263b573f326f1a5f Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 7 Dec 2023 10:38:05 +0100 +Subject: [PATCH 12/13] [gdb/symtab] Keep track of all parents for cooked index + +Keep track of all parents for cooked index. + +Tested on x86_64-linux. +--- + gdb/dwarf2/read.c | 12 +++++++++--- + 1 file changed, 9 insertions(+), 3 deletions(-) + +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index de7b655d26c..93708ef11b9 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -16718,9 +16718,15 @@ cooked_indexer::index_dies (cutu_reader *reader, + }); + } + else +- this_entry = m_index_storage->add (this_die, abbrev->tag, flags, +- name, this_parent_entry, +- m_per_cu); ++ { ++ CORE_ADDR addr ++ = parent_map::form_addr (this_die, reader->cu->per_cu->is_dwz, ++ reader->cu->per_cu->is_debug_types); ++ set_parent (addr, addr, this_parent_entry); ++ this_entry = m_index_storage->add (this_die, abbrev->tag, flags, ++ name, this_parent_entry, ++ m_per_cu); ++ } + } + + if (linkage_name != nullptr) +-- +2.35.3 + diff --git a/gdb-symtab-keep-track-of-processed-dies-in-shard.patch b/gdb-symtab-keep-track-of-processed-dies-in-shard.patch new file mode 100644 index 0000000..371363a --- /dev/null +++ b/gdb-symtab-keep-track-of-processed-dies-in-shard.patch @@ -0,0 +1,126 @@ +From e8285c8b37d28033209cad6579db4b9f6a48a01a Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sun, 24 Sep 2023 11:41:39 +0200 +Subject: [PATCH 08/13] [gdb/symtab] Keep track of processed DIEs in shard + +For optimizations in two following patches, we keep track in each shard which +DIEs have been processed. + +Tested on x86_64-linux. +--- + gdb/dwarf2/cooked-index.c | 1 + + gdb/dwarf2/cooked-index.h | 15 +++++++++++++++ + gdb/dwarf2/read.c | 24 ++++++++++++++++++++++++ + 3 files changed, 40 insertions(+) + +diff --git a/gdb/dwarf2/cooked-index.c b/gdb/dwarf2/cooked-index.c +index 3231d25db5a..c096da57d62 100644 +--- a/gdb/dwarf2/cooked-index.c ++++ b/gdb/dwarf2/cooked-index.c +@@ -723,6 +723,7 @@ cooked_index::handle_deferred_entries () + { + shard->m_die_range_map.reset (nullptr); + shard->m_deferred_entries.reset (nullptr); ++ shard->m_die_range_map_valid.reset (nullptr); + } + } + +diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h +index 66424c37f7c..fa895233035 100644 +--- a/gdb/dwarf2/cooked-index.h ++++ b/gdb/dwarf2/cooked-index.h +@@ -316,6 +316,7 @@ class cooked_index_shard + { + m_die_range_map.reset (new parent_map); + m_deferred_entries.reset (new std::vector); ++ m_die_range_map_valid.reset (new addrmap_mutable); + } + + DISABLE_COPY_AND_ASSIGN (cooked_index_shard); +@@ -407,6 +408,18 @@ class cooked_index_shard + const cooked_index_entry *resolve_deferred_entry + (const deferred_entry &entry, const cooked_index_entry *parent_entry); + ++ /* Mark parents in range [START, END] as valid . */ ++ void set_parent_valid (CORE_ADDR start, CORE_ADDR end) ++ { ++ m_die_range_map_valid->set_empty (start, end, (void *) 1); ++ } ++ ++ /* Return true if find_parents can be relied upon. */ ++ bool parent_valid (CORE_ADDR addr) ++ { ++ return m_die_range_map_valid->find (addr) != nullptr; ++ } ++ + private: + + /* Return the entry that is believed to represent the program's +@@ -470,6 +483,8 @@ class cooked_index_shard + understand this. */ + std::unique_ptr m_die_range_map; + ++ std::unique_ptr m_die_range_map_valid; ++ + /* The generated DWARF can sometimes have the declaration for a + method in a class (or perhaps namespace) scope, with the + definition appearing outside this scope... just one of the many +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index 5b7c0969ed7..09598e702bc 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -4697,6 +4697,12 @@ class cooked_index_storage + m_index->defer_entry (de); + } + ++ /* Mark parents in range [START, END] as valid . */ ++ void set_parent_valid (CORE_ADDR start, CORE_ADDR end) ++ { ++ m_index->set_parent_valid (start, end); ++ } ++ + private: + + /* Hash function for a cutu_reader. */ +@@ -4840,6 +4846,11 @@ class cooked_indexer + { + m_index_storage->defer_entry (de); + } ++ ++ void set_parent_valid (CORE_ADDR start, CORE_ADDR end) ++ { ++ m_index_storage->set_parent_valid (start, end); ++ } + }; + + /* Subroutine of dwarf2_build_psymtabs_hard to simplify it. +@@ -16604,6 +16615,11 @@ cooked_indexer::index_dies (cutu_reader *reader, + + to_underlying (reader->cu->header.sect_off) + + reader->cu->header.get_length_with_initial ()); + ++ const CORE_ADDR start_cu ++ = parent_map::form_addr (sect_offset (info_ptr - reader->buffer), ++ reader->cu->per_cu->is_dwz, ++ reader->cu->per_cu->is_debug_types); ++ + while (info_ptr < end_ptr) + { + sect_offset this_die = (sect_offset) (info_ptr - reader->buffer); +@@ -16754,6 +16770,14 @@ cooked_indexer::index_dies (cutu_reader *reader, + } + } + ++ { ++ CORE_ADDR end_prev_die ++ = parent_map::form_addr (sect_offset (info_ptr - reader->buffer - 1), ++ reader->cu->per_cu->is_dwz, ++ reader->cu->per_cu->is_debug_types); ++ set_parent_valid (start_cu, end_prev_die); ++ } ++ + return info_ptr; + } + +-- +2.35.3 + diff --git a/gdb-symtab-recurse-into-c-dw_tag_subprogram-dies-for.patch b/gdb-symtab-recurse-into-c-dw_tag_subprogram-dies-for.patch new file mode 100644 index 0000000..f525a56 --- /dev/null +++ b/gdb-symtab-recurse-into-c-dw_tag_subprogram-dies-for.patch @@ -0,0 +1,31 @@ +From 0f53dc7e5cc07e30d11f3f5a0645239535824890 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 7 Dec 2023 10:36:07 +0100 +Subject: [PATCH 11/13] [gdb/symtab] Recurse into c++ DW_TAG_subprogram DIEs + for cooked index + +Recurse into c++ DW_TAG_subprogram DIEs for cooked index, to add +DW_TAG_inlined_subroutine entries. + +Tested on x86_64-linux. +--- + gdb/dwarf2/read.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index e7904532434..de7b655d26c 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -16781,7 +16781,8 @@ cooked_indexer::index_dies (cutu_reader *reader, + + case DW_TAG_subprogram: + if ((m_language == language_fortran +- || m_language == language_ada) ++ || m_language == language_ada ++ || m_language == language_cplus) + && this_entry != nullptr) + { + info_ptr = recurse (reader, info_ptr, this_entry, true); +-- +2.35.3 + diff --git a/gdb-symtab-refactor-condition-in-scan_attributes.patch b/gdb-symtab-refactor-condition-in-scan_attributes.patch new file mode 100644 index 0000000..169e8f4 --- /dev/null +++ b/gdb-symtab-refactor-condition-in-scan_attributes.patch @@ -0,0 +1,70 @@ +From f72f115b4c012e3748a2e702d7b970be19974885 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Mon, 11 Dec 2023 15:41:26 +0100 +Subject: [PATCH 01/13] [gdb/symtab] Refactor condition in scan_attributes + +In scan_attributes there's code: +... + if (new_reader->cu == reader->cu + && new_info_ptr > watermark_ptr + && *parent_entry == nullptr) + ... + else if (*parent_entry == nullptr) + ... +... +that uses the "*parent_entry == nullptr" condition twice. + +Make this somewhat more readable by factoring out the condition: +... + if (*parent_entry == nullptr) + { + if (new_reader->cu == reader->cu + && new_info_ptr > watermark_ptr) + ... + else + ... + } +... + +This also allows us to factor out "form_addr (origin_offset, origin_is_dwz)". + +Tested on x86_64-linux. +--- + gdb/dwarf2/read.c | 18 ++++++++++-------- + 1 file changed, 10 insertions(+), 8 deletions(-) + +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index 50fa302b43a..466d3e59878 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -16410,15 +16410,17 @@ cooked_indexer::scan_attributes (dwarf2_per_cu_data *scanning_per_cu, + const gdb_byte *new_info_ptr = (new_reader->buffer + + to_underlying (origin_offset)); + +- if (new_reader->cu == reader->cu +- && new_info_ptr > watermark_ptr +- && *parent_entry == nullptr) +- *maybe_defer = form_addr (origin_offset, origin_is_dwz); +- else if (*parent_entry == nullptr) ++ if (*parent_entry == nullptr) + { +- CORE_ADDR lookup = form_addr (origin_offset, origin_is_dwz); +- void *obj = m_die_range_map.find (lookup); +- *parent_entry = static_cast (obj); ++ CORE_ADDR addr = form_addr (origin_offset, origin_is_dwz); ++ if (new_reader->cu == reader->cu ++ && new_info_ptr > watermark_ptr) ++ *maybe_defer = addr; ++ else ++ { ++ void *obj = m_die_range_map.find (addr); ++ *parent_entry = static_cast (obj); ++ } + } + + unsigned int bytes_read; + +base-commit: 3490f51a80a10d46dc1885ba672d9390a8221170 +-- +2.35.3 + diff --git a/gdb-symtab-resolve-deferred-entries-inter-shard-case.patch b/gdb-symtab-resolve-deferred-entries-inter-shard-case.patch new file mode 100644 index 0000000..cc4f6f3 --- /dev/null +++ b/gdb-symtab-resolve-deferred-entries-inter-shard-case.patch @@ -0,0 +1,500 @@ +From e2d7097cf236c9ea6959785754d067833fc302af Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 22 Aug 2023 14:24:42 +0200 +Subject: [PATCH 05/13] [gdb/symtab] Resolve deferred entries, inter-shard case + +Generically solve the case of inter-CU dependencies, including inter-shard +dependencies: +- mark deferred entries in new data structure m_deferred, +- return &parent_map::deferred in find_parent for deferred entries, +- defer all intra-CU dependencies that depend on deferred entries, +- defer all inter-CU dependencies (note that two subsequent patches implement + optimizations to deal with this more optimally), +- move m_die_range_map and m_deferred_dies to cooked_index_shard, and +- move handle_deferred_dies to the cooked_index, where it is called in the + constructor, and update it to handle the intra-shard case. + +Handling units from the .debug_info section alongside units from the +.debug_types section requires us to extend form_addr to take is_debug_types +into account. + +Tested on x86_64-linux. + +PR symtab/30846 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30846 +--- + gdb/dwarf2/cooked-index.c | 77 +++++++++++++++++++++++ + gdb/dwarf2/cooked-index.h | 105 ++++++++++++++++++++++++++++++- + gdb/dwarf2/read.c | 128 ++++++++++++++++++++++---------------- + 3 files changed, 254 insertions(+), 56 deletions(-) + +diff --git a/gdb/dwarf2/cooked-index.c b/gdb/dwarf2/cooked-index.c +index 58ea541a5c9..3231d25db5a 100644 +--- a/gdb/dwarf2/cooked-index.c ++++ b/gdb/dwarf2/cooked-index.c +@@ -228,6 +228,12 @@ cooked_index_entry::write_scope (struct obstack *storage, + + /* See cooked-index.h. */ + ++cooked_index_entry parent_map::deferred((sect_offset)0, (dwarf_tag)0, ++ (cooked_index_flag)0, nullptr, ++ nullptr, nullptr); ++ ++/* See cooked-index.h. */ ++ + const cooked_index_entry * + cooked_index_shard::add (sect_offset die_offset, enum dwarf_tag tag, + cooked_index_flag flags, const char *name, +@@ -446,6 +452,8 @@ cooked_index_shard::wait (bool allow_quit) const + cooked_index::cooked_index (vec_type &&vec) + : m_vector (std::move (vec)) + { ++ handle_deferred_entries (); ++ + for (auto &idx : m_vector) + idx->finalize (); + +@@ -649,6 +657,75 @@ cooked_index::maybe_write_index (dwarf2_per_bfd *per_bfd, + global_index_cache.store (per_bfd, ctx); + } + ++/* See cooked-index.h. */ ++ ++const cooked_index_entry * ++cooked_index_shard::resolve_deferred_entry ++ (const deferred_entry &de, const cooked_index_entry *parent_entry) ++{ ++ reset_parent_deferred (parent_map::form_addr (de.die_offset, de.per_cu_2->is_dwz, ++ de.per_cu_2->is_debug_types)); ++ return add (de.die_offset, de.tag, de.flags, de.name, ++ parent_entry, de.per_cu); ++} ++ ++/* See cooked-index.h. */ ++ ++const cooked_index_entry * ++cooked_index::find_parent_deferred_entry ++ (const cooked_index_shard::deferred_entry &entry) const ++{ ++ const cooked_index_entry *parent_entry = nullptr; ++ for (auto &parent_map_shard : m_vector) ++ { ++ auto res = parent_map_shard->find_parent (entry.spec_offset); ++ if (res != nullptr) ++ { ++ parent_entry = res; ++ break; ++ } ++ } ++ ++ return parent_entry; ++} ++ ++/* See cooked-index.h. */ ++ ++void ++cooked_index::handle_deferred_entries () ++{ ++ bool changed; ++ bool deferred; ++ do ++ { ++ deferred = false; ++ changed = false; ++ for (auto &shard : m_vector) ++ for (auto it = shard->m_deferred_entries->begin (); ++ it != shard->m_deferred_entries->end (); ) ++ { ++ const cooked_index_entry *parent_entry ++ = find_parent_deferred_entry (*it); ++ if (parent_entry == &parent_map::deferred) ++ { ++ deferred = true; ++ it++; ++ continue; ++ } ++ shard->resolve_deferred_entry (*it, parent_entry); ++ it = shard->m_deferred_entries->erase (it); ++ changed = true; ++ } ++ } ++ while (changed && deferred); ++ ++ for (auto &shard : m_vector) ++ { ++ shard->m_die_range_map.reset (nullptr); ++ shard->m_deferred_entries.reset (nullptr); ++ } ++} ++ + /* Wait for all the index cache entries to be written before gdb + exits. */ + static void +diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h +index 79fbfe88c03..66424c37f7c 100644 +--- a/gdb/dwarf2/cooked-index.h ++++ b/gdb/dwarf2/cooked-index.h +@@ -34,6 +34,7 @@ + #include "dwarf2/mapped-index.h" + #include "dwarf2/tag.h" + #include "gdbsupport/range-chain.h" ++#include + + struct dwarf2_per_cu_data; + struct dwarf2_per_bfd; +@@ -242,19 +243,29 @@ struct cooked_index_entry : public allocate_on_obstack + class parent_map + { + public: ++ /* A dummy cooked_index_entry to mark that computing the parent has been ++ deferred. */ ++ static cooked_index_entry deferred; ++ + /* A helper function to turn a section offset into an address that + can be used in a parent_map. */ +- static CORE_ADDR form_addr (sect_offset offset, bool is_dwz) ++ static CORE_ADDR form_addr (sect_offset offset, bool is_dwz, ++ bool is_debug_types) + { + CORE_ADDR value = to_underlying (offset); + if (is_dwz) + value |= ((CORE_ADDR) 1) << (8 * sizeof (CORE_ADDR) - 1); ++ if (is_debug_types) ++ value |= ((CORE_ADDR) 1) << (8 * sizeof (CORE_ADDR) - 2); + return value; + } + + /* Find the parent of DIE LOOKUP. */ + const cooked_index_entry *find_parent (CORE_ADDR lookup) const + { ++ if (m_deferred.find (lookup) != m_deferred.end ()) ++ return &parent_map::deferred; ++ + const void *obj = m_parent_map.find (lookup); + return static_cast (obj); + } +@@ -265,12 +276,28 @@ class parent_map + { + /* Calling set_empty with nullptr is currently not allowed. */ + if (parent_entry != nullptr) +- m_parent_map.set_empty (start, end, (void *)parent_entry); ++ { ++ gdb_assert (parent_entry != &parent_map::deferred); ++ m_parent_map.set_empty (start, end, (void *)parent_entry); ++ } ++ } ++ ++ void set_parent_deferred (CORE_ADDR addr) ++ { ++ m_deferred.emplace (addr); ++ } ++ ++ void reset_parent_deferred (CORE_ADDR addr) ++ { ++ m_deferred.erase (addr); + } + + private: + /* An addrmap that maps from section offsets to cooked_index_entry *. */ + addrmap_mutable m_parent_map; ++ ++ /* DIEs that are deffered. */ ++ std::unordered_set m_deferred; + }; + + class cooked_index; +@@ -285,7 +312,12 @@ class cooked_index; + class cooked_index_shard + { + public: +- cooked_index_shard () = default; ++ cooked_index_shard () ++ { ++ m_die_range_map.reset (new parent_map); ++ m_deferred_entries.reset (new std::vector); ++ } ++ + DISABLE_COPY_AND_ASSIGN (cooked_index_shard); + + /* Create a new cooked_index_entry and register it with this object. +@@ -329,6 +361,52 @@ class cooked_index_shard + for completion, will be returned. */ + range find (const std::string &name, bool completing) const; + ++ /* Find the parent of DIE LOOKUP. */ ++ const cooked_index_entry * ++ find_parent (CORE_ADDR lookup) const ++ { ++ return m_die_range_map->find_parent (lookup); ++ } ++ ++ /* Set the parent of DIES in range [START, END] to PARENT_ENTRY. */ ++ void set_parent (CORE_ADDR start, CORE_ADDR end, ++ const cooked_index_entry *parent_entry) ++ { ++ m_die_range_map->set_parent (start, end, parent_entry); ++ } ++ ++ void set_parent_deferred (CORE_ADDR addr) ++ { ++ m_die_range_map->set_parent_deferred (addr); ++ } ++ ++ void reset_parent_deferred (CORE_ADDR addr) ++ { ++ m_die_range_map->reset_parent_deferred (addr); ++ } ++ ++ /* A single deferred entry. See m_deferred_entries. */ ++ struct deferred_entry ++ { ++ sect_offset die_offset; ++ const char *name; ++ CORE_ADDR spec_offset; ++ dwarf_tag tag; ++ cooked_index_flag flags; ++ dwarf2_per_cu_data *per_cu; ++ dwarf2_per_cu_data *per_cu_2; ++ }; ++ ++ /* Defer creating a cooked_index_entry corresponding to DEFERRED. */ ++ void defer_entry (deferred_entry de) ++ { ++ m_deferred_entries->push_back (de); ++ } ++ ++ /* Variant of add that takes a deferred_entry as parameter. */ ++ const cooked_index_entry *resolve_deferred_entry ++ (const deferred_entry &entry, const cooked_index_entry *parent_entry); ++ + private: + + /* Return the entry that is believed to represent the program's +@@ -386,6 +464,20 @@ class cooked_index_shard + that the 'get' method is never called on this future, only + 'wait'. */ + gdb::future m_future; ++ ++ /* An addrmap that maps from section offsets (see the form_addr ++ method) to newly-created entries. See m_deferred_entries to ++ understand this. */ ++ std::unique_ptr m_die_range_map; ++ ++ /* The generated DWARF can sometimes have the declaration for a ++ method in a class (or perhaps namespace) scope, with the ++ definition appearing outside this scope... just one of the many ++ bad things about DWARF. In order to handle this situation, we ++ defer certain entries until the end of scanning, at which point ++ we'll know the containing context of all the DIEs that we might ++ have scanned. This vector stores these deferred entries. */ ++ std::unique_ptr> m_deferred_entries; + }; + + /* The main index of DIEs. The parallel DIE indexers create +@@ -469,6 +561,13 @@ class cooked_index : public dwarf_scanner_base + + private: + ++ /* Find the parent corresponding to deferred entry ENTRY. */ ++ const cooked_index_entry *find_parent_deferred_entry ++ (const cooked_index_shard::deferred_entry &entry) const; ++ ++ /* Create cooked_index_entries for the deferred entries. */ ++ void handle_deferred_entries (); ++ + /* Maybe write the index to the index cache. */ + void maybe_write_index (dwarf2_per_bfd *per_bfd, + const index_cache_store_context &); +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index afdf9e870a8..5b7c0969ed7 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -4672,6 +4672,31 @@ class cooked_index_storage + return &m_addrmap; + } + ++ /* Find the parent of DIE LOOKUP. */ ++ const cooked_index_entry *find_parent (CORE_ADDR lookup) ++ { ++ return m_index->find_parent (lookup); ++ } ++ ++ /* Set the parent of DIES in range [START, END] to PARENT_ENTRY. */ ++ void set_parent (CORE_ADDR start, CORE_ADDR end, ++ const cooked_index_entry *parent_entry) ++ { ++ m_index->set_parent (start, end, parent_entry); ++ } ++ ++ /* Set the parent of DIE at ADDR as deferred. */ ++ void set_parent_deferred (CORE_ADDR addr) ++ { ++ m_index->set_parent_deferred (addr); ++ } ++ ++ /* Defer creating a cooked_index_entry corresponding to deferred_entry DE. */ ++ void defer_entry (cooked_index_shard::deferred_entry de) ++ { ++ m_index->defer_entry (de); ++ } ++ + private: + + /* Hash function for a cutu_reader. */ +@@ -4794,59 +4819,26 @@ class cooked_indexer + /* Find the parent of DIE LOOKUP. */ + const cooked_index_entry *find_parent (CORE_ADDR lookup) const + { +- return m_die_range_map.find_parent (lookup); ++ return m_index_storage->find_parent (lookup); + } + + /* Set the parent of DIES in range [START, END] to PARENT_ENTRY. */ + void set_parent (CORE_ADDR start, CORE_ADDR end, + const cooked_index_entry *parent_entry) + { +- m_die_range_map.set_parent (start, end, parent_entry); ++ m_index_storage->set_parent (start, end, parent_entry); + } + +- /* A single deferred entry. */ +- struct deferred_entry +- { +- sect_offset die_offset; +- const char *name; +- CORE_ADDR spec_offset; +- dwarf_tag tag; +- cooked_index_flag flags; +- }; +- +- /* The generated DWARF can sometimes have the declaration for a +- method in a class (or perhaps namespace) scope, with the +- definition appearing outside this scope... just one of the many +- bad things about DWARF. In order to handle this situation, we +- defer certain entries until the end of scanning, at which point +- we'll know the containing context of all the DIEs that we might +- have scanned. This vector stores these deferred entries. */ +- std::vector m_deferred_entries; +- +- /* Defer creating a cooked_index_entry corresponding to deferred_entry DE. */ +- void defer_entry (const deferred_entry &de) ++ /* Set the parent of DIE at ADDR as deferred. */ ++ void set_parent_deferred (CORE_ADDR addr) + { +- m_deferred_entries.push_back (de); ++ m_index_storage->set_parent_deferred (addr); + } + +- /* Create a cooked_index_entry corresponding to deferred_entry DE with +- parent PARENT_ENTRY. */ +- const cooked_index_entry *resolve_deferred_entry +- (const deferred_entry &de, const cooked_index_entry *parent_entry) +- { +- return m_index_storage->add (de.die_offset, de.tag, de.flags, de.name, +- parent_entry, m_per_cu); +- } +- +- /* Create cooked_index_entries for the deferred entries. */ +- void handle_deferred_entries () ++ /* Defer creating a cooked_index_entry corresponding to deferred_entry DE. */ ++ void defer_entry (const cooked_index_shard::deferred_entry &de) + { +- for (const auto &entry : m_deferred_entries) +- { +- const cooked_index_entry *parent_entry +- = find_parent (entry.spec_offset); +- resolve_deferred_entry (entry, parent_entry); +- } ++ m_index_storage->defer_entry (de); + } + }; + +@@ -16441,13 +16433,36 @@ cooked_indexer::scan_attributes (dwarf2_per_cu_data *scanning_per_cu, + + if (*parent_entry == nullptr) + { ++ gdb_assert (reader->cu->per_cu->is_debug_types ++ == new_reader->cu->per_cu->is_debug_types); + CORE_ADDR addr +- = parent_map::form_addr (origin_offset, origin_is_dwz); +- if (new_reader->cu == reader->cu +- && new_info_ptr > watermark_ptr) +- *maybe_defer = addr; ++ = parent_map::form_addr (origin_offset, origin_is_dwz, ++ reader->cu->per_cu->is_debug_types); ++ if (new_reader->cu == reader->cu) ++ { ++ /* Intra-CU case. */ ++ if (new_info_ptr > watermark_ptr) ++ { ++ /* Defer because origin is not read yet. */ ++ *maybe_defer = addr; ++ } ++ else ++ { ++ auto tmp = find_parent (addr); ++ if (tmp == &parent_map::deferred) ++ { ++ /* Defer because origin is deferred. */ ++ *maybe_defer = addr; ++ } ++ else ++ *parent_entry = tmp; ++ } ++ } + else +- *parent_entry = find_parent (addr); ++ { ++ /* Inter-CU case. */ ++ *maybe_defer = addr; ++ } + } + + unsigned int bytes_read; +@@ -16567,10 +16582,12 @@ cooked_indexer::recurse (cutu_reader *reader, + limit the range to the children of parent_entry. */ + CORE_ADDR start + = parent_map::form_addr (parent_entry->die_offset + 1, +- reader->cu->per_cu->is_dwz); ++ reader->cu->per_cu->is_dwz, ++ reader->cu->per_cu->is_debug_types); + CORE_ADDR end + = parent_map::form_addr (sect_offset (info_ptr - 1 - reader->buffer), +- reader->cu->per_cu->is_dwz); ++ reader->cu->per_cu->is_dwz, ++ reader->cu->per_cu->is_debug_types); + set_parent (start, end, parent_entry); + } + +@@ -16637,9 +16654,16 @@ cooked_indexer::index_dies (cutu_reader *reader, + if (name != nullptr) + { + if (defer != 0) +- defer_entry ({ +- this_die, name, defer, abbrev->tag, flags +- }); ++ { ++ CORE_ADDR addr ++ = parent_map::form_addr (this_die, reader->cu->per_cu->is_dwz, ++ reader->cu->per_cu->is_debug_types); ++ set_parent_deferred (addr); ++ defer_entry ({ ++ this_die, name, defer, abbrev->tag, flags, m_per_cu, ++ reader->cu->per_cu ++ }); ++ } + else + this_entry = m_index_storage->add (this_die, abbrev->tag, flags, + name, this_parent_entry, +@@ -16741,8 +16765,6 @@ cooked_indexer::make_index (cutu_reader *reader) + if (!reader->comp_unit_die->has_children) + return; + index_dies (reader, reader->info_ptr, nullptr, false); +- +- handle_deferred_entries (); + } + + /* An implementation of quick_symbol_functions for the cooked DWARF +-- +2.35.3 + diff --git a/gdb-symtab-resolve-deferred-entries-intra-shard-case.patch b/gdb-symtab-resolve-deferred-entries-intra-shard-case.patch new file mode 100644 index 0000000..a18108a --- /dev/null +++ b/gdb-symtab-resolve-deferred-entries-intra-shard-case.patch @@ -0,0 +1,120 @@ +From 3b2f2b376bb80edadacc582161c362612947e3a6 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sun, 24 Sep 2023 11:43:24 +0200 +Subject: [PATCH 09/13] [gdb/symtab] Resolve deferred entries, intra-shard case + +In patch "[gdb/symtab] Resolve deferred entries, inter-shard case" we've +solved the generic case of handling deferred entries. + +Now add an optimization that handles deferred entries with an intra-shard +dependency in the parallel for. + +Tested on x86_64-linux. +--- + gdb/dwarf2/cooked-index.c | 35 +++++++++++++++++++++++++++++++++++ + gdb/dwarf2/cooked-index.h | 7 +++++++ + gdb/dwarf2/read.c | 10 ++++++++++ + 3 files changed, 52 insertions(+) + +diff --git a/gdb/dwarf2/cooked-index.c b/gdb/dwarf2/cooked-index.c +index c096da57d62..ebed21d510c 100644 +--- a/gdb/dwarf2/cooked-index.c ++++ b/gdb/dwarf2/cooked-index.c +@@ -452,6 +452,7 @@ cooked_index_shard::wait (bool allow_quit) const + cooked_index::cooked_index (vec_type &&vec) + : m_vector (std::move (vec)) + { ++ /* Handle deferred entries, inter-cu case. */ + handle_deferred_entries (); + + for (auto &idx : m_vector) +@@ -659,6 +660,40 @@ cooked_index::maybe_write_index (dwarf2_per_bfd *per_bfd, + + /* See cooked-index.h. */ + ++const cooked_index_entry * ++cooked_index_shard::find_parent_deferred_entry ++ (const cooked_index_shard::deferred_entry &entry) const ++{ ++ return find_parent (entry.spec_offset); ++} ++ ++/* See cooked-index.h. */ ++ ++void ++cooked_index_shard::handle_deferred_entries () ++{ ++ for (auto it = m_deferred_entries->begin (); it != m_deferred_entries->end (); ) ++ { ++ const deferred_entry & deferred_entry = *it; ++ if (!parent_valid (deferred_entry.spec_offset)) ++ { ++ it++; ++ continue; ++ } ++ const cooked_index_entry *parent_entry ++ = find_parent_deferred_entry (deferred_entry); ++ if (parent_entry == &parent_map::deferred) ++ { ++ it++; ++ continue; ++ } ++ resolve_deferred_entry (deferred_entry, parent_entry); ++ it = m_deferred_entries->erase (it); ++ } ++} ++ ++/* See cooked-index.h. */ ++ + const cooked_index_entry * + cooked_index_shard::resolve_deferred_entry + (const deferred_entry &de, const cooked_index_entry *parent_entry) +diff --git a/gdb/dwarf2/cooked-index.h b/gdb/dwarf2/cooked-index.h +index fa895233035..106e3091a90 100644 +--- a/gdb/dwarf2/cooked-index.h ++++ b/gdb/dwarf2/cooked-index.h +@@ -408,6 +408,13 @@ class cooked_index_shard + const cooked_index_entry *resolve_deferred_entry + (const deferred_entry &entry, const cooked_index_entry *parent_entry); + ++ /* Find the parent entry for deferred_entry ENTRY. */ ++ const cooked_index_entry *find_parent_deferred_entry ++ (const cooked_index_shard::deferred_entry &entry) const; ++ ++ /* Create cooked_index_entries for the deferred entries. */ ++ void handle_deferred_entries (); ++ + /* Mark parents in range [START, END] as valid . */ + void set_parent_valid (CORE_ADDR start, CORE_ADDR end) + { +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index 09598e702bc..a97f738a54e 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -4697,6 +4697,12 @@ class cooked_index_storage + m_index->defer_entry (de); + } + ++ /* Handle deferred entries, intra-cu case. */ ++ void handle_deferred_entries () ++ { ++ m_index->handle_deferred_entries (); ++ } ++ + /* Mark parents in range [START, END] as valid . */ + void set_parent_valid (CORE_ADDR start, CORE_ADDR end) + { +@@ -5183,6 +5189,10 @@ dwarf2_build_psymtabs_hard (dwarf2_per_objfile *per_objfile) + errors.push_back (std::move (except)); + } + } ++ ++ /* Handle deferred entries, intra-cu case. */ ++ thread_storage.handle_deferred_entries (); ++ + return result_type (thread_storage.release (), std::move (errors)); + }, task_size); + +-- +2.35.3 + diff --git a/gdb-symtab-return-correct-reader-for-top-level-cu-in.patch b/gdb-symtab-return-correct-reader-for-top-level-cu-in.patch new file mode 100644 index 0000000..24e3484 --- /dev/null +++ b/gdb-symtab-return-correct-reader-for-top-level-cu-in.patch @@ -0,0 +1,224 @@ +From 84b9218d98eb2ac242fe3afc81598206279f7b13 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 22 Aug 2024 10:00:27 +0200 +Subject: [PATCH] [gdb/symtab] Return correct reader for top-level CU in + cooked_indexer::ensure_cu_exists + +With the test-case included in this patch, we run into: +... +$ gdb -q -batch $exec +Dwarf Error: Could not find abbrev number 3 in CU at offset 0xdb \ + [in module $exec] +... + +The debug info consists of two CUs: +... + Compilation Unit @ offset 0xb2: + Length: 0x25 (32-bit) + Version: 4 + Abbrev Offset: 0x6c + Pointer Size: 8 + <0>: Abbrev Number: 1 (DW_TAG_compile_unit) + DW_AT_language : 2 (non-ANSI C) + <1>: Abbrev Number: 2 (DW_TAG_subprogram) + DW_AT_low_pc : 0x4004a7 + DW_AT_high_pc : 0x4004b2 + DW_AT_specification: <0xe8> + <1>: Abbrev Number: 3 (DW_TAG_subprogram) + DW_AT_name : main + <1>: Abbrev Number: 0 + Compilation Unit @ offset 0xdb: + Length: 0xf (32-bit) + Version: 4 + Abbrev Offset: 0x86 + Pointer Size: 8 + <0>: Abbrev Number: 1 (DW_TAG_compile_unit) + DW_AT_language : 2 (non-ANSI C) + <1>: Abbrev Number: 2 (DW_TAG_subprogram) + DW_AT_specification: <0xd4> + <1>: Abbrev Number: 0 +... +where: +- DIE 0xbf in CU@0xb2 contains an inter-CU reference to +- DIE 0xe8 in CU@0xdb, which contains an inter-CU reference to +- DIE 0xd4 back in CU@0xb2. + +The dwarf error is caused by this bit of code in +cooked_indexer::ensure_cu_exists: +... + if (per_cu == m_per_cu) + return reader; +... + +The dwarf error happens as follows: +- a cutu_reader A is created for CU@0xb2 +- using cutu_reader A, the cooked index reader starts indexing dies, with + m_per_cu set to CU@0xb2 +- while indexing it scans the attributes of DIE 0xbf and encounters the + inter-CU reference to DIE 0xe8 +- it calls cooked_indexer::ensure_cu_exists, which creates a cutu_reader B for + CU@0xdb and returns it +- using cutu_reader B, it continues scanning attributes of DIE 0xe8 and + encounters the inter-CU reference to DIE 0xd4 +- it calls cooked_indexer::ensure_cu_exists, the problematic bit is triggered + and cutu_reader B is returned +- using cutu_reader B, it continues scanning attributes of DIE 0xd4 +- this goes wrong because: + - the attributes of the DIE are encoded using the abbreviation table at + offset 0x6c, while + - the decoding is done using cutu_reader B which uses the abbreviation table + at offset 0x86. + +Fix this by removing the problematic if clause. + +Since cutu_reader A is not preserved in m_index_storage, +cooked_indexer::ensure_cu_exists cannot find it there and creates a duplicate +cutu_reader C for CU@0xb2. Fix this in process_psymtab_comp_unit by preserving +the cutu_reader A as well in m_index_storage. + +Tested on x86_64-linux and aarch64-linux. + +PR symtab/32081 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=32081 + +Approved-By: Tom Tromey +Reported-By: Andreas Schwab +--- + gdb/dwarf2/read.c | 35 ++++++----- + .../dw2-inter-cu-forth-and-back.exp | 60 +++++++++++++++++++ + 2 files changed, 80 insertions(+), 15 deletions(-) + create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-inter-cu-forth-and-back.exp + +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index 8f2d7a34aef..b72b5fe8c83 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -4880,28 +4880,35 @@ process_psymtab_comp_unit (dwarf2_per_cu_data *this_cu, + dwarf2_per_objfile *per_objfile, + cooked_index_storage *storage) + { +- cutu_reader reader (this_cu, per_objfile, nullptr, nullptr, false, +- storage->get_abbrev_cache ()); ++ cutu_reader *reader = storage->get_reader (this_cu); ++ if (reader == nullptr) ++ { ++ cutu_reader new_reader (this_cu, per_objfile, nullptr, nullptr, false, ++ storage->get_abbrev_cache ()); + +- if (reader.comp_unit_die == nullptr) +- return; ++ if (new_reader.comp_unit_die == nullptr || new_reader.dummy_p) ++ return; + +- if (reader.dummy_p) +- { +- /* Nothing. */ ++ std::unique_ptr copy ++ (new cutu_reader (std::move (new_reader))); ++ reader = storage->preserve (std::move (copy)); + } +- else if (this_cu->is_debug_types) +- build_type_psymtabs_reader (&reader, storage); +- else if (reader.comp_unit_die->tag != DW_TAG_partial_unit) ++ ++ if (reader->comp_unit_die == nullptr || reader->dummy_p) ++ return; ++ ++ if (this_cu->is_debug_types) ++ build_type_psymtabs_reader (reader, storage); ++ else if (reader->comp_unit_die->tag != DW_TAG_partial_unit) + { + bool nope = false; + if (this_cu->scanned.compare_exchange_strong (nope, true)) + { +- prepare_one_comp_unit (reader.cu, reader.comp_unit_die, ++ prepare_one_comp_unit (reader->cu, reader->comp_unit_die, + language_minimal); + gdb_assert (storage != nullptr); +- cooked_indexer indexer (storage, this_cu, reader.cu->lang ()); +- indexer.make_index (&reader); ++ cooked_indexer indexer (storage, this_cu, reader->cu->lang ()); ++ indexer.make_index (reader); + } + } + } +@@ -16280,8 +16287,6 @@ cooked_indexer::ensure_cu_exists (cutu_reader *reader, + if (!per_cu->scanned.compare_exchange_strong (nope, true)) + return nullptr; + } +- if (per_cu == m_per_cu) +- return reader; + + cutu_reader *result = m_index_storage->get_reader (per_cu); + if (result == nullptr) +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inter-cu-forth-and-back.exp b/gdb/testsuite/gdb.dwarf2/dw2-inter-cu-forth-and-back.exp +new file mode 100644 +index 00000000000..62674bdb700 +--- /dev/null ++++ b/gdb/testsuite/gdb.dwarf2/dw2-inter-cu-forth-and-back.exp +@@ -0,0 +1,60 @@ ++# Copyright 2024 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++# Check that the cooked index reader can handle inter-CU references: ++# - DIE1@CU1 -> DIE2@CU2 ++# - DIE2@CU2 -> DIE3@CU1. ++ ++load_lib dwarf.exp ++ ++# This test can only be run on targets which support DWARF-2 and use gas. ++require dwarf2_support ++ ++standard_testfile main.c .S ++ ++# Create the DWARF. ++set asm_file [standard_output_file $srcfile2] ++Dwarf::assemble $asm_file { ++ declare_labels label1 label2 ++ ++ cu {} { ++ compile_unit {{language @DW_LANG_C}} { ++ subprogram { ++ {MACRO_AT_range { main }} ++ {DW_AT_specification %$label1} ++ } ++ ++ label2: subprogram { ++ {DW_AT_name main} ++ } ++ } ++ } ++ ++ cu {} { ++ compile_unit {{language @DW_LANG_C}} { ++ label1: subprogram { ++ {DW_AT_specification %$label2} ++ } ++ } ++ } ++} ++ ++if [prepare_for_testing "failed to prepare" $testfile \ ++ [list $asm_file $srcfile] {nodebug}] { ++ return -1 ++} ++ ++# Regression test for PR32081. ++gdb_assert { ![regexp -nocase "error:" $gdb_file_cmd_msg] } "No Error message" + +base-commit: 102b31b0b7f62e6e4f685e725f325f2ab6283c2a +-- +2.35.3 + diff --git a/gdb-symtab-set-default-dwarf-max-cache-age-1000.patch b/gdb-symtab-set-default-dwarf-max-cache-age-1000.patch new file mode 100644 index 0000000..ffb32ad --- /dev/null +++ b/gdb-symtab-set-default-dwarf-max-cache-age-1000.patch @@ -0,0 +1,13 @@ +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index f8797537108..cb8f86fa352 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -1250,7 +1250,7 @@ struct field_info + compilation units. Set this to zero to disable caching. Cache + sizes of up to at least twenty will improve startup time for + typical inter-CU-reference binaries, at an obvious memory cost. */ +-static int dwarf_max_cache_age = 5; ++static int dwarf_max_cache_age = 1000; + static void + show_dwarf_max_cache_age (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) diff --git a/gdb-symtab-work-around-gas-pr28629.patch b/gdb-symtab-work-around-gas-pr28629.patch new file mode 100644 index 0000000..9bcab94 --- /dev/null +++ b/gdb-symtab-work-around-gas-pr28629.patch @@ -0,0 +1,278 @@ +From 1b878333913343630472f89b4bc42f51b1619308 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Wed, 1 Nov 2023 00:33:12 +0100 +Subject: [PATCH 1/2] [gdb/symtab] Work around gas PR28629 + +When running test-case gdb.tui/tui-layout-asm-short-prog.exp on AlmaLinux 9.2 +ppc64le, I run into: +... +FAIL: gdb.tui/tui-layout-asm-short-prog.exp: check asm box contents +... + +The problem is that we get: +... + 7 [ No Assembly Available ] +... +because tui_get_begin_asm_address doesn't succeed. + +In more detail, tui_get_begin_asm_address calls: +... + find_line_pc (sal.symtab, sal.line, &addr); +... +with: +... +(gdb) p *sal.symtab +$5 = {next = 0x130393c0, m_compunit = 0x130392f0, m_linetable = 0x0, + filename = "tui-layout-asm-short-prog.S", + filename_for_id = "$gdb/build/gdb/testsuite/tui-layout-asm-short-prog.S", + m_language = language_asm, fullname = 0x0} +(gdb) p sal.line +$6 = 1 +... + +The problem is the filename_for_id which is the source file prefixed with the +compilation dir rather than the source dir. + +This is due to faulty debug info generated by gas, PR28629: +... + <1a> DW_AT_name : tui-layout-asm-short-prog.S + <1e> DW_AT_comp_dir : $gdb/build/gdb/testsuite + <22> DW_AT_producer : GNU AS 2.35.2 +... + +The DW_AT_name is relative, and it's relative to the DW_AT_comp_dir entry, +making the effective name $gdb/build/gdb/testsuite/tui-layout-asm-short-prog.S. + +The bug is fixed starting version 2.38, where we get instead: +... + <1a> DW_AT_name : + $gdb/src/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S + <1e> DW_AT_comp_dir : $gdb/build/gdb/testsuite + <22> DW_AT_producer : GNU AS 2.38 +... + +Work around the faulty debug info by constructing the filename_for_id using +the second directory from the directory table in the .debug_line header: +... + The Directory Table (offset 0x22, lines 2, columns 1): + Entry Name + 0 $gdb/build/gdb/testsuite + 1 $gdb/src/gdb/testsuite/gdb.tui +... + +Note that the used gas contains a backport of commit 3417bfca676 ("GAS: +DWARF-5: Ensure that the 0'th entry in the directory table contains the +current working directory."), because directory 0 is correct. With the +unpatched 2.35.2 release the directory 0 entry is incorrect: it's a copy of +entry 1. + +Add a dwarf assembly test-case that reflects the debug info as generated by +unpatched gas 2.35.2. + +Tested on x86_64-linux. + +Approved-By: Tom Tromey +--- + gdb/dwarf2/cu.c | 1 + + gdb/dwarf2/cu.h | 1 + + gdb/dwarf2/read.c | 37 +++++++- + .../gdb.dwarf2/dw2-gas-workaround.exp | 92 +++++++++++++++++++ + 4 files changed, 130 insertions(+), 1 deletion(-) + create mode 100644 gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp + +diff --git a/gdb/dwarf2/cu.c b/gdb/dwarf2/cu.c +index a908ec908cd..f9b05dfc709 100644 +--- a/gdb/dwarf2/cu.c ++++ b/gdb/dwarf2/cu.c +@@ -40,6 +40,7 @@ dwarf2_cu::dwarf2_cu (dwarf2_per_cu_data *per_cu, + producer_is_icc_lt_14 (false), + producer_is_codewarrior (false), + producer_is_clang (false), ++ producer_is_gas_lt_2_38 (false), + producer_is_gas_2_39 (false), + processing_has_namespace_info (false), + load_all_dies (false) +diff --git a/gdb/dwarf2/cu.h b/gdb/dwarf2/cu.h +index 6c611710503..ef8db480e3f 100644 +--- a/gdb/dwarf2/cu.h ++++ b/gdb/dwarf2/cu.h +@@ -265,6 +265,7 @@ struct dwarf2_cu + bool producer_is_icc_lt_14 : 1; + bool producer_is_codewarrior : 1; + bool producer_is_clang : 1; ++ bool producer_is_gas_lt_2_38 : 1; + bool producer_is_gas_2_39 : 1; + + /* When true, the file that we're processing is known to have +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index fc4667b782f..50fa302b43a 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -147,6 +147,8 @@ static int dwarf2_locexpr_block_index; + static int dwarf2_loclist_block_index; + static int ada_block_index; + ++static bool producer_is_gas_lt_2_38 (struct dwarf2_cu *cu); ++ + /* Size of .debug_loclists section header for 32-bit DWARF format. */ + #define LOCLIST_HEADER_SIZE32 12 + +@@ -7665,6 +7667,27 @@ read_file_scope (struct die_info *die, struct dwarf2_cu *cu) + + file_and_directory &fnd = find_file_and_directory (die, cu); + ++ /* GAS supports generating dwarf-5 info starting version 2.35. Versions ++ 2.35-2.37 generate an incorrect CU name attribute: it's relative, ++ implicitly prefixing it with the compilation dir. Work around this by ++ prefixing it with the source dir instead. */ ++ if (cu->header.version == 5 && !IS_ABSOLUTE_PATH (fnd.get_name ()) ++ && producer_is_gas_lt_2_38 (cu)) ++ { ++ attr = dwarf2_attr (die, DW_AT_stmt_list, cu); ++ if (attr != nullptr && attr->form_is_unsigned ()) ++ { ++ sect_offset line_offset = (sect_offset) attr->as_unsigned (); ++ line_header_up lh = dwarf_decode_line_header (line_offset, cu, ++ fnd.get_comp_dir ()); ++ if (lh->version == 5 && lh->is_valid_file_index (1)) ++ { ++ std::string dir = lh->include_dir_at (1); ++ fnd.set_comp_dir (std::move (dir)); ++ } ++ } ++ } ++ + cu->start_compunit_symtab (fnd.get_name (), fnd.intern_comp_dir (objfile), + lowpc); + +@@ -11427,7 +11450,10 @@ check_producer (struct dwarf2_cu *cu) + else if (producer_is_clang (cu->producer, &major, &minor)) + cu->producer_is_clang = true; + else if (producer_is_gas (cu->producer, &major, &minor)) +- cu->producer_is_gas_2_39 = major == 2 && minor == 39; ++ { ++ cu->producer_is_gas_lt_2_38 = major < 2 || (major == 2 && minor < 38); ++ cu->producer_is_gas_2_39 = major == 2 && minor == 39; ++ } + else + { + /* For other non-GCC compilers, expect their behavior is DWARF version +@@ -11463,6 +11489,15 @@ producer_is_codewarrior (struct dwarf2_cu *cu) + return cu->producer_is_codewarrior; + } + ++static bool ++producer_is_gas_lt_2_38 (struct dwarf2_cu *cu) ++{ ++ if (!cu->checked_producer) ++ check_producer (cu); ++ ++ return cu->producer_is_gas_lt_2_38; ++} ++ + static bool + producer_is_gas_2_39 (struct dwarf2_cu *cu) + { +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp b/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp +new file mode 100644 +index 00000000000..ca2b10f23b3 +--- /dev/null ++++ b/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp +@@ -0,0 +1,92 @@ ++# Copyright 2023 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++# Test line number information in various configurations. ++ ++load_lib dwarf.exp ++ ++# This test can only be run on targets which support DWARF-2 and use gas. ++require dwarf2_support ++ ++standard_testfile dw2-lines.c -dw2.S ++ ++with_shared_gdb { ++ set func_info_vars [get_func_info bar] ++} ++ ++# Helper function. ++proc line_for { l } { ++ global srcfile ++ set line [gdb_get_line_number "$l:" $srcfile] ++ return [expr $line + 1] ++} ++ ++set asm_file [standard_output_file $srcfile2] ++Dwarf::assemble $asm_file { ++ declare_labels Llines ++ global srcdir subdir srcfile objdir ++ global func_info_vars ++ foreach var $func_info_vars { ++ global $var ++ } ++ ++ cu { version 5 } { ++ compile_unit { ++ {language @DW_LANG_Mips_Assembler} ++ {name $srcfile} ++ {comp_dir $objdir} ++ {stmt_list $Llines DW_FORM_sec_offset} ++ {producer "GNU AS 2.35.2"} ++ } { ++ subprogram { ++ {external 1 flag} ++ {name bar} ++ {low_pc $bar_start addr} ++ {high_pc "$bar_start + $bar_len" addr} ++ } ++ } ++ } ++ ++ lines [list version 5] Llines { ++ set diridx1 [include_dir "${srcdir}/${subdir}"] ++ set diridx2 [include_dir "${srcdir}/${subdir}"] ++ file_name "$srcfile" $diridx1 ++ file_name "$srcfile" $diridx2 ++ ++ program { ++ DW_LNE_set_address bar_label ++ line [line_for bar_label] ++ DW_LNS_copy ++ ++ DW_LNE_set_address bar_label_2 ++ DW_LNE_end_sequence ++ } ++ } ++} ++ ++if { [prepare_for_testing "failed to prepare" ${testfile} \ ++ [list $srcfile $asm_file] {nodebug}] } { ++ return -1 ++} ++ ++gdb_test_no_output "set debug symtab-create 1" ++gdb_test_multiple "ptype bar" "" { ++ -re -wrap "$objdir.*" { ++ fail $gdb_test_name ++ } ++ -re -wrap "" { ++ pass $gdb_test_name ++ } ++} + +base-commit: d9951c3c9ea2e542d071710e9706ed505046fe36 +-- +2.35.3 + diff --git a/gdb-symtab-work-around-pr-gas-29517-dwarf2-case.patch b/gdb-symtab-work-around-pr-gas-29517-dwarf2-case.patch new file mode 100644 index 0000000..be57664 --- /dev/null +++ b/gdb-symtab-work-around-pr-gas-29517-dwarf2-case.patch @@ -0,0 +1,137 @@ +From 582fc35843fdf71b82d645d83d2903e2546cc21a Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Wed, 1 May 2024 15:10:50 +0200 +Subject: [PATCH 2/2] [gdb/symtab] Work around PR gas/29517, dwarf2 case + +In commit 1d45d90934b ("[gdb/symtab] Work around PR gas/29517") we added a +workaround for PR gas/29517. + +The problem is present in gas version 2.39, and fixed in 2.40, so the +workaround is only active for gas version == 2.39. + +However, the problem in gas is only fixed for dwarf version >= 3, which +supports DW_TAG_unspecified_type. + +Fix this by also activating the workaround for dwarf version == 2. + +Tested on x86_64-linux. + +PR symtab/31689 +https://sourceware.org/bugzilla/show_bug.cgi?id=31689 +--- + gdb/dwarf2/read.c | 5 +++- + .../gdb.dwarf2/dw2-unspecified-type-foo.c | 7 ++++++ + .../gdb.dwarf2/dw2-unspecified-type.c | 3 ++- + .../gdb.dwarf2/dw2-unspecified-type.exp | 23 ++++++++++++++++++- + 4 files changed, 35 insertions(+), 3 deletions(-) + +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index 761437f6631..fc4667b782f 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -14646,10 +14646,13 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu) + + type = die_type (die, cu); + ++ /* PR gas/29517 occurs in 2.39, and is fixed in 2.40, but it's only fixed ++ for dwarf version >= 3 which supports DW_TAG_unspecified_type. */ + if (type->code () == TYPE_CODE_VOID + && !type->is_stub () + && die->child == nullptr +- && producer_is_gas_2_39 (cu)) ++ && (cu->per_cu->version () == 2 ++ || producer_is_gas_2_39 (cu))) + { + /* Work around PR gas/29517, pretend we have an DW_TAG_unspecified_type + return type. */ +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type-foo.c b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type-foo.c +index 164e781c9f0..bcf525a4d2e 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type-foo.c ++++ b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type-foo.c +@@ -21,3 +21,10 @@ foo (void) + asm ("foo_label: .globl foo_label"); + return 0; + } ++ ++int ++foo2 (void) ++{ ++ asm ("foo2_label: .globl foo2_label"); ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c +index e07d9517ff2..9e600f9dcce 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c ++++ b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c +@@ -16,6 +16,7 @@ + along with this program. If not, see . */ + + extern int foo (void); ++extern int foo2 (void); + + int + bar (void) +@@ -27,6 +28,6 @@ bar (void) + int + main (void) + { +- int res = foo () + bar (); ++ int res = foo () + bar () + foo2 (); + return res; + } +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp +index a6f2a57e33e..947246ba44d 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp ++++ b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp +@@ -34,11 +34,19 @@ lassign $bar_res \ + bar_start bar_len + set bar_end "$bar_start + $bar_len" + ++set foo2_res \ ++ [function_range foo2 \ ++ [list ${srcdir}/${subdir}/$srcfile ${srcdir}/${subdir}/$srcfile2]] ++lassign $foo2_res \ ++ foo2_start foo2_len ++set foo2_end "$foo2_start + $foo2_len" ++ + # Create the DWARF. + set asm_file [standard_output_file $srcfile3] + Dwarf::assemble $asm_file { + global foo_start foo_end + global bar_start bar_end ++ global foo2_start foo2_end + declare_labels unspecified_type_label + + cu {} { +@@ -68,6 +76,19 @@ Dwarf::assemble $asm_file { + } + } + } ++ ++ cu { version 2 } { ++ compile_unit { ++ {language @DW_LANG_Mips_Assembler} ++ {producer "GNU AS 2.40.0"} ++ } { ++ DW_TAG_subprogram { ++ {name foo2} ++ {low_pc $foo2_start addr} ++ {high_pc $foo2_end addr} ++ } ++ } ++ } + } + + if [prepare_for_testing "failed to prepare" $testfile \ +@@ -79,7 +100,7 @@ if ![runto_main] { + return -1 + } + +-foreach f {foo bar} { ++foreach f {foo bar foo2} { + # Print the function type. Return type should be stub type, which is printed + # as void. + gdb_test "ptype $f" "type = void \\(void\\)" +-- +2.35.3 + diff --git a/gdb-symtab-work-around-pr-gas-29517.patch b/gdb-symtab-work-around-pr-gas-29517.patch new file mode 100644 index 0000000..54fc9de --- /dev/null +++ b/gdb-symtab-work-around-pr-gas-29517.patch @@ -0,0 +1,256 @@ +From 7a2731d9d1c0926d22905b9d07e32a7b63c43b34 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 28 Sep 2023 13:55:07 +0200 +Subject: [PATCH 57/65] Work around PR gas/29517 + +When using glibc debuginfo generated with gas 2.39, we run into PR gas/29517: +... +$ gdb -q -batch a.out -ex start -ex "p (char *)strstr (\"haha\", \"ah\")" +Temporary breakpoint 1 at 0x40051b: file hello.c, line 6. + +Temporary breakpoint 1, main () at hello.c:6 +6 printf ("hello\n"); +Invalid cast. +... +while without glibc debuginfo installed we get the expected result: +... +$n = 0x7ffff7daa1b1 "aha" +... +and likewise with glibc debuginfo generated with gas 2.40. + +The strstr ifunc resolves to __strstr_sse2_unaligned. The problem is that gas +generates dwarf that states that the return type is void: +... +<1><3e1e58>: Abbrev Number: 2 (DW_TAG_subprogram) + <3e1e59> DW_AT_name : __strstr_sse2_unaligned + <3e1e5d> DW_AT_external : 1 + <3e1e5e> DW_AT_low_pc : 0xbbd2e + <3e1e66> DW_AT_high_pc : 0xbc1c3 +... +while the return type should be a DW_TAG_unspecified_type, as is the case +with gas 2.40. + +We can still use the workaround of casting to another function type for both +__strstr_sse2_unaligned: +... +(gdb) p ((char * (*) (const char *, const char *))__strstr_sse2_unaligned) \ + ("haha", "ah") +$n = 0x7ffff7daa211 "aha" +... +and strstr (which requires using *strstr to dereference the ifunc before we +cast): +... +gdb) p ((char * (*) (const char *, const char *))*strstr) ("haha", "ah") +$n = 0x7ffff7daa251 "aha" +... +but that's a bit cumbersome to use. + +Work around this in the dwarf reader, such that we have instead: +... +(gdb) p (char *)strstr ("haha", "ah") +$n = 0x7ffff7daa1b1 "aha" +... + +This also requires fixing producer_is_gcc to stop returning true for +producer "GNU AS 2.39.0". + +Tested on x86_64-linux. + +PR symtab/30911 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30911 +--- + gdb/dwarf2/cu.c | 1 + + gdb/dwarf2/cu.h | 1 + + gdb/dwarf2/read.c | 23 ++++++++++++ + gdb/producer.c | 8 ++++- + .../gdb.dwarf2/dw2-unspecified-type.c | 9 ++++- + .../gdb.dwarf2/dw2-unspecified-type.exp | 36 +++++++++++++++---- + 6 files changed, 69 insertions(+), 9 deletions(-) + +diff --git a/gdb/dwarf2/cu.c b/gdb/dwarf2/cu.c +index 89de40daab0..a908ec908cd 100644 +--- a/gdb/dwarf2/cu.c ++++ b/gdb/dwarf2/cu.c +@@ -40,6 +40,7 @@ dwarf2_cu::dwarf2_cu (dwarf2_per_cu_data *per_cu, + producer_is_icc_lt_14 (false), + producer_is_codewarrior (false), + producer_is_clang (false), ++ producer_is_gas_2_39 (false), + processing_has_namespace_info (false), + load_all_dies (false) + { +diff --git a/gdb/dwarf2/cu.h b/gdb/dwarf2/cu.h +index 0c15d8b02db..6c611710503 100644 +--- a/gdb/dwarf2/cu.h ++++ b/gdb/dwarf2/cu.h +@@ -265,6 +265,7 @@ struct dwarf2_cu + bool producer_is_icc_lt_14 : 1; + bool producer_is_codewarrior : 1; + bool producer_is_clang : 1; ++ bool producer_is_gas_2_39 : 1; + + /* When true, the file that we're processing is known to have + debugging info for C++ namespaces. GCC 3.3.x did not produce +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index a5c48baa6f8..e5e557c17d3 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -11426,6 +11426,8 @@ check_producer (struct dwarf2_cu *cu) + cu->producer_is_codewarrior = true; + else if (producer_is_clang (cu->producer, &major, &minor)) + cu->producer_is_clang = true; ++ else if (startswith (cu->producer, "GNU AS 2.39.0")) ++ cu->producer_is_gas_2_39 = true; + else + { + /* For other non-GCC compilers, expect their behavior is DWARF version +@@ -11461,6 +11463,15 @@ producer_is_codewarrior (struct dwarf2_cu *cu) + return cu->producer_is_codewarrior; + } + ++static bool ++producer_is_gas_2_39 (struct dwarf2_cu *cu) ++{ ++ if (!cu->checked_producer) ++ check_producer (cu); ++ ++ return cu->producer_is_gas_2_39; ++} ++ + /* Return the accessibility of DIE, as given by DW_AT_accessibility. + If that attribute is not available, return the appropriate + default. */ +@@ -14635,6 +14646,18 @@ read_subroutine_type (struct die_info *die, struct dwarf2_cu *cu) + + type = die_type (die, cu); + ++ if (type->code () == TYPE_CODE_VOID ++ && !type->is_stub () ++ && die->child == nullptr ++ && producer_is_gas_2_39 (cu)) ++ { ++ /* Work around PR gas/29517, pretend we have an DW_TAG_unspecified_type ++ return type. */ ++ type = (type_allocator (cu->per_objfile->objfile, cu->lang ()) ++ .new_type (TYPE_CODE_VOID, 0, nullptr)); ++ type->set_is_stub (true); ++ } ++ + /* The die_type call above may have already set the type for this DIE. */ + ftype = get_die_type (die, cu); + if (ftype) +diff --git a/gdb/producer.c b/gdb/producer.c +index 655eb971283..9fcf749e3d4 100644 +--- a/gdb/producer.c ++++ b/gdb/producer.c +@@ -54,13 +54,19 @@ producer_is_gcc (const char *producer, int *major, int *minor) + if (minor == NULL) + minor = &min; + ++ /* Skip GNU. */ ++ cs = &producer[strlen ("GNU ")]; ++ ++ /* Bail out for GNU AS. */ ++ if (startswith (cs, "AS ")) ++ return 0; ++ + /* Skip any identifier after "GNU " - such as "C11" "C++" or "Java". + A full producer string might look like: + "GNU C 4.7.2" + "GNU Fortran 4.8.2 20140120 (Red Hat 4.8.2-16) -mtune=generic ..." + "GNU C++14 5.0.0 20150123 (experimental)" + */ +- cs = &producer[strlen ("GNU ")]; + while (*cs && !isspace (*cs)) + cs++; + if (*cs && isspace (*cs)) +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c +index 1df09214d4a..e07d9517ff2 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c ++++ b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.c +@@ -17,9 +17,16 @@ + + extern int foo (void); + ++int ++bar (void) ++{ ++ asm ("bar_label: .globl bar_label"); ++ return 0; ++} ++ + int + main (void) + { +- int res = foo (); ++ int res = foo () + bar (); + return res; + } +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp +index 5fa6ee544b2..a6f2a57e33e 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp ++++ b/gdb/testsuite/gdb.dwarf2/dw2-unspecified-type.exp +@@ -27,10 +27,18 @@ lassign $foo_res \ + foo_start foo_len + set foo_end "$foo_start + $foo_len" + ++set bar_res \ ++ [function_range bar \ ++ [list ${srcdir}/${subdir}/$srcfile ${srcdir}/${subdir}/$srcfile2]] ++lassign $bar_res \ ++ bar_start bar_len ++set bar_end "$bar_start + $bar_len" ++ + # Create the DWARF. + set asm_file [standard_output_file $srcfile3] + Dwarf::assemble $asm_file { + global foo_start foo_end ++ global bar_start bar_end + declare_labels unspecified_type_label + + cu {} { +@@ -45,7 +53,19 @@ Dwarf::assemble $asm_file { + {high_pc $foo_end addr} + {type :$unspecified_type_label} + } ++ } ++ } + ++ cu {} { ++ compile_unit { ++ {language @DW_LANG_Mips_Assembler} ++ {producer "GNU AS 2.39.0"} ++ } { ++ DW_TAG_subprogram { ++ {name bar} ++ {low_pc $bar_start addr} ++ {high_pc $bar_end addr} ++ } + } + } + } +@@ -59,12 +79,14 @@ if ![runto_main] { + return -1 + } + +-# Print the function type. Return type should be stub type, which is printed +-# as void. +-gdb_test "ptype foo" "type = void \\(void\\)" ++foreach f {foo bar} { ++ # Print the function type. Return type should be stub type, which is printed ++ # as void. ++ gdb_test "ptype $f" "type = void \\(void\\)" + +-# Call the function, casting the function to the correct function type. +-gdb_test "p ((int (*) ()) foo) ()" " = 0" ++ # Call the function, casting the function to the correct function type. ++ gdb_test "p ((int (*) ()) $f) ()" " = 0" + +-# Call the function, casting the function result to the correct type. +-gdb_test "p (int) foo ()" " = 0" ++ # Call the function, casting the function result to the correct type. ++ gdb_test "p (int) $f ()" " = 0" ++} +-- +2.35.3 + diff --git a/gdb-symtab-workaround-pr-gas-31115.patch b/gdb-symtab-workaround-pr-gas-31115.patch new file mode 100644 index 0000000..d5869cf --- /dev/null +++ b/gdb-symtab-workaround-pr-gas-31115.patch @@ -0,0 +1,122 @@ +From d25e3f4ed05c3a6c207263d7e532f829860b83f0 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Wed, 20 Mar 2024 09:57:49 +0100 +Subject: [PATCH 1/7] [gdb/symtab] Workaround PR gas/31115 + +On arm-linux, with gas 2.40, I run into: +... +(gdb) x /i main+8^M + 0x4e1 : vrhadd.u16 d14, d14, d31^M +(gdb) FAIL: gdb.arch/pr25124.exp: disassemble thumb instruction (1st try) +... + +This is a regression due to PR gas/31115, which makes gas produce a low_pc +with the thumb bit set (0x4d8 & 0x1): +... + <1><24>: Abbrev Number: 2 (DW_TAG_subprogram) + <25> DW_AT_name : main + <29> DW_AT_external : 1 + <29> DW_AT_type : <0x2f> + <2a> DW_AT_low_pc : 0x4d9 + <2e> DW_AT_high_pc : 12 +... + +The regression was introduced in 2.39, and is also present in 2.40 and 2.41, +and hasn't been fixed yet. + +Work around this in read_func_scope, by using gdbarch_addr_bits_remove on +low_pc and high_pc. + +Tested on arm-linux and x86_64-linux. + +PR tdep/31453 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31453 +--- + gdb/dwarf2/cu.c | 1 + + gdb/dwarf2/cu.h | 1 + + gdb/dwarf2/read.c | 22 ++++++++++++++++++++++ + 3 files changed, 24 insertions(+) + +diff --git a/gdb/dwarf2/cu.c b/gdb/dwarf2/cu.c +index f9b05dfc709..7f89500effd 100644 +--- a/gdb/dwarf2/cu.c ++++ b/gdb/dwarf2/cu.c +@@ -42,6 +42,7 @@ dwarf2_cu::dwarf2_cu (dwarf2_per_cu_data *per_cu, + producer_is_clang (false), + producer_is_gas_lt_2_38 (false), + producer_is_gas_2_39 (false), ++ producer_is_gas_ge_2_40 (false), + processing_has_namespace_info (false), + load_all_dies (false) + { +diff --git a/gdb/dwarf2/cu.h b/gdb/dwarf2/cu.h +index ef8db480e3f..1b02f89ed2f 100644 +--- a/gdb/dwarf2/cu.h ++++ b/gdb/dwarf2/cu.h +@@ -267,6 +267,7 @@ struct dwarf2_cu + bool producer_is_clang : 1; + bool producer_is_gas_lt_2_38 : 1; + bool producer_is_gas_2_39 : 1; ++ bool producer_is_gas_ge_2_40 : 1; + + /* When true, the file that we're processing is known to have + debugging info for C++ namespaces. GCC 3.3.x did not produce +diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c +index a4f982962ae..8f2d7a34aef 100644 +--- a/gdb/dwarf2/read.c ++++ b/gdb/dwarf2/read.c +@@ -148,6 +148,7 @@ static int dwarf2_loclist_block_index; + static int ada_block_index; + + static bool producer_is_gas_lt_2_38 (struct dwarf2_cu *cu); ++static bool producer_is_gas_ge_2_39 (struct dwarf2_cu *cu); + + /* Size of .debug_loclists section header for 32-bit DWARF format. */ + #define LOCLIST_HEADER_SIZE32 12 +@@ -10223,6 +10224,15 @@ read_func_scope (struct die_info *die, struct dwarf2_cu *cu) + lowpc = per_objfile->relocate (unrel_low); + highpc = per_objfile->relocate (unrel_high); + ++ if (gdbarch_bfd_arch_info (gdbarch)->arch == bfd_arch_arm ++ && producer_is_gas_ge_2_39 (cu)) ++ { ++ /* Gas version 2.39 produces DWARF for a Thumb subprogram with a low_pc ++ attribute with the thumb bit set (PR gas/31115). Work around this. */ ++ lowpc = gdbarch_addr_bits_remove (gdbarch, lowpc); ++ highpc = gdbarch_addr_bits_remove (gdbarch, highpc); ++ } ++ + /* If we have any template arguments, then we must allocate a + different sort of symbol. */ + for (child_die = die->child; child_die; child_die = child_die->sibling) +@@ -11507,6 +11517,7 @@ check_producer (struct dwarf2_cu *cu) + { + cu->producer_is_gas_lt_2_38 = major < 2 || (major == 2 && minor < 38); + cu->producer_is_gas_2_39 = major == 2 && minor == 39; ++ cu->producer_is_gas_ge_2_40 = major > 2 || (major == 2 && minor >= 40); + } + else + { +@@ -11561,6 +11572,17 @@ producer_is_gas_2_39 (struct dwarf2_cu *cu) + return cu->producer_is_gas_2_39; + } + ++/* Return true if CU is produced by GAS 2.39 or later. */ ++ ++static bool ++producer_is_gas_ge_2_39 (struct dwarf2_cu *cu) ++{ ++ if (!cu->checked_producer) ++ check_producer (cu); ++ ++ return cu->producer_is_gas_2_39 || cu->producer_is_gas_ge_2_40; ++} ++ + /* Return the accessibility of DIE, as given by DW_AT_accessibility. + If that attribute is not available, return the appropriate + default. */ + +base-commit: c79ecacd3f75cfb0ec1a3afc49ca3f30b1759009 +-- +2.35.3 + diff --git a/gdb-tdep-fix-catching-syscall-execve-exit-for-arm.patch b/gdb-tdep-fix-catching-syscall-execve-exit-for-arm.patch new file mode 100644 index 0000000..3aa1420 --- /dev/null +++ b/gdb-tdep-fix-catching-syscall-execve-exit-for-arm.patch @@ -0,0 +1,130 @@ +From e2a2cb30bc4e85f462b817bac5393b3fee1ecf9f Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 21 Nov 2023 11:44:07 +0100 +Subject: [PATCH 3/7] [gdb/tdep] Fix catching syscall execve exit for arm + +When running test-case gdb.base/catch-syscall.exp on a pinebook (64-bit +aarch64 kernel, 32-bit userland) I run into: +... +(gdb) PASS: $exp: execve: syscall(s) execve appears in 'info breakpoints' +continue^M +Continuing.^M +^M +Catchpoint 18 (call to syscall execve), 0xf7726318 in execve () from \ + /lib/arm-linux-gnueabihf/libc.so.6^M +(gdb) PASS: gdb.base/catch-syscall.exp: execve: program has called execve +continue^M +Continuing.^M +process 32392 is executing new program: catch-syscall^M +Cannot access memory at address 0xf77c6a7c^M +(gdb) FAIL: $exp: execve: syscall execve has returned +... + +The memory error is thrown by arm_linux_get_syscall_number, when doing: +... + /* PC gets incremented before the syscall-stop, so read the + previous instruction. */ + unsigned long this_instr = + read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code); +... + +The reason for the error is that we're stopped at the syscall exit of syscall +execve, and the pc is at the first insn of the new exec, which also happens to +be the first insn in the code segment, so consequently we cannot read the +previous insn. + +Fix this by detecting the situation by looking at the register state, similar +to what is done in aarch64_linux_get_syscall_number. + +Furthermore, catch the memory error by using safe_read_memory_unsigned_integer +and return -1 instead, matching the documented behaviour of +arm_linux_get_syscall_number. + +Finally, rather than using a hardcoded constant 11, introduce an ad-hoc +arm_sys_execve. + +Tested on pinebook. + +PR tdep/31071 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31071 +--- + gdb/arm-linux-tdep.c | 42 ++++++++++++++++++++++++++++++++++++++---- + 1 file changed, 38 insertions(+), 4 deletions(-) + +diff --git a/gdb/arm-linux-tdep.c b/gdb/arm-linux-tdep.c +index 33748731cfd..8116c1368ff 100644 +--- a/gdb/arm-linux-tdep.c ++++ b/gdb/arm-linux-tdep.c +@@ -813,6 +813,32 @@ arm_linux_sigreturn_next_pc (struct regcache *regcache, + return next_pc; + } + ++/* Return true if we're at execve syscall-exit-stop. */ ++ ++static bool ++is_execve_syscall_exit (struct regcache *regs) ++{ ++ ULONGEST reg = -1; ++ ++ /* Check that lr is 0. */ ++ regcache_cooked_read_unsigned (regs, ARM_LR_REGNUM, ®); ++ if (reg != 0) ++ return false; ++ ++ /* Check that r0-r8 is 0. */ ++ for (int i = 0; i <= 8; ++i) ++ { ++ reg = -1; ++ regcache_cooked_read_unsigned (regs, ARM_A1_REGNUM + i, ®); ++ if (reg != 0) ++ return false; ++ } ++ ++ return true; ++} ++ ++#define arm_sys_execve 11 ++ + /* At a ptrace syscall-stop, return the syscall number. This either + comes from the SWI instruction (OABI) or from r7 (EABI). + +@@ -830,6 +856,9 @@ arm_linux_get_syscall_number (struct gdbarch *gdbarch, + int is_thumb; + ULONGEST svc_number = -1; + ++ if (is_execve_syscall_exit (regs)) ++ return arm_sys_execve; ++ + regcache_cooked_read_unsigned (regs, ARM_PC_REGNUM, &pc); + regcache_cooked_read_unsigned (regs, ARM_PS_REGNUM, &cpsr); + is_thumb = (cpsr & t_bit) != 0; +@@ -845,9 +874,14 @@ arm_linux_get_syscall_number (struct gdbarch *gdbarch, + + /* PC gets incremented before the syscall-stop, so read the + previous instruction. */ +- unsigned long this_instr = +- read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code); +- ++ unsigned long this_instr; ++ { ++ ULONGEST val; ++ if (!safe_read_memory_unsigned_integer (pc - 4, 4, byte_order_for_code, ++ &val)) ++ return -1; ++ this_instr = val; ++ } + unsigned long svc_operand = (0x00ffffff & this_instr); + + if (svc_operand) +@@ -1265,7 +1299,7 @@ arm_canonicalize_syscall (int syscall) + case 8: return gdb_sys_creat; + case 9: return gdb_sys_link; + case 10: return gdb_sys_unlink; +- case 11: return gdb_sys_execve; ++ case arm_sys_execve: return gdb_sys_execve; + case 12: return gdb_sys_chdir; + case 13: return gdb_sys_time; + case 14: return gdb_sys_mknod; +-- +2.35.3 + diff --git a/gdb-tdep-fix-gdb.base-watch-bitfields.exp-on-aarch64.patch b/gdb-tdep-fix-gdb.base-watch-bitfields.exp-on-aarch64.patch new file mode 100644 index 0000000..2b4fcd5 --- /dev/null +++ b/gdb-tdep-fix-gdb.base-watch-bitfields.exp-on-aarch64.patch @@ -0,0 +1,349 @@ +From 83b2b88c96f87a3649b4440f43a088dc6e292181 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 12 Mar 2024 17:08:18 +0100 +Subject: [PATCH 08/48] [gdb/tdep] Fix gdb.base/watch-bitfields.exp on aarch64 + +On aarch64-linux, with test-case gdb.base/watch-bitfields.exp I run into: +... +(gdb) continue^M +Continuing.^M +^M +Hardware watchpoint 2: -location q.a^M +^M +Old value = 1^M +New value = 0^M +main () at watch-bitfields.c:42^M +42 q.h--;^M +(gdb) FAIL: $exp: -location watch against bitfields: q.e: 0->5: continue +... + +In a minimal form, if we step past line 37 which sets q.e, and we have a +watchpoint set on q.e, it triggers: +... +$ gdb -q -batch watch-bitfields -ex "b 37" -ex run -ex "watch q.e" -ex step +Breakpoint 1 at 0x410204: file watch-bitfields.c, line 37. + +Breakpoint 1, main () at watch-bitfields.c:37 +37 q.e = 5; +Hardware watchpoint 2: q.e + +Hardware watchpoint 2: q.e + +Old value = 0 +New value = 5 +main () at /home/vries/gdb/src/gdb/testsuite/gdb.base/watch-bitfields.c:38 +38 q.f = 6; +... + +However, if we set in addition a watchpoint on q.a, the watchpoint on q.e +doesn't trigger. + +How does this happen? + +Bitfield q.a is just bit 0 of byte 0, and bitfield q.e is bit 4..7 of byte 1 +and bit 1 of byte 2. So, watch q.a should watch byte 0, and watch q.e should +watch bytes 1 and 2. + +Using "maint set show-debug-regs on" (and some more detailed debug prints) we +get: +... +WP2: addr=0x440028 (orig=0x440029), ctrl=0x000000d5, ref.count=1 + ctrl: enabled=1, offset=1, len=2 +WP3: addr=0x440028 (orig=0x440028), ctrl=0x00000035, ref.count=1 + ctrl: enabled=1, offset=0, len=1 +... +which matches that. + +When executing line 37, a hardware watchpoint trap triggers and we hit +aarch64_stopped_data_address with addr_trap == 0x440028: +... +(gdb) p /x addr_trap +$1 = 0x440028 +.... +and since the loop in aarch64_stopped_data_address walks backward, we check +WP3 first, which matches, and consequently target_stopped_by_watchpoint +returns true in watchpoints_triggered. + +Likewise for target_stopped_data_address, which also returns addr == 0x440028. +Watchpoints_triggered matches watchpoint q.a to that address, and sets +watch_triggered_yes. + +However, subsequently the value of q.a is checked, and it's the same value as +before (becase the insn in line 37 didn't change q.a), so the watchpoint +hardware trap is not reported to the user. + +The problem originates from that fact that aarch64_stopped_data_address picked +WP3 instead of WP2. + +There's something we can do about this. In the example above, both +target_stopped_by_watchpoint and target_stopped_data_address returned true. +Instead we can return true in target_stopped_by_watchpoint but false in +target_stopped_data_address. This lets watchpoints_triggered known that a +watchpoint was triggered, but we don't know where, and both watchpoints +get set to watch_triggered_unknown. + +Subsequently, the values of both q.a and q.e are checked, and since q.e is not +the same value as before, the watchpoint hardware trap is reported to the user. + +Note that this works well for regular (write) watchpoints (watch command), but +not for read watchpoints (rwatch command), because for those no value is +checked. Likewise for access watchpoints (awatch command). + +So, fix this by: +- passing a nullptr in aarch64_fbsd_nat_target::stopped_by_watchpoint and + aarch64_linux_nat_target::stopped_by_watchpoint to make clear we're not + interested in the stop address, +- introducing a two-phase approach in aarch64_stopped_data_address, where: + - phase one handles access and read watchpoints, as before, and + - phase two handles write watchpoints, where multiple matches cause: + - return true if addr_p == null, and + - return false if addr_p != null. + +Tested on aarch64-linux. + +Approved-By: Luis Machado + +PR tdep/31214 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31214 +--- + gdb/aarch64-fbsd-nat.c | 4 +- + gdb/aarch64-linux-nat.c | 4 +- + gdb/aarch64-nat.c | 132 ++++++++++++++++++++++++++----------- + gdb/nat/aarch64-hw-point.c | 25 +++++++ + gdb/nat/aarch64-hw-point.h | 2 + + 5 files changed, 123 insertions(+), 44 deletions(-) + +diff --git a/gdb/aarch64-fbsd-nat.c b/gdb/aarch64-fbsd-nat.c +index 38fb093f139..58518248248 100644 +--- a/gdb/aarch64-fbsd-nat.c ++++ b/gdb/aarch64-fbsd-nat.c +@@ -164,9 +164,7 @@ aarch64_fbsd_nat_target::stopped_data_address (CORE_ADDR *addr_p) + bool + aarch64_fbsd_nat_target::stopped_by_watchpoint () + { +- CORE_ADDR addr; +- +- return stopped_data_address (&addr); ++ return stopped_data_address (nullptr); + } + + /* Implement the "stopped_by_hw_breakpoint" target_ops method. */ +diff --git a/gdb/aarch64-linux-nat.c b/gdb/aarch64-linux-nat.c +index c1d59b5d77c..768748a20db 100644 +--- a/gdb/aarch64-linux-nat.c ++++ b/gdb/aarch64-linux-nat.c +@@ -972,9 +972,7 @@ aarch64_linux_nat_target::stopped_data_address (CORE_ADDR *addr_p) + bool + aarch64_linux_nat_target::stopped_by_watchpoint () + { +- CORE_ADDR addr; +- +- return stopped_data_address (&addr); ++ return stopped_data_address (nullptr); + } + + /* Implement the "can_do_single_step" target_ops method. */ +diff --git a/gdb/aarch64-nat.c b/gdb/aarch64-nat.c +index ee8c5a1e21d..89d1ba6acc6 100644 +--- a/gdb/aarch64-nat.c ++++ b/gdb/aarch64-nat.c +@@ -231,46 +231,102 @@ bool + aarch64_stopped_data_address (const struct aarch64_debug_reg_state *state, + CORE_ADDR addr_trap, CORE_ADDR *addr_p) + { +- int i; +- +- for (i = aarch64_num_wp_regs - 1; i >= 0; --i) +- { +- const unsigned int offset +- = aarch64_watchpoint_offset (state->dr_ctrl_wp[i]); +- const unsigned int len = aarch64_watchpoint_length (state->dr_ctrl_wp[i]); +- const CORE_ADDR addr_watch = state->dr_addr_wp[i] + offset; +- const CORE_ADDR addr_watch_aligned = align_down (state->dr_addr_wp[i], 8); +- const CORE_ADDR addr_orig = state->dr_addr_orig_wp[i]; +- +- if (state->dr_ref_count_wp[i] +- && DR_CONTROL_ENABLED (state->dr_ctrl_wp[i]) +- && addr_trap >= addr_watch_aligned +- && addr_trap < addr_watch + len) +- { +- /* ADDR_TRAP reports the first address of the memory range +- accessed by the CPU, regardless of what was the memory +- range watched. Thus, a large CPU access that straddles +- the ADDR_WATCH..ADDR_WATCH+LEN range may result in an +- ADDR_TRAP that is lower than the +- ADDR_WATCH..ADDR_WATCH+LEN range. E.g.: +- +- addr: | 4 | 5 | 6 | 7 | 8 | +- |---- range watched ----| +- |----------- range accessed ------------| +- +- In this case, ADDR_TRAP will be 4. +- +- To match a watchpoint known to GDB core, we must never +- report *ADDR_P outside of any ADDR_WATCH..ADDR_WATCH+LEN +- range. ADDR_WATCH <= ADDR_TRAP < ADDR_ORIG is a false +- positive on kernels older than 4.10. See PR +- external/20207. */ ++ bool found = false; ++ for (int phase = 0; phase <= 1; ++phase) ++ for (int i = aarch64_num_wp_regs - 1; i >= 0; --i) ++ { ++ if (!(state->dr_ref_count_wp[i] ++ && DR_CONTROL_ENABLED (state->dr_ctrl_wp[i]))) ++ { ++ /* Watchpoint disabled. */ ++ continue; ++ } ++ ++ const enum target_hw_bp_type type ++ = aarch64_watchpoint_type (state->dr_ctrl_wp[i]); ++ if (type == hw_execute) ++ { ++ /* Watchpoint disabled. */ ++ continue; ++ } ++ ++ if (phase == 0) ++ { ++ /* Phase 0: No hw_write. */ ++ if (type == hw_write) ++ continue; ++ } ++ else ++ { ++ /* Phase 1: Only hw_write. */ ++ if (type != hw_write) ++ continue; ++ } ++ ++ const unsigned int offset ++ = aarch64_watchpoint_offset (state->dr_ctrl_wp[i]); ++ const unsigned int len ++ = aarch64_watchpoint_length (state->dr_ctrl_wp[i]); ++ const CORE_ADDR addr_watch = state->dr_addr_wp[i] + offset; ++ const CORE_ADDR addr_watch_aligned ++ = align_down (state->dr_addr_wp[i], 8); ++ const CORE_ADDR addr_orig = state->dr_addr_orig_wp[i]; ++ ++ /* ADDR_TRAP reports the first address of the memory range ++ accessed by the CPU, regardless of what was the memory ++ range watched. Thus, a large CPU access that straddles ++ the ADDR_WATCH..ADDR_WATCH+LEN range may result in an ++ ADDR_TRAP that is lower than the ++ ADDR_WATCH..ADDR_WATCH+LEN range. E.g.: ++ ++ addr: | 4 | 5 | 6 | 7 | 8 | ++ |---- range watched ----| ++ |----------- range accessed ------------| ++ ++ In this case, ADDR_TRAP will be 4. */ ++ if (!(addr_trap >= addr_watch_aligned ++ && addr_trap < addr_watch + len)) ++ { ++ /* Not a match. */ ++ continue; ++ } ++ ++ /* To match a watchpoint known to GDB core, we must never ++ report *ADDR_P outside of any ADDR_WATCH..ADDR_WATCH+LEN ++ range. ADDR_WATCH <= ADDR_TRAP < ADDR_ORIG is a false ++ positive on kernels older than 4.10. See PR ++ external/20207. */ ++ if (addr_p != nullptr) + *addr_p = addr_orig; +- return true; +- } +- } + +- return false; ++ if (phase == 0) ++ { ++ /* Phase 0: Return first match. */ ++ return true; ++ } ++ ++ /* Phase 1. */ ++ if (addr_p == nullptr) ++ { ++ /* First match, and we don't need to report an address. No need ++ to look for other matches. */ ++ return true; ++ } ++ ++ if (!found) ++ { ++ /* First match, and we need to report an address. Look for other ++ matches. */ ++ found = true; ++ continue; ++ } ++ ++ /* More than one match, and we need to return an address. No need to ++ look for further matches. */ ++ return false; ++ } ++ ++ return found; + } + + /* Define AArch64 maintenance commands. */ +diff --git a/gdb/nat/aarch64-hw-point.c b/gdb/nat/aarch64-hw-point.c +index 6747e61e026..3b8cdcba23b 100644 +--- a/gdb/nat/aarch64-hw-point.c ++++ b/gdb/nat/aarch64-hw-point.c +@@ -73,6 +73,31 @@ aarch64_watchpoint_length (unsigned int ctrl) + return retval; + } + ++/* Utility function that returns the type of a watchpoint according to the ++ content of a hardware debug control register CTRL. */ ++ ++enum target_hw_bp_type ++aarch64_watchpoint_type (unsigned int ctrl) ++{ ++ unsigned int type = DR_CONTROL_TYPE (ctrl); ++ ++ switch (type) ++ { ++ case 1: ++ return hw_read; ++ case 2: ++ return hw_write; ++ case 3: ++ return hw_access; ++ case 0: ++ /* Reserved for a watchpoint. It must behave as if the watchpoint is ++ disabled. */ ++ return hw_execute; ++ default: ++ gdb_assert_not_reached (""); ++ } ++} ++ + /* Given the hardware breakpoint or watchpoint type TYPE and its + length LEN, return the expected encoding for a hardware + breakpoint/watchpoint control register. */ +diff --git a/gdb/nat/aarch64-hw-point.h b/gdb/nat/aarch64-hw-point.h +index 2ff9ccb5c1c..71ae2864927 100644 +--- a/gdb/nat/aarch64-hw-point.h ++++ b/gdb/nat/aarch64-hw-point.h +@@ -73,6 +73,7 @@ + + #define DR_CONTROL_ENABLED(ctrl) (((ctrl) & 0x1) == 1) + #define DR_CONTROL_MASK(ctrl) (((ctrl) >> 5) & 0xff) ++#define DR_CONTROL_TYPE(ctrl) (((ctrl) >> 3) & 0x3) + + /* Structure for managing the hardware breakpoint/watchpoint resources. + DR_ADDR_* stores the address, DR_CTRL_* stores the control register +@@ -107,6 +108,7 @@ void aarch64_notify_debug_reg_change (ptid_t ptid, int is_watchpoint, + + unsigned int aarch64_watchpoint_offset (unsigned int ctrl); + unsigned int aarch64_watchpoint_length (unsigned int ctrl); ++enum target_hw_bp_type aarch64_watchpoint_type (unsigned int ctrl); + + int aarch64_handle_breakpoint (enum target_hw_bp_type type, CORE_ADDR addr, + int len, int is_insert, ptid_t ptid, +-- +2.35.3 + diff --git a/gdb-tdep-fix-gdb.base-watchpoint-running-on-arm-ppc6.patch b/gdb-tdep-fix-gdb.base-watchpoint-running-on-arm-ppc6.patch new file mode 100644 index 0000000..74340f0 --- /dev/null +++ b/gdb-tdep-fix-gdb.base-watchpoint-running-on-arm-ppc6.patch @@ -0,0 +1,76 @@ +From 1e64a66f72c79874016e78a4672b85cdeb506b9f Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 4 Jun 2024 09:30:03 +0000 +Subject: [PATCH] [gdb/tdep] Fix gdb.base/watchpoint-running on + {arm,ppc64le}-linux + +When running test-case gdb.base/watchpoint-running on ppc64le-linux, we get: +... +(gdb) watch global_var^M +warning: Error when detecting the debug register interface. \ + Debug registers will be unavailable.^M +Watchpoint 2: global_var^M +(gdb) FAIL: $exp: all-stop: hardware: watch global_var +FAIL: $exp: all-stop: hardware: watchpoint hit (timeout) +... + +The problem is that ppc_linux_dreg_interface::detect fails to detect the +hardware watchpoint interface, because the calls to ptrace return with errno +set to ESRCH. + +This is a feature of ptrace: if a call is done while the tracee is not +ptrace-stopped, it returns ESRCH. + +Indeed, in the test-case "watch global_var" is executed while the inferior is +running, and that triggers the first call to ppc_linux_dreg_interface::detect. + +And because the detection failure is cached, subsequent attempts at setting +hardware watchpoints will also fail, even if the tracee is ptrace-stopped. + +Fix this by calling target_can_use_hardware_watchpoint from +linux_init_ptrace_procfs, which is called from both: +- linux_nat_target::post_attach, and +- linux_nat_target::post_startup_inferior. + +By fixing this here, we also fix the same problem for arm-linux. + +Tested on ppc64le-linux and arm-linux. + +PR tdep/31834 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31834 +PR tdep/31705 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31705 + +(cherry picked from commit bbc92bfbf25ad42548100e31e491ed3c32fbfa3e) +--- + gdb/linux-nat.c | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c +index c8991cc3da4..47d74d27e11 100644 +--- a/gdb/linux-nat.c ++++ b/gdb/linux-nat.c +@@ -385,6 +385,18 @@ linux_init_ptrace_procfs (pid_t pid, int attached) + linux_ptrace_init_warnings (); + linux_proc_init_warnings (); + proc_mem_file_is_writable (); ++ ++ /* Some targets (for instance ppc and arm) may call ptrace to answer a ++ target_can_use_hardware_watchpoint query, and cache the result. However, ++ the ptrace call will fail with errno ESRCH if the tracee is not ++ ptrace-stopped, making the query fail. And if the caching mechanism does ++ not disregard an ESRCH result, all subsequent queries will also fail. ++ Call it now, where we known the tracee is ptrace-stopped. ++ ++ Other targets (for instance aarch64) do the relevant ptrace call and ++ caching in their implementation of post_attach and post_startup_inferior, ++ in which case this call is expected to have no effect. */ ++ target_can_use_hardware_watchpoint (bp_hardware_watchpoint, 1, 0); + } + + linux_nat_target::~linux_nat_target () + +base-commit: a6800d9c8145f25001dd39afc3571e3350573e81 +-- +2.35.3 + diff --git a/gdb-tdep-fix-gdb.base-watchpoint-unaligned.exp-on-aa.patch b/gdb-tdep-fix-gdb.base-watchpoint-unaligned.exp-on-aa.patch new file mode 100644 index 0000000..aed0238 --- /dev/null +++ b/gdb-tdep-fix-gdb.base-watchpoint-unaligned.exp-on-aa.patch @@ -0,0 +1,262 @@ +From 3efde6721b362fe0acad348443e4b961d7485717 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 14 Mar 2024 11:25:10 +0100 +Subject: [PATCH 09/48] [gdb/tdep] Fix gdb.base/watchpoint-unaligned.exp on + aarch64 + +On aarch64-linux, with test-case gdb.base/watchpoint-unaligned.exp I run into: +... +(gdb) watch data.u.size8twice[1]^M +Hardware watchpoint 241: data.u.size8twice[1]^M +(gdb) PASS: gdb.base/watchpoint-unaligned.exp: watch data.u.size8twice[1] +continue^M +Continuing.^M +FAIL: gdb.base/watchpoint-unaligned.exp: continue (timeout) +FAIL: gdb.base/watchpoint-unaligned.exp: size8twice write +... + +This happens as follows. + +We start the exec and set an 8-byte hardware watchpoint on +data.u.size8twice[1] at address 0x440048: +... +(gdb) p sizeof (data.u.size8twice[1]) +$1 = 8 +(gdb) p &data.u.size8twice[1] +$2 = (uint64_t *) 0x440048 +... + +We continue execution, and a 16-byte write at address 0x440040 triggers the +hardware watchpoint: +... + 4101c8: a9000801 stp x1, x2, [x0] +... + +When checking whether a watchpoint has triggered in +aarch64_stopped_data_address, we check against address 0x440040 (passed in +parameter addr_trap). This behaviour is documented: +... + /* ADDR_TRAP reports the first address of the memory range + accessed by the CPU, regardless of what was the memory + range watched. ... */ +... +and consequently the matching logic compares against an addr_watch_aligned: +... + && addr_trap >= addr_watch_aligned + && addr_trap < addr_watch + len) +... + +However, the comparison fails: +... +(gdb) p /x addr_watch_aligned +$3 = 0x440048 +(gdb) p addr_trap >= addr_watch_aligned +$4 = false +... + +Consequently, aarch64_stopped_data_address returns false, and +stopped_by_watchpoint returns false, and watchpoints_triggered returns 0, +which make infrun think it's looking at a delayed hardware +breakpoint/watchpoint trap: +... + [infrun] handle_signal_stop: stop_pc=0x4101c8 + [infrun] handle_signal_stop: delayed hardware breakpoint/watchpoint trap, ignoring +... +Infrun then ignores the trap and continues, but runs into the same situation +again and again, causing a hang which then causes the test timeout. + +Fix this by allowing a match 8 bytes below addr_watch_aligned. This +introduces the possibility for false positives, so we only do this for regular +"value changed" watchpoints. + +An earlier version of this patch worked by aligning addr_watch_aligned to 16 +instead of 8: +... +- const CORE_ADDR addr_watch_aligned = align_down (state->dr_addr_wp[i], 8); ++ const CORE_ADDR addr_watch_aligned = align_down (state->dr_addr_wp[i], 16); +... +but while that fixed the test-case, it didn't fix the problem completely, so +extend the test-case to check more scenarios. + +Tested on aarch64-linux. + +Tested-By: Luis Machado +Approved-By: Luis Machado + +PR tdep/29423 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29423 +--- + gdb/aarch64-nat.c | 17 +++- + gdb/testsuite/gdb.base/watchpoint-unaligned.c | 11 +-- + .../gdb.base/watchpoint-unaligned.exp | 78 ++++++++++++------- + 3 files changed, 68 insertions(+), 38 deletions(-) + +diff --git a/gdb/aarch64-nat.c b/gdb/aarch64-nat.c +index 89d1ba6acc6..a173e4e18d5 100644 +--- a/gdb/aarch64-nat.c ++++ b/gdb/aarch64-nat.c +@@ -269,7 +269,7 @@ aarch64_stopped_data_address (const struct aarch64_debug_reg_state *state, + = aarch64_watchpoint_length (state->dr_ctrl_wp[i]); + const CORE_ADDR addr_watch = state->dr_addr_wp[i] + offset; + const CORE_ADDR addr_watch_aligned +- = align_down (state->dr_addr_wp[i], 8); ++ = align_down (state->dr_addr_wp[i], AARCH64_HWP_MAX_LEN_PER_REG); + const CORE_ADDR addr_orig = state->dr_addr_orig_wp[i]; + + /* ADDR_TRAP reports the first address of the memory range +@@ -283,8 +283,19 @@ aarch64_stopped_data_address (const struct aarch64_debug_reg_state *state, + |---- range watched ----| + |----------- range accessed ------------| + +- In this case, ADDR_TRAP will be 4. */ +- if (!(addr_trap >= addr_watch_aligned ++ In this case, ADDR_TRAP will be 4. ++ ++ The access size also can be larger than that of the watchpoint ++ itself. For instance, the access size of an stp instruction is 16. ++ So, if we use stp to store to address p, and set a watchpoint on ++ address p + 8, the reported ADDR_TRAP can be p + 8 (observed on ++ RK3399 SOC). But it also can be p (observed on M1 SOC). Checking ++ for this situation introduces the possibility of false positives, ++ so we only do this for hw_write watchpoints. */ ++ const CORE_ADDR max_access_size = type == hw_write ? 16 : 8; ++ const CORE_ADDR addr_watch_base = addr_watch_aligned - ++ (max_access_size - AARCH64_HWP_MAX_LEN_PER_REG); ++ if (!(addr_trap >= addr_watch_base + && addr_trap < addr_watch + len)) + { + /* Not a match. */ +diff --git a/gdb/testsuite/gdb.base/watchpoint-unaligned.c b/gdb/testsuite/gdb.base/watchpoint-unaligned.c +index b60025a64f4..d854c376be9 100644 +--- a/gdb/testsuite/gdb.base/watchpoint-unaligned.c ++++ b/gdb/testsuite/gdb.base/watchpoint-unaligned.c +@@ -29,7 +29,7 @@ static volatile struct + uint32_t size4[2]; + uint16_t size2[4]; + uint8_t size1[8]; +- uint64_t size8twice[2]; ++ uint64_t size8twice[3]; + } + u; + } data; +@@ -44,13 +44,14 @@ write_size8twice (void) + static const uint64_t second = 2; + + #ifdef __aarch64__ ++ volatile void *p = &data.u.size8twice[offset]; + asm volatile ("stp %1, %2, [%0]" + : /* output */ +- : "r" (data.u.size8twice), "r" (first), "r" (second) /* input */ ++ : "r" (p), "r" (first), "r" (second) /* input */ + : "memory" /* clobber */); + #else +- data.u.size8twice[0] = first; +- data.u.size8twice[1] = second; ++ data.u.size8twice[offset] = first; ++ data.u.size8twice[offset + 1] = second; + #endif + } + +@@ -59,7 +60,7 @@ main (void) + { + volatile uint64_t local; + +- assert (sizeof (data) == 8 + 2 * 8); ++ assert (sizeof (data) == 8 + 3 * 8); + + write_size8twice (); + +diff --git a/gdb/testsuite/gdb.base/watchpoint-unaligned.exp b/gdb/testsuite/gdb.base/watchpoint-unaligned.exp +index d31a9cdc2c8..c58704d033d 100644 +--- a/gdb/testsuite/gdb.base/watchpoint-unaligned.exp ++++ b/gdb/testsuite/gdb.base/watchpoint-unaligned.exp +@@ -151,38 +151,56 @@ foreach wpcount {4 7} { + gdb_assert $got_hit $test + } + +-if ![runto_main] { +- return -1 +-} +-gdb_breakpoint [gdb_get_line_number "final_return"] "Breakpoint $decimal at $hex" "final_return" +-set test {watch data.u.size8twice[1]} +-set wpnum 0 +-gdb_test_multiple $test $test { +- -re "Hardware watchpoint (\[0-9\]+): .*\r\n$gdb_prompt $" { +- set wpnum $expect_out(1,string) +- pass $gdb_test_name +- } +- -re "Watchpoint (\[0-9\]+): .*\r\n$gdb_prompt $" { +- if {[istarget "arm*-*-*"]} { +- untested $gdb_test_name +- } else { +- fail $gdb_test_name +- } +- } +-} +-if {$wpnum} { +- set test "continue" +- set got_hit 0 +- gdb_test_multiple $test $test { +- -re "\r\nCould not insert hardware watchpoint .*\r\n$gdb_prompt $" { ++# We've got an array with 3 8-byte elements. Do a store of 16 bytes, ++# to: ++# - elements 0 and 1 (offset == 0), and ++# - elements 1 and 2 (offset == 1). ++# For each case, check setting a watchpoint at: ++# - the first written element (index == 0), and ++# - the second element (index == 1). ++foreach_with_prefix offset { 0 1 } { ++ foreach_with_prefix index { 0 1 } { ++ ++ clean_restart $binfile ++ ++ if ![runto_main] { ++ return -1 + } +- -re "Hardware watchpoint $wpnum:.*New value = .*\r\n$gdb_prompt $" { +- set got_hit 1 +- send_gdb "continue\n" +- exp_continue ++ ++ gdb_test_no_output "set var offset = $offset" ++ gdb_breakpoint [gdb_get_line_number "final_return"] \ ++ "Breakpoint $decimal at $hex" "final_return" ++ set watch_index [expr $offset + $index] ++ set test "watch data.u.size8twice\[$watch_index\]" ++ set wpnum 0 ++ gdb_test_multiple $test $test { ++ -re "Hardware watchpoint (\[0-9\]+): .*\r\n$gdb_prompt $" { ++ set wpnum $expect_out(1,string) ++ pass $gdb_test_name ++ } ++ -re "Watchpoint (\[0-9\]+): .*\r\n$gdb_prompt $" { ++ if {[istarget "arm*-*-*"]} { ++ untested $gdb_test_name ++ } else { ++ fail $gdb_test_name ++ } ++ } + } +- -re " final_return .*\r\n$gdb_prompt $" { ++ if {$wpnum} { ++ set test "continue" ++ set got_hit 0 ++ gdb_test_multiple $test $test { ++ -re "\r\nCould not insert hardware watchpoint .*\r\n$gdb_prompt $" { ++ } ++ -re "Hardware watchpoint $wpnum:.*New value = .*\r\n$gdb_prompt $" { ++ set got_hit 1 ++ send_gdb "continue\n" ++ exp_continue ++ } ++ -re " final_return .*\r\n$gdb_prompt $" { ++ } ++ } ++ gdb_assert $got_hit "size8twice write" + } + } +- gdb_assert $got_hit "size8twice write" + } +-- +2.35.3 + diff --git a/gdb-tdep-fix-nr-array-elements-in-ppc64_aggregate_ca.patch b/gdb-tdep-fix-nr-array-elements-in-ppc64_aggregate_ca.patch new file mode 100644 index 0000000..0b91eaf --- /dev/null +++ b/gdb-tdep-fix-nr-array-elements-in-ppc64_aggregate_ca.patch @@ -0,0 +1,86 @@ +From 3f0c512dc37dbede372a018732d315726a56d10e Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Wed, 1 Nov 2023 08:07:15 +0100 +Subject: [PATCH] [gdb/tdep] Fix nr array elements in ppc64_aggregate_candidate + +On AlmaLinux 9.2 powerpc64le I run into: +... +(gdb) PASS: gdb.ada/array_return.exp: continuing to Create_Small_Float_Vector +finish^M +Run till exit from #0 pck.create_small_float_vector () at pck.adb:30^M +0x00000000100022d4 in p () at p.adb:25^M +25 Vector := Create_Small_Float_Vector;^M +Value returned is $3 = (2.80259693e-45, 2.80259693e-45)^M +(gdb) FAIL: gdb.ada/array_return.exp: value printed by finish of Create_Small_Float_Vector +... +while this is expected: +... +Value returned is $3 = (4.25, 4.25)^M +... + +The problem is here in ppc64_aggregate_candidate: +... + if (!get_array_bounds (type, &low_bound, &high_bound)) + return -1; + count *= high_bound - low_bound +... + +The array type (containing 2 elements) is: +... + type Small_Float_Vector is array (1 .. 2) of Float; +... +so we have: +... +(gdb) p low_bound +$1 = 1 +(gdb) p high_bound +$2 = 2 +... +but we calculate the number of elements in the array using +"high_bound - low_bound", which is 1. + +Consequently, gdb fails to correctly classify the type as a ELFv2 homogeneous +aggregate. + +Fix this by calculating the number of elements in the array by using +"high_bound - low_bound + 1" instead. + +Furthermore, high_bound can (in general, though perhaps not here) be also be +smaller than low_bound, so to be safe take that into account as well: +... + LONGEST nr_array_elements = (low_bound > high_bound + ? 0 + : (high_bound - low_bound + 1)); + count *= nr_array_elements; +... + +Tested on powerpc64le-linux. + +PR tdep/31015 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31015 +--- + gdb/ppc-sysv-tdep.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/gdb/ppc-sysv-tdep.c b/gdb/ppc-sysv-tdep.c +index 9cea63307e6..dc89201eed2 100644 +--- a/gdb/ppc-sysv-tdep.c ++++ b/gdb/ppc-sysv-tdep.c +@@ -1126,7 +1126,11 @@ ppc64_aggregate_candidate (struct type *type, + + if (!get_array_bounds (type, &low_bound, &high_bound)) + return -1; +- count *= high_bound - low_bound; ++ ++ LONGEST nr_array_elements = (low_bound > high_bound ++ ? 0 ++ : (high_bound - low_bound + 1)); ++ count *= nr_array_elements; + + /* There must be no padding. */ + if (count == 0) + +base-commit: b1136560e772dd4c74f1fbb41f6ba840b92fb9d6 +-- +2.35.3 + diff --git a/gdb-tdep-fix-reverse-execution-of-ldr-immediate-t4.patch b/gdb-tdep-fix-reverse-execution-of-ldr-immediate-t4.patch new file mode 100644 index 0000000..106bb08 --- /dev/null +++ b/gdb-tdep-fix-reverse-execution-of-ldr-immediate-t4.patch @@ -0,0 +1,80 @@ +From b8a8f319b30149f94823302d9120d83b9eee01a4 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 13 Feb 2024 09:10:54 +0100 +Subject: [PATCH 23/48] [gdb/tdep] Fix reverse execution of LDR(immediate) T4 + +When running test-case gdb.reverse/func-map-to-same-line.exp on arm-linux with +target board unix/-mthumb, we run into: +... +(gdb) reverse-step +func2 () at func-map-to-same-line.c:26 +26 { +(gdb) FAIL: gdb.reverse/func-map-to-same-line.exp: \ + column_info_flag=column-info: step-test: reverse-step into func2 +... + +The FAIL is caused by incorrect recording of this insn: +... +4f6: f85d 7b04 ldr.w r7, [sp], #4 +... + +The insn updates the sp, but we don't record this: +... +$ gdb -q -batch func-map-to-same-line \ + -ex "b *func2+8" \ + -ex run \ + -ex record \ + -ex "set debug record 2" \ + -ex stepi +Breakpoint 1 at 0x4f6: file func-map-to-same-line.c, line 27. + +Breakpoint 1, 0xaaaaa4f6 in func2 () at func-map-to-same-line.c:27 +27 } /* END FUNC2 */ +Process record: arm_process_record addr = 0xaaaaa4f6 +Process record: add register num = 15 to record list. +Process record: record_full_arch_list_add 0xabc6c460. +Process record: add register num = 7 to record list. +Process record: record_full_arch_list_add 0xabc3b868. +Process record: add register num = 25 to record list. +... +[ Note that sp is r13, and we see here only r15 (pc), r7, and r25 (ps). ] + +The problem is that the specific insn, an LDR(immediate) T4, is not handled in +thumb2_record_ld_word. + +Fix this by detecting the insn in thumb2_record_ld_word, and recording the +updated base register. + +Tested on arm-linux. + +Reported-By: Thiago Jung Bauermann +Approved-By: Luis Machado + +PR tdep/31278 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31278 +--- + gdb/arm-tdep.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +diff --git a/gdb/arm-tdep.c b/gdb/arm-tdep.c +index 04392115848..3b1682a2aea 100644 +--- a/gdb/arm-tdep.c ++++ b/gdb/arm-tdep.c +@@ -14156,6 +14156,14 @@ thumb2_record_ld_word (arm_insn_decode_record *thumb2_insn_r) + record_buf[1] = ARM_PS_REGNUM; + thumb2_insn_r->reg_rec_count = 2; + ++ if ((thumb2_insn_r->arm_insn & 0xfff00900) == 0xf8500900) ++ { ++ /* Detected LDR(immediate), T4, with write-back bit set. Record Rn ++ update. */ ++ record_buf[2] = bits (thumb2_insn_r->arm_insn, 16, 19); ++ thumb2_insn_r->reg_rec_count++; ++ } ++ + REG_ALLOC (thumb2_insn_r->arm_regs, thumb2_insn_r->reg_rec_count, + record_buf); + return ARM_RECORD_SUCCESS; +-- +2.35.3 + diff --git a/gdb-tdep-s390-add-arch15-record-replay-support.patch b/gdb-tdep-s390-add-arch15-record-replay-support.patch new file mode 100644 index 0000000..fcef18f --- /dev/null +++ b/gdb-tdep-s390-add-arch15-record-replay-support.patch @@ -0,0 +1,168 @@ +From 9afcf99e16a4adecc7d1a18c30bed65a29c96e52 Mon Sep 17 00:00:00 2001 +From: Andreas Arnez +Date: Tue, 19 Nov 2024 18:24:06 +0100 +Subject: [PATCH] [gdb/tdep] s390: Add arch15 record/replay support + +Enable recording of the new "arch15" instructions on z/Architecture +targets. +--- + gdb/s390-tdep.c | 78 +++++++++++++++++++++++++++++++++++++++++++++++-- + 1 file changed, 75 insertions(+), 3 deletions(-) + +diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c +index dcac407caef..e25bcfaf974 100644 +--- a/gdb/s390-tdep.c ++++ b/gdb/s390-tdep.c +@@ -4245,6 +4245,10 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + case 0xb917: /* LLGTR - load logical thirty one bits */ + case 0xb91c: /* MSGFR - multiply single 64<32 */ + case 0xb946: /* BCTGR - branch on count */ ++ case 0xb968: /* CLZG - count leading zeros */ ++ case 0xb969: /* CTZG - count trailing zeros */ ++ case 0xb96c: /* BEXTG - bit extract */ ++ case 0xb96d: /* BDEPG - bit deposit */ + case 0xb984: /* LLGCR - load logical character */ + case 0xb985: /* LLGHR - load logical halfword */ + case 0xb9e2: /* LOCGR - load on condition */ +@@ -5125,7 +5129,14 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + return -1; + break; + +- /* 0xc86-0xc8f undefined */ ++ case 0xc86: /* CAL - compare and load 32 */ ++ case 0xc87: /* CALG - compare and load 64 */ ++ case 0xc8f: /* CALGF - compare and load 64<32 */ ++ if (s390_record_gpr_g (gdbarch, regcache, inib[2])) ++ return -1; ++ if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM)) ++ return -1; ++ break; + + default: + goto UNKNOWN_OP; +@@ -5336,6 +5347,16 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + case 0xe33b: /* LZRF - load and zero rightmost byte */ + case 0xe351: /* MSY - multiply single */ + case 0xe358: /* LY - load */ ++ case 0xe360: /* LXAB - load indexed address (shift 0) */ ++ case 0xe361: /* LLXAB - load logical indexed address (shift 0) */ ++ case 0xe362: /* LXAH - load indexed address (shift 1) */ ++ case 0xe363: /* LLXAH - load logical indexed address (shift 1) */ ++ case 0xe364: /* LXAF - load indexed address (shift 2) */ ++ case 0xe365: /* LLXAF - load logical indexed address (shift 2) */ ++ case 0xe366: /* LXAG - load indexed address (shift 3) */ ++ case 0xe367: /* LLXAG - load logical indexed address (shift 3) */ ++ case 0xe368: /* LXAQ - load indexed address (shift 4) */ ++ case 0xe369: /* LLXAQ - load logical indexed address (shift 4) */ + case 0xe371: /* LAY - load address */ + case 0xe373: /* ICY - insert character */ + case 0xe376: /* LB - load byte */ +@@ -5448,7 +5469,7 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + break; + + /* 0xe35d undefined */ +- /* 0xe360-0xe36f undefined */ ++ /* 0xe36a-0xe36f undefined */ + + case 0xe372: /* STCY - store character */ + case 0xe3c3: /* STCH - store character high */ +@@ -5569,6 +5590,7 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + case 0xe750: /* VPOPCT - vector population count */ + case 0xe752: /* VCTZ - vector count trailing zeros */ + case 0xe753: /* VCLZ - vector count leading zeros */ ++ case 0xe754: /* VGEM - vector generate element masks */ + case 0xe756: /* VLR - vector load */ + case 0xe75f: /* VSEG -vector sign extend to doubleword */ + case 0xe760: /* VMRL - vector merge low */ +@@ -5602,6 +5624,8 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + case 0xe785: /* VBPERM - vector bit permute */ + case 0xe786: /* VSLD - vector shift left double by bit */ + case 0xe787: /* VSRD - vector shift right double by bit */ ++ case 0xe788: /* VEVAL - vector evaluate */ ++ case 0xe789: /* VBLEND - vector blend */ + case 0xe78b: /* VSTRS - vector string search */ + case 0xe78c: /* VPERM - vector permute */ + case 0xe78d: /* VSEL - vector select */ +@@ -5624,6 +5648,10 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + case 0xe7ad: /* VMALO - vector multiply and add logical odd */ + case 0xe7ae: /* VMAE - vector multiply and add even */ + case 0xe7af: /* VMAO - vector multiply and add odd */ ++ case 0xe7b0: /* VDL - vector divide logical */ ++ case 0xe7b1: /* VRL - vector remainder logical */ ++ case 0xe7b2: /* VD - vector divide */ ++ case 0xe7b3: /* VR - vector remainder */ + case 0xe7b4: /* VGFM - vector Galois field multiply sum */ + case 0xe7b8: /* VMSL - vector multiply sum logical */ + case 0xe7b9: /* VACCC - vector add with carry compute carry */ +@@ -5799,6 +5827,8 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + + /* 0xe747-0xe749 undefined */ + ++ case 0xe64a: /* VCVDQ - vector convert to decimal 128 bits */ ++ case 0xe64e: /* VCVBQ - vector convert to binary 128 bits */ + case 0xe651: /* VCLZDP - vector count leading zero digits */ + case 0xe654: /* VUPKZH - vector unpack zoned high */ + case 0xe658: /* VCVD - vector convert to decimal 32 bit */ +@@ -5839,6 +5869,7 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + break; + + case 0xe65f: /* VTP - vector test decimal */ ++ case 0xe67f: /* VTZ - vector test zoned */ + /* flags + FPC */ + if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM)) + return -1; +@@ -5932,7 +5963,48 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, + return -1; + break; + +- /* 0xeb15-0xeb1b undefined */ ++ case 0xeb16: /* PFCR - perform functions with concurrent results */ ++ if (record_full_arch_list_add_reg (regcache, S390_PSWM_REGNUM)) ++ return -1; ++ regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp); ++ oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], ++ ibyte[4]); ++ { ++ uint8_t fc = tmp & 0xff; ++ if (fc == 0) /* PFCR-QAF */ ++ { ++ if (record_full_arch_list_add_mem (oaddr, 16)) ++ return -1; ++ } ++ else if (fc >= 1 && fc <= 4) ++ { ++ /* Compare and swap and double/triple store. */ ++ int bytesize = fc & 1 ? 4 : 8; ++ int startbit = fc >= 3 ? 16 : 32; ++ if (record_full_arch_list_add_reg (regcache, ++ S390_R0_REGNUM + inib[2])) ++ return -1; ++ regcache_raw_read_unsigned (regcache, ++ S390_R0_REGNUM + inib[3], &tmp); ++ for (i = startbit; i < 64; i += 16) ++ { ++ oaddr = s390_record_calc_disp (gdbarch, regcache, 0, ++ (tmp >> i) & 0xffff, 0); ++ if (record_full_arch_list_add_mem (oaddr, bytesize)) ++ return -1; ++ } ++ } ++ else ++ { ++ gdb_printf (gdb_stdlog, ++ "Warning: Unknown PFCR FC %02x at %s.\n", ++ fc, paddress (gdbarch, addr)); ++ return -1; ++ } ++ } ++ break; ++ ++ /* 0xeb17-0xeb1b undefined */ + /* 0xeb1e-0xeb1f undefined */ + /* 0xeb22 undefined */ + + +base-commit: 029bb9a91184eae765dda5220ccfb29d7d02f395 +-- +2.43.0 + diff --git a/gdb-test-bt-cfi-without-die.patch b/gdb-test-bt-cfi-without-die.patch new file mode 100644 index 0000000..29b6bc0 --- /dev/null +++ b/gdb-test-bt-cfi-without-die.patch @@ -0,0 +1,214 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-test-bt-cfi-without-die.patch + +;; [delayed-symfile] Test a backtrace regression on CFIs without DIE (BZ 614604). +;;=fedoratest + +http://sourceware.org/ml/archer/2010-q3/msg00028.html + +On Wed, 25 Feb 2009 00:14:29 +0100, Jan Kratochvil wrote: +> commit 6a37c2b9962258ecf9299cc34a650e64a06acaa5 +> +> There was a regression on gdb.base/savedregs.exp. +> +> quick_addrmap/require_partial_symbols should be used even for the unwind debug +> info checking as its load has been also delayed by this branch. +[...] +> --- a/gdb/dwarf2-frame.c +> +++ b/gdb/dwarf2-frame.c +[...] +> @@ -1499,6 +1500,14 @@ dwarf2_frame_find_fde (CORE_ADDR *pc) +> struct dwarf2_fde *fde; +> CORE_ADDR offset; +> +> + if (objfile->quick_addrmap) +> + { +> + if (!addrmap_find (objfile->quick_addrmap, *pc)) +> + continue; +> + } +> + /* FIXME: Read-in only .debug_frame/.eh_frame without .debug_info? */ +> + require_partial_symbols (objfile); +> + + +but this has caused a different regression (as discussed in the confcall). + +QUICK_ADDRMAP is built only from .debug_aranges. But we can have existing +built .debug_aranges for CUs in OBJFILE but still some CUs do not need to have +DWARF at all while they can feature CFIs (.eh_frame or .debug_frame). +It has been described by Daniel Jacobowitz at: + Re: [2/4] RFC: check psymtabs_addrmap before reading FDEs + http://sourceware.org/ml/gdb-patches/2010-07/msg00012.html + +Sorry for this regression by me (in that fix of a different regression). + +Fixed it the "slow way" as this branch is now obsoleted by .gdb-index. + +No regressions on {x86_64,x86_64-m32,i686}-fedora13-linux-gnu. + +Checked-in. + +Thanks, +Jan + +eb8df8566acc1ed963e3e9b77c13b9c2c3db03fb + +Test CFI is parsed even for range (function) not described by any DIE. + +https://bugzilla.redhat.com/show_bug.cgi?id=614028 + +gdb/ + * dwarf2-frame.c (dwarf2_frame_find_fde): Remove the + OBJFILE->QUICK_ADDRMAP check. New comment why. + +gdb/testsuite/ + * gdb.base/cfi-without-die.exp, gdb.base/cfi-without-die-main.c, + gdb.base/cfi-without-die-caller.c: New files. + +diff --git a/gdb/testsuite/gdb.base/cfi-without-die-caller.c b/gdb/testsuite/gdb.base/cfi-without-die-caller.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/cfi-without-die-caller.c +@@ -0,0 +1,28 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2005, 2007, 2008, 2009, 2010 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 . */ ++ ++typedef int (*callback_t) (void); ++ ++int ++caller (callback_t callback) ++{ ++ /* Ensure some frame content to push away the return address. */ ++ volatile const long one = 1; ++ ++ /* Modify the return value to prevent any tail-call optimization. */ ++ return (*callback) () - one; ++} +diff --git a/gdb/testsuite/gdb.base/cfi-without-die-main.c b/gdb/testsuite/gdb.base/cfi-without-die-main.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/cfi-without-die-main.c +@@ -0,0 +1,32 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2005, 2007, 2008, 2009, 2010 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 . */ ++ ++typedef int (*callback_t) (void); ++ ++extern int caller (callback_t callback); ++ ++int ++callback (void) ++{ ++ return 1; ++} ++ ++int ++main (void) ++{ ++ return caller (callback); ++} +diff --git a/gdb/testsuite/gdb.base/cfi-without-die.exp b/gdb/testsuite/gdb.base/cfi-without-die.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/cfi-without-die.exp +@@ -0,0 +1,71 @@ ++# Copyright 2010 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 CFI is parsed even for range (function) not described by any DIE. ++ ++set testfile cfi-without-die ++set srcmainfile ${testfile}-main.c ++set srccallerfile ${testfile}-caller.c ++set executable ${testfile} ++set objmainfile [standard_output_file ${testfile}-main.o] ++set objcallerfile [standard_output_file ${testfile}-caller.o] ++set binfile [standard_output_file ${executable}] ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srccallerfile}" ${objcallerfile} \ ++ object [list {additional_flags=-fomit-frame-pointer -fno-unwind-tables -fno-asynchronous-unwind-tables}]] != "" ++ || [gdb_compile "${srcdir}/${subdir}/${srcmainfile}" ${objmainfile} object {debug}] != "" ++ || [gdb_compile "${objmainfile} ${objcallerfile}" ${binfile} executable {}] != "" } { ++ untested ${testfile}.exp ++ return -1 ++} ++ ++clean_restart $executable ++ ++if ![runto callback] then { ++ fail "verify unwinding: Can't run to callback" ++ return 0 ++} ++set test "verify unwinding breaks without CFI" ++gdb_test_multiple "bt" $test { ++ -re " in \[?\]\[?\] .*\r\n$gdb_prompt $" { ++ # It may backtrace through some random frames even to main(). ++ pass $test ++ } ++ -re " in main .*\r\n$gdb_prompt $" { ++ fail $test ++ } ++ -re "\r\n$gdb_prompt $" { ++ pass $test ++ } ++} ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srccallerfile}" ${objcallerfile} \ ++ object [list {additional_flags=-fomit-frame-pointer -funwind-tables -fasynchronous-unwind-tables}]] != "" ++ || [gdb_compile "${srcdir}/${subdir}/${srcmainfile}" ${objmainfile} object {debug}] != "" ++ || [gdb_compile "${objmainfile} ${objcallerfile}" ${binfile} executable {}] != "" } { ++ untested ${testfile}.exp ++ return -1 ++} ++ ++clean_restart $executable ++ ++if ![runto callback] then { ++ fail "test CFI without DIEs: Can't run to callback" ++ return 0 ++} ++# #0 callback () at ... ++# #1 0x00000000004004e9 in caller () ++# #2 0x00000000004004cd in main () at ... ++gdb_test "bt" "#0 +callback \[^\r\n\]+\r\n#1 \[^\r\n\]+ in caller \[^\r\n\]+\r\n#2 \[^\r\n\]+ in main \[^\r\n\]+" "verify unwindin works for CFI without DIEs" diff --git a/gdb-test-dw2-aranges.patch b/gdb-test-dw2-aranges.patch new file mode 100644 index 0000000..d88d3f4 --- /dev/null +++ b/gdb-test-dw2-aranges.patch @@ -0,0 +1,220 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Fedora GDB patches +Date: Fri, 27 Oct 2017 21:07:50 +0200 +Subject: gdb-test-dw2-aranges.patch + +;; [archer-tromey-delayed-symfile] New test gdb.dwarf2/dw2-aranges.exp. +;;=fedoratest + +[archer-tromey-delayed-symfile] + +commit 77fa7778a37b0d28a7e4e5235f074a10ecf1815d +Author: Jan Kratochvil +Date: Sat Aug 15 15:05:54 2009 +0200 + + Test for "handle incorrect aranges". + + readelf: + Contents of the .debug_aranges section: + + Length: 8 + Version: 2 + Offset into .debug_info: 0x0 + Pointer Size: 0 + Segment Size: 0 + + Address Length + Floating point exception + + * gdb.dwarf2/dw2-aranges.exp, gdb.dwarf2/dw2-aranges.S: New files. + +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-aranges.S b/gdb/testsuite/gdb.dwarf2/dw2-aranges.S +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.dwarf2/dw2-aranges.S +@@ -0,0 +1,140 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2004, 2007, 2008, 2009 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 .debug_aranges containing zero address_size. */ ++ ++/* Dummy function to provide debug information for. */ ++ ++ .text ++.Lbegin_text1: ++ .globl main ++ .type main, %function ++main: ++.Lbegin_main: ++ .int 0 ++.Lend_main: ++ .size main, .-main ++.Lend_text1: ++ ++/* Debug information */ ++ ++ .section .debug_info ++.Lcu1_begin: ++ /* CU header */ ++ .4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */ ++.Lcu1_start: ++ .2byte 2 /* DWARF Version */ ++ .4byte .Labbrev1_begin /* Offset into abbrev section */ ++ .byte 4 /* Pointer size */ ++ ++ /* CU die */ ++ .uleb128 1 /* Abbrev: DW_TAG_compile_unit */ ++ .4byte .Lend_text1 /* DW_AT_high_pc */ ++ .4byte .Lbegin_text1 /* DW_AT_low_pc */ ++ .ascii "file1.txt\0" /* DW_AT_name */ ++ .ascii "GNU C 3.3.3\0" /* DW_AT_producer */ ++ .byte 1 /* DW_AT_language (C) */ ++ ++ /* main */ ++ .uleb128 2 /* Abbrev: DW_TAG_subprogram */ ++ .byte 1 /* DW_AT_external */ ++ .byte 1 /* DW_AT_decl_file */ ++ .byte 2 /* DW_AT_decl_line */ ++ .ascii "main\0" /* DW_AT_name */ ++ .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ ++ .4byte .Lbegin_main /* DW_AT_low_pc */ ++ .4byte .Lend_main /* DW_AT_high_pc */ ++ .byte 1 /* DW_AT_frame_base: length */ ++ .byte 0x55 /* DW_AT_frame_base: DW_OP_reg5 */ ++ ++.Ltype_int: ++ .uleb128 3 /* Abbrev: DW_TAG_base_type */ ++ .ascii "int\0" /* DW_AT_name */ ++ .byte 4 /* DW_AT_byte_size */ ++ .byte 5 /* DW_AT_encoding */ ++ ++ .byte 0 /* End of children of CU */ ++ ++.Lcu1_end: ++ ++/* Abbrev table */ ++ .section .debug_abbrev ++.Labbrev1_begin: ++ .uleb128 1 /* Abbrev code */ ++ .uleb128 0x11 /* DW_TAG_compile_unit */ ++ .byte 1 /* has_children */ ++ .uleb128 0x12 /* DW_AT_high_pc */ ++ .uleb128 0x1 /* DW_FORM_addr */ ++ .uleb128 0x11 /* DW_AT_low_pc */ ++ .uleb128 0x1 /* DW_FORM_addr */ ++ .uleb128 0x3 /* DW_AT_name */ ++ .uleb128 0x8 /* DW_FORM_string */ ++ .uleb128 0x25 /* DW_AT_producer */ ++ .uleb128 0x8 /* DW_FORM_string */ ++ .uleb128 0x13 /* DW_AT_language */ ++ .uleb128 0xb /* DW_FORM_data1 */ ++ .byte 0x0 /* Terminator */ ++ .byte 0x0 /* Terminator */ ++ ++ .uleb128 2 /* Abbrev code */ ++ .uleb128 0x2e /* DW_TAG_subprogram */ ++ .byte 0 /* has_children */ ++ .uleb128 0x3f /* DW_AT_external */ ++ .uleb128 0xc /* DW_FORM_flag */ ++ .uleb128 0x3a /* DW_AT_decl_file */ ++ .uleb128 0xb /* DW_FORM_data1 */ ++ .uleb128 0x3b /* DW_AT_decl_line */ ++ .uleb128 0xb /* DW_FORM_data1 */ ++ .uleb128 0x3 /* DW_AT_name */ ++ .uleb128 0x8 /* DW_FORM_string */ ++ .uleb128 0x49 /* DW_AT_type */ ++ .uleb128 0x13 /* DW_FORM_ref4 */ ++ .uleb128 0x11 /* DW_AT_low_pc */ ++ .uleb128 0x1 /* DW_FORM_addr */ ++ .uleb128 0x12 /* DW_AT_high_pc */ ++ .uleb128 0x1 /* DW_FORM_addr */ ++ .uleb128 0x40 /* DW_AT_frame_base */ ++ .uleb128 0xa /* DW_FORM_block1 */ ++ .byte 0x0 /* Terminator */ ++ .byte 0x0 /* Terminator */ ++ ++ .uleb128 3 /* Abbrev code */ ++ .uleb128 0x24 /* DW_TAG_base_type */ ++ .byte 0 /* has_children */ ++ .uleb128 0x3 /* DW_AT_name */ ++ .uleb128 0x8 /* DW_FORM_string */ ++ .uleb128 0xb /* DW_AT_byte_size */ ++ .uleb128 0xb /* DW_FORM_data1 */ ++ .uleb128 0x3e /* DW_AT_encoding */ ++ .uleb128 0xb /* DW_FORM_data1 */ ++ .byte 0x0 /* Terminator */ ++ .byte 0x0 /* Terminator */ ++ ++ .byte 0x0 /* Terminator */ ++ .byte 0x0 /* Terminator */ ++ ++/* aranges table */ ++ .section .debug_aranges ++ .long .Laranges_end - 1f ++1: ++ .2byte 2 /* aranges Version */ ++ .4byte .Lcu1_begin - .debug_info /* Offset into .debug_info section */ ++ /* The GDB crasher is this zero value. */ ++ .byte 0 /* aranges address_size */ ++ .byte 0 /* aranges segment_size */ ++ ++.Laranges_end: +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-aranges.exp b/gdb/testsuite/gdb.dwarf2/dw2-aranges.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.dwarf2/dw2-aranges.exp +@@ -0,0 +1,40 @@ ++# Copyright 2004, 2005, 2007, 2008, 2009 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 .debug_aranges containing zero address_size. ++ ++# This test can only be run on targets which support DWARF-2 and use gas. ++# For now pick a sampling of likely targets. ++if {![istarget *-*-linux*] ++ && ![istarget *-*-gnu*] ++ && ![istarget *-*-elf*] ++ && ![istarget *-*-openbsd*] ++ && ![istarget arm-*-eabi*] ++ && ![istarget powerpc-*-eabi*]} { ++ return 0 ++} ++ ++set testfile "dw2-aranges" ++set srcfile ${testfile}.S ++set binfile [standard_output_file ${testfile}] ++ ++if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {nodebug}] != "" } { ++ return -1 ++} ++ ++clean_restart $testfile ++ ++# Failed gdb_load would abort the testcase execution earlier. ++pass "file loaded" diff --git a/gdb-testsuite-ada-pie.patch b/gdb-testsuite-ada-pie.patch new file mode 100644 index 0000000..0a54bc6 --- /dev/null +++ b/gdb-testsuite-ada-pie.patch @@ -0,0 +1,121 @@ +From 6de9111c512de99fd8cb3ea89f9890b1d72f6ef0 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 21 Apr 2023 09:12:35 +0200 +Subject: [PATCH] Compile ada hello world for skip_ada_tests + +For openSUSE Leap 15.0 with gcc-PIE installed (which makes gcc create PIE +executables by default) we get: +... +FAIL: gdb.ada/O2_float_param.exp: compilation foo.adb +... + +The problem is that while gcc-PIE affects gcc, it does not affect gnatlink, +so it links in the libgnat.a, rather than libgnat_pic.a. [ This is +bsc#1115034. ] + +[ Without gcc-PIE, we have a related problem: if we run ada tests with +--target_board=unix/-fPIE/-pie, which makes sure PIE executables are generated +for c/c++ test-cases, still we get non-PIE ada executables, because gnatmake +does not pass -pie to gnatlink. And if gnatmake would pass -pie to gnatlink, +we'd run into the same FAIL as above because gnatlink does not use use +libgnat_pic.a when -pie is specified (this is PR gcc/87936). So, in order to +have ada tests generate PIE executables, we need +--target_board=unix/-fPIE/-largs/-pie/-lgnat_pic/-margs, which will not work +with c/c++ test-cases. ] + +For now, we check whether we can compile an ada hello world, and if not, +generate an UNSUPPORTED in either skip_ada_tests or gdb_compile_ada, to +not have this problem result in ~200 FAILs. + +gdb/testsuite/ChangeLog: + +2020-11-06 Tom de Vries + + * lib/ada.exp (gdb_compile_ada): Call gdb_can_compile_ada. + (gdb_can_compile_ada): New gdb_caching_proc. + * lib/gdb.exp: Add load_lib ada.exp. + (skip_ada_tests): Return 1 if !gdb_can_compile_ada. +--- + gdb/testsuite/lib/ada.exp | 31 +++++++++++++++++++++++++++++++ + gdb/testsuite/lib/gdb.exp | 8 ++++++++ + 2 files changed, 39 insertions(+) + +diff --git a/gdb/testsuite/lib/ada.exp b/gdb/testsuite/lib/ada.exp +index 4bf1368f29f..7d8fbf01fbd 100644 +--- a/gdb/testsuite/lib/ada.exp ++++ b/gdb/testsuite/lib/ada.exp +@@ -90,12 +90,43 @@ proc gdb_compile_ada_1 {source dest type options} { + # compile was successful. + + proc gdb_compile_ada {source dest type options} { ++ if { [gdb_can_compile_ada] == 0 } { ++ global gdb_test_file_name ++ unsupported "$gdb_test_file_name" ++ return "Cannot compile ada" ++ } + set result [gdb_compile_ada_1 $source $dest $type $options] + + gdb_compile_test $source $result + return $result + } + ++gdb_caching_proc gdb_can_compile_ada {} { ++ set name "hello" ++ set dir "[pwd]/tmp-ada-hello-[pid]" ++ set src "$dir/$name.adb" ++ set dest "$dir/$name" ++ ++ set code { ++ with Ada.Text_IO; ++ ++ procedure Hello is ++ begin ++ Ada.Text_IO.Put_Line("Hello, world!"); ++ end Hello; ++ } ++ ++ file mkdir $dir ++ gdb_produce_source $src $code ++ set res [gdb_compile_ada_1 $src $dest executable {debug}] ++ file delete -force $dir ++ ++ if { $res != "" } { ++ return 0 ++ } ++ return 1 ++} ++ + # Like standard_testfile, but for Ada. Historically the Ada tests + # used a different naming convention from many of the other gdb tests, + # and this difference was preserved during the conversion to +diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp +index 990d0c8a70f..6c1f59ef4a6 100644 +--- a/gdb/testsuite/lib/gdb.exp ++++ b/gdb/testsuite/lib/gdb.exp +@@ -145,6 +145,7 @@ load_lib cache.exp + load_lib gdb-utils.exp + load_lib memory.exp + load_lib check-test-names.exp ++load_lib ada.exp + + # The path to the GDB binary to test. + global GDB +@@ -2538,6 +2539,13 @@ proc allow_ada_tests {} { + # Currently gdb_ada_compile doesn't support remote host. + return 0 + } ++ ++ if { [gdb_can_compile_ada] == 0 } { ++ global gdb_test_file_name ++ unsupported "$gdb_test_file_name" ++ return 0 ++ } ++ + return 1 + } + + +base-commit: af4a87e2b3c2ac5acae1e6f4405fc59e1218de74 +-- +2.35.3 + diff --git a/gdb-testsuite-add-gdb.dwarf2-backward-spec-inter-cu..patch b/gdb-testsuite-add-gdb.dwarf2-backward-spec-inter-cu..patch new file mode 100644 index 0000000..85f633f --- /dev/null +++ b/gdb-testsuite-add-gdb.dwarf2-backward-spec-inter-cu..patch @@ -0,0 +1,128 @@ +From 088088cf78b937cff973c95ec6da2d86ea173b48 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sun, 24 Sep 2023 12:30:10 +0200 +Subject: [PATCH 07/13] [gdb/testsuite] Add + gdb.dwarf2/backward-spec-inter-cu.exp + +Add another regression test for PR symtab/30846. + +Tested on x86_64-linux. + +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30846 +--- + .../gdb.dwarf2/backward-spec-inter-cu.exp | 103 ++++++++++++++++++ + 1 file changed, 103 insertions(+) + create mode 100644 gdb/testsuite/gdb.dwarf2/backward-spec-inter-cu.exp + +diff --git a/gdb/testsuite/gdb.dwarf2/backward-spec-inter-cu.exp b/gdb/testsuite/gdb.dwarf2/backward-spec-inter-cu.exp +new file mode 100644 +index 00000000000..59b3db50dbb +--- /dev/null ++++ b/gdb/testsuite/gdb.dwarf2/backward-spec-inter-cu.exp +@@ -0,0 +1,103 @@ ++# Copyright 2023 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++# Check that the DWARF reader works with a a DW_AT_specification that ++# refers to an earlier DIE. Inter-cu variant of forward-spec.exp. ++ ++load_lib dwarf.exp ++ ++# This test can only be run on targets which support DWARF-2 and use gas. ++require dwarf2_support ++ ++standard_testfile main.c -debug.S ++ ++# Set up the DWARF for the test. ++set asm_file [standard_output_file $srcfile2] ++Dwarf::assemble $asm_file { ++ global srcfile ++ ++ declare_labels spec ++ ++ cu {} { ++ DW_TAG_compile_unit { ++ {DW_AT_language @DW_LANG_C_plus_plus} ++ } { ++ declare_labels myint ++ ++ myint: DW_TAG_base_type { ++ {DW_AT_byte_size 4 DW_FORM_sdata} ++ {DW_AT_encoding @DW_ATE_signed} ++ {DW_AT_name myint} ++ } ++ ++ DW_TAG_namespace { ++ {DW_AT_name ns} ++ } { ++ spec: DW_TAG_variable { ++ {DW_AT_name v} ++ {DW_AT_type :$myint} ++ {DW_AT_declaration 1 DW_FORM_flag_present} ++ } ++ } ++ } ++ } ++ ++ cu {} { ++ DW_TAG_compile_unit { ++ {DW_AT_language @DW_LANG_C_plus_plus} ++ } { ++ # The new indexer has special code to compute the full ++ # name of an object that uses a specification that appears ++ # later in the DWARF. ++ DW_TAG_variable { ++ {DW_AT_specification %$spec} ++ {DW_AT_location { ++ DW_OP_const1u 23 ++ DW_OP_stack_value ++ } SPECIAL_expr} ++ } ++ } ++ } ++} ++ ++if {[build_executable "failed to build executable" ${testfile} \ ++ [list $srcfile $asm_file] {nodebug}]} { ++ return -1 ++} ++ ++set eol "\r\n" ++set ws "\[ \t\]" ++ ++set worker_threads_list {} ++ ++# Exercises the intra-shard case. ++lappend worker_threads_list 0 ++ ++# Might exercise the inter-shard case. ++lappend worker_threads_list default ++ ++foreach_with_prefix worker_threads $worker_threads_list { ++ ++ clean_restart ++ ++ if { $worker_threads != "default" } { ++ gdb_test_no_output "maint set worker-threads $worker_threads" ++ } ++ ++ gdb_load $binfile ++ ++ gdb_test "maint print objfiles" "$eol$ws+qualified:$ws+ns::v$eol.*" \ ++ "v has parent ns" ++} +-- +2.35.3 + diff --git a/gdb-testsuite-add-gdb.dwarf2-forward-spec-inter-cu.e.patch b/gdb-testsuite-add-gdb.dwarf2-forward-spec-inter-cu.e.patch new file mode 100644 index 0000000..cd0ea71 --- /dev/null +++ b/gdb-testsuite-add-gdb.dwarf2-forward-spec-inter-cu.e.patch @@ -0,0 +1,128 @@ +From a022afb07305b50fd6372015bef6c51ae461c6a9 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sun, 24 Sep 2023 12:33:59 +0200 +Subject: [PATCH 06/13] [gdb/testsuite] Add + gdb.dwarf2/forward-spec-inter-cu.exp + +Add a regression test for PR symtab/30846. + +Tested on x86_64-linux. + +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30846 +--- + .../gdb.dwarf2/forward-spec-inter-cu.exp | 103 ++++++++++++++++++ + 1 file changed, 103 insertions(+) + create mode 100644 gdb/testsuite/gdb.dwarf2/forward-spec-inter-cu.exp + +diff --git a/gdb/testsuite/gdb.dwarf2/forward-spec-inter-cu.exp b/gdb/testsuite/gdb.dwarf2/forward-spec-inter-cu.exp +new file mode 100644 +index 00000000000..d8367b0a162 +--- /dev/null ++++ b/gdb/testsuite/gdb.dwarf2/forward-spec-inter-cu.exp +@@ -0,0 +1,103 @@ ++# Copyright 2023 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++# Check that the DWARF reader works with a a DW_AT_specification that ++# refers to a later DIE. Inter-cu variant of forward-spec.exp. ++ ++load_lib dwarf.exp ++ ++# This test can only be run on targets which support DWARF-2 and use gas. ++require dwarf2_support ++ ++standard_testfile main.c -debug.S ++ ++# Set up the DWARF for the test. ++set asm_file [standard_output_file $srcfile2] ++Dwarf::assemble $asm_file { ++ global srcfile ++ ++ declare_labels spec ++ ++ cu {} { ++ DW_TAG_compile_unit { ++ {DW_AT_language @DW_LANG_C_plus_plus} ++ } { ++ # The new indexer has special code to compute the full ++ # name of an object that uses a specification that appears ++ # later in the DWARF. ++ DW_TAG_variable { ++ {DW_AT_specification %$spec} ++ {DW_AT_location { ++ DW_OP_const1u 23 ++ DW_OP_stack_value ++ } SPECIAL_expr} ++ } ++ } ++ } ++ ++ cu {} { ++ DW_TAG_compile_unit { ++ {DW_AT_language @DW_LANG_C_plus_plus} ++ } { ++ declare_labels myint ++ ++ myint: DW_TAG_base_type { ++ {DW_AT_byte_size 4 DW_FORM_sdata} ++ {DW_AT_encoding @DW_ATE_signed} ++ {DW_AT_name myint} ++ } ++ ++ DW_TAG_namespace { ++ {DW_AT_name ns} ++ } { ++ spec: DW_TAG_variable { ++ {DW_AT_name v} ++ {DW_AT_type :$myint} ++ {DW_AT_declaration 1 DW_FORM_flag_present} ++ } ++ } ++ } ++ } ++} ++ ++if {[build_executable "failed to build executable" ${testfile} \ ++ [list $srcfile $asm_file] {nodebug}]} { ++ return -1 ++} ++ ++set eol "\r\n" ++set ws "\[ \t\]" ++ ++set worker_threads_list {} ++ ++# Exercises the intra-shard case. ++lappend worker_threads_list 0 ++ ++# Might exercise the inter-shard case. ++lappend worker_threads_list default ++ ++foreach_with_prefix worker_threads $worker_threads_list { ++ ++ clean_restart ++ ++ if { $worker_threads != "default" } { ++ gdb_test_no_output "maint set worker-threads $worker_threads" ++ } ++ ++ gdb_load $binfile ++ ++ gdb_test "maint print objfiles" "$eol$ws+qualified:$ws+ns::v$eol.*" \ ++ "v has parent ns" ++} +-- +2.35.3 + diff --git a/gdb-testsuite-add-gdb.suse-debranding.exp.patch b/gdb-testsuite-add-gdb.suse-debranding.exp.patch new file mode 100644 index 0000000..1edf545 --- /dev/null +++ b/gdb-testsuite-add-gdb.suse-debranding.exp.patch @@ -0,0 +1,68 @@ +From b08bf94f170dd39db21cf8f62941f1866b6978c0 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 16 Feb 2023 11:36:47 +0100 +Subject: [PATCH 080/155] Add gdb.suse/debranding.exp + +--- + gdb/testsuite/gdb.suse/debranding.exp | 49 +++++++++++++++++++++++++++ + 1 file changed, 49 insertions(+) + create mode 100644 gdb/testsuite/gdb.suse/debranding.exp + +diff --git a/gdb/testsuite/gdb.suse/debranding.exp b/gdb/testsuite/gdb.suse/debranding.exp +new file mode 100644 +index 00000000000..cdee10b75a7 +--- /dev/null ++++ b/gdb/testsuite/gdb.suse/debranding.exp +@@ -0,0 +1,49 @@ ++# Copyright 2023 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++# There's a problem with dumping the entire output into gdb.log ++# on SLE-11, so redirect to file instead. Also means the gdb.log ++# is smaller. ++set f [standard_output_file "gdb-strings.txt"] ++ ++# Not using remote_exec due to using file redirection. ++set cmd "exec strings $GDB > $f" ++set status [catch $cmd msg] ++verbose -log "status: $status" ++verbose -log "msg: $msg" ++gdb_assert { $status == 0 } ++ ++set fp [open $f r] ++set output [read $fp] ++close $fp ++ ++set re {^.*(?:fedora|red[^a-z]?hat).*$} ++set matches [regexp -line -nocase -all -inline $re $output] ++ ++set disallowed_matches 0 ++set allowed_re "warning: deprecated Red Hat reloc" ++foreach match $matches { ++ if { [regexp -nocase $allowed_re $match] } { ++ verbose -log "allowed_match: '$match'" ++ continue ++ } ++ ++ verbose -log "disallowed_match: '$match'" ++ incr disallowed_matches ++} ++ ++gdb_assert { $disallowed_matches == 0 } ++ ++remote_file build delete $f +-- +2.35.3 + diff --git a/gdb-testsuite-add-gdb.suse-zypper-hint.exp.patch b/gdb-testsuite-add-gdb.suse-zypper-hint.exp.patch new file mode 100644 index 0000000..b1d3bf2 --- /dev/null +++ b/gdb-testsuite-add-gdb.suse-zypper-hint.exp.patch @@ -0,0 +1,101 @@ +gdb-testsuite-add-gdb.suse-zypper-hint.exp + +[gdb/testsuite] Add gdb.suse/zypper-hint.exp + +--- + gdb/testsuite/gdb.suse/zypper-hint.c | 25 ++++++++++++++++ + gdb/testsuite/gdb.suse/zypper-hint.exp | 55 ++++++++++++++++++++++++++++++++++ + 2 files changed, 80 insertions(+) + +diff --git a/gdb/testsuite/gdb.suse/zypper-hint.c b/gdb/testsuite/gdb.suse/zypper-hint.c +new file mode 100644 +index 00000000000..e179788f04f +--- /dev/null ++++ b/gdb/testsuite/gdb.suse/zypper-hint.c +@@ -0,0 +1,25 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2021 Free Software Foundation, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++#include ++ ++int ++main (void) ++{ ++ printf ("hello\n"); ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.suse/zypper-hint.exp b/gdb/testsuite/gdb.suse/zypper-hint.exp +new file mode 100644 +index 00000000000..c2b9a1134bd +--- /dev/null ++++ b/gdb/testsuite/gdb.suse/zypper-hint.exp +@@ -0,0 +1,55 @@ ++# Copyright 2021 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++standard_testfile .c ++ ++if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } { ++ return -1 ++} ++ ++clean_restart ${binfile} ++ ++gdb_test_no_output "set build-id-verbose 1" ++ ++set test "zypper hint printed" ++if { ![gdb_breakpoint main qualified] } { ++ unresolved $test ++ return -1 ++} ++ ++gdb_run_cmd ++ ++set re_64 \ ++ "Missing separate debuginfos, use: zypper install glibc-debuginfo-" ++set re_32 \ ++ "Missing separate debuginfos, use: zypper install glibc-32bit-debuginfo-" ++ ++set hexno0x "\[0-9A-Fa-f\]+" ++set re_nolibrpm \ ++ [multi_line \ ++ "Missing separate debuginfo for .*libc.so.*" \ ++ "Try: zypper install -C \"debuginfo\\(build-id\\)=$hexno0x\""] ++ ++gdb_test_multiple "" $test { ++ -re -wrap ($re_64|$re_32).* { ++ pass "$gdb_test_name (librpm)" ++ } ++ -re -wrap $re_nolibrpm.* { ++ pass "$gdb_test_name (no librpm)" ++ } ++} ++ ++# To give some background information in case the previous test failed. ++gdb_test "info shared" diff --git a/gdb-testsuite-add-missing-include-in-gdb.base-ctf-pt.patch b/gdb-testsuite-add-missing-include-in-gdb.base-ctf-pt.patch new file mode 100644 index 0000000..61dfe6b --- /dev/null +++ b/gdb-testsuite-add-missing-include-in-gdb.base-ctf-pt.patch @@ -0,0 +1,51 @@ +From 4e9077b7e451bd87e48e9868519079a5a7070106 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 2 Apr 2024 16:22:46 +0200 +Subject: [PATCH 29/48] [gdb/testsuite] Add missing include in + gdb.base/ctf-ptype.c + +On fedora rawhide, when running test-case gdb.base/ctf-ptype.exp, I get: +... +gdb compile failed, ctf-ptype.c: In function 'main': +ctf-ptype.c:242:29: error: implicit declaration of function 'malloc' \ + [-Wimplicit-function-declaration] + 242 | v_char_pointer = (char *) malloc (1); + | ^~~~~~ +ctf-ptype.c:1:1: note: include '' or provide a declaration of 'malloc' + +++ |+#include + 1 | /* This test program is part of GDB, the GNU debugger. +... + +Fix this by adding the missing include. + +Tested on aarch64-linux. +--- + gdb/testsuite/gdb.base/ctf-ptype.c | 5 ++--- + 1 file changed, 2 insertions(+), 3 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/ctf-ptype.c b/gdb/testsuite/gdb.base/ctf-ptype.c +index cc4e98a234f..0cea44701b9 100644 +--- a/gdb/testsuite/gdb.base/ctf-ptype.c ++++ b/gdb/testsuite/gdb.base/ctf-ptype.c +@@ -24,6 +24,8 @@ + * First the basic C types. + */ + ++#include ++ + #if !defined (__STDC__) && !defined (_AIX) + #define signed /**/ + #endif +@@ -234,9 +236,6 @@ func_type v_func_type; + + int main () + { +- /* Ensure that malloc is a pointer type; avoid use of "void" and any include files. */ +-/* extern char *malloc();*/ +- + /* Some of the tests in ptype.exp require invoking malloc, so make + sure it is linked in to this program. */ + v_char_pointer = (char *) malloc (1); +-- +2.35.3 + diff --git a/gdb-testsuite-add-missing-include-in-gdb.base-rtld-s.patch b/gdb-testsuite-add-missing-include-in-gdb.base-rtld-s.patch new file mode 100644 index 0000000..79b4b4b --- /dev/null +++ b/gdb-testsuite-add-missing-include-in-gdb.base-rtld-s.patch @@ -0,0 +1,47 @@ +From a2889f1e3f71589fee9454c0aa772ce1bc540db3 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 28 Mar 2024 06:51:59 +0100 +Subject: [PATCH 35/48] [gdb/testsuite] Add missing include in + gdb.base/rtld-step.exp + +On fedora rawhide, with test-case gdb.base/rtld-step.exp I get: +... +static-pie-static-libc.c: In function '_start':^M +static-pie-static-libc.c:1:22: error: \ + implicit declaration of function '_exit' [-Wimplicit-function-declaration]^M + 1 | void _start (void) { _exit (0); }^M + | ^~~~~^M +compiler exited with status 1 + ... +UNTESTED: gdb.base/rtld-step.exp: failed to compile \ + (-static-pie not supported or static libc missing) +... + +Fix this by adding the missing include. + +Tested on aarch64-linux. + +Approved-by: Kevin Buettner +--- + gdb/testsuite/gdb.base/rtld-step.exp | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.base/rtld-step.exp b/gdb/testsuite/gdb.base/rtld-step.exp +index 9a6c76d191a..bd3f89769b8 100644 +--- a/gdb/testsuite/gdb.base/rtld-step.exp ++++ b/gdb/testsuite/gdb.base/rtld-step.exp +@@ -86,7 +86,10 @@ set rtld_flags [list debug additional_flags=[list -static-pie -fPIE \ + -nostdlib -static -lc]] + + if { ![gdb_can_simple_compile static-pie-static-libc \ +- "void _start (void) { _exit (0); }" \ ++ { ++ #include ++ void _start (void) { _exit (0); } ++ } \ + executable $rtld_flags] } { + set reason "-static-pie not supported or static libc missing" + untested "failed to compile ($reason)" +-- +2.35.3 + diff --git a/gdb-testsuite-add-missing-includes-in-gdb.trace-coll.patch b/gdb-testsuite-add-missing-includes-in-gdb.trace-coll.patch new file mode 100644 index 0000000..6793bce --- /dev/null +++ b/gdb-testsuite-add-missing-includes-in-gdb.trace-coll.patch @@ -0,0 +1,60 @@ +From 4a08080ba59f4f66bf062a9015f9e51c765b05b5 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 29 Mar 2024 07:47:30 +0100 +Subject: [PATCH 31/48] [gdb/testsuite] Add missing includes in + gdb.trace/collection.c + +On fedora rawhide, with test-case gdb.trace/collection.exp, I get: +... +gdb compile failed, collection.c: In function 'strings_test_func': +collection.c:227:13: error: implicit declaration of function 'malloc' \ + [-Wimplicit-function-declaration] + 227 | longloc = malloc(500); + | ^~~~~~ +collection.c:1:1: note: \ + include '' or provide a declaration of 'malloc' + +++ |+#include + 1 | /* This testcase is part of GDB, the GNU debugger. + +collection.c:228:3: error: implicit declaration of function 'strcpy' \ + [-Wimplicit-function-declaration] + 228 | strcpy(longloc, ... ); + | ^~~~~~ +collection.c:1:1: note: include '' or provide a declaration of \ + 'strcpy' + +++ |+#include + 1 | /* This testcase is part of GDB, the GNU debugger. +collection.c:230:8: error: implicit declaration of function 'strlen' \ + [-Wimplicit-function-declaration] + 230 | i += strlen (locstr); + | ^~~~~~ +collection.c:230:8: note: include '' or provide a declaration of \ + 'strlen' +... + +Fix this by adding the missing includes. + +Tested on aarch64-linux. + +Approved-By: John Baldwin +--- + gdb/testsuite/gdb.trace/collection.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/gdb/testsuite/gdb.trace/collection.c b/gdb/testsuite/gdb.trace/collection.c +index 3b5484748af..4ef93a3fa33 100644 +--- a/gdb/testsuite/gdb.trace/collection.c ++++ b/gdb/testsuite/gdb.trace/collection.c +@@ -19,6 +19,9 @@ + * Test program for trace collection + */ + ++#include ++#include ++ + /* + * Typedefs + */ +-- +2.35.3 + diff --git a/gdb-testsuite-add-missing-no-prompt-anchor-in-gdb.ba.patch b/gdb-testsuite-add-missing-no-prompt-anchor-in-gdb.ba.patch new file mode 100644 index 0000000..b2826a4 --- /dev/null +++ b/gdb-testsuite-add-missing-no-prompt-anchor-in-gdb.ba.patch @@ -0,0 +1,45 @@ +From 08ce0d63c343f7db9a504d37de25391a997b46e2 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Mon, 8 Jan 2024 13:01:50 +0100 +Subject: [PATCH] [gdb/testsuite] Add missing -no-prompt-anchor in + gdb.base/vfork-follow-parent.exp + +When running test-case gdb.base/vfork-follow-parent.exp it passes fine, but +when running it with "taskset -c 0" I run into: +... +(gdb) inferior 1^M +[Switching to inferior 1 [process 26606] (vfork-follow-parent-exit)]^M +[Switching to thread 1.1 (process 26606)]^M +(gdb) Reading symbols from vfork-follow-parent-exit...^M +FAIL: $exp: exec_file=vfork-follow-parent-exit: target-non-stop=on: \ + non-stop=off: resolution_method=schedule-multiple: inferior 1 (timeout) +... + +Fix this by using -no-prompt-anchor. + +Tested on x86_64-linux. + +PR testsuite/31166 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31166 +--- + gdb/testsuite/gdb.base/vfork-follow-parent.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.base/vfork-follow-parent.exp b/gdb/testsuite/gdb.base/vfork-follow-parent.exp +index 89c38001dac..ee6f2835d8e 100644 +--- a/gdb/testsuite/gdb.base/vfork-follow-parent.exp ++++ b/gdb/testsuite/gdb.base/vfork-follow-parent.exp +@@ -64,7 +64,7 @@ proc do_test { resolution_method } { + gdb_test "set schedule-multiple on" + gdb_test "continue" "$::inferior_exited_re normally.*" \ + "continue to end of inferior 2" +- gdb_test "inferior 1" ".*Switching to inferior 1.*" ++ gdb_test -no-prompt-anchor "inferior 1" ".*Switching to inferior 1.*" + gdb_test "print unblock_parent = 1" " = 1" + } else { + error "invalid resolution method: $resolution_method" + +base-commit: 19185006cfe0901da907da4f09fbc197aba976a2 +-- +2.35.3 + diff --git a/gdb-testsuite-add-pr-gdb-26967-kfail-in-two-more-tes.patch b/gdb-testsuite-add-pr-gdb-26967-kfail-in-two-more-tes.patch new file mode 100644 index 0000000..1ee0ff4 --- /dev/null +++ b/gdb-testsuite-add-pr-gdb-26967-kfail-in-two-more-tes.patch @@ -0,0 +1,167 @@ +From fb2b155e33f5a21259c52685ee9b24f75ac66e75 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Wed, 20 Mar 2024 19:23:48 +0100 +Subject: [PATCH 10/48] [gdb/testsuite] Add PR gdb/26967 KFAIL in two more + test-cases + +On aarch64-linux (debian 12), when running test-case +gdb.base/longjmp-until-in-main.exp, I run into: +... +(gdb) until 33^M +warning: Breakpoint address adjusted from 0x70f727c678928489 to 0xfff727c678928489.^M +Warning:^M +Cannot insert breakpoint 0.^M +Cannot access memory at address 0xfff727c678928489^M +^M +0x0000fffff7e3a580 in siglongjmp () from /lib/aarch64-linux-gnu/libc.so.6^M +(gdb) FAIL: gdb.base/longjmp-until-in-main.exp: until $line, in main +... + +This is PR gdb/26967: no longjmp probe is available: +... +(gdb) info probes stap libc ^longjmp$^M +No probes matched.^M +... +and glibc applies pointer mangling which makes it fairly difficult for gdb to +get the longjmp target. + +There's a KFAIL for this in test-case gdb.base/longjmp.exp, added in commit +b5e7cd5cd3d ("[gdb/testsuite] Add KFAILs in gdb.base/longjmp.exp"). + +Factor out new proc have_longjmp_probe, and use it to add similar KFAIL in +this and one more test-case. + +Tested on aarch64-linux. + +Approved-By: Tom Tromey +--- + .../gdb.base/longjmp-until-in-main.exp | 24 ++++++++++++++++--- + gdb/testsuite/gdb.base/longjmp.exp | 11 +-------- + .../premature-dummy-frame-removal.exp | 22 ++++++++++++++++- + gdb/testsuite/lib/gdb.exp | 19 +++++++++++++++ + 4 files changed, 62 insertions(+), 14 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/longjmp-until-in-main.exp b/gdb/testsuite/gdb.base/longjmp-until-in-main.exp +index c0635f23345..6167989319a 100644 +--- a/gdb/testsuite/gdb.base/longjmp-until-in-main.exp ++++ b/gdb/testsuite/gdb.base/longjmp-until-in-main.exp +@@ -35,10 +35,28 @@ if {![runto_main]} { + return + } + ++set have_longjmp_probe [have_longjmp_probe] ++ + delete_breakpoints + + set until_to_line [gdb_get_line_number "until to here"] + +-gdb_test "until $until_to_line" \ +- " until to here .*" \ +- "until \$line, in main" ++set re_cannot_insert_bp \ ++ [multi_line \ ++ "Warning:" \ ++ "Cannot insert breakpoint $::decimal\\." \ ++ "Cannot access memory at address $::hex"] ++ ++set test "until \$line, in main" ++gdb_test_multiple "until $until_to_line" $test { ++ -re -wrap "\r\n$re_cannot_insert_bp\r\n.*" { ++ if { $have_longjmp_probe } { ++ fail $gdb_test_name ++ } else { ++ kfail gdb/26967 $gdb_test_name ++ } ++ } ++ -re -wrap " until to here .*" { ++ pass $gdb_test_name ++ } ++} +diff --git a/gdb/testsuite/gdb.base/longjmp.exp b/gdb/testsuite/gdb.base/longjmp.exp +index f74891aa7ca..0420f4df675 100644 +--- a/gdb/testsuite/gdb.base/longjmp.exp ++++ b/gdb/testsuite/gdb.base/longjmp.exp +@@ -62,16 +62,7 @@ proc do_test { with_probes } { + # + # We detect the different failure modes and kfail these. + +- set have_longjmp_probe 0 +- gdb_test_multiple "info probes stap libc ^longjmp$" "" { +- -re -wrap "No probes matched\\." { +- pass $gdb_test_name +- } +- -re -wrap "\r\nstap\[ \t\]+libc\[ \t\]+longjmp\[ \t\]+.*" { +- pass $gdb_test_name +- set have_longjmp_probe 1 +- } +- } ++ set have_longjmp_probe [have_longjmp_probe] + + if { $with_probes } { + if { !$have_longjmp_probe } { +diff --git a/gdb/testsuite/gdb.base/premature-dummy-frame-removal.exp b/gdb/testsuite/gdb.base/premature-dummy-frame-removal.exp +index fe906cefb14..6979345ee45 100644 +--- a/gdb/testsuite/gdb.base/premature-dummy-frame-removal.exp ++++ b/gdb/testsuite/gdb.base/premature-dummy-frame-removal.exp +@@ -49,7 +49,27 @@ if {![runto_main]} { + set pyfile [gdb_remote_download host ${srcdir}/${subdir}/${testfile}.py] + gdb_test_no_output "source ${pyfile}" "load python file" + +-gdb_test "p some_func ()" " = 0" ++set have_longjmp_probe [have_longjmp_probe] ++ ++set re_cannot_insert_bp \ ++ [multi_line \ ++ "Warning:" \ ++ "Cannot insert breakpoint $::decimal\\." \ ++ "Cannot access memory at address $::hex"] ++ ++gdb_test_multiple "p some_func ()" "" { ++ -re -wrap "\r\n$re_cannot_insert_bp\r\n.*" { ++ if { $have_longjmp_probe } { ++ fail $gdb_test_name ++ } else { ++ kfail gdb/26967 $gdb_test_name ++ return 0 ++ } ++ } ++ -re -wrap " = 0" { ++ pass $gdb_test_name ++ } ++} + + # When frame debugging is turned on, this test has (previously) + # revealed some crashes due to the Python frame unwinder trying to +diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp +index 21967550cf6..70c2db4ac84 100644 +--- a/gdb/testsuite/lib/gdb.exp ++++ b/gdb/testsuite/lib/gdb.exp +@@ -4615,6 +4615,25 @@ proc skip_libstdcxx_probe_tests {} { + return [skip_libstdcxx_probe_tests_prompt "$gdb_prompt $"] + } + ++# Return 1 if libc supports the longjmp probe. Note that we're not using ++# gdb_caching_proc because the probe may have been disabled. ++ ++proc have_longjmp_probe {} { ++ set have_probe -1 ++ gdb_test_multiple "info probes stap libc ^longjmp$" "" { ++ -re -wrap "No probes matched\\." { ++ set have_probe 0 ++ } ++ -re -wrap "\r\nstap\[ \t\]+libc\[ \t\]+longjmp\[ \t\]+.*" { ++ set have_probe 1 ++ } ++ } ++ if { $have_probe == -1 } { ++ error "failed to get libc longjmp probe status" ++ } ++ return $have_probe ++} ++ + # Helper for gdb_is_target_* procs. TARGET_NAME is the name of the target + # we're looking for (used to build the test name). TARGET_STACK_REGEXP + # is a regexp that will match the output of "maint print target-stack" if +-- +2.35.3 + diff --git a/gdb-testsuite-avoid-intermittent-failures-on-a-debug.patch b/gdb-testsuite-avoid-intermittent-failures-on-a-debug.patch new file mode 100644 index 0000000..c31a50d --- /dev/null +++ b/gdb-testsuite-avoid-intermittent-failures-on-a-debug.patch @@ -0,0 +1,59 @@ +From 729d6b050f41d1d058c0f22f2c767995f5441b7a Mon Sep 17 00:00:00 2001 +From: Andrew Burgess +Date: Sun, 27 Oct 2024 08:55:16 +0000 +Subject: [PATCH] gdb/testsuite: avoid intermittent failures on a debuginfod + test + +I saw a failure in gdb.debuginfod/build-id-no-debug-warning.exp which +I could only produce one time. + +Normally the test output looks like this: + + file /tmp/build/gdb/testsuite/outputs/gdb.debuginfod/build-id-no-debug-warning/.build-id/0c/30f589cc4f2c0fb22c8914d042ddf39c9a3885.debug + Reading symbols from /tmp/build/gdb/testsuite/outputs/gdb.debuginfod/build-id-no-debug-warning/.build-id/0c/30f589cc4f2c0fb22c8914d042ddf39c9a3885.debug... + Downloading separate debug info for /tmp/build/gdb/testsuite/outputs/gdb.debuginfod/build-id-no-debug-warning/.build-id/0c/30f589cc4f2c0fb22c8914d042ddf39c9a3885.debug... + Reading symbols from /tmp/build/gdb/testsuite/outputs/gdb.debuginfod/build-id-no-debug-warning/.client_cache/0c30f589cc4f2c0fb22c8914d042ddf39c9a3885/debuginfo... + (gdb) PASS: gdb.debuginfod/build-id-no-debug-warning.exp: local_debuginfod: debuginfod running, info downloaded, no war + +But one time I saw this: + + file /tmp/build/gdb/testsuite/outputs/gdb.debuginfod/build-id-no-debug-warning/.build-id/0c/30f589cc4f2c0fb22c8914d042ddf39c9a3885.debug + Reading symbols from /tmp/build/gdb/testsuite/outputs/gdb.debuginfod/build-id-no-debug-warning/.build-id/0c/30f589cc4f2c0fb22c8914d042ddf39c9a3885.debug... + Downloading 6.77 K separate debug info for /tmp/build/gdb/testsuite/outputs/gdb.debuginfod/build-id-no-debug-warning/.build-id/0c/30f589cc4f2c0fb22c8914d042ddf39c9a3885.debug... + Reading symbols from /tmp/build/gdb/testsuite/outputs/gdb.debuginfod/build-id-no-debug-warning/.client_cache/0c30f589cc4f2c0fb22c8914d042ddf39c9a3885/debuginfo... + (gdb) FAIL: gdb.debuginfod/build-id-no-debug-warning.exp: local_debuginfod: debuginfod running, info downloaded, no warnings + +The difference is the "Downloading separate debug info for ..." line +has gained an extra '6.77 K' component. When I got the FAIL the +machine was under heavy load, so I suspect everything was running +pretty slow. I think the size is only added when the debuginfod +download is taking its time. + +Anyway, the test in question is not expecting to see a size, which is +why it failed. + +Every other debuginfod test does allow for an optional size being +printed, so lets update this test to also accept an optional size, +this should prevent failures like this in the future. +--- + gdb/testsuite/gdb.debuginfod/build-id-no-debug-warning.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.debuginfod/build-id-no-debug-warning.exp b/gdb/testsuite/gdb.debuginfod/build-id-no-debug-warning.exp +index 8ee3bb0e78c..fcadfddd293 100644 +--- a/gdb/testsuite/gdb.debuginfod/build-id-no-debug-warning.exp ++++ b/gdb/testsuite/gdb.debuginfod/build-id-no-debug-warning.exp +@@ -148,7 +148,7 @@ proc_with_prefix local_debuginfod { } { + gdb_test "file ${build_id_debug_file}" \ + [multi_line \ + "Reading symbols from ${build_id_debug_file}\\.\\.\\." \ +- "Downloading separate debug info for ${build_id_debug_file}\\.\\.\\." \ ++ "Downloading\[^\r\n\]*separate debug info for ${build_id_debug_file}\\.\\.\\." \ + "Reading symbols from ${cache}/\[^\r\n\]+\\.\\.\\.(?:\r\nExpanding full symbols from \[^\r\n\]+)*"] \ + "debuginfod running, info downloaded, no warnings" + } + +base-commit: 6cfb7bf81be3ab6f131dbc6a27eefca516cf7517 +-- +2.43.0 + diff --git a/gdb-testsuite-call-ldd-version-in-gdb.testsuite-dump.patch b/gdb-testsuite-call-ldd-version-in-gdb.testsuite-dump.patch new file mode 100644 index 0000000..a20c617 --- /dev/null +++ b/gdb-testsuite-call-ldd-version-in-gdb.testsuite-dump.patch @@ -0,0 +1,39 @@ +From dedb6d4ce0478d053b7e786d73f298c8e72f1f99 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 18 Jan 2024 11:14:19 +0100 +Subject: [PATCH 44/48] [gdb/testsuite] Call ldd --version in + gdb.testsuite/dump-system-info.exp + +Once in a while I'm looking at the gdb.log of an entire testsuite run, and I'm +trying to establish what glibc version is used. Sometimes this is possible, +sometimes not. + +Make this easy by calling ldd --version in test-case +gdb.testsuite/dump-system-info.exp, which for instance on openSUSE Leap 15.4 +gives: +... +$ ldd --version +ldd (GNU libc) 2.31 + ... +$ +... + +Tested on x86_64-linux. + +Approved-By: Tom Tromey +--- + gdb/testsuite/gdb.testsuite/dump-system-info.exp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/gdb/testsuite/gdb.testsuite/dump-system-info.exp b/gdb/testsuite/gdb.testsuite/dump-system-info.exp +index 1a28b29b1c7..e3eb9eee73a 100644 +--- a/gdb/testsuite/gdb.testsuite/dump-system-info.exp ++++ b/gdb/testsuite/gdb.testsuite/dump-system-info.exp +@@ -36,3 +36,4 @@ proc dump_info {cmd {what ""}} { + dump_info "cat /proc/cpuinfo" "Cpuinfo" + dump_info "uname -a" + dump_info "lsb_release -a" ++dump_info "ldd --version" +-- +2.35.3 + diff --git a/gdb-testsuite-factor-out-proc-get_portnum.patch b/gdb-testsuite-factor-out-proc-get_portnum.patch new file mode 100644 index 0000000..bf62489 --- /dev/null +++ b/gdb-testsuite-factor-out-proc-get_portnum.patch @@ -0,0 +1,98 @@ +From 2e5c943519de45144a880b8ce0d693dfd13f4650 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sat, 4 May 2024 10:41:09 +0200 +Subject: [PATCH 16/48] [gdb/testsuite] Factor out proc get_portnum + +In gdbserver_start, we have some code that determines what port number to use: +... + # Port id -- either specified in baseboard file, or managed here. + if [target_info exists gdb,socketport] { + set portnum [target_info gdb,socketport] + } else { + # Bump the port number to avoid conflicts with hung ports. + incr portnum + } +... + +Factor this out into a new proc get_portnum. + +Tested on aarch64-linux. + +Approved-By: Tom Tromey +--- + gdb/testsuite/lib/gdbserver-support.exp | 40 ++++++++++++++++++------- + 1 file changed, 29 insertions(+), 11 deletions(-) + +diff --git a/gdb/testsuite/lib/gdbserver-support.exp b/gdb/testsuite/lib/gdbserver-support.exp +index 30d94fd7eb6..8aaca946b7d 100644 +--- a/gdb/testsuite/lib/gdbserver-support.exp ++++ b/gdb/testsuite/lib/gdbserver-support.exp +@@ -129,8 +129,31 @@ proc gdb_target_cmd { args } { + return [expr $res == 0 ? 0 : 1] + } + +-global portnum +-set portnum "2345" ++# Return a usable port number. ++ ++proc get_portnum {} { ++ if { [target_info exists gdb,socketport] } { ++ # Hard-coded in target board. ++ return [target_info gdb,socketport] ++ } ++ ++ # Not hard-coded in target board. Return increasing port numbers, ++ # starting at $initial_portnum, to avoid conflicts with hung ports. ++ set initial_portnum 2345 ++ ++ # Currently available port number. ++ global portnum ++ ++ # Initialize, if necessary. ++ if { ![info exists portnum] } { ++ set portnum $initial_portnum ++ } ++ ++ # Return currently available port number, and update it. ++ set res $portnum ++ incr portnum ++ return $res ++} + + # Locate the gdbserver binary. Returns "" if gdbserver could not be found. + +@@ -247,16 +270,10 @@ proc gdbserver_default_get_comm_port { port } { + # Returns the target protocol and socket to connect to. + + proc gdbserver_start { options arguments } { +- global portnum + global GDB_TEST_SOCKETHOST + + # Port id -- either specified in baseboard file, or managed here. +- if [target_info exists gdb,socketport] { +- set portnum [target_info gdb,socketport] +- } else { +- # Bump the port number to avoid conflicts with hung ports. +- incr portnum +- } ++ set portnum [get_portnum] + + # Extract the local and remote host ids from the target board struct. + if { [info exists GDB_TEST_SOCKETHOST] } { +@@ -372,10 +389,11 @@ proc gdbserver_start { options arguments } { + -re "Listening on" { } + -re "Can't (bind address|listen on socket): Address already in use\\.\r\n" { + verbose -log "Port $portnum is already in use." +- if ![target_info exists gdb,socketport] { ++ set other_portnum [get_portnum] ++ if { $other_portnum != $portnum } { + # Bump the port number to avoid the conflict. + wait -i $expect_out(spawn_id) +- incr portnum ++ set portnum $other_portnum + continue + } + } +-- +2.35.3 + diff --git a/gdb-testsuite-factor-out-proc-lock_dir.patch b/gdb-testsuite-factor-out-proc-lock_dir.patch new file mode 100644 index 0000000..a3aab5c --- /dev/null +++ b/gdb-testsuite-factor-out-proc-lock_dir.patch @@ -0,0 +1,63 @@ +From a9cc672af5f81034f4189446aa656c08ea10e2ac Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sat, 4 May 2024 10:41:09 +0200 +Subject: [PATCH 19/48] [gdb/testsuite] Factor out proc lock_dir + +In lib/rocm.exp we have: +... +set gpu_lock_filename $objdir/gpu-parallel.lock +... + +This decides both the lock file name and directory. + +Factor out a new proc lock_dir that decides on the directory, leaving just: +... +set gpu_lock_filename gpu-parallel.lock +... + +Tested on aarch64-linux. + +Approved-By: Tom Tromey +--- + gdb/testsuite/lib/gdb-utils.exp | 7 +++++++ + gdb/testsuite/lib/rocm.exp | 2 +- + 2 files changed, 8 insertions(+), 1 deletion(-) + +diff --git a/gdb/testsuite/lib/gdb-utils.exp b/gdb/testsuite/lib/gdb-utils.exp +index 3dc4b3a3ebc..63f6b8c3698 100644 +--- a/gdb/testsuite/lib/gdb-utils.exp ++++ b/gdb/testsuite/lib/gdb-utils.exp +@@ -177,10 +177,17 @@ proc lock_file_release {info} { + } + } + ++# Return directory where we keep lock files. ++ ++proc lock_dir {} { ++ return $objdir ++} ++ + # Run body under lock LOCK_FILE. + + proc with_lock { lock_file body } { + if {[info exists ::GDB_PARALLEL]} { ++ set lock_file [file join [lock_dir] $lock_file] + set lock_rc [lock_file_acquire $lock_file] + } + +diff --git a/gdb/testsuite/lib/rocm.exp b/gdb/testsuite/lib/rocm.exp +index 86ec29567da..a6608664f24 100644 +--- a/gdb/testsuite/lib/rocm.exp ++++ b/gdb/testsuite/lib/rocm.exp +@@ -105,7 +105,7 @@ gdb_caching_proc allow_hipcc_tests {} { + + # The lock file used to ensure that only one GDB has access to the GPU + # at a time. +-set gpu_lock_filename $objdir/gpu-parallel.lock ++set gpu_lock_filename gpu-parallel.lock + + # Run body under the GPU lock. Also calls gdb_exit before releasing + # the GPU lock. +-- +2.35.3 + diff --git a/gdb-testsuite-factor-out-proc-with_lock.patch b/gdb-testsuite-factor-out-proc-with_lock.patch new file mode 100644 index 0000000..19f606b --- /dev/null +++ b/gdb-testsuite-factor-out-proc-with_lock.patch @@ -0,0 +1,160 @@ +From d96f9a0ef44eb3a3f41e2a478b817c1d00e6e0a1 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sat, 4 May 2024 10:41:09 +0200 +Subject: [PATCH 18/48] [gdb/testsuite] Factor out proc with_lock + +Factor out proc with_lock from with_rocm_gpu_lock, and move required procs +lock_file_acquire and lock_file_release to lib/gdb-utils.exp. + +Tested on aarch64-linux. + +Approved-By: Tom Tromey +--- + gdb/testsuite/lib/gdb-utils.exp | 59 +++++++++++++++++++++++++++++++++ + gdb/testsuite/lib/rocm.exp | 55 +----------------------------- + 2 files changed, 60 insertions(+), 54 deletions(-) + +diff --git a/gdb/testsuite/lib/gdb-utils.exp b/gdb/testsuite/lib/gdb-utils.exp +index a010e14fc04..3dc4b3a3ebc 100644 +--- a/gdb/testsuite/lib/gdb-utils.exp ++++ b/gdb/testsuite/lib/gdb-utils.exp +@@ -138,3 +138,62 @@ proc version_compare { l1 op l2 } { + } + return 1 + } ++ ++# Acquire lock file LOCKFILE. Tries forever until the lock file is ++# successfully created. ++ ++proc lock_file_acquire {lockfile} { ++ verbose -log "acquiring lock file: $::subdir/${::gdb_test_file_name}.exp" ++ while {true} { ++ if {![catch {open $lockfile {WRONLY CREAT EXCL}} rc]} { ++ set msg "locked by $::subdir/${::gdb_test_file_name}.exp" ++ verbose -log "lock file: $msg" ++ # For debugging, put info in the lockfile about who owns ++ # it. ++ puts $rc $msg ++ flush $rc ++ return [list $rc $lockfile] ++ } ++ after 10 ++ } ++} ++ ++# Release a lock file. ++ ++proc lock_file_release {info} { ++ verbose -log "releasing lock file: $::subdir/${::gdb_test_file_name}.exp" ++ ++ if {![catch {fconfigure [lindex $info 0]}]} { ++ if {![catch { ++ close [lindex $info 0] ++ file delete -force [lindex $info 1] ++ } rc]} { ++ return "" ++ } else { ++ return -code error "Error releasing lockfile: '$rc'" ++ } ++ } else { ++ error "invalid lock" ++ } ++} ++ ++# Run body under lock LOCK_FILE. ++ ++proc with_lock { lock_file body } { ++ if {[info exists ::GDB_PARALLEL]} { ++ set lock_rc [lock_file_acquire $lock_file] ++ } ++ ++ set code [catch {uplevel 1 $body} result] ++ ++ if {[info exists ::GDB_PARALLEL]} { ++ lock_file_release $lock_rc ++ } ++ ++ if {$code == 1} { ++ global errorInfo errorCode ++ return -code $code -errorinfo $errorInfo -errorcode $errorCode $result ++ } else { ++ return -code $code $result ++ } ++} +diff --git a/gdb/testsuite/lib/rocm.exp b/gdb/testsuite/lib/rocm.exp +index fcdf665aef9..86ec29567da 100644 +--- a/gdb/testsuite/lib/rocm.exp ++++ b/gdb/testsuite/lib/rocm.exp +@@ -107,68 +107,15 @@ gdb_caching_proc allow_hipcc_tests {} { + # at a time. + set gpu_lock_filename $objdir/gpu-parallel.lock + +-# Acquire lock file LOCKFILE. Tries forever until the lock file is +-# successfully created. +- +-proc lock_file_acquire {lockfile} { +- verbose -log "acquiring lock file: $::subdir/${::gdb_test_file_name}.exp" +- while {true} { +- if {![catch {open $lockfile {WRONLY CREAT EXCL}} rc]} { +- set msg "locked by $::subdir/${::gdb_test_file_name}.exp" +- verbose -log "lock file: $msg" +- # For debugging, put info in the lockfile about who owns +- # it. +- puts $rc $msg +- flush $rc +- return [list $rc $lockfile] +- } +- after 10 +- } +-} +- +-# Release a lock file. +- +-proc lock_file_release {info} { +- verbose -log "releasing lock file: $::subdir/${::gdb_test_file_name}.exp" +- +- if {![catch {fconfigure [lindex $info 0]}]} { +- if {![catch { +- close [lindex $info 0] +- file delete -force [lindex $info 1] +- } rc]} { +- return "" +- } else { +- return -code error "Error releasing lockfile: '$rc'" +- } +- } else { +- error "invalid lock" +- } +-} +- + # Run body under the GPU lock. Also calls gdb_exit before releasing + # the GPU lock. + + proc with_rocm_gpu_lock { body } { +- if {[info exists ::GDB_PARALLEL]} { +- set lock_rc [lock_file_acquire $::gpu_lock_filename] +- } +- +- set code [catch {uplevel 1 $body} result] ++ with_lock $::gpu_lock_filename $body + + # In case BODY returned early due to some testcase failing, and + # left GDB running, debugging the GPU. + gdb_exit +- +- if {[info exists ::GDB_PARALLEL]} { +- lock_file_release $lock_rc +- } +- +- if {$code == 1} { +- global errorInfo errorCode +- return -code $code -errorinfo $errorInfo -errorcode $errorCode $result +- } else { +- return -code $code $result +- } + } + + # Return true if all the devices support debugging multiple processes +-- +2.35.3 + diff --git a/gdb-testsuite-fix-error-in-gdb.server-server-kill-py.patch b/gdb-testsuite-fix-error-in-gdb.server-server-kill-py.patch new file mode 100644 index 0000000..cef9974 --- /dev/null +++ b/gdb-testsuite-fix-error-in-gdb.server-server-kill-py.patch @@ -0,0 +1,54 @@ +From b33811a85ff53af77cdad995ad8cb50431c8c362 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 30 May 2024 12:56:35 +0200 +Subject: [PATCH] [gdb/testsuite] Fix error in + gdb.server/server-kill-python.exp + +With test-case gdb.server/server-kill-python.exp, I sometimes run into: +... +builtin_spawn gdb -nw -nx -q -iex set height 0 -iex set width 0 \ + -data-directory data-directory^M +kill^M +(gdb) kill^M +file /home/abuild/rpmbuild/BUILD/gdb-14.2/build-x86_64-suse-linux/gdb/testsuite.unix.-m64.-fno-PIE.-no-pie/outputs/gdb.server/server-kill-python/server-kill-python^M +The program is not being run.^M +(gdb) ERROR: Couldn't load server-kill-python into GDB. +... + +The problem is that the spawn produces a prompt, but it's not explicitly +consumed. + +This is a regression since commit 0f077fcae0f ("[gdb/testsuite] Simplify +gdb.server/server-kill-python.exp"). + +Fix this by consuming the initial prompt. + +PR testsuite/31819 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31819 +Fixes: 0f077fcae0f ("[gdb/testsuite] Simplify gdb.server/server-kill-python.exp" +--- + gdb/testsuite/gdb.server/server-kill-python.exp | 6 ++++++ + 1 file changed, 6 insertions(+) + +diff --git a/gdb/testsuite/gdb.server/server-kill-python.exp b/gdb/testsuite/gdb.server/server-kill-python.exp +index 778880984ec..c0768558eeb 100644 +--- a/gdb/testsuite/gdb.server/server-kill-python.exp ++++ b/gdb/testsuite/gdb.server/server-kill-python.exp +@@ -63,6 +63,12 @@ if {[gdb_spawn_with_cmdline_opts \ + return + } + ++gdb_test_multiple "" "initial prompt" { ++ -re "^$gdb_prompt $" { ++ pass $gdb_test_name ++ } ++} ++ + gdb_load $binfile + gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport + + +base-commit: 3faa0f850b27f64f08ad4ec5987f711be8862851 +-- +2.35.3 + diff --git a/gdb-testsuite-fix-gdb.ada-verylong.exp-on-32-bit-tar.patch b/gdb-testsuite-fix-gdb.ada-verylong.exp-on-32-bit-tar.patch new file mode 100644 index 0000000..807b5f1 --- /dev/null +++ b/gdb-testsuite-fix-gdb.ada-verylong.exp-on-32-bit-tar.patch @@ -0,0 +1,84 @@ +From d9a17115fbeb8d4c1780677bb57edf0fe8448038 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 2 Apr 2024 16:14:39 +0200 +Subject: [PATCH 30/48] [gdb/testsuite] Fix gdb.ada/verylong.exp on 32-bit + target + +In an aarch32-linux chroot on an aarch64-linux system, I run into: +... +(gdb) print x^M +$1 = 9223372036854775807^M +(gdb) FAIL: gdb.ada/verylong.exp: print x +... + +A passing version on aarch64-linux looks like: +... +(gdb) print x^M +$1 = 170141183460469231731687303715884105727^M +(gdb) PASS: gdb.ada/verylong.exp: print x +... + +The difference is caused by the size of the type Long_Long_Long_Integer, which +is: +- a 128-bit signed on 64-bit targets, and +- a 64-bit signed on 32-bit target. + +Fix this by detecting the size of the Long_Long_Long_Integer type, and +handling it. + +Tested on aarch64-linux and aarch32-linux. + +Approved-By: Tom Tromey + +PR testsuite/31574 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31574 + +[1] https://gcc.gnu.org/onlinedocs/gnat_rm/Implementation-Defined-Characteristics.html +--- + gdb/testsuite/gdb.ada/verylong.exp | 28 +++++++++++++++++++++------- + 1 file changed, 21 insertions(+), 7 deletions(-) + +diff --git a/gdb/testsuite/gdb.ada/verylong.exp b/gdb/testsuite/gdb.ada/verylong.exp +index d1fa968015b..4b83e0bd467 100644 +--- a/gdb/testsuite/gdb.ada/verylong.exp ++++ b/gdb/testsuite/gdb.ada/verylong.exp +@@ -29,15 +29,29 @@ clean_restart ${testfile} + set bp_location [gdb_get_line_number "START" ${testdir}/prog.adb] + runto "prog.adb:$bp_location" + +-gdb_test "print x" " = 170141183460469231731687303715884105727" +-gdb_test "print x / 2" " = 85070591730234615865843651857942052863" +-gdb_test "print (x / 4) * 2" " = 85070591730234615865843651857942052862" ++set lll_int_size 0 ++gdb_test_multiple "ptype Long_Long_Long_Integer" "" { ++ -re -wrap "type = <8-byte integer>" { ++ set lll_int_size 8 ++ set max 9223372036854775807 ++ } ++ -re -wrap "type = <16-byte integer>" { ++ set lll_int_size 16 ++ set max 170141183460469231731687303715884105727 ++ } ++} ++ ++require {expr $lll_int_size == 8 || $lll_int_size == 16} ++ ++gdb_test "print x" " = $max" ++gdb_test "print x / 2" " = [expr $max / 2]" ++gdb_test "print (x / 4) * 2" " = [expr ($max / 4) * 2]" + gdb_test "print x - x" " = 0" +-gdb_test "print x - 99 + 1" " = 170141183460469231731687303715884105629" +-gdb_test "print -x" " = -170141183460469231731687303715884105727" +-gdb_test "print +x" " = 170141183460469231731687303715884105727" ++gdb_test "print x - 99 + 1" " = [expr $max - 99 + 1]" ++gdb_test "print -x" " = -$max" ++gdb_test "print +x" " = $max" + + gdb_test "print 170141183460469231731687303715884105727" \ + " = 170141183460469231731687303715884105727" +-gdb_test "print x = 170141183460469231731687303715884105727" \ ++gdb_test "print x = $max" \ + " = true" +-- +2.35.3 + diff --git a/gdb-testsuite-fix-gdb.base-eh_return.exp.patch b/gdb-testsuite-fix-gdb.base-eh_return.exp.patch new file mode 100644 index 0000000..fc0c4df --- /dev/null +++ b/gdb-testsuite-fix-gdb.base-eh_return.exp.patch @@ -0,0 +1,80 @@ +From 7ee7b011e0c846a77cb4d1dde3a3c625412f1733 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 25 Jan 2024 16:25:07 +0100 +Subject: [PATCH 11/48] [gdb/testsuite] Fix gdb.base/eh_return.exp + +On Fedora rawhide aarch64, I run into: +... +(gdb) PASS: gdb.base/eh_return.exp: set breakpoint on address +run ^M +Starting program: eh_return ^M +[Thread debugging using libthread_db enabled]^M +Using host libthread_db library "/lib64/libthread_db.so.1".^M +[Inferior 1 (process 1113051) exited normally]^M +(gdb) FAIL: gdb.base/eh_return.exp: hit breakpoint (the program exited) +... + +This happens as follows: the test-case sets a breakpoint on the last +instruction of function eh2: +... +(gdb) break *0x00000000004103ec^M +... +and expects to hit the breakpoint, but instead the "br x6" is taken: +... + 0x00000000004103e0 <+176>: cbz x4, 0x4103ec ^M + 0x00000000004103e4 <+180>: add sp, sp, x5^M + 0x00000000004103e8 <+184>: br x6^M + 0x00000000004103ec <+188>: ret^M +... + +In contrast, with fedora f39 we have: +... + 0x00000000004103bc <+156>: ldp x2, x3, [sp, #48]^M + 0x00000000004103c0 <+160>: ldp x29, x30, [sp, #16]^M + 0x00000000004103c4 <+164>: add sp, sp, #0x50^M + 0x00000000004103c8 <+168>: add sp, sp, x4^M + 0x00000000004103cc <+172>: ret^M + +... +and the breakpoint is reached. + +Fix this by detecting that the breakpoint is not hit, and declaring the test +unsupported. + +Tested on aarch64-linux. + +Approved-By: Tom Tromey + +PR testsuite/31291 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31291 +--- + gdb/testsuite/gdb.base/eh_return.exp | 16 +++++++++++++++- + 1 file changed, 15 insertions(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.base/eh_return.exp b/gdb/testsuite/gdb.base/eh_return.exp +index bced409547b..7d566b1ddc2 100644 +--- a/gdb/testsuite/gdb.base/eh_return.exp ++++ b/gdb/testsuite/gdb.base/eh_return.exp +@@ -79,4 +79,18 @@ gdb_assert [gdb_breakpoint "*$address" no-message] "set breakpoint on address" + # breakpoint, so instead, run to the breakpoint. + gdb_run_cmd + +-gdb_test "" "Breakpoint .*" "hit breakpoint" ++set test "hit breakpoint" ++gdb_expect { ++ -re "Breakpoint .*\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re "$inferior_exited_re normally.*\r\n$gdb_prompt $" { ++ unsupported $test ++ } ++ -re "\r\n$gdb_prompt $" { ++ fail $test ++ } ++ default { ++ fail $test ++ } ++} +-- +2.35.3 + diff --git a/gdb-testsuite-fix-gdb.base-ending-run.exp-on-manjaro.patch b/gdb-testsuite-fix-gdb.base-ending-run.exp-on-manjaro.patch new file mode 100644 index 0000000..26f3954 --- /dev/null +++ b/gdb-testsuite-fix-gdb.base-ending-run.exp-on-manjaro.patch @@ -0,0 +1,58 @@ +From 5f7c4f7a435571d535c2372b999e1017eefb15c4 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 28 Mar 2024 08:26:31 +0100 +Subject: [PATCH 33/48] [gdb/testsuite] Fix gdb.base/ending-run.exp on manjaro + linux + +On aarch64-linux, using the manjaro linux distro, I run into: +... +(gdb) next^M +32 }^M +(gdb) next^M +0x0000fffff7d67b80 in ?? () from /usr/lib/libc.so.6^M +(gdb) FAIL: gdb.base/ending-run.exp: step out of main +... + +What happens here is described in detail in this clause: +... + -re "0x.*\\?\\? \\(\\) from /lib/powerpc.*$gdb_prompt $" { + # This case occurs on Powerpc when gdb steps out of main and the + # needed debug info files are not loaded on the system, preventing + # GDB to determine which function it reached (__libc_start_call_main). + # Ideally, the target system would have the necessary debugging + # information, but in its absence, GDB's behavior is as expected. + ... + } +... +but the clause only matches for powerpc. + +Fix this by: +- making the regexp generic enough to also match /usr/lib/libc.so.6, and +- updating the comment to not mention powerpc. + +Tested on aarch64-linux. + +PR testsuite/31450 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31450 +--- + gdb/testsuite/gdb.base/ending-run.exp | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/ending-run.exp b/gdb/testsuite/gdb.base/ending-run.exp +index 070dcc6f190..76701d33e19 100644 +--- a/gdb/testsuite/gdb.base/ending-run.exp ++++ b/gdb/testsuite/gdb.base/ending-run.exp +@@ -206,8 +206,8 @@ gdb_test_multiple "next" "step out of main" { + # This is what happens on system using uClibc. + pass "step out of main" + } +- -re "0x.*\\?\\? \\(\\) from /lib/powerpc.*$gdb_prompt $" { +- # This case occurs on Powerpc when gdb steps out of main and the ++ -re -wrap "$hex in \\?\\? \\(\\) from \[^\r\n\]+" { ++ # This case occurs when gdb steps out of main and the + # needed debug info files are not loaded on the system, preventing + # GDB to determine which function it reached (__libc_start_call_main). + # Ideally, the target system would have the necessary debugging +-- +2.35.3 + diff --git a/gdb-testsuite-fix-gdb.base-list-no-debug.exp-on-debi.patch b/gdb-testsuite-fix-gdb.base-list-no-debug.exp-on-debi.patch new file mode 100644 index 0000000..443bf3e --- /dev/null +++ b/gdb-testsuite-fix-gdb.base-list-no-debug.exp-on-debi.patch @@ -0,0 +1,103 @@ +From 2235f362eba0387f0404620676dd29637ff17738 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sun, 17 Mar 2024 16:48:43 +0100 +Subject: [PATCH 39/48] [gdb/testsuite] Fix gdb.base/list-no-debug.exp on + debian + +On debian 12, aarch64-linux I run into: +... +(gdb) list .^M +No symbol table is loaded. Use the "file" command.^M +(gdb) FAIL: gdb.base/list-nodebug.exp: first 'list .' +... + +The test-case expects some debug info, but none for main. Instead, there's no +debug info at all. + +Fix this by adding another source file to the test-case, and compiling it with +debug info. + +Tested on aarch64-linux. + +Approved-By: Andrew Burgess + +PR testsuite/31290 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31290 +--- + gdb/testsuite/gdb.base/list-nodebug-2.c | 24 ++++++++++++++++++++++++ + gdb/testsuite/gdb.base/list-nodebug.c | 7 +++++-- + gdb/testsuite/gdb.base/list-nodebug.exp | 9 ++++++--- + 3 files changed, 35 insertions(+), 5 deletions(-) + create mode 100644 gdb/testsuite/gdb.base/list-nodebug-2.c + +diff --git a/gdb/testsuite/gdb.base/list-nodebug-2.c b/gdb/testsuite/gdb.base/list-nodebug-2.c +new file mode 100644 +index 00000000000..861e6149071 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/list-nodebug-2.c +@@ -0,0 +1,24 @@ ++/* This testcase is part of GDB, the GNU debugger. ++ ++ Copyright 2024 Free Software Foundation, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++extern int foo (void); ++ ++int ++foo (void) ++{ ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/list-nodebug.c b/gdb/testsuite/gdb.base/list-nodebug.c +index 078517c011e..d4ae6787310 100644 +--- a/gdb/testsuite/gdb.base/list-nodebug.c ++++ b/gdb/testsuite/gdb.base/list-nodebug.c +@@ -15,7 +15,10 @@ + You should have received a copy of the GNU General Public License + along with this program. If not, see . */ + +-int main () ++extern int foo (void); ++ ++int ++main (void) + { +- return 0; ++ return foo (); + } +diff --git a/gdb/testsuite/gdb.base/list-nodebug.exp b/gdb/testsuite/gdb.base/list-nodebug.exp +index 08de05423af..942a282083a 100644 +--- a/gdb/testsuite/gdb.base/list-nodebug.exp ++++ b/gdb/testsuite/gdb.base/list-nodebug.exp +@@ -16,10 +16,13 @@ + # Test that using the command "list" in a file with no debug information + # will not crash GDB and will give reasonable output. + +-standard_testfile .c ++standard_testfile .c -2.c + +-if {[prepare_for_testing "failed to prepare" ${testfile} ${srcfile} \ +- {nodebug}]} { ++if { [prepare_for_testing_full "failed to prepare" \ ++ [list \ ++ $testfile {} \ ++ $srcfile {nodebug} \ ++ $srcfile2 {debug}]] } { + return -1 + } + +-- +2.35.3 + diff --git a/gdb-testsuite-fix-gdb.base-step-over-syscall.exp-with-m32-amd-case.patch b/gdb-testsuite-fix-gdb.base-step-over-syscall.exp-with-m32-amd-case.patch new file mode 100644 index 0000000..5b3cbb9 --- /dev/null +++ b/gdb-testsuite-fix-gdb.base-step-over-syscall.exp-with-m32-amd-case.patch @@ -0,0 +1,71 @@ +[gdb/testsuite] Fix gdb.base/step-over-syscall.exp with -m32, AMD case + +On an OBS machine with openSUSE Leap 15.2 and target board unix/-m32 I run +into: +... +(gdb) x/2i $pc^M +=> 0xf7fd5155 <__kernel_vsyscall+5>: syscall ^M + 0xf7fd5157 <__kernel_vsyscall+7>: int $0x80^M +(gdb) PASS: gdb.base/step-over-syscall.exp: fork: displaced=off: \ + pc before/after syscall instruction +stepi^M +[Detaching after fork from child process 19924]^M +0xf7fd5159 in __kernel_vsyscall ()^M +1: x/i $pc^M +=> 0xf7fd5159 <__kernel_vsyscall+9>: pop %ebp^M +(gdb) PASS: gdb.base/step-over-syscall.exp: fork: displaced=off: stepi fork insn +print /x $pc^M +$2 = 0xf7fd5159^M +(gdb) PASS: gdb.base/step-over-syscall.exp: fork: displaced=off: pc after stepi +FAIL: gdb.base/step-over-syscall.exp: fork: displaced=off: \ + pc after stepi matches insn addr a +fter syscall +... + +This is essentially a duplicate of the problem solved by commit 14852123287 +"[gdb/testsuite] Fix gdb.base/step-over-syscall.exp with -m32", only here the +insn before "int $0x80" is syscall instead of sysenter. + +The background here is that we're executing this code in the linux kernel +(from ./arch/x86/entry/vdso/vdso32/system_call.S): +... + #define SYSENTER_SEQUENCE "movl %esp, %ebp; sysenter" + #define SYSCALL_SEQUENCE "movl %ecx, %ebp; syscall" + + /* If SYSENTER (Intel) or SYSCALL32 (AMD) is available, use it. */ + ALTERNATIVE_2 "", SYSENTER_SEQUENCE, X86_FEATURE_SYSENTER32, \ + SYSCALL_SEQUENCE, X86_FEATURE_SYSCALL32 + ALTERNATIVE "", SYSENTER_SEQUENCE, X86_FEATURE_SEP +... +and depending on the active feature, we either have sysenter or syscall. + +Fix this by recognizing the "syscall", "int $0x80" sequence. + +Tested on x86_64-linux. + +--- + gdb/testsuite/gdb.base/step-over-syscall.exp | 9 +++++---- + 1 file changed, 5 insertions(+), 4 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/step-over-syscall.exp b/gdb/testsuite/gdb.base/step-over-syscall.exp +index ecfb7be481d..a4821d7cd5a 100644 +--- a/gdb/testsuite/gdb.base/step-over-syscall.exp ++++ b/gdb/testsuite/gdb.base/step-over-syscall.exp +@@ -162,12 +162,13 @@ proc setup { syscall } { + } + + # If we encounter a sequence: +- # 0xf7fd5155 <__kernel_vsyscall+5>: sysenter ++ # 0xf7fd5155 <__kernel_vsyscall+5>: sysenter / syscall + # 0xf7fd5157 <__kernel_vsyscall+7>: int $0x80 + # 0xf7fd5159 <__kernel_vsyscall+9>: pop %ebp +- # then a stepi at sysenter will step over the int insn, so make sure +- # next_insn_addr points after the int insn. +- if { $actual_syscall_insn == "sysenter" } { ++ # then a stepi at sysenter/syscall will step over the int insn, ++ # so make sure next_insn_addr points after the int insn. ++ if { $actual_syscall_insn == "sysenter" ++ || $actual_syscall_insn == "syscall" } { + set test "pc after sysenter instruction" + set re_int_insn "\[ \t\]*int\[ \t\]\[^\r\n\]*" + set re [multi_line \ diff --git a/gdb-testsuite-fix-gdb.cp-namespace.exp-with-read1.patch b/gdb-testsuite-fix-gdb.cp-namespace.exp-with-read1.patch new file mode 100644 index 0000000..64e0052 --- /dev/null +++ b/gdb-testsuite-fix-gdb.cp-namespace.exp-with-read1.patch @@ -0,0 +1,57 @@ +From 818f70aa9a6c17ddc79ac33f80c1a3e4df30ea14 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sun, 14 Jan 2024 09:36:12 +0100 +Subject: [PATCH 46/48] [gdb/testsuite] Fix gdb.cp/namespace.exp with read1 + +With check-read1 we run into: +... +(gdb) break DNE>::DNE^M +Function "DNE>::DNE" not defined.^M +Make breakpoint pending on future shared library load? (y or [n]) y^M +Breakpoint 9 (DNE>::DNE) pending.^M +n^M +(gdb) FAIL: gdb.cp/namespace.exp: br malformed '>' (got interactive prompt) +n^M +... + +The question is supposed to be handled by the question and response arguments +to this gdb_test call: +... +gdb_test "break DNE>::DNE" "" "br malformed \'>\'" \ + "Make breakpoint pending on future shared library load?.*" "y" +... +but both this and the builtin handling in gdb_test_multiple triggers. + +The cause of this is that the question argument regexp is incomplete. + +Fix this by making sure that the entire question is matched in the regexp: +... +set yn_re [string_to_regexp {(y or [n])}] + ... + "Make breakpoint pending on future shared library load\\? $yn_re " "Y" +... + +Tested on x86_64-linux. +--- + gdb/testsuite/gdb.cp/namespace.exp | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/gdb/testsuite/gdb.cp/namespace.exp b/gdb/testsuite/gdb.cp/namespace.exp +index a9de09f087d..b1c7403f2c6 100644 +--- a/gdb/testsuite/gdb.cp/namespace.exp ++++ b/gdb/testsuite/gdb.cp/namespace.exp +@@ -251,8 +251,9 @@ gdb_test "print AAA::ALPHA" "\\$\[0-9\].* = AAA::ALPHA" + gdb_test "whatis ::C::CClass::NestedClass" "type = C::CClass::NestedClass" + gdb_test "whatis ::C::CClass::NestedClass *" "type = C::CClass::NestedClass \\*" + ++set yn_re [string_to_regexp {(y or [n])}] + # Break on functions with a malformed name. + gdb_test "break DNE>::DNE" "" "br malformed \'>\'" \ +- "Make breakpoint pending on future shared library load?.*" "y" ++ "Make breakpoint pending on future shared library load\\? $yn_re " "Y" + gdb_test "break DNE)::DNE" "" "br malformed \')\'" \ +- "Make breakpoint pending on future shared library load?.*" "y" ++ "Make breakpoint pending on future shared library load\\? $yn_re " "Y" +-- +2.35.3 + diff --git a/gdb-testsuite-fix-gdb.dwarf2-dw2-gas-workaround.exp.patch b/gdb-testsuite-fix-gdb.dwarf2-dw2-gas-workaround.exp.patch new file mode 100644 index 0000000..99a0948 --- /dev/null +++ b/gdb-testsuite-fix-gdb.dwarf2-dw2-gas-workaround.exp.patch @@ -0,0 +1,41 @@ +From 254988c36fe592e89af5d92e1d35a6eb4b09cbb0 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Mon, 6 Nov 2023 08:32:54 +0100 +Subject: [PATCH 2/2] [gdb/testsuite] Fix gdb.dwarf2/dw2-gas-workaround.exp + +Recently added test-case gdb.dwarf2/dw2-gas-workaround.exp: +- passes when gdb is configured using $(cd ../src; pwd)/configure, but +- fails when using ../src/configure. + +Fix this by making the matching more precise: +... +- -re -wrap "$objdir.*" { ++ -re -wrap "name_for_id = $objdir/$srcfile\r\n.*" { +... +such that we only fail on the line: +... +[symtab-create] start_subfile: name = dw2-lines.c, name_for_id = \ + /data/vries/gdb/leap-15-4/build/gdb/testsuite/dw2-lines.c^M +... + +Reported-By: Carl Love +--- + gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp b/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp +index ca2b10f23b3..7d5375a920a 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp ++++ b/gdb/testsuite/gdb.dwarf2/dw2-gas-workaround.exp +@@ -83,7 +83,7 @@ if { [prepare_for_testing "failed to prepare" ${testfile} \ + + gdb_test_no_output "set debug symtab-create 1" + gdb_test_multiple "ptype bar" "" { +- -re -wrap "$objdir.*" { ++ -re -wrap "name_for_id = $objdir/$srcfile\r\n.*" { + fail $gdb_test_name + } + -re -wrap "" { +-- +2.35.3 + diff --git a/gdb-testsuite-fix-gdb.fortran-array-bounds.exp-on-ar.patch b/gdb-testsuite-fix-gdb.fortran-array-bounds.exp-on-ar.patch new file mode 100644 index 0000000..fce13ed --- /dev/null +++ b/gdb-testsuite-fix-gdb.fortran-array-bounds.exp-on-ar.patch @@ -0,0 +1,95 @@ +From a6f598be3d0477c5c59bd490573a5d457949658e Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 7 Jun 2024 08:12:34 +0200 +Subject: [PATCH] [gdb/testsuite] Fix gdb.fortran/array-bounds.exp on arm + +When running test-case gdb.fortran/array-bounds.exp on arm-linux, we run into: +... +(gdb) print &foo^M +$1 = (PTR TO -> ( real(kind=4) (0:1) )) 0xfffef008^M +(gdb) FAIL: gdb.fortran/array-bounds.exp: print &foo +print &bar^M +$2 = (PTR TO -> ( real(kind=4) (-1:0) )) 0xfffef010^M +(gdb) FAIL: gdb.fortran/array-bounds.exp: print &bar +... + +This is due to gcc PR debug/54934. + +The test-case contains a kfail for this, which is only activated for +x86_64/i386. + +Fix this by enabling the kfail for all ilp32 targets. + +Also: +- change the kfail into an xfail, because gdb is not at fault here, and +- limit the xfail to the gfortran compiler. + +Tested on arm-linux. + +(cherry picked from commit f9478936896ada7786e8d68622f6e6ff78b97b0d) +--- + gdb/testsuite/gdb.fortran/array-bounds.exp | 45 +++++++++++++++------- + 1 file changed, 31 insertions(+), 14 deletions(-) + +diff --git a/gdb/testsuite/gdb.fortran/array-bounds.exp b/gdb/testsuite/gdb.fortran/array-bounds.exp +index e3f2603a118..a9d6011aed4 100644 +--- a/gdb/testsuite/gdb.fortran/array-bounds.exp ++++ b/gdb/testsuite/gdb.fortran/array-bounds.exp +@@ -31,21 +31,38 @@ if {![fortran_runto_main]} { + return + } + +-# Convenience proc to setup for KFAIL +-proc kfail_if {exp bugid triplet} { +- if {$exp} { +- setup_kfail $bugid $triplet ++# GCC outputs incorrect range debug info for -m32, gcc PR debug/54934. ++set expect_xfail \ ++ [expr \ ++ [test_compiler_info {gfortran-*} f90] \ ++ && [is_ilp32_target]] ++ ++set re_ok [string_to_regexp (4294967296:4294967297)] ++set re_xfail [string_to_regexp (0:1)] ++gdb_test_multiple "print &foo" "" { ++ -re -wrap $re_ok.* { ++ pass $gdb_test_name ++ } ++ -re -wrap $re_xfail.* { ++ if { $expect_xfail } { ++ xfail $gdb_test_name ++ } else { ++ fail $gdb_test_name ++ } + } + } + +-# GCC outputs incorrect range debug info for -m32. +-set expect_fail false +-if {[is_ilp32_target] && ([istarget "i\[34567\]86-*-linux*"] +- || [istarget "x86_64-*-linux*"])} { +- set expect_fail true ++set re_ok [string_to_regexp (-4294967297:-4294967296)] ++set re_xfail [string_to_regexp (-1:0)] ++gdb_test_multiple "print &bar" "" { ++ -re -wrap $re_ok.* { ++ pass $gdb_test_name ++ } ++ -re -wrap $re_xfail.* { ++ if { $expect_xfail } { ++ xfail $gdb_test_name ++ } else { ++ fail $gdb_test_name ++ } ++ } + } +- +-kfail_if $expect_fail "gcc/54934" "*-*-*" +-gdb_test "print &foo" {.*\(4294967296:4294967297\).*} +-kfail_if $expect_fail "gcc/54934" "*-*-*" +-gdb_test "print &bar" {.*\(-4294967297:-4294967296\).*} + +base-commit: 4c7dab250c3581e691c2da87395e80244074d8bf +-- +2.35.3 + diff --git a/gdb-testsuite-fix-gdb.mi-mi-dprintf.exp-with-read1.patch b/gdb-testsuite-fix-gdb.mi-mi-dprintf.exp-with-read1.patch new file mode 100644 index 0000000..1115c0c --- /dev/null +++ b/gdb-testsuite-fix-gdb.mi-mi-dprintf.exp-with-read1.patch @@ -0,0 +1,72 @@ +From 80b0afed39702c7a25d68f6b28427f92c5db6d80 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sun, 14 Jan 2024 10:21:46 +0100 +Subject: [PATCH 45/48] [gdb/testsuite] Fix gdb.mi/mi-dprintf.exp with read1 + +When running test-case gdb.mi/mi-dprintf.exp with check-read1, I run into: +... +(gdb) ^M +PASS: gdb.mi/mi-dprintf.exp: gdb: mi 2nd dprintf stop +-data-evaluate-expression stderr^M +^done,value="0x7ffff7e4a420 <_IO_2_1_stderr_>"^M +(gdb) FAIL: gdb.mi/mi-dprintf.exp: stderr symbol check +... + +The problem is in proc mi_gdb_is_stderr_available: +... +proc mi_gdb_is_stderr_available {} { + set has_stderr_symbol false + gdb_test_multiple "-data-evaluate-expression stderr" "stderr symbol check" { + -re "\\^error,msg=\"'stderr' has unknown type; cast it to its declared type\"\r\n$::mi_gdb_prompt$" { + } + -re "$::mi_gdb_prompt$" { + set has_stderr_symbol true + } + } +... +which uses a gdb_test_multiple that is supposed to use the mi prompt, but +doesn't use -prompt to indicate this. Consequently, the default patterns use +the regular gdb prompt, which trigger earlier than the two custom patterns +which use "$::mi_gdb_prompt$". + +Fix this by adding the missing -prompt "$::mi_gdb_prompt$" arguments. + +While we're at it, make the gdb_test_multiple call a bit more readable by +using variables, and by using -wrap. + +Tested on x86_64-linux, with: +- gcc and clang (to trigger both the has_stderr_symbol true and false cases) +- make check and make check-read1. +--- + gdb/testsuite/lib/mi-support.exp | 11 ++++++++--- + 1 file changed, 8 insertions(+), 3 deletions(-) + +diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp +index 540eb3371c6..1b702e8a3bb 100644 +--- a/gdb/testsuite/lib/mi-support.exp ++++ b/gdb/testsuite/lib/mi-support.exp +@@ -2956,13 +2956,18 @@ proc foreach_mi_ui_mode { var_name body } { + # Check if GDB has information about the stderr symbol. + proc mi_gdb_is_stderr_available {} { + set has_stderr_symbol false +- gdb_test_multiple "-data-evaluate-expression stderr" "stderr symbol check" { +- -re "\\^error,msg=\"'stderr' has unknown type; cast it to its declared type\"\r\n$::mi_gdb_prompt$" { ++ ++ set cmd "-data-evaluate-expression stderr" ++ set test "stderr symbol check" ++ set msg_re {"'stderr' has unknown type; cast it to its declared type"} ++ gdb_test_multiple $cmd $test -prompt "$::mi_gdb_prompt$" { ++ -re -wrap "\\^error,msg=$msg_re" { + # Default value of false is fine. + } +- -re "$::mi_gdb_prompt$" { ++ -re -wrap "" { + set has_stderr_symbol true + } + } ++ + return $has_stderr_symbol + } +-- +2.35.3 + diff --git a/gdb-testsuite-fix-gdb.server-server-connect.exp-for-.patch b/gdb-testsuite-fix-gdb.server-server-connect.exp-for-.patch new file mode 100644 index 0000000..7606cae --- /dev/null +++ b/gdb-testsuite-fix-gdb.server-server-connect.exp-for-.patch @@ -0,0 +1,74 @@ +From 237a0ec8a20cc5e233d630a43d9cacd2774a564d Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Wed, 20 Mar 2024 19:31:24 +0100 +Subject: [PATCH 37/48] [gdb/testsuite] Fix gdb.server/server-connect.exp for + missing ipv6 + +On a system without ipv6 support enabled, when running test-case +gdb.server/server-connect.exp, it takes about 4 minutes, and I get: +... +builtin_spawn gdbserver --once ::1:2347 server-connect^M +Can't open socket: Address family not supported by protocol.^M +Exiting^M +PASS: gdb.server/server-connect.exp: tcp6: start gdbserver +target remote tcp6:::1:2347^M +A program is being debugged already. Kill it? (y or n) y^M +could not connect: Address family not supported by protocol.^M +(gdb) FAIL: gdb.server/server-connect.exp: tcp6: connect to gdbserver using tcp6:::1 +... + +Fix this by: +- recognizing the error message in gdbserver_start, and returning an empty list + to signal unsupported, and +- handling the unsupported response in the test-case. + +This brings testing time down to 2 seconds, and gets me: +... +UNSUPPORTED: gdb.server/server-connect.exp: tcp6: start gdbserver +UNSUPPORTED: gdb.server/server-connect.exp: tcp6-with-brackets: start gdbserver +UNSUPPORTED: gdb.server/server-connect.exp: udp6: start gdbserver +UNSUPPORTED: gdb.server/server-connect.exp: udp6-with-brackets: start gdbserver +... + +Tested on aarch64-linux. + +Approved-By: Tom Tromey + +PR testsuite/31502 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31502 +--- + gdb/testsuite/gdb.server/server-connect.exp | 3 +++ + gdb/testsuite/lib/gdbserver-support.exp | 3 +++ + 2 files changed, 6 insertions(+) + +diff --git a/gdb/testsuite/gdb.server/server-connect.exp b/gdb/testsuite/gdb.server/server-connect.exp +index 1f5b9a27cf4..ffdfaa89154 100644 +--- a/gdb/testsuite/gdb.server/server-connect.exp ++++ b/gdb/testsuite/gdb.server/server-connect.exp +@@ -88,6 +88,9 @@ save_vars { GDB_TEST_SOCKETHOST } { + } else { + if { $gdbserver_should_fail } { + fail "$test: gdbserver should fail but did not" ++ } elseif { [llength $res] == 0 } { ++ unsupported $test ++ continue + } else { + pass "$test" + } +diff --git a/gdb/testsuite/lib/gdbserver-support.exp b/gdb/testsuite/lib/gdbserver-support.exp +index a3cccf54a72..d065fb36764 100644 +--- a/gdb/testsuite/lib/gdbserver-support.exp ++++ b/gdb/testsuite/lib/gdbserver-support.exp +@@ -429,6 +429,9 @@ proc gdbserver_start { options arguments } { + -re ".*: cannot resolve name: .*\r\n" { + error "gdbserver cannot resolve name." + } ++ -re "Can't open socket: Address family not supported by protocol." { ++ return {} ++ } + timeout { + error "Timeout waiting for gdbserver response." + } +-- +2.35.3 + diff --git a/gdb-testsuite-fix-gdbserver-pid-in-gdb.server-server.patch b/gdb-testsuite-fix-gdbserver-pid-in-gdb.server-server.patch new file mode 100644 index 0000000..d96e679 --- /dev/null +++ b/gdb-testsuite-fix-gdbserver-pid-in-gdb.server-server.patch @@ -0,0 +1,117 @@ +From 7357f73483cfe8f3e8ec2dd9ca2fb3d52206055a Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Wed, 17 Apr 2024 11:45:02 +0200 +Subject: [PATCH 28/48] [gdb/testsuite] Fix gdbserver pid in + gdb.server/server-kill-python.exp + +The commit ed32754a8c7 ("[gdb/testsuite] Fix gdb.server/multi-ui-errors.exp for +remote target") intended to addresss the problem that this command: +... +set gdbserver_pid [exp_pid -i $server_spawn_id] +... +does not return the pid of the gdbserver for remote target, but rather the one +of the ssh client session. + +To fix this, it added another way of getting the gdbserver_pid. + +For the trivial case of non-remote target, the PID found by either method +should be identical, but if we compare those by adding +"puts [exec ps -p $gdbserver_pid]" we get: +... + PID TTY TIME CMD +31711 pts/8 00:00:00 gdbserver + PID TTY TIME CMD +31718 pts/8 00:00:00 server-kill-pyt +... + +The problem is that while the gdbserver PID is supposed to be read from the +result of "gdb.execute ('p server_pid')" in the python script, instead it's +taken from: +... +Process server-kill-python created; pid = 31718^M +... + +Fix this by moving the printing of the gdbserver PID out of the python script. + +Also double-check the two methods against each other, in the cases that they +should match. + +Tested on x86_64-linux. + +PR testsuite/31633 +https://sourceware.org/bugzilla/show_bug.cgi?id=31633 +--- + .../gdb.server/server-kill-python.exp | 37 +++++++++++-------- + 1 file changed, 21 insertions(+), 16 deletions(-) + +diff --git a/gdb/testsuite/gdb.server/server-kill-python.exp b/gdb/testsuite/gdb.server/server-kill-python.exp +index dcb6eddd6eb..778880984ec 100644 +--- a/gdb/testsuite/gdb.server/server-kill-python.exp ++++ b/gdb/testsuite/gdb.server/server-kill-python.exp +@@ -37,7 +37,7 @@ set host_binfile [gdb_remote_download host $binfile] + set res [gdbserver_spawn "${target_binfile}"] + set gdbserver_protocol [lindex $res 0] + set gdbserver_gdbport [lindex $res 1] +-set gdbserver_pid [exp_pid -i $server_spawn_id] ++set gdbserver_pid_check [exp_pid -i $server_spawn_id] + + set break_linenr [gdb_get_line_number "@@XX@@ Inferior Starting @@XX@@"] + +@@ -48,9 +48,6 @@ puts $fd \ + "import gdb + + def do_gdb_stuff (): +- gdb.execute ('break $srcfile:$break_linenr') +- gdb.execute ('continue') +- gdb.execute ('p server_pid') + gdb.execute ('continue') + + do_gdb_stuff()" +@@ -68,24 +65,32 @@ if {[gdb_spawn_with_cmdline_opts \ + + gdb_load $binfile + gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport +-send_gdb "source $host_file1\n" ++ ++gdb_test "break $srcfile:$break_linenr" + + # Get the gdbserver PID. + set gdbserver_pid 0 +- +-# Wait for the inferior to start up. +-with_spawn_id $server_spawn_id { +- gdb_test_multiple "" "get gdbserver PID" { +- -re " = ($decimal)\r\n" { +- set gdbserver_pid $expect_out(1,string) +- pass $gdb_test_name +- } ++gdb_test "continue" ++gdb_test_multiple "print server_pid" "get gdbserver PID" { ++ -re -wrap " = ($decimal)" { ++ set gdbserver_pid $expect_out(1,string) ++ pass $gdb_test_name + } ++} + +- if { $gdbserver_pid == 0 } { +- return +- } ++if { $gdbserver_pid == 0 } { ++ return ++} ++ ++if { ![is_remote target] && $gdbserver_pid != $gdbserver_pid_check } { ++ error "Failed to get correct gdbserver pid" ++} + ++send_gdb "source $host_file1\n" ++ ++ ++# Wait for the inferior to start up. ++with_spawn_id $server_spawn_id { + gdb_test_multiple "" "ensure inferior is running" { + -re "@@XX@@ Inferior Starting @@XX@@" { + pass $gdb_test_name +-- +2.35.3 + diff --git a/gdb-testsuite-fix-license-text-in-gdb.reverse-map-to.patch b/gdb-testsuite-fix-license-text-in-gdb.reverse-map-to.patch new file mode 100644 index 0000000..7bbae1c --- /dev/null +++ b/gdb-testsuite-fix-license-text-in-gdb.reverse-map-to.patch @@ -0,0 +1,49 @@ +From 5b840a3cb41ada4cee1456d16993809abeb30eda Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 22 Feb 2024 12:09:14 +0100 +Subject: [PATCH 43/48] [gdb/testsuite] Fix license text in + gdb.reverse/map-to-same-line.{c,exp} + +I noticed in gdb.reverse/map-to-same-line.{c,exp} that the license urls are +using some kind of indirection via urldefense.proofpoint.com. + +Fix this by removing this indirection. + +Tested on x86_64-linux. + +PR testsuite/31358 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31358 +--- + gdb/testsuite/gdb.reverse/map-to-same-line.c | 2 +- + gdb/testsuite/gdb.reverse/map-to-same-line.exp | 2 +- + 2 files changed, 2 insertions(+), 2 deletions(-) + +diff --git a/gdb/testsuite/gdb.reverse/map-to-same-line.c b/gdb/testsuite/gdb.reverse/map-to-same-line.c +index 3086e849231..f6b4f10dbf7 100644 +--- a/gdb/testsuite/gdb.reverse/map-to-same-line.c ++++ b/gdb/testsuite/gdb.reverse/map-to-same-line.c +@@ -11,7 +11,7 @@ + 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 . */ ++ along with this program. If not, see . */ + + /* The purpose of this test is to create a DWARF line table that contains two + or more entries for the same line. When stepping (forwards or backwards), +diff --git a/gdb/testsuite/gdb.reverse/map-to-same-line.exp b/gdb/testsuite/gdb.reverse/map-to-same-line.exp +index 63f8c9c76b3..1510cf98d0c 100644 +--- a/gdb/testsuite/gdb.reverse/map-to-same-line.exp ++++ b/gdb/testsuite/gdb.reverse/map-to-same-line.exp +@@ -11,7 +11,7 @@ + # 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 . ++# along with this program. If not, see . + + # When stepping (forwards or backwards), GDB should step over the entire line + # and not just a particular entry in the line table. This test was added to +-- +2.35.3 + diff --git a/gdb-testsuite-fix-missing-return-type-in-gdb.linespe.patch b/gdb-testsuite-fix-missing-return-type-in-gdb.linespe.patch new file mode 100644 index 0000000..25083c5 --- /dev/null +++ b/gdb-testsuite-fix-missing-return-type-in-gdb.linespe.patch @@ -0,0 +1,40 @@ +From 3e4d764ebb264f0c9153c6fd3727f67d4454ae9b Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 29 Mar 2024 07:47:30 +0100 +Subject: [PATCH 32/48] [gdb/testsuite] Fix missing return type in + gdb.linespec/break-asm-file.c + +On fedora rawhide, when running test-case gdb.linespec/break-asm-file.exp, I +get: +... +gdb compile failed, break-asm-file.c:21:8: error: \ + return type defaults to 'int' [-Wimplicit-int] + 21 | static func() + | ^~~~ +... + +Fix this by adding the missing return type. + +Tested on aarch64-linux. + +Approved-By: John Baldwin +--- + gdb/testsuite/gdb.linespec/break-asm-file.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.linespec/break-asm-file.c b/gdb/testsuite/gdb.linespec/break-asm-file.c +index 41f0904fc84..e7bdc26b1ec 100644 +--- a/gdb/testsuite/gdb.linespec/break-asm-file.c ++++ b/gdb/testsuite/gdb.linespec/break-asm-file.c +@@ -18,7 +18,7 @@ + void func3(); + void func2(); + +-static func() ++static void func() + { + } + +-- +2.35.3 + diff --git a/gdb-testsuite-fix-regexp-in-vgdb_start.patch b/gdb-testsuite-fix-regexp-in-vgdb_start.patch new file mode 100644 index 0000000..2591fa6 --- /dev/null +++ b/gdb-testsuite-fix-regexp-in-vgdb_start.patch @@ -0,0 +1,66 @@ +From acc30323a8bc8aa04d404356e96b003a9a30543f Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 25 Jan 2024 16:36:09 +0100 +Subject: [PATCH 06/48] [gdb/testsuite] Fix regexp in vgdb_start + +On Fedora 39 aarch64 I run into: +... +(gdb) target remote | vgdb --wait=2 --max-invoke-ms=2500 --pid=2114437^M +Remote debugging using | vgdb --wait=2 --max-invoke-ms=2500 --pid=2114437^M +relaying data between gdb and process 2114437^M +warning: remote target does not support file transfer, \ + attempting to access files from local filesystem.^M +Reading symbols from /lib/ld-linux-aarch64.so.1...^M +_start () at ../sysdeps/aarch64/dl-start.S:22^M +warning: 22 ../sysdeps/aarch64/dl-start.S: No such file or directory^M +(gdb) FAIL: gdb.base/valgrind-infcall.exp: target remote for vgdb +... + +For contrast, on openSUSE Leap 15.4 x86_64 I have: +... +(gdb) target remote | vgdb --wait=2 --max-invoke-ms=2500 --pid=18797^M +Remote debugging using | vgdb --wait=2 --max-invoke-ms=2500 --pid=18797^M +relaying data between gdb and process 18797^M +warning: remote target does not support file transfer, \ + attempting to access files from local filesystem.^M +Reading symbols from /lib64/ld-linux-x86-64.so.2...^M +(No debugging symbols found in /lib64/ld-linux-x86-64.so.2)^M +0x0000000004002550 in _start () from /lib64/ld-linux-x86-64.so.2^M +(gdb) PASS: gdb.base/valgrind-infcall.exp: target remote for vgdb +... + +The fail happens in vgdb_start because the regexp only matches the +"in _start ()" variant, not the "_start () at": +... + gdb_test "$vgdbcmd" " in \\.?_start .*" "target remote for vgdb" +... +Which variant you get is determined by presence of debug info. + +Fix this by also matching the "_start () at" variant. + +Tested aarch64-linux and x86_64-linux. + +Approved-By: Tom Tromey +--- + gdb/testsuite/lib/valgrind.exp | 5 ++++- + 1 file changed, 4 insertions(+), 1 deletion(-) + +diff --git a/gdb/testsuite/lib/valgrind.exp b/gdb/testsuite/lib/valgrind.exp +index a1cd85a7b09..f9096663509 100644 +--- a/gdb/testsuite/lib/valgrind.exp ++++ b/gdb/testsuite/lib/valgrind.exp +@@ -92,7 +92,10 @@ proc vgdb_start { {active_at_startup 1} } { + set vgdbcmd "target remote | vgdb --wait=2 --max-invoke-ms=2500 --pid=$vgdbpid" + + if { $active_at_startup } { +- gdb_test "$vgdbcmd" " in \\.?_start .*" "target remote for vgdb" ++ set start_re1 " in \\.?_start " ++ set start_re2 "\\.?_start \\(\\) at " ++ gdb_test "$vgdbcmd" "($start_re1|$start_re2).*" \ ++ "target remote for vgdb" + } else { + # Let $binfile run a bit before attaching. This is a bit of a hack, + # in that it lets test-case valgrind-infcall-2.exp run to the point of +-- +2.35.3 + diff --git a/gdb-testsuite-fix-spurious-fails-with-examine-backwa.patch b/gdb-testsuite-fix-spurious-fails-with-examine-backwa.patch new file mode 100644 index 0000000..a786701 --- /dev/null +++ b/gdb-testsuite-fix-spurious-fails-with-examine-backwa.patch @@ -0,0 +1,221 @@ +From 8bf7fdfc16f5d5fd9a94c233c0c41d307ba86cd2 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 21 Nov 2023 13:15:29 +0100 +Subject: [PATCH 04/48] [gdb/testsuite] Fix spurious FAILs with + examine-backward.exp, again + +Commit 59a561480d5 ("Fix spurious FAILs with examine-backward.exp") describes +the problem that: +... +The test case examine-backward.exp issues the command "x/-s" after the end +of the first string in TestStrings, but without making sure that this +string is preceded by a string terminator. Thus GDB may spuriously print +some random characters from before that string, and then the test fails. +... + +The commit fixes the problem by adding a Barrier variable before the TestStrings +variable: +... ++const char Barrier[] = { 0x0 }; + const char TestStrings[] = { +... + +There is however no guarantee that Barrier is placed immediately before +TestStrings. + +Before recent commit 169fe7ab54b ("Change gdb.base/examine-backwards.exp for +AIX.") on x86_64-linux, I see: +... +0000000000400660 R Barrier +0000000000400680 R TestStrings +... + +So while the Barrier variable is the first before the TestStrings variable, +it's not immediately preceding TestStrings. + +After commit 169fe7ab54b: +... +0000000000402259 B Barrier +0000000000402020 D TestStrings +... +they're not even in the same section anymore. + +Fix this reliably by adding the zero in the array itself: +... +char TestStringsBase[] = { + 0x0, + ... +}; +char *TestStrings = &TestStringsBase[1]; +... +and do likewise for TestStringsH and TestStringsW. + +Tested on x86_64-linux. + +PR testsuite/31064 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31064 +--- + gdb/testsuite/gdb.base/examine-backward.c | 35 ++++++++++++++------- + gdb/testsuite/gdb.base/examine-backward.exp | 18 +++++------ + 2 files changed, 33 insertions(+), 20 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/examine-backward.c b/gdb/testsuite/gdb.base/examine-backward.c +index 354c2e2f323..5549cc20a4a 100644 +--- a/gdb/testsuite/gdb.base/examine-backward.c ++++ b/gdb/testsuite/gdb.base/examine-backward.c +@@ -32,15 +32,12 @@ literals. The content of each array is the same as followings: + }; + */ + +-/* This is here just to ensure we have a null character before +- TestStrings, to avoid showing garbage when we look for strings +- backwards from TestStrings. */ ++unsigned char TestStringsBase[] = { ++ /* This is here just to ensure we have a null character before ++ TestStrings, to avoid showing garbage when we look for strings ++ backwards from TestStrings. */ ++ 0x0, + +-unsigned char Barrier[] = { +- 0x00, +-}; +- +-unsigned char TestStrings[] = { + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, + 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, +@@ -54,7 +51,14 @@ unsigned char TestStrings[] = { + 0x00 + }; + +-short TestStringsH[] = { ++unsigned char *TestStrings = &TestStringsBase[1]; ++ ++short TestStringsHBase[] = { ++ /* This is here just to ensure we have a null character before ++ TestStringsH, to avoid showing garbage when we look for strings ++ backwards from TestStringsH. */ ++ 0x0, ++ + 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, + 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f, 0x0050, + 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, +@@ -67,7 +71,14 @@ short TestStringsH[] = { + 0x0000 + }; + +-int TestStringsW[] = { ++short *TestStringsH = &TestStringsHBase[1]; ++ ++int TestStringsWBase[] = { ++ /* This is here just to ensure we have a null character before ++ TestStringsW, to avoid showing garbage when we look for strings ++ backwards from TestStringsW. */ ++ 0x0, ++ + 0x00000041, 0x00000042, 0x00000043, 0x00000044, + 0x00000045, 0x00000046, 0x00000047, 0x00000048, + 0x00000049, 0x0000004a, 0x0000004b, 0x0000004c, +@@ -89,11 +100,13 @@ int TestStringsW[] = { + 0x00000000 + }; + ++int *TestStringsW = &TestStringsWBase[1]; ++ + int + main (void) + { + /* Clang++ eliminates the variables if nothing references them. */ +- int dummy = Barrier[0] + TestStrings[0] + TestStringsH[0] + TestStringsW[0]; ++ int dummy = TestStrings[0] + TestStringsH[0] + TestStringsW[0]; + + /* Backward disassemble test requires at least 20 instructions in + this function. Adding a simple bubble sort. */ +diff --git a/gdb/testsuite/gdb.base/examine-backward.exp b/gdb/testsuite/gdb.base/examine-backward.exp +index 7c8a08c0726..4e197d7d725 100644 +--- a/gdb/testsuite/gdb.base/examine-backward.exp ++++ b/gdb/testsuite/gdb.base/examine-backward.exp +@@ -145,7 +145,7 @@ gdb_test_no_output "set charset ASCII" + + with_test_prefix "char-width=1, print-max=20" { + gdb_test_no_output "set print elements 20" +- gdb_test_sequence "x/6s &TestStrings" "take 6 strings forward" { ++ gdb_test_sequence "x/6s TestStrings" "take 6 strings forward" { + "\"ABCDEFGHIJKLMNOPQRST\"\.\.\." + "\"UVWXYZ\"" + "\"\"" +@@ -162,7 +162,7 @@ with_test_prefix "char-width=1, print-max=20" { + "\"[^\"]+\"" + "\"01234567890123456789\"\.\.\." + } +- gdb_test_sequence "x/6s &TestStrings" "take 6 strings forward again" { ++ gdb_test_sequence "x/6s TestStrings" "take 6 strings forward again" { + "\"ABCDEFGHIJKLMNOPQRST\"\.\.\." + "\"UVWXYZ\"" + "\"\"" +@@ -187,7 +187,7 @@ with_test_prefix "char-width=1, print-max=20" { + + with_test_prefix "char-width=2, print-max=20" { + gdb_test_no_output "set print elements 20" +- gdb_test_sequence "x/6sh &TestStringsH" "take 6 strings forward" { ++ gdb_test_sequence "x/6sh TestStringsH" "take 6 strings forward" { + "u\"ABCDEFGHIJKLMNOPQRST\"\.\.\." + "u\"UVWXYZ\"" + "u\"\"" +@@ -204,7 +204,7 @@ with_test_prefix "char-width=2, print-max=20" { + "u\"[^\"]+\"" + "u\"01234567890123456789\"\.\.\." + } +- gdb_test_sequence "x/6sh &TestStringsH" "take 6 strings forward again" { ++ gdb_test_sequence "x/6sh TestStringsH" "take 6 strings forward again" { + "u\"ABCDEFGHIJKLMNOPQRST\"\.\.\." + "u\"UVWXYZ\"" + "u\"\"" +@@ -229,7 +229,7 @@ with_test_prefix "char-width=2, print-max=20" { + + with_test_prefix "char-width=4, print-max=20" { + gdb_test_no_output "set print elements 20" +- gdb_test_sequence "x/6sw &TestStringsW" "take 6 strings forward" { ++ gdb_test_sequence "x/6sw TestStringsW" "take 6 strings forward" { + "U\"ABCDEFGHIJKLMNOPQRST\"\.\.\." + "U\"UVWXYZ\"" + "U\"\"" +@@ -246,7 +246,7 @@ with_test_prefix "char-width=4, print-max=20" { + "U\"[^\"]+\"" + "U\"01234567890123456789\"\.\.\." + } +- gdb_test_sequence "x/6sw &TestStringsW" "take 6 strings forward again" { ++ gdb_test_sequence "x/6sw TestStringsW" "take 6 strings forward again" { + "U\"ABCDEFGHIJKLMNOPQRST\"\.\.\." + "U\"UVWXYZ\"" + "U\"\"" +@@ -271,7 +271,7 @@ with_test_prefix "char-width=4, print-max=20" { + + with_test_prefix "char-width=2, print-max=0" { + gdb_test_no_output "set print elements 0" +- gdb_test_sequence "x/6sh &TestStringsH" "take 6 strings forward" { ++ gdb_test_sequence "x/6sh TestStringsH" "take 6 strings forward" { + "u\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"" + "u\"\"" + "u\"\"" +@@ -289,7 +289,7 @@ with_test_prefix "char-width=2, print-max=0" { + "u\"012345678901234567890123456789\"" + "u\"!!!!!!\"" + } +- gdb_test_sequence "x/6sh &TestStringsH" "take 6 strings forward again" { ++ gdb_test_sequence "x/6sh TestStringsH" "take 6 strings forward again" { + "u\"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"" + "u\"\"" + "u\"\"" +@@ -314,7 +314,7 @@ with_test_prefix "char-width=2, print-max=0" { + + with_test_prefix "char-width=1, print-max=4" { + gdb_test_no_output "set print elements 4" +- gdb_test_sequence "x/9s &TestStrings" "take 9 strings forward" { ++ gdb_test_sequence "x/9s TestStrings" "take 9 strings forward" { + "\"ABCD\"\.\.\." + "\"EFGH\"\.\.\." + "\"IJKL\"\.\.\." +-- +2.35.3 + diff --git a/gdb-testsuite-fix-test-case-gdb.threads-attach-stopp.patch b/gdb-testsuite-fix-test-case-gdb.threads-attach-stopp.patch new file mode 100644 index 0000000..beef20a --- /dev/null +++ b/gdb-testsuite-fix-test-case-gdb.threads-attach-stopp.patch @@ -0,0 +1,65 @@ +From 3596f8119753089d8dd8c0aff800dbf2e283a111 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 28 Mar 2024 08:26:31 +0100 +Subject: [PATCH 34/48] [gdb/testsuite] Fix test-case + gdb.threads/attach-stopped.exp on manjaro linux + +When running test-case gdb.threads/attach-stopped.exp on aarch64-linux, using +the manjaro linux distro, I get: +... + (gdb) thread apply all bt^M + ^M + Thread 2 (Thread 0xffff8d8af120 (LWP 278116) "attach-stopped"):^M + #0 0x0000ffff8d964864 in clock_nanosleep () from /usr/lib/libc.so.6^M + #1 0x0000ffff8d969cac in nanosleep () from /usr/lib/libc.so.6^M + #2 0x0000ffff8d969b68 in sleep () from /usr/lib/libc.so.6^M + #3 0x0000aaaade370828 in func (arg=0x0) at attach-stopped.c:29^M + #4 0x0000ffff8d930aec in ?? () from /usr/lib/libc.so.6^M + #5 0x0000ffff8d99a5dc in ?? () from /usr/lib/libc.so.6^M + ^M + Thread 1 (Thread 0xffff8db62020 (LWP 278111) "attach-stopped"):^M + #0 0x0000ffff8d92d2d8 in ?? () from /usr/lib/libc.so.6^M + #1 0x0000ffff8d9324b8 in ?? () from /usr/lib/libc.so.6^M + #2 0x0000aaaade37086c in main () at attach-stopped.c:45^M + (gdb) FAIL: gdb.threads/attach-stopped.exp: threaded: attach2 to stopped bt +... + +The problem is that the test-case expects to see start_thread: +... + gdb_test "thread apply all bt" ".*sleep.*start_thread.*" \ + "$threadtype: attach2 to stopped bt" +... +but lack of symbols makes that impossible. + +Fix this by allowing " in ?? () from " as well. + +Tested on aarch64-linux. + +PR testsuite/31451 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31451 +--- + gdb/testsuite/gdb.threads/attach-stopped.exp | 6 ++++-- + 1 file changed, 4 insertions(+), 2 deletions(-) + +diff --git a/gdb/testsuite/gdb.threads/attach-stopped.exp b/gdb/testsuite/gdb.threads/attach-stopped.exp +index acdfcb5d8c5..b28fbd1a3d3 100644 +--- a/gdb/testsuite/gdb.threads/attach-stopped.exp ++++ b/gdb/testsuite/gdb.threads/attach-stopped.exp +@@ -54,10 +54,12 @@ proc corefunc { threadtype } { + } + + # ".*sleep.*clone.*" would fail on s390x as bt stops at START_THREAD there. ++ set test "$threadtype: attach2 to stopped bt" + if {[string equal $threadtype threaded]} { +- gdb_test "thread apply all bt" ".*sleep.*start_thread.*" "$threadtype: attach2 to stopped bt" ++ gdb_test "thread apply all bt" \ ++ ".*sleep.*(start_thread| in \\?\\? \\(\\) from ).*" $test + } else { +- gdb_test "bt" ".*sleep.*main.*" "$threadtype: attach2 to stopped bt" ++ gdb_test "bt" ".*sleep.*main.*" $test + } + + gdb_exit +-- +2.35.3 + diff --git a/gdb-testsuite-fix-test-in-gdb.python-py-finish-break.patch b/gdb-testsuite-fix-test-in-gdb.python-py-finish-break.patch new file mode 100644 index 0000000..b977f01 --- /dev/null +++ b/gdb-testsuite-fix-test-in-gdb.python-py-finish-break.patch @@ -0,0 +1,67 @@ +From 7658c4d52562eef199e30fcd2da7da9a56d5d9b3 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 27 Feb 2024 16:18:32 +0100 +Subject: [PATCH 41/48] [gdb/testsuite] Fix test in + gdb.python/py-finish-breakpoint.exp + +With test-case gdb.python/py-finish-breakpoint.exp, we run into: +... +(gdb) python print (finishbp_default.hit_count) +Traceback (most recent call last): + File "", line 1, in +RuntimeError: Breakpoint 3 is invalid. +Error while executing Python code. +(gdb) PASS: gdb.python/py-finish-breakpoint.exp: normal conditions: \ + check finishBP on default frame has been hit +... + +The test producing the pass is: +... + gdb_test "python print (finishbp_default.hit_count)" "1.*" \ + "check finishBP on default frame has been hit" +... +so the pass is produced because the 1 in "line 1" matches "1.*". + +Temporary breakpoints are removed when hit, and consequently accessing the +hit_count attribute of a temporary python breakpoint (gdb.Breakpoint class) is +not possible, and as per spec we get a RuntimeError. + +So the RuntimeError is correct, and not specific to finish breakpoints. + +The test presumably attempts to match: +... +(gdb) python print (finishbp_default.hit_count) +1 +... +but most likely this output was never produced by any gdb version. + +Fix this by checking whether the finishbp_default breakpoint has hit by +checking that finishbp_default.is_valid() is False. + +Tested on aarch64-linux. + +Approved-By: Tom Tromey + +PR testsuite/31391 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31391 +--- + gdb/testsuite/gdb.python/py-finish-breakpoint.exp | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.python/py-finish-breakpoint.exp b/gdb/testsuite/gdb.python/py-finish-breakpoint.exp +index e5a46874afd..687b9ad38cb 100644 +--- a/gdb/testsuite/gdb.python/py-finish-breakpoint.exp ++++ b/gdb/testsuite/gdb.python/py-finish-breakpoint.exp +@@ -73,7 +73,8 @@ with_test_prefix "normal conditions" { + "check MyFinishBreakpoint hit" + gdb_test "python print (finishbp.return_value)" "-5.*" "check return_value" + +- gdb_test "python print (finishbp_default.hit_count)" "1.*" "check finishBP on default frame has been hit" ++ gdb_test "python print (finishbp_default.is_valid())" "False" \ ++ "check finishBP on default frame has been hit" + gdb_test "python print (finishbp.is_valid())" "False.*"\ + "ensure that finish bp is invalid afer normal hit" + +-- +2.35.3 + diff --git a/gdb-testsuite-fix-timeout-in-gdb.tui-resize-2.exp.patch b/gdb-testsuite-fix-timeout-in-gdb.tui-resize-2.exp.patch new file mode 100644 index 0000000..62d57ab --- /dev/null +++ b/gdb-testsuite-fix-timeout-in-gdb.tui-resize-2.exp.patch @@ -0,0 +1,76 @@ +From 56ab56c61f7cba5ed919dfae49c4c8671be8e6b5 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 31 May 2024 10:19:35 +0200 +Subject: [PATCH] [gdb/testsuite] Fix timeout in gdb.tui/resize-2.exp + +When running test-case gdb.tui/resize-2.exp with taskset -c 0, I sometimes run +into: +... +tui disable^[[40;1H^M(gdb) PASS: $exp: tui disable +^M^[[K(gdb) FAIL: $exp: two prompt redisplays after resize (timeout) +... + +The test-case does "Term::resize 24 80 0" while having the settings of an +earlier "Term::resize 40 90", so both dimensions change. + +When TUI is enabled, we call Term::resize with wait_for_msg == 1, and the proc: +- calls stty to change one dimension, +- waits for the message (enabled by "maint set tui-resize-message on") + confirming the resize has happened, +- calls stty to change the other dimension, and again +- waits for the message confirming the resize has happened. + +Since TUI is disabled, we call Term::resize with wait_for_msg == 0 because the +message is not printed, so stty is called twice, and afterwards we check for +the results of the two resizes, which is the test that is failing. + +The problem is that not waiting for a response after each stty call opens up +the possibility of the responses being merged. + +Fix this by calling Term::resize twice, changing one dimension at a time, and +waiting for a single prompt redisplay after each one. + +Tested on x86_64-linux. + +PR testsuite/31822 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31822 +--- + gdb/testsuite/gdb.tui/resize-2.exp | 18 +++++++++++++++--- + 1 file changed, 15 insertions(+), 3 deletions(-) + +diff --git a/gdb/testsuite/gdb.tui/resize-2.exp b/gdb/testsuite/gdb.tui/resize-2.exp +index 0f1f0b9eb1e..729e1ee23f9 100644 +--- a/gdb/testsuite/gdb.tui/resize-2.exp ++++ b/gdb/testsuite/gdb.tui/resize-2.exp +@@ -59,11 +59,23 @@ gdb_test_multiple "tui disable" "" { + } + } + +-# Resize with TUI disabled, so don't wait for the resize message. ++# Resize with TUI disabled, so don't wait for the resize message. Instead, ++# do it in two steps, and wait for a prompt redisplay for each. If we do ++# this in one step, it's unpredictable how may prompt redisplays we'll get. ++Term::resize 24 90 0 ++set screen_dim { 0 0 90 24 } ++ ++gdb_test_multiple "" "prompt redisplays after first resize" { ++ -re "\r.*$gdb_prompt $" { ++ pass $gdb_test_name ++ } ++} ++ + Term::resize 24 80 0 + set screen_dim { 0 0 80 24 } +-gdb_test_multiple "" "two prompt redisplays after resize" { +- -re "\r.*$gdb_prompt \r.*$gdb_prompt $" { ++ ++gdb_test_multiple "" "prompt redisplays after second resize" { ++ -re "\r.*$gdb_prompt $" { + pass $gdb_test_name + } + } + +base-commit: 9736d941f271a6c3c14dcbeb5ad03a5fc4106b45 +-- +2.35.3 + diff --git a/gdb-testsuite-fix-typo-in-gdb.base-catch-syscall.exp.patch b/gdb-testsuite-fix-typo-in-gdb.base-catch-syscall.exp.patch new file mode 100644 index 0000000..22bd445 --- /dev/null +++ b/gdb-testsuite-fix-typo-in-gdb.base-catch-syscall.exp.patch @@ -0,0 +1,52 @@ +From 22655d76bc767d938dc9a72e0f50816a2f97f4c0 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sun, 31 Dec 2023 09:39:45 +0100 +Subject: [PATCH 47/48] [gdb/testsuite] Fix typo in gdb.base/catch-syscall.exp + +On aarch64-linux with a gdb build without libexpat, I run into: +... +(gdb) PASS: gdb.base/catch-syscall.exp: determine pipe syscall: \ + catch syscall 59 +continue +Continuing. + +Catchpoint 5 (call to syscall 59), 0x0000fffff7e04578 in pipe () from \ + /lib64/libc.so.6 +(gdb) FAIL: gdb.base/catch-syscall.exp: determine pipe syscall: continue +... + +In the test-case, this pattern handles either the syscall name or number for +the pipe syscall: +... + -re -wrap "Catchpoint $decimal \\(call to syscall (pipe|$SYS_pipe)\\).*" { +... +but the pattern for the pipe2 syscall mistakenly uses SYS_pipe instead of +SYS_pipe2: +... + -re -wrap "Catchpoint $decimal \\(call to syscall (pipe2|$SYS_pipe)\\).*" { +... +and consequently doesn't handle the pipe2 syscall number. + +Fix the typo by using SYS_pipe2 instead. + +Tested on aarch64-linux. +--- + gdb/testsuite/gdb.base/catch-syscall.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.base/catch-syscall.exp b/gdb/testsuite/gdb.base/catch-syscall.exp +index 0588cb35d87..f7d499cb10b 100644 +--- a/gdb/testsuite/gdb.base/catch-syscall.exp ++++ b/gdb/testsuite/gdb.base/catch-syscall.exp +@@ -752,7 +752,7 @@ proc setup_all_syscalls {} { + pass $gdb_test_name + set ok 1 + } +- -re -wrap "Catchpoint $decimal \\(call to syscall (pipe2|$SYS_pipe)\\).*" { ++ -re -wrap "Catchpoint $decimal \\(call to syscall (pipe2|$SYS_pipe2)\\).*" { + lappend all_syscalls pipe2 + pass $gdb_test_name + set ok 1 +-- +2.35.3 + diff --git a/gdb-testsuite-fix-valgrind-tests-on-debian.patch b/gdb-testsuite-fix-valgrind-tests-on-debian.patch new file mode 100644 index 0000000..d1453cd --- /dev/null +++ b/gdb-testsuite-fix-valgrind-tests-on-debian.patch @@ -0,0 +1,54 @@ +From 489d8a4ff8c5998dad5a55694e346532695c911b Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 26 Mar 2024 17:32:09 +0100 +Subject: [PATCH 36/48] [gdb/testsuite] Fix valgrind tests on debian + +On debian 12, I run into: +... +(gdb) target remote | vgdb --wait=2 --max-invoke-ms=2500 --pid=618591^M +Remote debugging using | vgdb --wait=2 --max-invoke-ms=2500 --pid=618591^M +relaying data between gdb and process 618591^M +warning: remote target does not support file transfer, \ + attempting to access files from local filesystem.^M +Reading symbols from /lib/ld-linux-aarch64.so.1...^M +(No debugging symbols found in /lib/ld-linux-aarch64.so.1)^M +0x000000000401a980 in ?? () from /lib/ld-linux-aarch64.so.1^M +(gdb) FAIL: gdb.base/valgrind-infcall.exp: target remote for vgdb +... + +The problem is that we're expecting to match either of these regexps: +... + set start_re1 " in \\.?_start " + set start_re2 "\\.?_start \\(\\) at " +... +but there are no dwarf or elf symbols present. + +Fix this by also allowing: +... + set start_re3 "$::hex in \\?\\? \\(\\) from " +... + +Tested on aarch64-linux. + +Approved-By: Tom Tromey +--- + gdb/testsuite/lib/valgrind.exp | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/gdb/testsuite/lib/valgrind.exp b/gdb/testsuite/lib/valgrind.exp +index f9096663509..52ef603a803 100644 +--- a/gdb/testsuite/lib/valgrind.exp ++++ b/gdb/testsuite/lib/valgrind.exp +@@ -94,7 +94,8 @@ proc vgdb_start { {active_at_startup 1} } { + if { $active_at_startup } { + set start_re1 " in \\.?_start " + set start_re2 "\\.?_start \\(\\) at " +- gdb_test "$vgdbcmd" "($start_re1|$start_re2).*" \ ++ set start_re3 "$::hex in \\?\\? \\(\\) from " ++ gdb_test "$vgdbcmd" "($start_re1|$start_re2|$start_re3).*" \ + "target remote for vgdb" + } else { + # Let $binfile run a bit before attaching. This is a bit of a hack, +-- +2.35.3 + diff --git a/gdb-testsuite-further-handle-long-filenames-in-gdb.b.patch b/gdb-testsuite-further-handle-long-filenames-in-gdb.b.patch new file mode 100644 index 0000000..b21d5a9 --- /dev/null +++ b/gdb-testsuite-further-handle-long-filenames-in-gdb.b.patch @@ -0,0 +1,49 @@ +From dba128204017c9a12b3b6840bf1e3a6fec83f3e4 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Mon, 26 Feb 2024 15:59:47 +0100 +Subject: [PATCH 42/48] [gdb/testsuite] Further handle long filenames in + gdb.base/startup-with-shell.exp + +In commit 52498004a34 ("gdb/testsuite: handle long filenames in +gdb.base/startup-with-shell.exp") we fixed a FAIL reported by the Linaro CI: +... +(gdb) print argv[1] +$1 = 0xfffed978 "/startup-with-shell/unique-file.unique-e"... +(gdb) FAIL: gdb.base/startup-with-shell.exp: startup_with_shell = on; \ + run_args = *.unique-extension: first argument expanded +... + +PR testsuite/31410 reports a similar failure: +... +(gdb) print argv[1] +$1 = 0xfffeda96 "/startup-with-shell/*.unique-extens"... +(gdb) FAIL: gdb.base/startup-with-shell.exp: startup_with_shell = off; \ + run_args = *.unique-extension: first argument not expanded +... + +Fix this in the same way, using "set print characters unlimited". + +Tested on x86_64-linux. + +Approved-By: Tom Tromey + +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31410 +--- + gdb/testsuite/gdb.base/startup-with-shell.exp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/gdb/testsuite/gdb.base/startup-with-shell.exp b/gdb/testsuite/gdb.base/startup-with-shell.exp +index 51b1e4fa922..24135972b72 100644 +--- a/gdb/testsuite/gdb.base/startup-with-shell.exp ++++ b/gdb/testsuite/gdb.base/startup-with-shell.exp +@@ -65,6 +65,7 @@ with_test_prefix "startup_with_shell = on; run_args = *.unique-extension" { + + with_test_prefix "startup_with_shell = off; run_args = *.unique-extension" { + initial_setup_simple "off" "$unique_file_dir/*.unique-extension" ++ gdb_test_no_output "set print characters unlimited" + gdb_test "print argv\[1\]" "\\\$$decimal = $hex \"$unique_file_dir/\\\*\.unique-extension\"" \ + "first argument not expanded" + } +-- +2.35.3 + diff --git a/gdb-testsuite-handle-core-without-build-id-in-gdb.ba.patch b/gdb-testsuite-handle-core-without-build-id-in-gdb.ba.patch new file mode 100644 index 0000000..7969335 --- /dev/null +++ b/gdb-testsuite-handle-core-without-build-id-in-gdb.ba.patch @@ -0,0 +1,66 @@ +From 163358e7c426183521d34c96e6959f615862ff1f Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Wed, 20 Mar 2024 19:29:18 +0100 +Subject: [PATCH 38/48] [gdb/testsuite] Handle core without build-id in + gdb.base/corefile-buildid.exp + +On aarch64-linux (debian 12), when running test-case gdb.base/corefile-buildid.exp, I get: +... +expecting exec file "debugdir-exec/.build-id/ec/f10ec5d39648774f8c35d3cf757c8db52f5163" +info files^M +Local core dump file:^M + `build-exec/corefile-buildid.core', file type elf64-littleaarch64.^M + 0x0000aaaac1d70000 - 0x0000aaaac1d71000 is load1^M + ... + 0x0000ffffffa8b000 - 0x0000ffffffaac000 is load16^M +(gdb) FAIL: gdb.base/corefile-buildid.exp: exec: info files +... + +The problem is that the test-case expect the build-id to be available in the +core file, while it isn't. + +Fix this by detecting that the build-id isn't available in the core file using eu-readelf, as in +gdb.base/coredump-filter-build-id.exp. + +Tested on aarch64-linux. + +Approved-By: Tom Tromey +--- + gdb/testsuite/gdb.base/corefile-buildid.exp | 14 +++++++++++++- + 1 file changed, 13 insertions(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.base/corefile-buildid.exp b/gdb/testsuite/gdb.base/corefile-buildid.exp +index 3c2702e0cd3..630e812bd6b 100644 +--- a/gdb/testsuite/gdb.base/corefile-buildid.exp ++++ b/gdb/testsuite/gdb.base/corefile-buildid.exp +@@ -217,7 +217,7 @@ proc locate_exec_from_core_build_id {corefile buildid suffix \ + # of shared and/or stripped/.debug executables. + + proc do_corefile_buildid_tests {args} { +- global binfile testfile srcfile execdir sharedir ++ global binfile testfile srcfile execdir sharedir hex + + # Parse options. + parse_args [list {sepdebug} {shared}] +@@ -266,6 +266,18 @@ proc do_corefile_buildid_tests {args} { + } + verbose -log "corefile is $corefile" + ++ if { [catch "exec [gdb_find_eu-unstrip] -n --core $corefile" output] == 0 } { ++ set line [lindex [split $output "\n"] 0] ++ set binfile_re (?:[string_to_regexp $program_to_run]|\\\[(?:exe|pie)\\\]) ++ if { ![regexp "^${hex}\\+${hex} \[a-f0-9\]+@${hex}.*$binfile_re$" $line] } { ++ unsupported "build id for exec" ++ return ++ } ++ } else { ++ unsupported "eu-unstrip execution" ++ return ++ } ++ + # Grab the build-id from the binary, removing ".debug" from the end. + set buildid [build_id_debug_filename_get $program_to_run] + if {$buildid == ""} { +-- +2.35.3 + diff --git a/gdb-testsuite-handle-pac-marker.patch b/gdb-testsuite-handle-pac-marker.patch new file mode 100644 index 0000000..b357c75 --- /dev/null +++ b/gdb-testsuite-handle-pac-marker.patch @@ -0,0 +1,213 @@ +From f70536d3f72601b286967ed3031a3fb1ce0c834f Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 4 Jan 2024 13:42:45 +0100 +Subject: [PATCH 02/48] [gdb/testsuite] Handle PAC marker + +On aarch64-linux, I run into: +... +FAIL: gdb.base/annota1.exp: backtrace from shlibrary (timeout) +... +due to the PAC marker showing up: +... +^Z^Zframe-address^M +0x000000000041025c [PAC]^M +^Z^Zframe-address-end^M +... + +In the docs the marker is documented as follows: +... +When GDB is debugging the AArch64 architecture, and the program is using the +v8.3-A feature Pointer Authentication (PAC), then whenever the link register +$lr is pointing to an PAC function its value will be masked. When GDB prints +a backtrace, any addresses that required unmasking will be postfixed with the +marker [PAC]. When using the MI, this is printed as part of the addr_flags +field. +... + +Update the test-case to allow the PAC marker. + +Likewise in a few other test-cases. + +While we're at it, rewrite the affected pattern pat_begin in annota1.exp into +a more readable form. Likewise for the corresponding pat_end. + +Tested on aarch64-linux. + +Approved-By: Luis Machado + +PR testsuite/31202 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31202 +--- + gdb/testsuite/gdb.base/annota1.exp | 47 ++++++++++++++++++- + gdb/testsuite/gdb.cp/exception.exp | 8 ++-- + .../gdb.dwarf2/entry-value-typedef.exp | 2 +- + .../gdb.mi/mi-catch-cpp-exceptions.exp | 2 +- + gdb/testsuite/gdb.mi/mi-syn-frame.exp | 2 +- + .../gdb.threads/pthread_cond_wait.exp | 2 +- + gdb/testsuite/gdb.threads/tls.exp | 2 +- + 7 files changed, 54 insertions(+), 11 deletions(-) + +diff --git a/gdb/testsuite/gdb.base/annota1.exp b/gdb/testsuite/gdb.base/annota1.exp +index 3c2bbb43761..d8552b5be85 100644 +--- a/gdb/testsuite/gdb.base/annota1.exp ++++ b/gdb/testsuite/gdb.base/annota1.exp +@@ -286,9 +286,52 @@ gdb_test_multiple "continue" "continue to printf" { + # annotate-frame-address + # annotate-frame-address-end + # +-set pat_begin "\r\n\032\032post-prompt\r\n\r\n\032\032frame-begin 0 $hex\r\n.0 \r\n(\032\032frame-address\r\n$hex\r\n\032\032frame-address-end\r\n in \r\n)*\032\032frame-function-name\r\n.*printf(@.*)?\r\n\032\032frame-args\r\n \\(.*frame-end\r\n\r\n\032\032frame-begin 1 $hex\r\n.1 \r\n\032\032frame-address\r\n$hex\r\n\032\032frame-address-end\r\n in \r\n\032\032frame-function-name\r\nmain\r\n\032\032frame-args\r\n \\(\\)\r\n\032\032frame-source-begin\r\n at \r\n\032\032frame-source-file\r\n" ++set pat_begin \ ++ [list \ ++ "\r\n\032\032post-prompt\r\n" \ ++ "\r\n\032\032frame-begin 0 $hex\r\n" \ ++ ".0 \r\n" \ ++ "(" \ ++ "\032\032frame-address\r\n" \ ++ "${hex}( \\\[PAC\\\])?" \ ++ "\r\n\032\032frame-address-end\r\n" \ ++ " in \r\n" \ ++ ")*" \ ++ "\032\032frame-function-name\r\n" \ ++ ".*printf(@.*)?" \ ++ "\r\n\032\032frame-args\r\n" \ ++ " \\(.*frame-end\r\n" \ ++ "\r\n\032\032frame-begin 1 $hex\r\n" \ ++ ".1 " \ ++ "\r\n\032\032frame-address\r\n" \ ++ "${hex}( \\\[PAC\\\])?" \ ++ "\r\n\032\032frame-address-end\r\n" \ ++ " in " \ ++ "\r\n\032\032frame-function-name\r\n" \ ++ "main" \ ++ "\r\n\032\032frame-args\r\n" \ ++ " \\(\\)" \ ++ "\r\n\032\032frame-source-begin\r\n" \ ++ " at " \ ++ "\r\n\032\032frame-source-file\r\n"] ++ ++set pat_begin [join $pat_begin ""] ++ ++set pat_end \ ++ [list \ ++ "\r\n\032\032frame-source-file-end\r\n" \ ++ ":" \ ++ "\r\n\032\032frame-source-line\r\n" \ ++ ".*" \ ++ "\r\n\032\032frame-source-end\r\n\r\n" \ ++ "\r\n\032\032frame-end\r\n" \ ++ "(" \ ++ "\r\n\032\032frame-begin .*\r\n" \ ++ "\r\n\032\032frame-end\r\n" \ ++ ")*" \ ++ "$gdb_prompt$"] + +-set pat_end "\r\n\032\032frame-source-file-end\r\n:\r\n\032\032frame-source-line\r\n.*\r\n\032\032frame-source-end\r\n\r\n\r\n\032\032frame-end\r\n(\r\n\032\032frame-begin .*\r\n\r\n\032\032frame-end\r\n)*$gdb_prompt$" ++set pat_end [join $pat_end ""] + + gdb_test_multiple "backtrace" "backtrace from shlibrary" { + -re "$pat_begin$escapedsrcfile$pat_end" { +diff --git a/gdb/testsuite/gdb.cp/exception.exp b/gdb/testsuite/gdb.cp/exception.exp +index 2c7ef7793ee..03dd0cb3aeb 100644 +--- a/gdb/testsuite/gdb.cp/exception.exp ++++ b/gdb/testsuite/gdb.cp/exception.exp +@@ -111,7 +111,7 @@ gdb_test "continue" \ + + set name "backtrace after first throw" + gdb_test_multiple "backtrace" $name { +- -re ".*#\[0-9\]+.*\[\[:<:\]\]__cxa_throw\[\[:>:\]\].*#\[0-9\]+${ws}$hex in foo \\(i=20\\) at .*${srcfile}:\[0-9\]+\r\n#\[0-9\]+${ws}$hex in main \\(.*\\) at .*${srcfile}:\[0-9\]+\r\n$gdb_prompt $" { ++ -re ".*#\[0-9\]+.*\[\[:<:\]\]__cxa_throw\[\[:>:\]\].*#\[0-9\]+${ws}$hex (\\\[PAC\\\] )?in foo \\(i=20\\) at .*${srcfile}:\[0-9\]+\r\n#\[0-9\]+${ws}$hex in main \\(.*\\) at .*${srcfile}:\[0-9\]+\r\n$gdb_prompt $" { + # Either __cxxabiv1::__cxa_throw or __cxa_throw can be printed + # depending on debug info presence. + pass $name +@@ -129,7 +129,7 @@ gdb_test "continue" \ + + set name "backtrace after first catch" + gdb_test_multiple "backtrace" $name { +- -re ".*#\[0-9\]+.*\[\[:<:\]\]__cxa_begin_catch\[\[:>:\]\].*#\[0-9\]+${ws}$hex in main \\(.*\\) at .*$srcfile:\[0-9\]+\r\n$gdb_prompt $" { ++ -re ".*#\[0-9\]+.*\[\[:<:\]\]__cxa_begin_catch\[\[:>:\]\].*#\[0-9\]+${ws}$hex (\\\[PAC\\\] )?in main \\(.*\\) at .*$srcfile:\[0-9\]+\r\n$gdb_prompt $" { + pass $name + } + } +@@ -148,7 +148,7 @@ gdb_test "continue" \ + + set name "backtrace after second throw" + gdb_test_multiple "backtrace" $name { +- -re ".*#\[0-9\]+.*\[\[:<:\]\]__cxa_throw\[\[:>:\]\].*#\[0-9\]+${ws}$hex in foo \\(i=20\\) at .*${srcfile}:\[0-9\]+\r\n#\[0-9\]+${ws}$hex in main \\(.*\\) at .*${srcfile}:\[0-9\]+\r\n$gdb_prompt $" { ++ -re ".*#\[0-9\]+.*\[\[:<:\]\]__cxa_throw\[\[:>:\]\].*#\[0-9\]+${ws}$hex (\\\[PAC\\\] )?in foo \\(i=20\\) at .*${srcfile}:\[0-9\]+\r\n#\[0-9\]+${ws}$hex in main \\(.*\\) at .*${srcfile}:\[0-9\]+\r\n$gdb_prompt $" { + pass $name + } + } +@@ -164,7 +164,7 @@ gdb_test "continue" \ + + set name "backtrace after second catch" + gdb_test_multiple "backtrace" $name { +- -re ".*#\[0-9\]+.*\[\[:<:\]\]__cxa_begin_catch\[\[:>:\]\].*#\[0-9\]+${ws}$hex in main \\(.*\\) at .*$srcfile:\[0-9\]+\r\n$gdb_prompt $" { ++ -re ".*#\[0-9\]+.*\[\[:<:\]\]__cxa_begin_catch\[\[:>:\]\].*#\[0-9\]+${ws}$hex (\\\[PAC\\\] )?in main \\(.*\\) at .*$srcfile:\[0-9\]+\r\n$gdb_prompt $" { + pass $name + } + } +diff --git a/gdb/testsuite/gdb.dwarf2/entry-value-typedef.exp b/gdb/testsuite/gdb.dwarf2/entry-value-typedef.exp +index b56c9ceab6a..3d25e2a50b9 100644 +--- a/gdb/testsuite/gdb.dwarf2/entry-value-typedef.exp ++++ b/gdb/testsuite/gdb.dwarf2/entry-value-typedef.exp +@@ -42,4 +42,4 @@ gdb_test "continue" "Catchpoint $::decimal \\(exception thrown\\).*" + + # Without the corresponding fix, GDB would hit an internal error before + # printing the frame for main. +-gdb_test "backtrace" " $::hex in func \\(t=t@entry=@$::hex: 1234\\).* $::hex in main .*" ++gdb_test "backtrace" " $::hex (\\\[PAC\\\] )?in func \\(t=t@entry=@$::hex: 1234\\).* $::hex in main .*" +diff --git a/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp b/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp +index 595ae929e9a..1f119ec3a87 100644 +--- a/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp ++++ b/gdb/testsuite/gdb.mi/mi-catch-cpp-exceptions.exp +@@ -68,7 +68,7 @@ proc continue_to_next_exception { func line testname } { + mi_expect_stop "exception-caught" ".*" ".*" ".*" ".*" \ + {} "run until an exception is caught: $testname" + mi_gdb_test "-stack-list-frames 1 1" \ +- "\\^done,stack=\\\[frame=\{level=\"1\",addr=\"$hex\",func=\"${func}\",.*,line=\"${line}\".*\}\\\]" \ ++ "\\^done,stack=\\\[frame=\{level=\"1\",addr=\"$hex\",(addr_flags=\"PAC\",)?func=\"${func}\",.*,line=\"${line}\".*\}\\\]" \ + "check previous frame: $testname" + } + +diff --git a/gdb/testsuite/gdb.mi/mi-syn-frame.exp b/gdb/testsuite/gdb.mi/mi-syn-frame.exp +index 40df312a1cc..dd484cd80fa 100644 +--- a/gdb/testsuite/gdb.mi/mi-syn-frame.exp ++++ b/gdb/testsuite/gdb.mi/mi-syn-frame.exp +@@ -76,7 +76,7 @@ mi_gdb_test "406-data-evaluate-expression have_a_very_merry_interrupt()" \ + # in this next output. + + mi_gdb_test "407-stack-list-frames" \ +- "407\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",func=\"subroutine\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\",arch=\"$any\"\},frame=\{level=\"1\",addr=\"$hex\",func=\"handler\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\",arch=\"$any\"\},frame=\{level=\"2\",addr=\"$hex\",func=\"\"\},.*frame=\{level=\"$decimal\",addr=\"$hex\",func=\"have_a_very_merry_interrupt\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\",arch=\"$any\"\},frame=\{level=\"$decimal\",addr=\"$hex\",func=\"\"\},frame=\{level=\"$decimal\",addr=\"$hex\",func=\"main\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\",arch=\"$any\"\}.*\\\]" \ ++ "407\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",func=\"subroutine\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\",arch=\"$any\"\},frame=\{level=\"1\",addr=\"$hex\",func=\"handler\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\",arch=\"$any\"\},frame=\{level=\"2\",addr=\"$hex\",func=\"\"\},.*frame=\{level=\"$decimal\",addr=\"$hex\",(addr_flags=\"PAC\",)?func=\"have_a_very_merry_interrupt\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\",arch=\"$any\"\},frame=\{level=\"$decimal\",addr=\"$hex\",func=\"\"\},frame=\{level=\"$decimal\",addr=\"$hex\",func=\"main\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\",arch=\"$any\"\}.*\\\]" \ + "list stack frames, with signal handler and dummy frame" + + +diff --git a/gdb/testsuite/gdb.threads/pthread_cond_wait.exp b/gdb/testsuite/gdb.threads/pthread_cond_wait.exp +index ff3097cb519..b29be9e4191 100644 +--- a/gdb/testsuite/gdb.threads/pthread_cond_wait.exp ++++ b/gdb/testsuite/gdb.threads/pthread_cond_wait.exp +@@ -51,7 +51,7 @@ global decimal + # + # This is a "backtrace break" ("btb"): + # +-set btb "\[^\r\n\]+\[\r\n\]+\#${decimal}\[ \t\]+${hex} in " ++set btb "\[^\r\n\]+\[\r\n\]+\#${decimal}\[ \t\]+${hex} (\\\[PAC\\\] )?in " + + # One of the threads is blocked on a call to pthread_cond_wait, and + # we want to verify that we are able to get a sensible backtrace for +diff --git a/gdb/testsuite/gdb.threads/tls.exp b/gdb/testsuite/gdb.threads/tls.exp +index 89f6fb89bac..91a7f80b438 100644 +--- a/gdb/testsuite/gdb.threads/tls.exp ++++ b/gdb/testsuite/gdb.threads/tls.exp +@@ -132,7 +132,7 @@ proc check_thread_stack {number spin_threads spin_threads_level} { + } + send_gdb "where\n" + gdb_expect { +- -re ".*(\[0-9\]+)\[ \t\]+$hex in spin \\(vp=(0x\[0-9a-f\]+).*\r\n$gdb_prompt $" { ++ -re ".*(\[0-9\]+)\[ \t\]+$hex (\\\[PAC\\\] )?in spin \\(vp=(0x\[0-9a-f\]+).*\r\n$gdb_prompt $" { + if {[info exists tarr($number)]} { + fail "backtrace of thread number $number in spin" + } else { +-- +2.35.3 + diff --git a/gdb-testsuite-make-gdb.base-solib-search.exp-more-ro.patch b/gdb-testsuite-make-gdb.base-solib-search.exp-more-ro.patch new file mode 100644 index 0000000..0ce3dc5 --- /dev/null +++ b/gdb-testsuite-make-gdb.base-solib-search.exp-more-ro.patch @@ -0,0 +1,93 @@ +From 17ab80b7af4c388c44d0981d76de396d85bcba76 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Mon, 8 Jan 2024 10:37:44 +0100 +Subject: [PATCH 05/48] [gdb/testsuite] Make gdb.base/solib-search.exp more + robust + +On aarch64-linux, with gcc 13.2.1, I run into: +... + (gdb) backtrace^M + #0 break_here () at solib-search.c:30^M + #1 0x0000fffff7f20194 in lib2_func4 () at solib-search-lib2.c:50^M + #2 0x0000fffff7f70194 in lib1_func3 () at solib-search-lib1.c:50^M + #3 0x0000fffff7f20174 in lib2_func2 () at solib-search-lib2.c:30^M + #4 0x0000fffff7f70174 in lib1_func1 () at solib-search-lib1.c:30^M + #5 0x00000000004101b4 in main () at solib-search.c:23^M + (gdb) PASS: gdb.base/solib-search.exp: \ + backtrace (with wrong libs) (data collection) + FAIL: gdb.base/solib-search.exp: backtrace (with wrong libs) +... + +The FAIL is generated by this code in the test-case: +... + if { $expect_fail } { + # If the backtrace output is correct the test isn't sufficiently + # testing what it should. + if { $count == $total_expected } { + set fail 1 + } +... + +The test-case: +- builds two versions of two shared libs, a "right" and "wrong" version, the + difference being an additional dummy function (called spacer function), +- uses the "right" version to generate a core file, +- uses the "wrong" version to interpret the core file, and +- generates a backtrace. + +The intent is that the backtrace is incorrect due to using the "wrong" +version, but actually it's correct. This is because the spacer functions +aren't large enough. + +Fix this by increasing the size of the spacer functions by adding a dummy +loop, after which we have, as expected, an incorrect backtrace: +... + (gdb) backtrace^M + #0 break_here () at solib-search.c:30^M + #1 0x0000fffff7f201c0 in ?? ()^M + #2 0x0000fffff7f20174 in lib2_func2 () at solib-search-lib2.c:30^M + #3 0x0000fffff7f20174 in lib2_func2 () at solib-search-lib2.c:30^M + #4 0x0000fffff7f70174 in lib1_func1 () at solib-search-lib1.c:30^M + #5 0x00000000004101b4 in main () at solib-search.c:23^M + (gdb) PASS: gdb.base/solib-search.exp: \ + backtrace (with wrong libs) (data collection) + PASS: gdb.base/solib-search.exp: backtrace (with wrong libs) +... + +Tested on aarch64-linux. +--- + gdb/testsuite/gdb.base/solib-search-lib1.c | 3 +++ + gdb/testsuite/gdb.base/solib-search-lib2.c | 3 +++ + 2 files changed, 6 insertions(+) + +diff --git a/gdb/testsuite/gdb.base/solib-search-lib1.c b/gdb/testsuite/gdb.base/solib-search-lib1.c +index 76338a8e216..6a4cc9aa1a7 100644 +--- a/gdb/testsuite/gdb.base/solib-search-lib1.c ++++ b/gdb/testsuite/gdb.base/solib-search-lib1.c +@@ -39,6 +39,9 @@ lib1_func1 (void) + void + lib1_spacer (void) + { ++ int i; ++ for (i = 0; i < 10; ++i) ++ ; + } + + #endif +diff --git a/gdb/testsuite/gdb.base/solib-search-lib2.c b/gdb/testsuite/gdb.base/solib-search-lib2.c +index bf7c7bd071c..fb004d7377f 100644 +--- a/gdb/testsuite/gdb.base/solib-search-lib2.c ++++ b/gdb/testsuite/gdb.base/solib-search-lib2.c +@@ -39,6 +39,9 @@ lib2_func2 (void) + void + lib2_spacer (void) + { ++ int i; ++ for (i = 0; i < 10; ++i) ++ ; + } + + #endif +-- +2.35.3 + diff --git a/gdb-testsuite-make-portnum-a-persistent-global.patch b/gdb-testsuite-make-portnum-a-persistent-global.patch new file mode 100644 index 0000000..1d264ba --- /dev/null +++ b/gdb-testsuite-make-portnum-a-persistent-global.patch @@ -0,0 +1,68 @@ +From 81f752e905f9ef4d0f2e046acf3fabcddf952057 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sat, 4 May 2024 10:41:09 +0200 +Subject: [PATCH 17/48] [gdb/testsuite] Make portnum a persistent global + +When instrumenting get_portnum using: +... + puts "PORTNUM: $res" +... +and running: +... +$ cd build/gdb +$ make check TESTS=gdb.server/*.exp +... +we get: +... +Running gdb.server/target-exec-file.exp ... +PORTNUM: 2345 +Running gdb.server/stop-reply-no-thread-multi.exp ... +PORTNUM: 2345 +PORTNUM: 2346 +PORTNUM: 2347 +PORTNUM: 2348 +PORTNUM: 2349 +PORTNUM: 2350 +... + +So, while get_portnum does return increasing numbers in a single test-case, it +restarts at each test-case. + +This is a regression since the introduction of persistent globals. + +Fix this by using "gdb_persistent_global portnum", such that we get: +... +Running gdb.server/target-exec-file.exp ... +PORTNUM: 2345 +Running gdb.server/stop-reply-no-thread-multi.exp ... +PORTNUM: 2346 +PORTNUM: 2347 +PORTNUM: 2348 +PORTNUM: 2349 +PORTNUM: 2350 +PORTNUM: 2351 +... + +Tested on aarch64-linux. + +Approved-By: Tom Tromey +--- + gdb/testsuite/lib/gdbserver-support.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/lib/gdbserver-support.exp b/gdb/testsuite/lib/gdbserver-support.exp +index 8aaca946b7d..4f7effaacf7 100644 +--- a/gdb/testsuite/lib/gdbserver-support.exp ++++ b/gdb/testsuite/lib/gdbserver-support.exp +@@ -142,7 +142,7 @@ proc get_portnum {} { + set initial_portnum 2345 + + # Currently available port number. +- global portnum ++ gdb_persistent_global portnum + + # Initialize, if necessary. + if { ![info exists portnum] } { +-- +2.35.3 + diff --git a/gdb-testsuite-move-gpu-parallel.lock-to-cache-dir.patch b/gdb-testsuite-move-gpu-parallel.lock-to-cache-dir.patch new file mode 100644 index 0000000..604a3c8 --- /dev/null +++ b/gdb-testsuite-move-gpu-parallel.lock-to-cache-dir.patch @@ -0,0 +1,42 @@ +From 40ffee49122d3856292d2374c25f619805f76f1f Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sat, 4 May 2024 10:41:09 +0200 +Subject: [PATCH 20/48] [gdb/testsuite] Move gpu-parallel.lock to cache dir + +The lock directory returned by lock_dir is currently $objdir. + +It seems possible to leave a stale lock file that blocks progress in a +following run. + +Fix this by using a directory that is guaranteed to be initially empty when +using GDB_PARALLEL, like temp or cache. + +In gdb/testsuite/README I found: +... +cache in particular is used to share data across invocations of runtest +... +which seems appropriate, so let's use cache for this. + +Tested on aarch64-linux. + +Approved-By: Tom Tromey +--- + gdb/testsuite/lib/gdb-utils.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/lib/gdb-utils.exp b/gdb/testsuite/lib/gdb-utils.exp +index 63f6b8c3698..cfaa7905997 100644 +--- a/gdb/testsuite/lib/gdb-utils.exp ++++ b/gdb/testsuite/lib/gdb-utils.exp +@@ -180,7 +180,7 @@ proc lock_file_release {info} { + # Return directory where we keep lock files. + + proc lock_dir {} { +- return $objdir ++ return [make_gdb_parallel_path cache] + } + + # Run body under lock LOCK_FILE. +-- +2.35.3 + diff --git a/gdb-testsuite-prevent-compilation-fails-with-unix-fpie-pie.patch b/gdb-testsuite-prevent-compilation-fails-with-unix-fpie-pie.patch new file mode 100644 index 0000000..d239794 --- /dev/null +++ b/gdb-testsuite-prevent-compilation-fails-with-unix-fpie-pie.patch @@ -0,0 +1,132 @@ +From 469aebc4403f2135d02cb15dba1739264a4c1a17 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 21 Apr 2023 18:01:00 +0200 +Subject: [PATCH 1/2] Prevent compilation fails with unix/-fPIE/-pie + +A regular test-case will produce an executable, and depending on the compiler +default, it will be a PIE or not. A test-case can force one or the other +using the pie and nopie options. + +However, when running with target board unix/-fPIE/-pie, the nopie option will +have no effect, and likewise for target board unix/-fno-PIE/-no-pie and the +pie option. + +When say we run test-case gdb.base/attach-pie-noexec.exp, which passes the pie +option with target board unix/-fno-PIE/-no-pie we get: +... + Running src/gdb/testsuite/gdb.base/attach-pie-noexec.exp ... + gdb compile failed, pie failed to generate PIE executable + + === gdb Summary === + + # of untested testcases 1 +... + +However, this works only when we actually manage to generate an executable. + +There are other test-cases, like f.i. gdb.arch/amd64-disp-step.exp that +specify nopie, but will generate a compilation failure with target board +unix/-fPIE/-pie due to using a hard-coded .S file: +... + Running src/gdb/testsuite/gdb.arch/amd64-disp-step.exp ... + gdb compile failed, ld: outputs/gdb.arch/amd64-disp-step/amd64-disp-step0.o: \ + relocation R_X86_64_32S against `.text' can not be used when making a PIE \ + object; recompile with -fPIE + collect2: error: ld returned 1 exit status + + === gdb Summary === + + # of untested testcases 1 +... + +Hide this compilation error by: +- adding a gdb_caching_proc pie_forced, and +- using it in gdb_compile to bail out before even trying compilation +such that we simply have: +... +UNTESTED: gdb.arch/amd64-disp-step.exp: failed to prepare +... + +Likewise, add nopie_forced. + +Tested on x86_64-linux. +--- + gdb/testsuite/lib/gdb.exp | 53 +++++++++++++++++++++++++++++++++++++++ + 1 file changed, 53 insertions(+) + +diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp +index 6c1f59ef4a6..09bb7cc30e4 100644 +--- a/gdb/testsuite/lib/gdb.exp ++++ b/gdb/testsuite/lib/gdb.exp +@@ -5519,6 +5519,17 @@ proc gdb_compile {source dest type options} { + set options [lreplace $options $macros $macros $flag] + } + ++ if { $pie != -1 && [nopie_forced] } { ++ set result "pie unsupported" ++ verbose -log "gdb_compile: $result" ++ return $result ++ } ++ if { $nopie != -1 && [pie_forced] } { ++ set result "nopie unsupported" ++ verbose -log "gdb_compile: $result" ++ return $result ++ } ++ + if { $type == "executable" } { + if { ([istarget "*-*-mingw*"] + || [istarget "*-*-*djgpp"] +@@ -9608,6 +9619,48 @@ gdb_caching_proc linker_supports_image_base_flag {} { + } + + ++# Helper function for pie_forced. ++proc pie_forced_0 { } { return 0 } ++ ++# Return 1 if nopie fails to prevent a PIE, 0 if nopie prevented a PIE, ++# and -1 if an error occurred. ++gdb_caching_proc pie_forced {} { ++ set me "pie_forced" ++ set src { int main() { return 0; } } ++ # gdb_compile calls pie_forced when nopie is passed, so pretend it ++ # returns 0, to allow us to find out the actual pie_forced value. ++ with_override pie_forced pie_forced_0 { ++ gdb_simple_compile $me $src executable nopie ++ } ++ set res [exec_is_pie $obj] ++ if { $res == -1 } { ++ return -1 ++ } ++ set res [expr $res == 1] ++ return $res ++} ++ ++# Helper function for nopie_forced. ++proc nopie_forced_0 {} { return 0 } ++ ++# Return 1 if pie fails to generated a PIE, 0 if pie generated a PIE, ++# and -1 if an error occurred. ++gdb_caching_proc nopie_forced {} { ++ set me "nopie_forced" ++ set src { int main() { return 0; } } ++ # gdb_compile calls nopie_forced when pie is passed, so pretend it ++ # returns 0, to allow us to find out the actual nopie_forced value. ++ with_override nopie_forced nopie_forced_0 { ++ gdb_simple_compile $me $src executable pie ++ } ++ set res [exec_is_pie $obj] ++ if { $res == -1 } { ++ return -1 ++ } ++ set res [expr $res == 0] ++ return $res ++} ++ + # Return 1 if compiler supports scalar_storage_order attribute, otherwise + # return 0. + gdb_caching_proc supports_scalar_storage_order_attribute {} { + +base-commit: adfcabe4cc43766996a61bdf08ce1e9db7f18dcc +-- +2.35.3 + diff --git a/gdb-testsuite-remove-spurious-in-save_vars.patch b/gdb-testsuite-remove-spurious-in-save_vars.patch new file mode 100644 index 0000000..63cdf99 --- /dev/null +++ b/gdb-testsuite-remove-spurious-in-save_vars.patch @@ -0,0 +1,53 @@ +From d3fbb4d91ba2784df267fe1ac2e9ec42581a6fac Mon Sep 17 00:00:00 2001 +From: Simon Marchi +Date: Mon, 15 Jan 2024 16:23:42 +0000 +Subject: [PATCH] gdb/testsuite: remove spurious $ in save_vars + +I noticed that running the whole testsuite in serial mode (which means +all the .exp files are ran in the same TCL environment, one after the +other) with the native-extended-gdbserver board caused some weird +failures, for instance a lot of internal errors in the reverse tests, +like: + + continue^M + Continuing.^M + /home/jenkins/workspace/binutils-gdb_master_linuxbuild/platform/deb12-amd64/target_board/native-extended-gdbserver/src/binutils-gdb/gdb/remot e.c:6922: internal-error: resume: Assertion `scope_ptid == inferior_ptid' failed.^M + A problem internal to GDB has been detected,^M + further debugging may prove unreliable.^M + ----- Backtrace -----^M + FAIL: gdb.reverse/break-precsave.exp: run to end of main (GDB internal error) + +This only happens after running gdb.multi/attach-while-running.exp. +That test does not restore GDBFLAGS properly when it's done, it leaves +`-ex \"maint set target-non-stop on\""` in there, which breaks some +subsequent tests. The problem is that this line: + + save_vars { $::GDBFLAGS } { + +should not use a `$` before the variable name. Passes the content of +`::GDBFLAGS` to save_vars, which is not what we want. We want to pass +the `::GDBFLAGS` string. Fix that. + +Change-Id: I5ad32c527795fd10d0d94020e4fd15cebaca3a77 +--- + gdb/testsuite/gdb.multi/attach-while-running.exp | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.multi/attach-while-running.exp b/gdb/testsuite/gdb.multi/attach-while-running.exp +index d3e0d462413..8fce34eaa65 100644 +--- a/gdb/testsuite/gdb.multi/attach-while-running.exp ++++ b/gdb/testsuite/gdb.multi/attach-while-running.exp +@@ -46,7 +46,7 @@ if { [build_executable "failed to prepare" ${testfile} ${srcfile}] } { + } + + proc do_test {} { +- save_vars { $::GDBFLAGS } { ++ save_vars { ::GDBFLAGS } { + append ::GDBFLAGS " -ex \"maint set target-non-stop on\"" + clean_restart $::binfile + } + +base-commit: 08ce0d63c343f7db9a504d37de25391a997b46e2 +-- +2.35.3 + diff --git a/gdb-testsuite-reset-errcnt-and-warncnt-in-default_gd.patch b/gdb-testsuite-reset-errcnt-and-warncnt-in-default_gd.patch new file mode 100644 index 0000000..68f087e --- /dev/null +++ b/gdb-testsuite-reset-errcnt-and-warncnt-in-default_gd.patch @@ -0,0 +1,68 @@ +From 37b67fd94ed38959fecc67847666b758b29fe31c Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Tue, 27 Feb 2024 16:24:15 +0100 +Subject: [PATCH 40/48] [gdb/testsuite] Reset errcnt and warncnt in + default_gdb_init + +Say we do: +... +$ make check RUNTESTFLAGS="gdb.dap/ada-nested.exp gdb.dap/pause.exp" +... +and add a perror at the end of pause.exp: +... + dap_shutdown ++ ++perror "foo" +... + +We run into: +... +UNRESOLVED: gdb.dap/ada-nested.exp: compilation prog.adb +... + +This happens because the perror increases the errcnt, which is not reset at +the end of the test-case, and consequently the first pass in the following +test-case is changed into an unresolved. + +Version 1.6.3 of dejagnu contains a fix which produces an unresolved at the +end of the test-case, which does reset the errcnt, but this is with version +1.6.1. + +Furthermore, we reset the errcnt in clean_restart, but the pass is produced +before, so that doesn't help either. + +Fix this by resetting errcnt and warncnt in default_gdb_init. + +Tested on x86_64-linux. + +Approved-By: Tom Tromey + +PR testsuite/31351 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31351 +--- + gdb/testsuite/lib/gdb.exp | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp +index 70c2db4ac84..990d0c8a70f 100644 +--- a/gdb/testsuite/lib/gdb.exp ++++ b/gdb/testsuite/lib/gdb.exp +@@ -6851,6 +6851,15 @@ proc default_gdb_init { test_file_name } { + return [uplevel 1 ::gdb_tcl_unknown $args] + } + } ++ ++ # Dejagnu version 1.6.3 and later produce an unresolved at the end of a ++ # testcase if an error triggered, resetting errcnt and warncnt to 0, in ++ # order to avoid errors in one test-case influencing the following ++ # test-case. Do this manually here, to support older versions. ++ global errcnt ++ global warncnt ++ set errcnt 0 ++ set warncnt 0 + } + + # Return a path using GDB_PARALLEL. +-- +2.35.3 + diff --git a/gdb-testsuite-simplify-gdb.server-server-kill-python.patch b/gdb-testsuite-simplify-gdb.server-server-kill-python.patch new file mode 100644 index 0000000..3156050 --- /dev/null +++ b/gdb-testsuite-simplify-gdb.server-server-kill-python.patch @@ -0,0 +1,65 @@ +From afab95df8ff5b3bc57e3cacca813df987ce84af2 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Wed, 17 Apr 2024 11:45:02 +0200 +Subject: [PATCH 27/48] [gdb/testsuite] Simplify + gdb.server/server-kill-python.exp + +In test-case gdb.server/server-kill-python.exp we have: +... +if {[gdb_spawn_with_cmdline_opts \ + "-quiet -iex \"set height 0\" -iex \"set width 0\" -ex \"source $host_file1\""] != 0} { + fail "spawn" + return +} +... + +I reproduced the problem by reverting the fix at the commit adding both the +fix and the test-case, and the reproduced the same problem using: +... +(gdb) source $host_file1 +... +so there doesn't seem to be a specific need to source the python file using +"-ex". + +Simplify the test-case by sourcing the python file using send_gdb. + +This also allow us to simplify the python script. + +Tested on x86_64-linux. +--- + gdb/testsuite/gdb.server/server-kill-python.exp | 8 +++++--- + 1 file changed, 5 insertions(+), 3 deletions(-) + +diff --git a/gdb/testsuite/gdb.server/server-kill-python.exp b/gdb/testsuite/gdb.server/server-kill-python.exp +index ae85791c770..dcb6eddd6eb 100644 +--- a/gdb/testsuite/gdb.server/server-kill-python.exp ++++ b/gdb/testsuite/gdb.server/server-kill-python.exp +@@ -48,8 +48,6 @@ puts $fd \ + "import gdb + + def do_gdb_stuff (): +- gdb.execute ('file $host_binfile') +- gdb.execute ('target $gdbserver_protocol $gdbserver_gdbport') + gdb.execute ('break $srcfile:$break_linenr') + gdb.execute ('continue') + gdb.execute ('p server_pid') +@@ -63,11 +61,15 @@ set host_file1 [gdb_remote_download host $file1] + # Now start GDB, sourcing the python command file we generated above. + # Set the height and width so we don't end up at a paging prompt. + if {[gdb_spawn_with_cmdline_opts \ +- "-quiet -iex \"set height 0\" -iex \"set width 0\" -ex \"source $host_file1\""] != 0} { ++ "-quiet -iex \"set height 0\" -iex \"set width 0\""] != 0} { + fail "spawn" + return + } + ++gdb_load $binfile ++gdb_target_cmd $gdbserver_protocol $gdbserver_gdbport ++send_gdb "source $host_file1\n" ++ + # Get the gdbserver PID. + set gdbserver_pid 0 + +-- +2.35.3 + diff --git a/gdb-testsuite-use-find_gnatmake-instead-of-gdb_find_.patch b/gdb-testsuite-use-find_gnatmake-instead-of-gdb_find_.patch new file mode 100644 index 0000000..f25dcd8 --- /dev/null +++ b/gdb-testsuite-use-find_gnatmake-instead-of-gdb_find_.patch @@ -0,0 +1,139 @@ +From 6914ab446b7eb9b284b6bfef8d04c3bacafcaa97 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 18 Apr 2024 17:02:13 +0200 +Subject: [PATCH 26/48] [gdb/testsuite] Use find_gnatmake instead of + gdb_find_gnatmake + +On SLE-11, with an older dejagnu version, I ran into: +... +Running gdb.ada/mi_prot.exp ... +UNRESOLVED: gdb.ada/mi_prot.exp: \ + testcase aborted due to invalid command name: gdb_find_gnatmake +ERROR: tcl error sourcing gdb.ada/mi_prot.exp. +ERROR: invalid command name "gdb_find_gnatmake" + while executing +"::gdb_tcl_unknown gdb_find_gnatmake" + ("uplevel" body line 1) + invoked from within +"uplevel 1 ::gdb_tcl_unknown $args" + (procedure "::unknown" line 5) + invoked from within +"gdb_find_gnatmake" + (procedure "gnatmake_version_at_least" line 2) + invoked from within +... + +Proc gdb_find_gnatmake is actually a backup for find_gnatmake: +... +if {[info procs find_gnatmake] == ""} { + rename gdb_find_gnatmake find_gnatmake +... +so gnatmake_version_at_least should use find_gnatmake instead. + +For a recent dejagnu with find_gnatmake, gdb_find_gnatmake is kept, and we +don't run into this error. + +For an older dejagnu without find_gnatmake, gdb_find_gnatmake is renamed to +find_gnatmake, and we do run into the error. + +It's confusing that we're using the gdb_ prefix for gdb_find_gnatmake, it +seems something legitimate to use. Maybe we should use future_ or gdb_future_ +prefix instead to make this more clear, but I've left that alone for now. + +Fix this by: +- triggering the same error with a recent dejagnu by removing + gdb_find_gnatmake unless used (and likewise for other procs in future.exp), + and +- using find_gnatmake in gnatmake_version_at_least. + +Tested on x86_64-linux. + +Approved-By: Tom Tromey + +PR testsuite/31647 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31647 +--- + gdb/testsuite/lib/ada.exp | 2 +- + gdb/testsuite/lib/future.exp | 15 +++++++++++++++ + 2 files changed, 16 insertions(+), 1 deletion(-) + +diff --git a/gdb/testsuite/lib/ada.exp b/gdb/testsuite/lib/ada.exp +index d45d75994dd..4bf1368f29f 100644 +--- a/gdb/testsuite/lib/ada.exp ++++ b/gdb/testsuite/lib/ada.exp +@@ -151,7 +151,7 @@ proc find_ada_tool {tool} { + # Return 1 if gnatmake is at least version $MAJOR.x.x + + proc gnatmake_version_at_least { major } { +- set gnatmake [gdb_find_gnatmake] ++ set gnatmake [find_gnatmake] + set gnatmake [lindex [split $gnatmake] 0] + if {[catch {exec $gnatmake --version} output]} { + return 0 +diff --git a/gdb/testsuite/lib/future.exp b/gdb/testsuite/lib/future.exp +index 807053b8f94..204e11effa4 100644 +--- a/gdb/testsuite/lib/future.exp ++++ b/gdb/testsuite/lib/future.exp +@@ -694,12 +694,16 @@ if {[info procs find_gnatmake] == ""} { + rename gdb_find_gnatmake find_gnatmake + set use_gdb_compile(ada) 1 + gdb_note [join [list $note_prefix "Ada" $note_suffix] ""] ++} else { ++ rename gdb_find_gnatmake "" + } + + if {[info procs find_gfortran] == ""} { + rename gdb_find_gfortran find_gfortran + set use_gdb_compile(fortran) 1 + gdb_note [join [list $note_prefix "Fortran" $note_suffix] ""] ++} else { ++ rename gdb_find_gfortran "" + } + + if {[info procs find_go_linker] == ""} { +@@ -707,24 +711,33 @@ if {[info procs find_go_linker] == ""} { + rename gdb_find_go_linker find_go_linker + set use_gdb_compile(go) 1 + gdb_note [join [list $note_prefix "Go" $note_suffix] ""] ++} else { ++ rename gdb_find_go "" ++ rename gdb_find_go_linker "" + } + + if {[info procs find_gdc] == ""} { + rename gdb_find_gdc find_gdc + set use_gdb_compile(d) 1 + gdb_note [join [list $note_prefix "D" $note_suffix] ""] ++} else { ++ rename gdb_find_gdc "" + } + + if {[info procs find_rustc] == ""} { + rename gdb_find_rustc find_rustc + set use_gdb_compile(rust) 1 + gdb_note [join [list $note_prefix "Rust" $note_suffix] ""] ++} else { ++ rename gdb_find_rustc "" + } + + if {[info procs find_hipcc] == ""} { + rename gdb_find_hipcc find_hipcc + set use_gdb_compile(hip) 1 + gdb_note [join [list $note_prefix "HIP" $note_suffix] ""] ++} else { ++ rename gdb_find_hipcc "" + } + + # If dejagnu's default_target_compile is missing support for any language, +@@ -732,6 +745,8 @@ if {[info procs find_hipcc] == ""} { + if { [array size use_gdb_compile] != 0 } { + catch {rename default_target_compile dejagnu_default_target_compile} + rename gdb_default_target_compile default_target_compile ++} else { ++ rename gdb_default_target_compile "" + } + + +-- +2.35.3 + diff --git a/gdb-testsuite-use-more-progbits-for-arm.patch b/gdb-testsuite-use-more-progbits-for-arm.patch new file mode 100644 index 0000000..bba4283 --- /dev/null +++ b/gdb-testsuite-use-more-progbits-for-arm.patch @@ -0,0 +1,858 @@ +From d9951c3c9ea2e542d071710e9706ed505046fe36 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Fri, 24 Nov 2023 15:41:22 +0100 +Subject: [PATCH 48/48] [gdb/testsuite] Use more %progbits for arm + +On pinebook I ran into: +... +Running gdb.tui/tui-layout-asm-short-prog.exp ... +gdb compile failed, gdb.tui/tui-layout-asm-short-prog.S: Assembler messages: +gdb.tui/tui-layout-asm-short-prog.S:23: Error: \ + junk at end of line, first unrecognized character is `,' +... + +Fix this by using %progbits instead of @progbits for arm. + +Approved-by: Luis Machado + +Tested on x86_64-linux and pinebook. +--- + gdb/testsuite/gdb.arch/pr25124.S | 2 +- + gdb/testsuite/gdb.base/dup-sect.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dup-psym.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-ada-ffffffff.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-anonymous-func.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-bad-elf-other.S | 8 ++++++++ + gdb/testsuite/gdb.dwarf2/dw2-bad-parameter-type.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-basic.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-canonicalize-type.S | 4 ++++ + .../gdb.dwarf2/dw2-case-insensitive-debug.S | 8 ++++++++ + gdb/testsuite/gdb.dwarf2/dw2-compdir-oldgcc.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-compressed.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-const.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-cu-size.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-dos-drive.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-double-set-die-type.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-dummy-cu.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-empty-pc-range.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-entry-value.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-filename.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-icc-opaque.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-icycle.S | 12 ++++++++++++ + gdb/testsuite/gdb.dwarf2/dw2-inheritance.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-inline-param.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-intercu.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-intermix.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-linkage-name-trust.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-minsym-in-cu.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-modula2-self-type.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-noloc.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-inner.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-outer.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-op-call.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-op-stack-value.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-param-error.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-producer.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-simple-locdesc.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-stack-boundary.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-strp.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-unresolved.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw2-var-zero-addr.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/dw4-sig-type-unused.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/fission-reread.S | 4 ++++ + .../gdb.dwarf2/frame-inlined-in-outer-frame.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/mac-fileno.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/pr11465.S | 4 ++++ + gdb/testsuite/gdb.dwarf2/pr13961.S | 4 ++++ + gdb/testsuite/gdb.linespec/break-asm-file.exp | 4 ++-- + .../{break-asm-file0.s => break-asm-file0.S} | 12 ++++++++---- + .../{break-asm-file1.s => break-asm-file1.S} | 8 ++++++-- + gdb/testsuite/gdb.mi/dw2-ref-missing-frame.S | 4 ++++ + gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S | 4 ++++ + 59 files changed, 253 insertions(+), 9 deletions(-) + rename gdb/testsuite/gdb.linespec/{break-asm-file0.s => break-asm-file0.S} (96%) + rename gdb/testsuite/gdb.linespec/{break-asm-file1.s => break-asm-file1.S} (97%) + +diff --git a/gdb/testsuite/gdb.arch/pr25124.S b/gdb/testsuite/gdb.arch/pr25124.S +index a7ed1a02472..27b4e683488 100644 +--- a/gdb/testsuite/gdb.arch/pr25124.S ++++ b/gdb/testsuite/gdb.arch/pr25124.S +@@ -33,4 +33,4 @@ main: + mov r0, #0 + bx lr + .size main, .-main +- .section .note.GNU-stack,"",@progbits ++ .section .note.GNU-stack,"",%progbits +diff --git a/gdb/testsuite/gdb.base/dup-sect.S b/gdb/testsuite/gdb.base/dup-sect.S +index e374d578dc0..c51bc91d6d8 100644 +--- a/gdb/testsuite/gdb.base/dup-sect.S ++++ b/gdb/testsuite/gdb.base/dup-sect.S +@@ -20,4 +20,8 @@ var1: .byte 1 + + .section sect2, "a" + var2: .byte 2 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dup-psym.S b/gdb/testsuite/gdb.dwarf2/dup-psym.S +index ec180e65080..4e50c0fe885 100644 +--- a/gdb/testsuite/gdb.dwarf2/dup-psym.S ++++ b/gdb/testsuite/gdb.dwarf2/dup-psym.S +@@ -197,4 +197,8 @@ func_cu1: + .byte 1 + + .Lline1_end: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S +index f0276adf3be..e1fccd1979f 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-hello-dbg.S +@@ -149,4 +149,8 @@ LELTP: + .uleb128 0x1 + .byte 0x1 + LELT: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S +index 59dd26c3c85..2ff445e36a4 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-abs-hi-pc-world-dbg.S +@@ -149,4 +149,8 @@ LELTP: + .uleb128 0x1 + .byte 0x1 + LELT: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ada-ffffffff.S b/gdb/testsuite/gdb.dwarf2/dw2-ada-ffffffff.S +index 960a97c39a8..d58c8bfedf8 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-ada-ffffffff.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-ada-ffffffff.S +@@ -53,4 +53,8 @@ debug_end: + .byte 0x0 + .byte 0x0 + .byte 0x0 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S b/gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S +index 2c62b613c57..dc6b86648bd 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-anon-mptr.S +@@ -375,4 +375,8 @@ + + .section .debug_line + .Ldebug_line0: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-anonymous-func.S b/gdb/testsuite/gdb.dwarf2/dw2-anonymous-func.S +index 8b88ba6d1ef..45cd7c42fb8 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-anonymous-func.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-anonymous-func.S +@@ -246,4 +246,8 @@ func_cu2: + .byte 1 + + .Lline1_end: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-bad-elf-other.S b/gdb/testsuite/gdb.dwarf2/dw2-bad-elf-other.S +index d90d4e2b4ac..192bfac844f 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-bad-elf-other.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-bad-elf-other.S +@@ -15,7 +15,11 @@ + + .section ".other", "x" + .global some_func, some_func_end ++#ifdef __arm__ ++ .type some_func, %function ++#else + .type some_func, @function ++#endif + nop + nop + nop +@@ -27,4 +31,8 @@ some_func: + .size some_func,.-some_func + some_func_end: + nop ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-bad-parameter-type.S b/gdb/testsuite/gdb.dwarf2/dw2-bad-parameter-type.S +index d7654bb1c14..10ea1ae24cb 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-bad-parameter-type.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-bad-parameter-type.S +@@ -71,4 +71,8 @@ debug_end: + .byte 0x0 + .byte 0x0 + .byte 0x0 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-basic.S b/gdb/testsuite/gdb.dwarf2/dw2-basic.S +index 372ab23cb3b..7b37162b037 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-basic.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-basic.S +@@ -197,4 +197,8 @@ func_cu1: + .byte 1 + + .Lline1_end: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-canonicalize-type.S b/gdb/testsuite/gdb.dwarf2/dw2-canonicalize-type.S +index 39e462b7149..ffe29d17a3a 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-canonicalize-type.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-canonicalize-type.S +@@ -154,4 +154,8 @@ debug_end: + .byte 0x0 + .byte 0x0 + .byte 0x0 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive-debug.S b/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive-debug.S +index 1059ace3b3e..84e6ee9a485 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive-debug.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-case-insensitive-debug.S +@@ -60,7 +60,11 @@ + /* The .debug_names-based index support depends on + .debug_aranges generated by GCC. (.gdb_index includes a + gdb-generated map instead.) */ ++#ifdef __arm__ ++ .section .debug_aranges,"",%progbits ++#else + .section .debug_aranges,"",@progbits ++#endif + .4byte .Laranges_end - .Laranges_start // Length of Address Ranges Info + .Laranges_start: + .2byte 0x2 // DWARF Version +@@ -126,4 +130,8 @@ + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-compdir-oldgcc.S b/gdb/testsuite/gdb.dwarf2/dw2-compdir-oldgcc.S +index 8a8ecfc397b..4d626817f1a 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-compdir-oldgcc.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-compdir-oldgcc.S +@@ -239,4 +239,8 @@ gcc43: .globl gcc43 + .uleb128 1 + .byte 1 + .Lgcc43_end: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-compressed.S b/gdb/testsuite/gdb.dwarf2/dw2-compressed.S +index 509fbea4a3b..14cf286f393 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-compressed.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-compressed.S +@@ -218,4 +218,8 @@ func_cu1: + .byte 0x9c + .byte 0x00 + .byte 0x92 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-const.S b/gdb/testsuite/gdb.dwarf2/dw2-const.S +index dfc882ac530..ff81c18732d 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-const.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-const.S +@@ -249,4 +249,8 @@ func_cu1: + .byte 1 + + .Lline1_end: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.S b/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.S +index 070f24b407d..e217c736dd8 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-cp-infcall-ref-static.S +@@ -113,4 +113,8 @@ + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-cu-size.S b/gdb/testsuite/gdb.dwarf2/dw2-cu-size.S +index 99465e2c015..b6f8a2117b3 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-cu-size.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-cu-size.S +@@ -107,4 +107,8 @@ + + .byte 0x0 /* Terminator .debug_abbrev + section. */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-dos-drive.S b/gdb/testsuite/gdb.dwarf2/dw2-dos-drive.S +index d0bdce9ef8b..e4d13a8cd04 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-dos-drive.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-dos-drive.S +@@ -74,4 +74,8 @@ dieb: + .byte 0x0 + + .byte 0x0 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-double-set-die-type.S b/gdb/testsuite/gdb.dwarf2/dw2-double-set-die-type.S +index 973d5020342..d4fdb1d3077 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-double-set-die-type.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-double-set-die-type.S +@@ -617,4 +617,8 @@ + .byte 0x0 + .byte 0x0 + ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-dummy-cu.S b/gdb/testsuite/gdb.dwarf2/dw2-dummy-cu.S +index 781b87e7115..f44db05f266 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-dummy-cu.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-dummy-cu.S +@@ -31,4 +31,8 @@ main_end: + .section .debug_abbrev + .Ldebug_abbrev0: + .byte 0x0 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S +index d78b7e87ff5..5e08776ba39 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-namespace.S +@@ -106,4 +106,8 @@ var: .4byte 1 + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .type some_func, %function ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-empty-pc-range.S b/gdb/testsuite/gdb.dwarf2/dw2-empty-pc-range.S +index ea8dd092cb0..e4678d86695 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-empty-pc-range.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-empty-pc-range.S +@@ -80,4 +80,8 @@ dieb: + .byte 0x0 + + .byte 0x0 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-entry-value.S b/gdb/testsuite/gdb.dwarf2/dw2-entry-value.S +index 82d4549b8b5..5fdfeecbb09 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-entry-value.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-entry-value.S +@@ -102,4 +102,8 @@ loclist: + .byte 0x0 + .byte 0x0 + .byte 0x0 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-filename.S b/gdb/testsuite/gdb.dwarf2/dw2-filename.S +index 1cdd94a12f5..a1f0867aed5 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-filename.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-filename.S +@@ -51,4 +51,8 @@ + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-icc-opaque.S b/gdb/testsuite/gdb.dwarf2/dw2-icc-opaque.S +index f954c4f7cc7..67ba8a47d37 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-icc-opaque.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-icc-opaque.S +@@ -252,4 +252,8 @@ debug_info_seg3_end: + .byte 0x08 /* DW_FORM_string. */ + .2byte 0x0000 /* End abbrev. */ + .byte 0x00 /* End abbrev table. */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-icycle.S b/gdb/testsuite/gdb.dwarf2/dw2-icycle.S +index 8856eb6e5d3..e432f629cae 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-icycle.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-icycle.S +@@ -18,7 +18,11 @@ + .text + + .Ltext0: ++#ifdef __arm__ ++ .type p__top__middle__inside.3062, %function ++#else + .type p__top__middle__inside.3062, @function ++#endif + p__top__middle__inside.3062: + .LFB4: + .file 1 "p.adb" +@@ -26,7 +30,11 @@ p__top__middle__inside.3062: + .LBE6: + + .globl p__top ++#ifdef __arm__ ++ .type p__top, %function ++#else + .type p__top, @function ++#endif + p__top: + .LFB2: + .4byte 0 +@@ -246,4 +254,8 @@ p__top: + .Lline1_begin: + .byte 0 + ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inheritance.S b/gdb/testsuite/gdb.dwarf2/dw2-inheritance.S +index f83762503ac..1585d8ac576 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-inheritance.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-inheritance.S +@@ -96,4 +96,8 @@ + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-inline-param.S b/gdb/testsuite/gdb.dwarf2/dw2-inline-param.S +index 540bbb38342..c460dddb732 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-inline-param.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-inline-param.S +@@ -150,4 +150,8 @@ + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-intercu.S b/gdb/testsuite/gdb.dwarf2/dw2-intercu.S +index a068ba116f9..2cdc3049bc0 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-intercu.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-intercu.S +@@ -314,4 +314,8 @@ func_cu1: + .byte 1 + + .Lline1_end: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-intermix.S b/gdb/testsuite/gdb.dwarf2/dw2-intermix.S +index a9a474e2b7c..010bdb22454 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-intermix.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-intermix.S +@@ -198,4 +198,8 @@ func_cu1: + .byte 1 + + .Lline1_end: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-linkage-name-trust.S b/gdb/testsuite/gdb.dwarf2/dw2-linkage-name-trust.S +index aa3ec9d486c..8a16022bd8f 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-linkage-name-trust.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-linkage-name-trust.S +@@ -132,4 +132,8 @@ c: .4byte 0 + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-minsym-in-cu.S b/gdb/testsuite/gdb.dwarf2/dw2-minsym-in-cu.S +index 4169f720837..cbc1c87bb91 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-minsym-in-cu.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-minsym-in-cu.S +@@ -115,4 +115,8 @@ func2: + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-modula2-self-type.S b/gdb/testsuite/gdb.dwarf2/dw2-modula2-self-type.S +index 82236a7091a..6289c36f01e 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-modula2-self-type.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-modula2-self-type.S +@@ -121,4 +121,8 @@ die221: + .string "GNU Modula-2 0.78 (20100402) grafted onto GCC 4.1.2" + .LASF2: + .string "" ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-noloc.S b/gdb/testsuite/gdb.dwarf2/dw2-noloc.S +index 4b742437b56..d9e31d30ed9 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-noloc.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-noloc.S +@@ -324,4 +324,8 @@ resolvable: + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-inner.S b/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-inner.S +index 93abcf6e09a..57c58123fb8 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-inner.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-inner.S +@@ -178,4 +178,8 @@ inner: + .byte 1 + + .Lline1_end: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-outer.S b/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-outer.S +index 6031ad26d93..99ff8c1151e 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-outer.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-objfile-overlap-outer.S +@@ -209,4 +209,8 @@ outer_after: + .byte 1 + + .Lline1_end: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-op-call.S b/gdb/testsuite/gdb.dwarf2/dw2-op-call.S +index 2ae7bae9a4b..e5bba2cf053 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-op-call.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-op-call.S +@@ -166,4 +166,8 @@ loclist: + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-op-stack-value.S b/gdb/testsuite/gdb.dwarf2/dw2-op-stack-value.S +index 003732618b2..6983f0ed675 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-op-stack-value.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-op-stack-value.S +@@ -130,4 +130,8 @@ aa551234: .byte 0xaa, 0x55, 0x12, 0x34 + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-param-error.S b/gdb/testsuite/gdb.dwarf2/dw2-param-error.S +index 3c7ca3c8ad3..a8b8155b966 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-param-error.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-param-error.S +@@ -106,4 +106,8 @@ debug_end: + .byte 0x0 + .byte 0x0 + .byte 0x0 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-producer.S b/gdb/testsuite/gdb.dwarf2/dw2-producer.S +index ca63697e90d..30338ebd652 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-producer.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-producer.S +@@ -198,4 +198,8 @@ func_cu1: + .byte 1 + + .Lline1_end: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.S b/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.S +index 1091dbc895e..3e3502a441b 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-ref-missing-frame.S +@@ -149,4 +149,8 @@ + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-simple-locdesc.S b/gdb/testsuite/gdb.dwarf2/dw2-simple-locdesc.S +index f199994bcdf..5844ebe4f6d 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-simple-locdesc.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-simple-locdesc.S +@@ -167,4 +167,8 @@ d: + .string "sizetype" + .LASF1: + .string "char" ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.S b/gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.S +index d19ee72ebf3..c94147430c3 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-skip-prologue.S +@@ -397,4 +397,8 @@ loclist: + .byte 1 + + .Lline1_end: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-stack-boundary.S b/gdb/testsuite/gdb.dwarf2/dw2-stack-boundary.S +index 8ea03b126ac..6d4a7be3834 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-stack-boundary.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-stack-boundary.S +@@ -66,4 +66,8 @@ debug_end: + .byte 0x0 + .byte 0x0 + .byte 0x0 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-strp.S b/gdb/testsuite/gdb.dwarf2/dw2-strp.S +index dd4eb4fe46a..e0e27ce7548 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-strp.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-strp.S +@@ -176,4 +176,8 @@ + .string "hello world!\n" + .Lemptyname: + .string "" ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-unresolved.S b/gdb/testsuite/gdb.dwarf2/dw2-unresolved.S +index c52852d7463..2a0a8de6793 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-unresolved.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-unresolved.S +@@ -178,4 +178,8 @@ SYMBOL(var): .byte 2 + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw2-var-zero-addr.S b/gdb/testsuite/gdb.dwarf2/dw2-var-zero-addr.S +index f2fb3c39a23..2abb4f7ee25 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw2-var-zero-addr.S ++++ b/gdb/testsuite/gdb.dwarf2/dw2-var-zero-addr.S +@@ -90,4 +90,8 @@ + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/dw4-sig-type-unused.S b/gdb/testsuite/gdb.dwarf2/dw4-sig-type-unused.S +index d4b4bb64a3c..4678c0fe0f2 100644 +--- a/gdb/testsuite/gdb.dwarf2/dw4-sig-type-unused.S ++++ b/gdb/testsuite/gdb.dwarf2/dw4-sig-type-unused.S +@@ -85,4 +85,8 @@ types_start: + .byte 0x0 + .byte 0x0 + .byte 0x0 ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/fission-reread.S b/gdb/testsuite/gdb.dwarf2/fission-reread.S +index bdb20e76330..6171453c4a5 100644 +--- a/gdb/testsuite/gdb.dwarf2/fission-reread.S ++++ b/gdb/testsuite/gdb.dwarf2/fission-reread.S +@@ -460,4 +460,8 @@ SYMBOL(main): + .Ldebug_addr0: + .4byte .LFB0 /* DW_AT_low_pc */ + .4byte SYMBOL(baz) /* DW_AT_location */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/frame-inlined-in-outer-frame.S b/gdb/testsuite/gdb.dwarf2/frame-inlined-in-outer-frame.S +index 7e5971c50c9..a41b2851394 100644 +--- a/gdb/testsuite/gdb.dwarf2/frame-inlined-in-outer-frame.S ++++ b/gdb/testsuite/gdb.dwarf2/frame-inlined-in-outer-frame.S +@@ -164,4 +164,8 @@ __start_high_pc: + + .global __cu_high_pc + __cu_high_pc: ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/mac-fileno.S b/gdb/testsuite/gdb.dwarf2/mac-fileno.S +index 77730401515..71401bc81c7 100644 +--- a/gdb/testsuite/gdb.dwarf2/mac-fileno.S ++++ b/gdb/testsuite/gdb.dwarf2/mac-fileno.S +@@ -209,4 +209,8 @@ func_cu1: + .uleb128 0x0 /* Included from line number 0 */ + .uleb128 0x0 /* Filename we just started (bug: number too small) */ + .byte 0x0 /* end of CU's macro information */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/pr11465.S b/gdb/testsuite/gdb.dwarf2/pr11465.S +index 5308abebee0..b974f0e9c63 100644 +--- a/gdb/testsuite/gdb.dwarf2/pr11465.S ++++ b/gdb/testsuite/gdb.dwarf2/pr11465.S +@@ -360,4 +360,8 @@ die149: .uleb128 0x16 /* DW_TAG_variable */ + .LASF4: + .string "GNU C++ 4.4.2" + .ident "GCC: (GNU) 4.4.2" ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.dwarf2/pr13961.S b/gdb/testsuite/gdb.dwarf2/pr13961.S +index fc9d7afa838..4c1162591c3 100644 +--- a/gdb/testsuite/gdb.dwarf2/pr13961.S ++++ b/gdb/testsuite/gdb.dwarf2/pr13961.S +@@ -378,4 +378,8 @@ SYMBOL(main): + .LASF3: + .string "main" + ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.mi/dw2-ref-missing-frame.S b/gdb/testsuite/gdb.mi/dw2-ref-missing-frame.S +index 684b9d93541..e37b04a4219 100644 +--- a/gdb/testsuite/gdb.mi/dw2-ref-missing-frame.S ++++ b/gdb/testsuite/gdb.mi/dw2-ref-missing-frame.S +@@ -163,4 +163,8 @@ + + .byte 0x0 /* Terminator */ + .byte 0x0 /* Terminator */ ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +diff --git a/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S b/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S +index d577804e4bb..461e322628a 100644 +--- a/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S ++++ b/gdb/testsuite/gdb.tui/tui-layout-asm-short-prog.S +@@ -20,4 +20,8 @@ _start: + .rept 5 + nop + .endr ++#ifdef __arm__ ++ .section .note.GNU-stack,"",%progbits ++#else + .section .note.GNU-stack,"",@progbits ++#endif +-- +2.35.3 + diff --git a/gdb-testsuite-use-unique-portnum-in-parallel-testing-check-slash-slash-case.patch b/gdb-testsuite-use-unique-portnum-in-parallel-testing-check-slash-slash-case.patch new file mode 100644 index 0000000..fb67c05 --- /dev/null +++ b/gdb-testsuite-use-unique-portnum-in-parallel-testing-check-slash-slash-case.patch @@ -0,0 +1,95 @@ +From f24d498c972be365c72c99f14ada42e3a300b3c4 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sat, 4 May 2024 10:41:09 +0200 +Subject: [PATCH 22/48] [gdb/testsuite] Use unique portnum in parallel testing + (check//% case) + +Make target check//% is the gdb variant of a similar gcc make target [1]. + +When running tests using check//%: +... +$ cd build/gdb +$ make check//unix/{-fPIE/-pie,-fno-PIE/-no-pie} -j2 TESTS=gdb.server/*.exp +... +we get: +... +$ cat build/gdb/testsuite.unix.-fPIE.-pie/cache/portnum +2427 +$ cat build/gdb/testsuite.unix.-fno-PIE.-no-pie/cache/portnum +2423 +... + +The problem is that there are two portnum files used in parallel. + +Fix this by: +- creating a common lockdir build/gdb/testsuite.lockdir for make target + check//%, +- passing this down to the runtests invocations using variable GDB_LOCK_DIR, + and +- using GDB_LOCK_DIR in lock_dir. + +Tested on aarch64-linux. + +Approved-By: Tom Tromey + +PR testsuite/31632 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31632 + +[1] https://gcc.gnu.org/install/test.html +--- + gdb/Makefile.in | 8 ++++++-- + gdb/testsuite/lib/gdb-utils.exp | 5 +++++ + 2 files changed, 11 insertions(+), 2 deletions(-) + +diff --git a/gdb/Makefile.in b/gdb/Makefile.in +index 68e10cf47d8..f742eb5d009 100644 +--- a/gdb/Makefile.in ++++ b/gdb/Makefile.in +@@ -1971,6 +1971,10 @@ check-parallel: force + $(MAKE) $(TARGET_FLAGS_TO_PASS) check-parallel; \ + else true; fi + ++testsuite.lockdir: force ++ rm -rf $@ ++ mkdir -p $@ ++ + # The idea is to parallelize testing of multilibs, for example: + # make -j3 check//sh-hms-sim/{-m1,-m2,-m3,-m3e,-m4}/{,-nofpu} + # will run 3 concurrent sessions of check, eventually testing all 10 +@@ -1979,7 +1983,7 @@ check-parallel: force + # used, this rule will harmlessly fail to match. Used FORCE_PARALLEL to + # prevent serialized checking due to the passed RUNTESTFLAGS. + # FIXME: use config.status --config not --version, when available. +-check//%: force ++check//%: force testsuite.lockdir + @if [ -f testsuite/config.status ]; then \ + rootme=`pwd`; export rootme; \ + rootsrc=`cd $(srcdir); pwd`; export rootsrc; \ +@@ -1997,7 +2001,7 @@ check//%: force + ); \ + else :; fi && cd $$testdir && \ + $(MAKE) $(TARGET_FLAGS_TO_PASS) \ +- RUNTESTFLAGS="--target_board=$$variant $(RUNTESTFLAGS)" \ ++ RUNTESTFLAGS="GDB_LOCK_DIR=$$rootme/testsuite.lockdir --target_board=$$variant $(RUNTESTFLAGS)" \ + FORCE_PARALLEL=$(if $(FORCE_PARALLEL),1,$(if $(RUNTESTFLAGS),,1)) \ + "$$target"; \ + else true; fi +diff --git a/gdb/testsuite/lib/gdb-utils.exp b/gdb/testsuite/lib/gdb-utils.exp +index cfaa7905997..7fd613e0b8f 100644 +--- a/gdb/testsuite/lib/gdb-utils.exp ++++ b/gdb/testsuite/lib/gdb-utils.exp +@@ -180,6 +180,11 @@ proc lock_file_release {info} { + # Return directory where we keep lock files. + + proc lock_dir {} { ++ if { [info exists ::GDB_LOCK_DIR] } { ++ # When using check//. ++ return $::GDB_LOCK_DIR ++ } ++ + return [make_gdb_parallel_path cache] + } + +-- +2.35.3 + diff --git a/gdb-testsuite-use-unique-portnum-in-parallel-testing.patch b/gdb-testsuite-use-unique-portnum-in-parallel-testing.patch new file mode 100644 index 0000000..c9b5ee4 --- /dev/null +++ b/gdb-testsuite-use-unique-portnum-in-parallel-testing.patch @@ -0,0 +1,102 @@ +From c8bf6704e64be92816527e9f3f3b582046e214c9 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Sat, 4 May 2024 10:41:09 +0200 +Subject: [PATCH 21/48] [gdb/testsuite] Use unique portnum in parallel testing + +When instrumenting get_portnum using: +... +puts "PORTNUM: $res" +... +and running: +... +$ cd build/gdb +$ make check-parallel -j2 TESTS=gdb.server/*.exp +... +we run into: +... +Running gdb.server/abspath.exp ... +PORTNUM: 2345 +... +and: +... +Running gdb.server/bkpt-other-inferior.exp ... +PORTNUM: 2345 +... + +This is because the test-cases are run in independent runtest invocations. + +Fix this by handling the parallel case in get_portnum using: +- a file $objdir/cache/portnum to keep the portnum variable, and +- a file $objdir/cache/portnum.lock to serialize access to it. + +Tested on aarch64-linux. + +Approved-By: Tom Tromey +--- + gdb/testsuite/lib/gdbserver-support.exp | 47 ++++++++++++++++++++----- + 1 file changed, 38 insertions(+), 9 deletions(-) + +diff --git a/gdb/testsuite/lib/gdbserver-support.exp b/gdb/testsuite/lib/gdbserver-support.exp +index 4f7effaacf7..a3cccf54a72 100644 +--- a/gdb/testsuite/lib/gdbserver-support.exp ++++ b/gdb/testsuite/lib/gdbserver-support.exp +@@ -141,18 +141,47 @@ proc get_portnum {} { + # starting at $initial_portnum, to avoid conflicts with hung ports. + set initial_portnum 2345 + +- # Currently available port number. +- gdb_persistent_global portnum ++ if { ![info exists ::GDB_PARALLEL] } { ++ # Sequential case. + +- # Initialize, if necessary. +- if { ![info exists portnum] } { +- set portnum $initial_portnum ++ # Currently available port number. ++ gdb_persistent_global portnum ++ ++ # Initialize, if necessary. ++ if { ![info exists portnum] } { ++ set portnum $initial_portnum ++ } ++ ++ # Return currently available port number, and update it. ++ set res $portnum ++ incr portnum ++ return $res ++ } ++ ++ # Parallel case. ++ with_lock portnum.lock { ++ # Keep portnum file alongside the lock that guards it. ++ set portnum_file [lock_dir]/portnum ++ ++ if { [file exists $portnum_file] } { ++ set fd [open $portnum_file r] ++ set portnum [read $fd] ++ close $fd ++ ++ set portnum [string trim $portnum] ++ } else { ++ # Initialize. ++ set portnum $initial_portnum ++ } ++ ++ set next_portnum [expr $portnum + 1] ++ ++ set fd [open $portnum_file w] ++ puts $fd $next_portnum ++ close $fd + } + +- # Return currently available port number, and update it. +- set res $portnum +- incr portnum +- return $res ++ return $portnum + } + + # Locate the gdbserver binary. Returns "" if gdbserver could not be found. +-- +2.35.3 + diff --git a/gdb-tui-allow-command-window-of-1-or-2-lines.patch b/gdb-tui-allow-command-window-of-1-or-2-lines.patch new file mode 100644 index 0000000..c67b949 --- /dev/null +++ b/gdb-tui-allow-command-window-of-1-or-2-lines.patch @@ -0,0 +1,80 @@ +From 02616ce7c5571e5b2680cad52f8c58b27f77b2a5 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 9 Nov 2023 09:04:39 +0100 +Subject: [PATCH 4/6] [gdb/tui] Allow command window of 1 or 2 lines + +When starting TUI in a terminal with 2 lines (likewise with 1 line): +... +$ echo $LINES +2 +$ gdb -q -tui +... +we run into this assert in tui_apply_current_layout: +... + /* This should always be made visible by a layout. */ + gdb_assert (TUI_CMD_WIN != nullptr); +... + +The problem is that for the command window: +- the minimum height is 3 (the default), but +- the maximum height is only 2 because there are only 2 lines. + +This discrepancy eventually leads to a call to newwin in make_window with: +... +(gdb) p height +$1 = 3 +(gdb) p width +$2 = 66 +(gdb) p y +$3 = -1 +(gdb) p x +$4 = 0 +(gdb) +... +which results in a nullptr, which eventually triggers the assert. + +The easiest way to fix this is to change the minimum height of the command +window to 1. However, that would also change behaviour for the case that the +screen size is 3 lines or more. For instance, in gdb.tui/winheight.exp the +number of lines in the terminal is 24, and the test-case checks that the user +cannot increase the source window height to the point that the command window +height would be less than 3. + +Fix this by calculating the minimum height of the command window as follows: +- the default (3) if max_height () allows it, and +- max_height () otherwise. + +Tested on x86_64-linux. + +PR tui/31044 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31044 +--- + gdb/tui/tui-command.h | 12 ++++++++++++ + 1 file changed, 12 insertions(+) + +diff --git a/gdb/tui/tui-command.h b/gdb/tui/tui-command.h +index f6842880bb2..e8c96ecee30 100644 +--- a/gdb/tui/tui-command.h ++++ b/gdb/tui/tui-command.h +@@ -57,6 +57,18 @@ struct tui_cmd_window : public tui_win_info + /* The command window can't be made invisible. */ + } + ++ /* Compute the minimum height of this window. */ ++ virtual int min_height () const override ++ { ++ int preferred_min = tui_win_info::min_height (); ++ int max = max_height (); ++ /* If there is enough space to accommodate the preferred minimum height, ++ use it. Otherwise, use as much as possible. */ ++ return (preferred_min <= max ++ ? preferred_min ++ : max); ++ } ++ + int start_line = 0; + + protected: +-- +2.35.3 + diff --git a/gdb-tui-enable-work-around-libncurses-segfault.patch b/gdb-tui-enable-work-around-libncurses-segfault.patch new file mode 100644 index 0000000..ff7a907 --- /dev/null +++ b/gdb-tui-enable-work-around-libncurses-segfault.patch @@ -0,0 +1,47 @@ +diff --git a/gdb/tui/tui.c b/gdb/tui/tui.c +index 828e42bccf7..551a72e3992 100644 +--- a/gdb/tui/tui.c ++++ b/gdb/tui/tui.c +@@ -57,7 +57,7 @@ + + /* Tells whether the TUI is active or not. */ + bool tui_active = false; +-static bool tui_finish_init = true; ++static int tui_init = -1; + + enum tui_key_mode tui_current_key_mode = TUI_COMMAND_MODE; + +@@ -363,7 +363,13 @@ tui_enable (void) + /* To avoid to initialize curses when gdb starts, there is a deferred + curses initialization. This initialization is made only once + and the first time the curses mode is entered. */ +- if (tui_finish_init) ++ if (tui_init == 0) ++ { ++ /* Initalization failed before, just throw a generic error, don't try ++ again. Workaround for segfault in libncurses5 bsc#1179210. */ ++ error (_("Cannot enable the TUI")); ++ } ++ else if (tui_init == -1) + { + WINDOW *w; + SCREEN *s; +@@ -383,6 +389,8 @@ tui_enable (void) + if (!gdb_stderr->isatty ()) + error (_("Cannot enable the TUI when output is not a terminal")); + ++ tui_init = 0; ++ + s = newterm (NULL, stdout, stdin); + #ifdef __MINGW32__ + /* The MinGW port of ncurses requires $TERM to be unset in order +@@ -435,7 +443,8 @@ tui_enable (void) + tui_set_win_focus_to (TUI_SRC_WIN); + keypad (TUI_CMD_WIN->handle.get (), TRUE); + wrefresh (TUI_CMD_WIN->handle.get ()); +- tui_finish_init = false; ++ ++ tui_init = 1; + } + else + { diff --git a/gdb-tui-fix-resizing-of-terminal-to-1-or-2-lines.patch b/gdb-tui-fix-resizing-of-terminal-to-1-or-2-lines.patch new file mode 100644 index 0000000..d5a084b --- /dev/null +++ b/gdb-tui-fix-resizing-of-terminal-to-1-or-2-lines.patch @@ -0,0 +1,147 @@ +From c55a452eaf9390d5659d3205f762aa2cb84511e1 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Thu, 9 Nov 2023 09:05:01 +0100 +Subject: [PATCH 6/6] [gdb/tui] Fix resizing of terminal to 1 or 2 lines + +When starting TUI in a terminal with 3 lines: +... +$ echo $LINES +3 +$ gdb -q -tui +... +and resizing the terminal to 2 lines we run into a segfault. + +The problem is that for the source window: +- the minimum height is 3 (the default), but +- the maximum height is only 2 because there are only 2 lines. + +This discrepancy eventually leads to a call to newwin in make_window with: +... +(gdb) p height +$1 = 3 +(gdb) p width +$2 = 56 +(gdb) p y +$3 = -1 +(gdb) p x +$4 = 0 +... +which results in a nullptr. + +This violates the assumption here in tui_apply_current_layout: +.... + /* Get the new list of currently visible windows. */ + std::vector new_tui_windows; + applied_layout->get_windows (&new_tui_windows); +... +that get_windows only returns visible windows, which leads to tui_windows +holding a dangling pointer, which results in the segfault. + +Fix this by: +- making sure get_windows only returns visible windows, and +- detecting the situation and dropping windows from the layout if + there's no room for them. + +Tested on x86_64-linux. + +PR tui/31044 +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31044 +--- + gdb/testsuite/gdb.tui/resize.exp | 9 +++++++++ + gdb/tui/tui-layout.c | 22 ++++++++++++++++++++-- + gdb/tui/tui-layout.h | 6 +++++- + 3 files changed, 34 insertions(+), 3 deletions(-) + +diff --git a/gdb/testsuite/gdb.tui/resize.exp b/gdb/testsuite/gdb.tui/resize.exp +index 60d5116886b..e15f8a2f507 100644 +--- a/gdb/testsuite/gdb.tui/resize.exp ++++ b/gdb/testsuite/gdb.tui/resize.exp +@@ -39,3 +39,12 @@ Term::check_contents "source at startup" "\\|.*21 *return 0" + + Term::resize 40 90 + Term::check_box "source box after resize" 0 0 90 26 ++ ++# Check that resizing to less than 3 lines doesn't cause problems. ++foreach lines { 2 1 } { ++ with_test_prefix lines=$lines { ++ Term::resize $lines 90 0 ++ Term::wait_for "" ++ Term::check_region_contents "has prompt" 0 0 90 $lines "$gdb_prompt" ++ } ++} +diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c +index 27abee02087..362c1447910 100644 +--- a/gdb/tui/tui-layout.c ++++ b/gdb/tui/tui-layout.c +@@ -442,6 +442,13 @@ tui_layout_window::apply (int x_, int y_, int width_, int height_, + width = width_; + height = height_; + gdb_assert (m_window != nullptr); ++ if (width == 0 || height == 0) ++ { ++ /* The window was dropped, so it's going to be deleted, reset the ++ soon to be dangling pointer. */ ++ m_window = nullptr; ++ return; ++ } + m_window->resize (height, width, x, y); + } + +@@ -823,6 +830,7 @@ tui_layout_split::apply (int x_, int y_, int width_, int height_, + int available_size = m_vertical ? height : width; + int last_index = -1; + int total_weight = 0; ++ int prev = -1; + for (int i = 0; i < m_splits.size (); ++i) + { + bool cmd_win_already_exists = TUI_CMD_WIN != nullptr; +@@ -854,6 +862,14 @@ tui_layout_split::apply (int x_, int y_, int width_, int height_, + info[i].max_size = info[i].min_size; + } + ++ if (info[i].min_size > info[i].max_size) ++ { ++ /* There is not enough room for this window, drop it. */ ++ info[i].min_size = 0; ++ info[i].max_size = 0; ++ continue; ++ } ++ + if (info[i].min_size == info[i].max_size) + available_size -= info[i].min_size; + else +@@ -864,10 +880,12 @@ tui_layout_split::apply (int x_, int y_, int width_, int height_, + + /* Two adjacent boxed windows will share a border, making a bit + more size available. */ +- if (i > 0 +- && m_splits[i - 1].layout->last_edge_has_border_p () ++ if (prev != -1 ++ && m_splits[prev].layout->last_edge_has_border_p () + && m_splits[i].layout->first_edge_has_border_p ()) + info[i].share_box = true; ++ ++ prev = i; + } + + /* If last_index is set then we have a window that is not of a fixed +diff --git a/gdb/tui/tui-layout.h b/gdb/tui/tui-layout.h +index 206f1117445..ec013a3f051 100644 +--- a/gdb/tui/tui-layout.h ++++ b/gdb/tui/tui-layout.h +@@ -185,7 +185,11 @@ class tui_layout_window : public tui_layout_base + /* See tui_layout_base::get_windows. */ + void get_windows (std::vector *windows) override + { +- windows->push_back (m_window); ++ if (m_window != nullptr && m_window->is_visible ()) ++ { ++ /* Only get visible windows. */ ++ windows->push_back (m_window); ++ } + } + + protected: +-- +2.35.3 + diff --git a/gdb-tui-fix-wmaybe-uninitialized-in-tui_find_disasse.patch b/gdb-tui-fix-wmaybe-uninitialized-in-tui_find_disasse.patch new file mode 100644 index 0000000..01738b0 --- /dev/null +++ b/gdb-tui-fix-wmaybe-uninitialized-in-tui_find_disasse.patch @@ -0,0 +1,57 @@ +From 0f2bdd8648e47e10334f8cc8e47b277d4064d0a2 Mon Sep 17 00:00:00 2001 +From: Tom de Vries +Date: Mon, 13 Nov 2023 09:31:20 +0100 +Subject: [PATCH 3/6] [gdb/tui] Fix Wmaybe-uninitialized in + tui_find_disassembly_address +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +When building gdb with -O2, we run into: +... +gdb/tui/tui-disasm.c: In function ‘CORE_ADDR tui_find_disassembly_address \ + (gdbarch*, CORE_ADDR, int)’: +gdb/tui/tui-disasm.c:293:7: warning: ‘last_addr’ may be used uninitialized \ + in this function [-Wmaybe-uninitialized] + if (last_addr < pc) + ^~ +... + +The warning triggers since commit 72535eb14bd ("[gdb/tui] Fix segfault in +tui_find_disassembly_address"). + +Fix the warning by ensuring that last_addr is initialized at the point of +use: +... ++ last_addr = asm_lines.back ().addr; + if (last_addr < pc) +... + +Tested on x86_64-linux. +--- + gdb/tui/tui-disasm.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c +index 03c78aa1291..bbbc92c8183 100644 +--- a/gdb/tui/tui-disasm.c ++++ b/gdb/tui/tui-disasm.c +@@ -281,7 +281,6 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from) + /* Take the best possible match we have. */ + new_low = *possible_new_low; + next_addr = tui_disassemble (gdbarch, asm_lines, new_low, max_lines); +- last_addr = asm_lines.back ().addr; + gdb_assert (asm_lines.size () >= max_lines); + } + +@@ -290,6 +289,7 @@ tui_find_disassembly_address (struct gdbarch *gdbarch, CORE_ADDR pc, int from) + We keep the disassembled instructions in the 'lines' window + and shift it downward (increasing its addresses). */ + int pos = max_lines - 1; ++ last_addr = asm_lines.back ().addr; + if (last_addr < pc) + do + { +-- +2.35.3 + diff --git a/gdb.changes b/gdb.changes new file mode 100644 index 0000000..2c761fb --- /dev/null +++ b/gdb.changes @@ -0,0 +1,6139 @@ +------------------------------------------------------------------- +Tue Dec 17 16:11:55 UTC 2024 - Tom de Vries + +- Maintenance script qa.sh: + * Add PR29770 xfail (glibc). + * Add PR31229 kfail. + +------------------------------------------------------------------- +Wed Dec 11 18:13:33 UTC 2024 - Tom de Vries + +- Maintenance script qa.sh: + * Add PR32446 kfail. + * Add to be investigated FAILs on Leap 15.6 ppc64le. + +------------------------------------------------------------------- +Tue Dec 10 08:19:28 UTC 2024 - Tom de Vries + +- Patches added: + * gdb-testsuite-avoid-intermittent-failures-on-a-debug.patch +- Maintenance script qa.sh: + * Add PR32439 kfail. + +------------------------------------------------------------------- +Mon Dec 9 14:09:01 UTC 2024 - Tom de Vries + +- Patches added (jsc#PED-10258): + * gdb-tdep-s390-add-arch15-record-replay-support.patch + +------------------------------------------------------------------- +Mon Dec 2 16:05:47 UTC 2024 - Tom de Vries + +- Patches added (jsc#PED-10751): + * s390-provide-ibm-z16-arch14-instruction-descriptions.patch + * gdb-s390-add-arch14-record-replay-support.patch +- Maintenance script qa.sh: + * Add PR32407 kfail. + +------------------------------------------------------------------- +Thu Aug 29 05:55:04 UTC 2024 - Tom de Vries + +- Maintenance script qa.sh: + * Move PR26867 kfail from kfail_factory to kfail. + * Merge PR28468 kfail with PR26867 kfail. + +------------------------------------------------------------------- +Wed Aug 28 08:12:30 UTC 2024 - Tom de Vries + +- Maintenance script qa.sh: + * Restore yama ptrace_scope == 1 kfails, + aaa_base-yama-enable-ptrace doesn't work. + * Enable yama ptrace_scope == 1 kfails for SLFO. + * Add PR32121 kfail. + * Drop Leap 15.3 and 15.4, add Leap 15.6. + * Replace ALP with SLFO. + * Move PR28468 kfail from kfail_factory to kfail. + +------------------------------------------------------------------- +Wed Jun 19 13:11:11 UTC 2024 - Tom de Vries + +- Maintenance script qa.sh: + * Remove python2 related PR29245 kfail. + * Remove PR30518 kfail. + * Remove yama ptrace_scope == 1 kfails. + * Remove PR28065 kfail. +- Patches added (swo#32081): + * gdb-symtab-return-correct-reader-for-top-level-cu-in.patch +- Add "BuildRequires: aaa_base-yama-enable-ptrace" on tumbleweed. +- Maintenance script qa-local.sh: + * Add SLFO and Leap 15.6, drop Leap 15.3 and 15.4 and ALP. + +------------------------------------------------------------------- +Wed Jun 19 09:46:17 UTC 2024 - Tom de Vries + +- Mention changes in GDB 14: + * GDB now supports the AArch64 Scalable Matrix Extension 2 + (SME2), which includes a new 512 bit lookup table register + named ZT0. + * GDB now supports the AArch64 Scalable Matrix Extension (SME), + which includes a new matrix register named ZA, a new thread + register TPIDR2 and a new vector length register SVG + (streaming vector granule). GDB also supports tracking ZA + state across signal frames. Some features are still under + development or are dependent on ABI specs that are still in + alpha stage. For example, manual function calls with ZA state + don't have any special handling, and tracking of SVG changes + based on DWARF information is still not implemented, but there + are plans to do so in the future. + * GDB now recognizes the NO_COLOR environment variable and + disables styling according to the spec. See + https://no-color.org/. Styling can be re-enabled with + "set style enabled on". + * The AArch64 'org.gnu.gdb.aarch64.pauth' Pointer Authentication + feature string has been deprecated in favor of the + 'org.gnu.gdb.aarch64.pauth_v2' feature string. + * GDB now has some support for integer types larger than 64 bits. + * Multi-target feature configuration. + GDB now supports the individual configuration of remote + targets' feature sets. Based on the current selection of a + target, the commands 'set remote -packet (on|off|auto)' + and 'show remote -packet' can be used to configure a + target's feature packet and to display its configuration, + respectively. + * GDB has initial built-in support for the Debugger Adapter + Protocol. + * For the break command, multiple uses of the 'thread' or 'task' + keywords will now give an error instead of just using the + thread or task id from the last instance of the keyword. E.g.: + break foo thread 1 thread 2 + will now give an error rather than using 'thread 2'. + * For the watch command, multiple uses of the 'task' keyword will + now give an error instead of just using the task id from the + last instance of the keyword. E.g.: + watch my_var task 1 task 2 + will now give an error rather than using 'task 2'. The + 'thread' keyword already gave an error when used multiple times + with the watch command, this remains unchanged. + * The 'set print elements' setting now helps when printing large + arrays. If an array would otherwise exceed max-value-size, but + 'print elements' is set such that the size of elements to print + is less than or equal to 'max-value-size', GDB will now still + print the array, however only 'max-value-size' worth of data + will be added into the value history. + * For both the break and watch commands, it is now invalid to use + both the 'thread' and 'task' keywords within the same command. + For example the following commnds will now give an error: + break foo thread 1 task 1 + watch var thread 2 task 3 + * The printf command now accepts a '%V' output format which will + format an expression just as the 'print' command would. Print + options can be placed withing '[...]' after the '%V' to modify + how the value is printed. E.g: + printf "%V", some_array + printf "%V[-array-indexes on]", some_array + will print the array without, or with array indexes included, + just as the array would be printed by the 'print' command. + This functionality is also available for dprintf when + dprintf-style is 'gdb'. + * When the printf command requires a string to be fetched from + the inferior, GDB now uses the existing 'max-value-size' + setting to the limit the memory allocated within GDB. The + default 'max-value-size' is 64k. To print longer strings you + should increase 'max-value-size'. + * The Ada 2022 Enum_Rep and Enum_Val attributes are now + supported. + * The Ada 2022 target name symbol ('@') is now supported by the + Ada expression parser. + * The 'list' command now accepts '.' as an argument, which tells + GDB to print the location around the point of execution within + the current frame. If the inferior hasn't started yet, the + command will print around the beginning of the 'main' function. + * Using the 'list' command with no arguments in a situation where + the command would attempt to list past the end of the file now + warns the user that the end of file has been reached, refers + the user to the newly added '.' argument + * Breakpoints can now be inferior-specific. This is similar to + the existing thread-specific breakpoint support. Breakpoint + conditions can include the 'inferior' keyword followed by an + inferior id (as displayed in the 'info inferiors' output). + It is invalid to use the 'inferior' keyword with either the + 'thread' or 'task' keywords when creating a breakpoint. + * New convenience function "$_shell", to execute a shell command + and return the result. This lets you run shell commands in + expressions. Some examples: + (gdb) p $_shell("true") + $1 = 0 + (gdb) p $_shell("false") + $2 = 1 + (gdb) break func if $_shell("some command") == 0 + * New commands: + * set debug breakpoint on|off + show debug breakpoint + Print additional debug messages about breakpoint insertion + and removal. + * maintenance print record-instruction [ N ] + Print the recorded information for a given instruction. If N + is not given prints how GDB would undo the last instruction + executed. If N is negative, prints how GDB would undo the + N-th previous instruction, and if N is positive, it prints + how GDB will redo the N-th following instruction. + * maintenance info frame-unwinders + List the frame unwinders currently in effect, starting with + the highest priority. + * maintenance wait-for-index-cache + Wait until all pending writes to the index cache have + completed. + * set always-read-ctf on|off + show always-read-ctf + When off, CTF is only read if DWARF is not present. When on, + CTF is read regardless of whether DWARF is present. Off by + default. + * info main + Get main symbol to identify entry point into program. + * set tui mouse-events [on|off] + show tui mouse-events + When on (default), mouse clicks control the TUI and can be + accessed by Python extensions. When off, mouse clicks are + handled by the terminal, enabling terminal-native text + selection. + * MI changes: + * MI version 1 has been removed. + * mi now reports 'no-history' as a stop reason when hitting the + end of the reverse execution history. + * When creating a thread-specific breakpoint using the '-p' + option, the -break-insert command would report the 'thread' + field twice in the reply. The content of both fields was + always identical. This has now been fixed; the 'thread' + field will be reported just once for thread-specific + breakpoints, or not at all for breakpoints without a thread + restriction. The same is also true for the 'task' field of + an Ada task-specific breakpoint. + * It is no longer possible to create a thread-specific + breakpoint for a thread that doesn't exist using + '-break-insert -p ID'. Creating breakpoints for + non-existent threads is not allowed when using the CLI, that + the MI allowed it was a long standing bug, which has now + been fixed. + * The '--simple-values' argument to the + '-stack-list-arguments','-stack-list-locals', + '-stack-list-variables', and '-var-list-children' commands now + takes reference types into account: that is, a value is now + considered simple if it is neither an array, structure, or + union, nor a reference to an array, structure, or union. + (Previously all references were considered simple.) Support + for this feature can be verified by using the + '-list-features' command, which should contain + "simple-values-ref-types". + * The -break-insert command now accepts a '-g thread-group-id' + option to allow for the creation of inferior-specific + breakpoints. + * The bkpt tuple, which appears in breakpoint-created + notifications, and in the result of the -break-insert + command can now include an optional 'inferior' field for both + the main breakpoint, and each location, when the breakpoint + is inferior-specific. + * Python API: + * gdb.ThreadExitedEvent added. Emits a ThreadEvent. + * The gdb.unwinder.Unwinder.name attribute is now read-only. + * The name argument passed to gdb.unwinder.Unwinder.__init__ + must now be of type 'str' otherwise a TypeError will be + raised. + * The gdb.unwinder.Unwinder.enabled attribute can now only + accept values of type 'bool'. Changing this attribute will + now invalidate GDB's frame-cache, which means GDB will need + to rebuild its frame-cache when next required - either with, + or without the particular unwinder, depending on how + 'enabled' was changed. + * New methods added to the gdb.PendingFrame class. These + methods have the same behaviour as the corresponding + methods on gdb.Frame. The new methods are: + * gdb.PendingFrame.name: Return the name for the frame's + function, or None. + * gdb.PendingFrame.is_valid: Return True if the pending + frame object is valid. + * gdb.PendingFrame.pc: Return the $pc register value for + this frame. + * gdb.PendingFrame.language: Return a string containing the + language for this frame, or None. + * gdb.PendingFrame.find_sal: Return a gdb.Symtab_and_line + object for the current location within the pending frame, + or None. + * gdb.PendingFrame.block: Return a gdb.Block for the current + pending frame, or None. + * gdb.PendingFrame.function: Return a gdb.Symbol for the + current pending frame, or None. + * The frame-id passed to gdb.PendingFrame.create_unwind_info + can now use either an integer or a gdb.Value object for each + of its 'sp', 'pc', and 'special' attributes. + * A new class gdb.unwinder.FrameId has been added. Instances + of this class are constructed with 'sp' (stack-pointer) and + 'pc' (program-counter) values, and can be used as the + frame-id when calling gdb.PendingFrame.create_unwind_info. + * It is now no longer possible to sub-class the + gdb.disassembler.DisassemblerResult type. + * The Disassembler API from the gdb.disassembler module has + been extended to include styling support: + * The DisassemblerResult class can now be initialized with a + list of parts. Each part represents part of the + disassembled instruction along with the associated style + information. This list of parts can be accessed with the + new DisassemblerResult.parts property. + * New constants gdb.disassembler.STYLE_* representing all the + different styles part of an instruction might have. + * New methods DisassembleInfo.text_part and + DisassembleInfo.address_part which are used to create the + new styled parts of a disassembled instruction. + * Changes are backwards compatible, the older API can still + be used to disassemble instructions without styling. + * New function gdb.execute_mi(COMMAND, [ARG]...), that invokes + a GDB/MI command and returns the output as a Python + dictionary. + * New function gdb.block_signals(). This returns a context + manager that blocks any signals that GDB needs to handle + itself. + * New class gdb.Thread. This is a subclass of threading.Thread + that calls gdb.block_signals in its "start" method. + * gdb.parse_and_eval now has a new "global_context" parameter. + This can be used to request that the parse only examine + global symbols. + * gdb.Inferior now has a new "arguments" attribute. This holds + the command-line arguments to the inferior, if known. + * gdb.Inferior now has a new "main_name" attribute. This holds + the name of the inferior's "main", if known. + * gdb.Inferior now has new methods "clear_env", "set_env", and + "unset_env". These can be used to modify the inferior's + environment before it is started. + * gdb.Value now has the 'assign' method. + * gdb.Value now has the 'to_array' method. This converts an + array-like Value to an array. + * gdb.Progspace now has the new method "objfile_for_address". + This returns the gdb.Objfile, if any, that covers a given + address. + * gdb.Breakpoint now has an "inferior" attribute. If the + Breakpoint object is inferior specific then this attribute + holds the inferior-id (an integer). If the Breakpoint + object is not inferior specific, then this field contains + None. This field can be written too. + * gdb.Type now has the "is_array_like" and "is_string_like" + methods. These reflect GDB's internal idea of whether a + type might be array- or string-like, even if they do not + have the corresponding type code. + * gdb.ValuePrinter is a new class that can be used as the base + class for the result of applying a pretty-printer. As a + base class, it signals to gdb that the printer may implement + new pretty-printer methods. + * New attribute Progspace.symbol_file. This attribute holds + the gdb.Objfile that corresponds to Progspace.filename (when + Progspace.filename is not None), otherwise, this attribute is + itself None. + * New attribute Progspace.executable_filename. This attribute + holds a string containing a file name set by the "exec-file" + or "file" commands, or None if no executable file is set. + This isn't the exact string passed by the user to these + commands; the file name will have been partially resolved to + an absolute file name. + * A new executable_changed event registry is available. This + event emits ExecutableChangedEvent objects, which have + 'progspace' (a gdb.Progspace) and 'reload' (a Boolean) + attributes. This event is emitted when + gdb.Progspace.executable_filename changes. + * New event registries gdb.events.new_progspace and + gdb.events.free_progspace, these emit NewProgspaceEvent and + FreeProgspaceEvent event types respectively. Both of these + event types have a single 'progspace' attribute, which is + the gdb.Progspace that is either being added to GDB, or + removed from GDB. + * gdb.LazyString now implements the __str__ method. + * New method gdb.Frame.static_link that returns the outer + frame of a nested function frame. + +------------------------------------------------------------------- +Tue Jun 18 12:20:33 UTC 2024 - Tom de Vries + +- Fix mention of gdb-exp-redo-cast-handling-for-indirection.patch. + +------------------------------------------------------------------- +Thu Jun 13 09:26:39 UTC 2024 - Tom de Vries + +- Maintenance script qa-remote.sh: + * Filter out SLE-11. +- Maintenance script qa.sh: + * Add gdb.guile/scm-breakpoint.exp kfail. + * Fix kfail_powerpc64le_sle12 selection. + +------------------------------------------------------------------- +Thu Jun 13 07:07:11 UTC 2024 - Tom de Vries + +- Patches dropped: + * fix-gdb.threads-threads-after-exec.exp-race.patch + * add-maint-info-linux-lwps-command.patch +- Patches added: + * gdb-python-fix-gdb.python-py-disasm.exp-on-arm-linux.patch + * gdb-testsuite-fix-gdb.fortran-array-bounds.exp-on-ar.patch + * gdb-python-make-gdb.unwindinfo.add_saved_register-mo-fixup.patch + * gdb-exp-redo-cast-handling-for-indirection.patch + * gdb-tdep-fix-gdb.base-watchpoint-running-on-arm-ppc6.patch + +------------------------------------------------------------------- +Sat Jun 1 06:10:43 UTC 2024 - Tom de Vries + +- Maintenance script qa.sh: + * Add PR31831 kfail. + * Expand PR28617 kfail. + * Expand PR28561 kfail. + * Expand PR19675 kfail. +- Patches dropped: + * gdb-linux-delete-all-other-lwps-immediately-on-ptrac.patch + +------------------------------------------------------------------- +Fri May 31 06:27:25 UTC 2024 - Tom de Vries + +- Patches added: + * gdb-build-fix-gdbserver-linux-aarch64-low.cc-build.patch + * powerpc-fix-test-gdb.ada-finish-large.exp.patch + * gdb-testsuite-fix-timeout-in-gdb.tui-resize-2.exp.patch +- Maintenance script qa.sh: + * Remove PR26761 kfail. + * Add PR31061, PR31823, PR31825, PR31826, PR31827 and PR31564 + kfail. + * Remove PKRU-related kfails. + * Improve report format for known clean configs. + * Add more configs as known clean. + * Expand scope of PR29253 kfail. + +------------------------------------------------------------------- +Wed May 1 07:32:34 UTC 2024 - Tom de Vries + +- Rebase to 14.2 release (fedora rawhide @ 779f05e). + * Replace gdb-13.2.tar.bz2 with gdb-14.2.tar.bz2. +- Maintenance script import-fedora.sh: + * Drop patch skips: + * gdb-6.5-BEA-testsuite.patch +- Maintenance script qa-local.sh: + * Drop SLE-11. GDB 14.2 requires MPFR, and the SLE-11 version + (2.3.2) is older than required (3.1.0+). + * Add ALP. + * Update version to 14.2. +- Maintenance script qa.sh: + * Add PR30480, PR31440, PR31806 kfail. + * Add PR31810, PR31809, PR31811 kfail. + * Expand gdb.base/rtld-step.exp kfail. + * Add gdb.threads/thread-specific-bp.exp kfail. +- Fedora patches updated: + * gdb-6.3-gstack-20050411.patch + * gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch + * gdb-6.6-buildid-locate-rpm.patch + * gdb-6.6-buildid-locate-solib-missing-ids.patch + * gdb-6.6-buildid-locate.patch + * gdb-6.6-testsuite-timeouts.patch + * gdb-core-open-vdso-warning.patch + * gdb-fedora-libncursesw.patch + * gdb-linux_perf-bundle.patch + * gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch + * gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch + * gdb-rhbz-2232086-generate-gdb-index-consistently.patch +- Fedora patches removed: + * gdb-binutils29988-read_indexed_address.patch + * gdb-bz2196395-debuginfod-legacy-openssl-crash.patch + * gdb-bz2237392-dwarf-obstack-allocation.patch + * gdb-bz2237515-debuginfod-double-free.patch + * gdb-rhbz1773651-gdb-index-internal-error.patch + * gdb-rhbz2160211-excessive-core-file-warnings.patch + * gdb-rhbz2192105-ftbs-dangling-pointer + * gdb-rhbz2233961-CVE-2022-4806.patch + * gdb-rhbz2233965-memory-leak.patch +- Fedora patches added: + * gdb-ftbs-swapped-calloc-args.patch + * gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch + * gdb-rhbz2250652-gdbpy_gil.patch + * gdb-rhbz2261580-intrusive_list-assertion-fix.patch +- Fedora fixup patches added: + * fixup-skip-tests.patch +- Fedora fixup patches updated: + * fixup-gdb-linux_perf-bundle.patch +- Patches updated: + * gdb-symtab-work-around-pr-gas-29517.patch + * gdb-symtab-work-around-gas-pr28629.patch + * gdb-testsuite-ada-pie.patch + * gdb-python-finishbreakpoint-update.patch + * gdb-testsuite-prevent-compilation-fails-with-unix-fpie-pie.patch + * gdb-fix-segfault-in-for_each_block-part-1.patch + * gdb-fix-segfault-in-for_each_block-part-2.patch + * gdb-symtab-don-t-defer-backward-refs-inter-cu-intra-.patch + * gdb-symtab-factor-out-m_deferred_entries-usage.patch + * gdb-symtab-factor-out-m_die_range_map-usage.patch + * gdb-symtab-fix-dw_tag_inlined_subroutine-entries-in-.patch + * gdb-symtab-handle-nullptr-parent-in-parent_map-set_p.patch + * gdb-symtab-keep-track-of-all-parents-for-cooked-inde.patch + * gdb-symtab-keep-track-of-processed-dies-in-shard.patch + * gdb-symtab-recurse-into-c-dw_tag_subprogram-dies-for.patch + * gdb-symtab-refactor-condition-in-scan_attributes.patch + * gdb-symtab-resolve-deferred-entries-inter-shard-case.patch + * gdb-symtab-resolve-deferred-entries-intra-shard-case.patch +- Patches added: + * gdb-symtab-work-around-pr-gas-29517-dwarf2-case.patch + * fix-the-gdb.ada-inline-section-gc.exp-test.patch + * gdb-testsuite-handle-pac-marker.patch + * change-gdb.base-examine-backwards.exp-for-aix.patch + * gdb-testsuite-fix-spurious-fails-with-examine-backwa.patch + * gdb-testsuite-make-gdb.base-solib-search.exp-more-ro.patch + * gdb-testsuite-fix-regexp-in-vgdb_start.patch + * powerpc-and-aarch64-fix-reverse-stepping-failure.patch + * gdb-tdep-fix-gdb.base-watch-bitfields.exp-on-aarch64.patch + * gdb-tdep-fix-gdb.base-watchpoint-unaligned.exp-on-aa.patch + * gdb-testsuite-add-pr-gdb-26967-kfail-in-two-more-tes.patch + * gdb-testsuite-fix-gdb.base-eh_return.exp.patch + * fixup-powerpc-and-aarch64-fix-reverse-stepping-failu.patch + * gdb-exp-fix-printing-of-out-of-bounds-struct-members.patch + * gdb-fix-heap-use-after-free-in-select_event_lwp.patch + * fix-regression-on-aarch64-linux-gdbserver.patch + * gdb-testsuite-factor-out-proc-get_portnum.patch + * gdb-testsuite-make-portnum-a-persistent-global.patch + * gdb-testsuite-factor-out-proc-with_lock.patch + * gdb-testsuite-factor-out-proc-lock_dir.patch + * gdb-testsuite-move-gpu-parallel.lock-to-cache-dir.patch + * gdb-testsuite-use-unique-portnum-in-parallel-testing.patch + * gdb-testsuite-use-unique-portnum-in-parallel-testing-check-slash-slash-case.patch + * gdb-tdep-fix-reverse-execution-of-ldr-immediate-t4.patch + * gdb-exp-fix-cast-handling-for-indirection.patch + * gdb-remote-fix-abort-on-remote_close_error.patch + * gdb-testsuite-use-find_gnatmake-instead-of-gdb_find_.patch + * gdb-testsuite-simplify-gdb.server-server-kill-python.patch + * gdb-testsuite-fix-gdbserver-pid-in-gdb.server-server.patch + * gdb-testsuite-add-missing-include-in-gdb.base-ctf-pt.patch + * gdb-testsuite-fix-gdb.ada-verylong.exp-on-32-bit-tar.patch + * gdb-testsuite-add-missing-includes-in-gdb.trace-coll.patch + * gdb-testsuite-fix-missing-return-type-in-gdb.linespe.patch + * gdb-testsuite-fix-gdb.base-ending-run.exp-on-manjaro.patch + * gdb-testsuite-fix-test-case-gdb.threads-attach-stopp.patch + * gdb-testsuite-add-missing-include-in-gdb.base-rtld-s.patch + * gdb-testsuite-fix-valgrind-tests-on-debian.patch + * gdb-testsuite-fix-gdb.server-server-connect.exp-for-.patch + * gdb-testsuite-handle-core-without-build-id-in-gdb.ba.patch + * gdb-testsuite-fix-gdb.base-list-no-debug.exp-on-debi.patch + * gdb-testsuite-reset-errcnt-and-warncnt-in-default_gd.patch + * gdb-testsuite-fix-test-in-gdb.python-py-finish-break.patch + * gdb-testsuite-further-handle-long-filenames-in-gdb.b.patch + * gdb-testsuite-fix-license-text-in-gdb.reverse-map-to.patch + * gdb-testsuite-call-ldd-version-in-gdb.testsuite-dump.patch + * gdb-testsuite-fix-gdb.mi-mi-dprintf.exp-with-read1.patch + * gdb-testsuite-fix-gdb.cp-namespace.exp-with-read1.patch + * gdb-testsuite-fix-typo-in-gdb.base-catch-syscall.exp.patch + * gdb-testsuite-use-more-progbits-for-arm.patch + * gdb-testsuite-fix-gdb.dwarf2-dw2-gas-workaround.exp.patch + * gdb-testsuite-add-gdb.dwarf2-backward-spec-inter-cu..patch + * gdb-testsuite-add-gdb.dwarf2-forward-spec-inter-cu.e.patch + * gdb-symtab-workaround-pr-gas-31115.patch + * gdb-arm-remove-tpidruro-register-from-non-freebsd-ta.patch + * gdb-tdep-fix-catching-syscall-execve-exit-for-arm.patch + * gdb-arm-fix-epilogue-frame-id.patch + * gdb-linux-delete-all-other-lwps-immediately-on-ptrac.patch + * add-maint-info-linux-lwps-command.patch + * fix-gdb.threads-threads-after-exec.exp-race.patch + * rs6000-unwind-on-each-instruction-fix.patch + * gdb-python-make-gdb.unwindinfo.add_saved_register-mo.patch + * gdb-arm-remove-thumb-bit-in-arm_adjust_breakpoint_ad.patch + * gdb-testsuite-fix-error-in-gdb.server-server-kill-py.patch +- Patches dropped: + * remove-some-unnecessary-includes-from-exp.y.patch + * gdb-testsuite-fix-gdb.gdb-python-helper.exp-with-o2-.patch + * gdb-testsuite-simplify-gdb.base-unwind-on-each-insn..patch + * gdb-testsuite-handle-output-after-prompt-in-gdb.thre.patch + * gdb-testsuite-add-xfail-in-gdb.arch-i386-pkru.exp.patch + * gdb-testsuite-factor-out-proc-linux_kernel_version.patch + * gdb-testsuite-add-xfail-in-gdb.python-py-record-btra.patch + * gdb-testsuite-fix-gdb.threads-schedlock.exp-on-fast-.patch + * gdb-testsuite-simplify-gdb.arch-amd64-disp-step-avx..patch + * gdb-testsuite-fix-gdb.threads-schedlock.exp-for-gcc-.patch + * gdb-testsuite-add-xfail-case-in-gdb.python-py-record.patch + * aarch64-avoid-initializers-for-vlas.patch + * gdb-tdep-aarch64-fix-frame-address-of-last-insn.patch + * fix-pr30369-regression-on-aarch64-arm-pr30506.patch + * gdb-testsuite-fix-breakpoint-regexp-in-gdb.ada-out_o.patch + * gdb-testsuite-relax-breakpoint-count-check-in-gdb.py.patch + * gdb-testsuite-fix-buffer-overflow-in-gdb.base-signed.patch + * gdb-testsuite-require-syscall-time-in-gdb.reverse-ti.patch + * gdb-testsuite-handle-missing-gdc-in-gdb.dlang-dlang-.patch + * gdb-testsuite-add-basic-lmap-for-tcl-8.6.patch + * gdb-testsuite-fix-gdb.rust-watch.exp-on-ppc64le.patch + * gdb-testsuite-fix-gdb.python-py-breakpoint.exp-timeo.patch + * powerpc-fix-for-gdb.reverse-finish-precsave.exp-and-.patch + * powerpc-regression-fix-for-reverse-finish-command.patch + * gdb-testsuite-don-t-use-string-cat-in-gdb.dwarf2-dw2.patch + * move-step_until-procedure.patch + * gdb-testsuite-fix-gdb.arch-i386-signal.exp-on-x86_64.patch + * gdb-testsuite-fix-regexps-in-gdb.base-step-over-sysc.patch + * gdb-testsuite-add-kfail-for-pr-ada-30908.patch + * gdb-testsuite-fix-gdb.ada-mi_task_arg.exp-with-newer.patch + * gdb-testsuite-fix-gdb.cp-m-static.exp-regression-on-.patch + * gdb-symtab-fix-line-number-of-static-const-class-mem.patch + * gdb-symtab-handle-pu-in-iterate_over_some_symtabs.patch + * gdb-testsuite-fix-gdb.dwarf2-nullptr_t.exp-with-cc-w.patch + * gdb-symtab-fix-too-many-symbols-in-gdbpy_lookup_stat.patch + * gdb-support-rseq-auxvs.patch + * gdb-testsuite-add-xfail-for-gdb-29965-in-gdb.threads.patch + * gdb-cli-handle-pending-c-after-rl_callback_read_char.patch + * gdb-testsuite-add-have_host_locale.patch + * gdb-symtab-find-main-language-without-symtab-expansi.patch + * gdb-symtab-don-t-deduplicate-variables-in-gdb-index.patch + * xcoffread.c-fix-werror-dangling-pointer-issue-with-m.patch + * avoid-manual-memory-management-in-go-lang.c.patch + * gdb-go-handle-v3-go_0-mangled-prefix.patch + * gdb-symtab-handle-self-reference-die.patch + * gdb-symtab-handle-self-reference-in-inherit_abstract.patch + * gdb-symtab-add-optimized-out-static-var-to-cooked-in.patch + * gdb-testsuite-fix-gdb.python-py-breakpoint.exp-with-.patch + * gdb-tui-fix-segfault-in-tui_find_disassembly_address.patch + * gdb-testsuite-add-wait_for_msg-arg-to-term-resize-fi.patch + * gdb-testsuite-fix-gdb-server-ext-run-exp-for-obs.patch + * gdb-testsuite-work-around-skip_prologue-problems-in-gdb.threads-process-dies-while-detaching.exp.patch + +------------------------------------------------------------------- +Wed Apr 24 13:07:21 UTC 2024 - Tom de Vries + +- Maintenance script qa.sh: + * Add PR31671 unresolved. + * Add unresolved for yama ptrace_scope == 1. + * Limit PR31648 unresolved to SLE-11. + +------------------------------------------------------------------- +Thu Apr 18 14:00:01 UTC 2024 - Tom de Vries + +- Patch added (swo#31524, bsc#1222188): + * make-pascal_language-print_type-handle-varstring-nul.patch +- Renable gcc-fortran for SLE-11. +- Use system compiler (gcc 4.3.4) for testing all languages on + SLE-11. +- Maintenance script qa.sh: + * Ignore all fails for SLE-11. +- Maintenance script import-fedora.sh: + * Use %patch -P N instead of deprecated %patchN. + * Drop patch skips: + * gdb-6.5-readline-long-line-crash-test.patch + * gdb-6.7-charsign-test.patch + * gdb-test-ivy-bridge.patch + * gdb-ppc-power7-test.patch + * gdb-6.3-bz140532-ppc-unwinding-test.patch +- Patches added (import from fedora rawhide @ a27201b): + * gdb-bz2196395-debuginfod-legacy-openssl-crash.patch + * gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch + * gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch + * gdb-rhbz-2232086-generate-gdb-index-consistently.patch + * gdb-rhbz-2232086-reduce-size-of-gdb-index.patch + * gdb-rhbz2232086-refactor-selftest-support.patch +- Patches updated (import from fedora rawhide @ a27201b): + * gdb-6.6-buildid-locate-rpm.patch + * gdb-6.6-buildid-locate.patch + * gdb-fedora-libncursesw.patch + * gdb-rhbz2233961-CVE-2022-4806.patch + * gdb-rhbz2233965-memory-leak.patch +- Patches updated: + * gdb-6.6-buildid-locate-rpm-suse.patch +- Patches deleted (import from fedora rawhide @ a27201b): + * gdb-rhbz1553104-s390x-arch12-test.patch + * gdb-lineno-makeup-test.patch + * gdb-6.3-bz202689-exec-from-pthread-test.patch + * gdb-6.5-bz109921-DW_AT_decl_file-test.patch + * gdb-6.5-ia64-libunwind-leak-test.patch + * gdb-6.5-last-address-space-byte-test.patch + * gdb-6.5-missed-trap-on-step-test.patch + * gdb-6.5-sharedlibrary-path.patch + * gdb-6.7-testsuite-stable-results.patch + * gdb-6.8-bz442765-threaded-exec-test.patch + * gdb-ccache-workaround.patch + * gdb-opcodes-clflushopt-test.patch + * gdb-rhbz1186476-internal-error-unqualified-name-re-set-test.patch + * gdb-rhbz1350436-type-printers-error.patch + * gdb-rhbz2196395-debuginfod-legacy-openssl-crash.patch + * gdb-rhel5.9-testcase-xlf-var-inside-mod.patch + * gdb-test-pid0-core.patch +- Patches deleted: + * fixup-gdb-rhbz1553104-s390x-arch12-test.patch + * fixup-2-gdb-rhbz1553104-s390x-arch12-test.patch + * fixup-gdb-lineno-makeup-test.patch + * fixup-gdb-6.6-buildid-locate-rpm.patch +- Remove commented out mention of dropped patch + gdb-fix-selftest-fails-with-gdb-build-with-O2-flto.patch. + +------------------------------------------------------------------- +Thu Apr 18 08:21:00 UTC 2024 - Tom de Vries + +- Maintenance script qa.sh: + * Add PR31648 KFAIL. + * Handle yama ptrace_scope == 1. + +------------------------------------------------------------------- +Wed Apr 10 08:22:47 UTC 2024 - Tom de Vries + +- Patches added (bsc#1220490): + * fixup-gdb-6.6-buildid-locate-rpm.patch + +------------------------------------------------------------------- +Wed Mar 20 09:53:08 UTC 2024 - Richard Biener + +- Avoid using a %gcc macro to support using gcc 4.8 for building + on SLE11. Use the regular language compilers for testing. + +------------------------------------------------------------------- +Tue Feb 27 11:24:51 UTC 2024 - Dominique Leuenberger + +- Use %patch -P N instead of deprecated %patchN. + +------------------------------------------------------------------- +Wed Jan 10 13:40:34 UTC 2024 - Tom de Vries + +- Maintenance script qa.sh: + * Add PR31214 kfail. + * Add kfail for fails in gdb.reverse/solib-precsave.exp / + gdb.reverse/solib-reverse.exp fixed by commit fe6356def67 + ("PowerPC and aarch64: Fix reverse stepping failure"). + * Extend PR31004 kfail. +- Don't require %{python}-base for gdb-testresults package. +- Fix debuginfod handling: + * Enable for sle_version >= 150400 (bsc#1185605, jsc#PED-1149, + jsc#PED-1138), SLE15-SP4 and later. + * Enable for suse_version >= 1600, ALP and Tumbleweed. + * Add back "BuildRequires: libdebuginfod1" to prevent selecting + dummy variant. + * Add "BuildRequires: debuginfod-client" to prevent unresolved + due to conflict with dummy variant. + * Add --with-debuginfod=yes to prevent silently dropping support. +- Patches added (backport from master): + * gdb-testsuite-add-missing-no-prompt-anchor-in-gdb.ba.patch + * gdb-testsuite-remove-spurious-in-save_vars.patch + +------------------------------------------------------------------- +Wed Dec 13 14:58:14 UTC 2023 - Tom de Vries + +- Patches added (backport from gdb-patches, swo#30728): + * gdb-symtab-refactor-condition-in-scan_attributes.patch + * gdb-symtab-factor-out-m_die_range_map-usage.patch + * gdb-symtab-handle-nullptr-parent-in-parent_map-set_p.patch + * gdb-symtab-factor-out-m_deferred_entries-usage.patch + * gdb-symtab-resolve-deferred-entries-inter-shard-case.patch + * gdb-symtab-keep-track-of-processed-dies-in-shard.patch + * gdb-symtab-resolve-deferred-entries-intra-shard-case.patch + * gdb-symtab-don-t-defer-backward-refs-inter-cu-intra-.patch + * gdb-symtab-recurse-into-c-dw_tag_subprogram-dies-for.patch + * gdb-symtab-keep-track-of-all-parents-for-cooked-inde.patch + * gdb-symtab-fix-dw_tag_inlined_subroutine-entries-in-.patch + +------------------------------------------------------------------- +Mon Nov 13 14:08:08 UTC 2023 - Tom de Vries + +- Maintenance script qa.sh: + * Update PR31004 kfail. +- Patches added (backport from gdb-patches): + * gdb-fix-segfault-in-for_each_block-part-1.patch + +------------------------------------------------------------------- +Tue Oct 31 11:59:43 UTC 2023 - Tom de Vries + +- Maintenance script qa.sh: + * Update PR28561 kfail. + * Remove PR31015 kfail. + * Remove PR30547 kfail. +- Patches added (backport from master): + * gdb-symtab-add-producer_is_gas.patch + * gdb-symtab-work-around-gas-pr28629.patch + * gdb-tdep-fix-nr-array-elements-in-ppc64_aggregate_ca.patch + * gdb-testsuite-fix-gdb.python-py-breakpoint.exp-with-.patch + * gdb-tui-fix-segfault-in-tui_find_disassembly_address.patch + * gdb-tui-fix-wmaybe-uninitialized-in-tui_find_disasse.patch + * gdb-testsuite-add-wait_for_msg-arg-to-term-resize-fi.patch +- Patches added (backport from gdb-patches): + * gdb-fix-segfault-in-for_each_block-part-2.patch + * gdb-tui-allow-command-window-of-1-or-2-lines.patch + * gdb-tui-fix-resizing-of-terminal-to-1-or-2-lines.patch + +------------------------------------------------------------------- +Tue Oct 31 09:02:42 UTC 2023 - Tom de Vries + +- Maintenance script qa.sh: + * Remove PR28467, PR29418, PR29420, PR29814 and PR29408 kfail. + * Remove gdb.tui/tui-layout-asm-short-prog.exp kfail. + * Remove commit f68eca29d3b, 29004660c94, 301fe55e9c4, + 4d88ae0c7b5, e7d69e72bfd, 8b272d7671f, 85819864f7c, 167f3beb655 + and a0eda3df5b7 kfails. + * Add PR31015 kfail. + * Remove PR29793 kfail. + * Remove gdb.arch/powerpc-bcl-prologue.exp kfail. + * Remove PR29813 and PR29816 kfail. + +------------------------------------------------------------------- +Sun Oct 29 18:57:21 UTC 2023 - Tom de Vries + +- Maintenance script qa.sh: + * Update PR28561 kfail. + * Update PR29781 kfail. +- Maintenance script qa-local.sh: + * Add "Verify quilt setup" step. +- Patches added (backport from master): + * gdb-symtab-handle-self-reference-die.patch + * gdb-symtab-handle-self-reference-in-inherit_abstract.patch + * gdb-symtab-add-optimized-out-static-var-to-cooked-in.patch + +------------------------------------------------------------------- +Thu Oct 26 12:51:55 UTC 2023 - Tom de Vries + +- Maintenance script qa.sh: + * Add comment to kfail for PR30528. + * Add UNRESOLVED kfail for gdb.base/gcore-excessive-memory.exp. + * Add UNRESOLVED kfail for PR31001. + * Remove PR27238 kfail. + * Add powerpc64le hw watchpoint kfails. + * Add PR31004 kfail. + * Add PR30531 kfail. +- Patches added (backport from master): + * xcoffread.c-fix-werror-dangling-pointer-issue-with-m.patch + * avoid-manual-memory-management-in-go-lang.c.patch + * gdb-go-handle-v3-go_0-mangled-prefix.patch + +------------------------------------------------------------------- +Thu Oct 26 09:24:04 UTC 2023 - Tom de Vries + +- Patches added (backport from master): + * gdb-symtab-don-t-deduplicate-variables-in-gdb-index.patch +- Patches dropped (requires unsupported command): + * gdb-testsuite-add-wait-for-index-cache-in-gdb.dwarf2.patch +- Maintenance script qa.sh: + * Added PR30528 kfail. + +------------------------------------------------------------------- +Tue Oct 24 13:39:35 UTC 2023 - Tom de Vries + +- Patches added (manual import from fedora rawhide @ 52a4dab): + * gdb-rhbz1773651-gdb-index-internal-error.patch +- Patches added (backport from master): + * gdb-support-rseq-auxvs.patch + * gdb-symtab-fix-line-number-of-static-const-class-mem.patch + * gdb-symtab-fix-too-many-symbols-in-gdbpy_lookup_stat.patch + * gdb-symtab-handle-pu-in-iterate_over_some_symtabs.patch + * gdb-symtab-work-around-pr-gas-29517.patch + * gdb-testsuite-add-kfail-for-pr-ada-30908.patch + * gdb-testsuite-add-xfail-for-gdb-29965-in-gdb.threads.patch + * gdb-testsuite-fix-gdb.ada-mi_task_arg.exp-with-newer.patch + * gdb-testsuite-fix-gdb.arch-i386-signal.exp-on-x86_64.patch + * gdb-testsuite-fix-gdb.cp-m-static.exp-regression-on-.patch + * gdb-testsuite-fix-gdb.dwarf2-nullptr_t.exp-with-cc-w.patch + * gdb-testsuite-fix-regexps-in-gdb.base-step-over-sysc.patch + * gdb-symtab-find-main-language-without-symtab-expansi.patch + * gdb-testsuite-add-wait-for-index-cache-in-gdb.dwarf2.patch +- Patches moved (from "Backport from gdb-patches" to + "Backports from master, available in next release"): + * gdb-cli-handle-pending-c-after-rl_callback_read_char.patch + * gdb-testsuite-add-have_host_locale.patch +- Maintenance script qa.sh: + * Remove PR28463, PR28108, PR29247 and PR29160 kfails. + * Remove PR30540, PR30908, PR29965 kfails. + * Remove gdb.ada/mi_task_arg.exp kfail. +- Limit "Suggests: %{python}-Pygments" to SLE-15 and later. + +------------------------------------------------------------------- +Sat Oct 21 08:05:18 UTC 2023 - Tom de Vries + +- Mention import-fedora.sh to fix warning. +- Maintenance script qa.sh: + * Update kfail for PR28561. + +------------------------------------------------------------------- +Fri Oct 20 10:43:32 UTC 2023 - Tom de Vries + +- Maintenance script import-fedora.sh: + * New script. Move skipped patches list from gdb.spec to script. +- Update to fedora 38 @ 82cc8e0. +- Patch renamed: + * pass-const-frame_info_ptr-reference-for-skip_-langua.patch -> + gdb-rhbz2192105-ftbs-dangling-pointer +- Patches added: + * gdb-bz2237392-dwarf-obstack-allocation.patch + * gdb-bz2237515-debuginfod-double-free.patch + * gdb-rhbz2160211-excessive-core-file-warnings.patch + * gdb-rhbz2196395-debuginfod-legacy-openssl-crash.patch + * gdb-rhbz2233961-CVE-2022-4806.patch + * gdb-rhbz2233965-memory-leak.patch +- Maintenance script qa-local.sh: + * Add openSUSE_Leap_15.5 and openSUSE_Factory_LegacyX86. + * Add "List configs" item. + * Skip i586 for SLE-11. +- Maintenance script qa.sh: + * Make sure exit status is 0 + +------------------------------------------------------------------- +Wed Sep 27 09:22:47 UTC 2023 - Tom de Vries + +- Add "Suggests: %{python}-Pygments". +- Maintenance script qa.sh: + * Note investigation of some ada test-cases. + * Update PR30547 kfail. + * Add PR28561 kfail. + * Update PKRU-related kfail. + * Use openSUSE_Factory_LegacyX86.i586 instead of + openSUSE_Factory.i586. + * Remove PR27813 kfail and corresponding todo. + +------------------------------------------------------------------- +Sun Aug 20 00:41:09 UTC 2023 - Luciano Santos + +- Drop libdebuginfod1 BuildRequires/Recommends. The former isn't + needed because there's a build requirement on libdebuginfod-devel + already, which will pull the shared library. And the latter, + because it's bogus since RPM auto generated dependency will take + care of that requirement. + +------------------------------------------------------------------- +Wed Jun 14 06:23:42 UTC 2023 - Tom de Vries + +- Patches added (master backports): + * pass-const-frame_info_ptr-reference-for-skip_-langua.patch +- Maintenance script qa.sh: + * Add PR30543 kfail. + * Remove PR29793 kfail. + +------------------------------------------------------------------- +Mon Jun 12 08:36:48 UTC 2023 - Tom de Vries + +- Patches added (master backports): + * fix-pr30369-regression-on-aarch64-arm-pr30506.patch + * gdb-tdep-aarch64-fix-frame-address-of-last-insn.patch + * gdb-testsuite-fix-breakpoint-regexp-in-gdb.ada-out_o.patch + * gdb-testsuite-relax-breakpoint-count-check-in-gdb.py.patch + * gdb-testsuite-fix-buffer-overflow-in-gdb.base-signed.patch + * gdb-testsuite-require-syscall-time-in-gdb.reverse-ti.patch + * gdb-testsuite-handle-missing-gdc-in-gdb.dlang-dlang-.patch + * gdb-testsuite-add-basic-lmap-for-tcl-8.6.patch + * gdb-testsuite-fix-gdb.rust-watch.exp-on-ppc64le.patch + * gdb-testsuite-fix-gdb.python-py-breakpoint.exp-timeo.patch + * powerpc-fix-for-gdb.reverse-finish-precsave.exp-and-.patch + * powerpc-regression-fix-for-reverse-finish-command.patch + * gdb-testsuite-don-t-use-string-cat-in-gdb.dwarf2-dw2.patch + * move-step_until-procedure.patch +- Patches added (gdb-patches backport): + * gdb-testsuite-add-have_host_locale.patch +- Patches added (fedora patch fixups): + * fixup-gdb-6.3-gstack-20050411.patch + * fixup-gdb-6.3-attach-see-vdso-test.patch + * fixup-gdb-lineno-makeup-test.patch + * fixup-gdb-rhbz1261564-aarch64-hw-watchpoint-test.pat.patch +- Patches dropped: + * gdb-ppc-power7-test.patch + * gdb-rhbz1156192-recursive-dlopen-test.patch + * gdb-6.3-bz140532-ppc-unwinding-test.patch +- Maintenance script qa.sh: + * Add PR30540, PR30537, PR30021 and PR30542 KFAILs. + * Add gdb.base/gcore-excessive-memory.exp internal error. + * Update gdb.base/inline-frame-cycle-unwind.exp KFAIL comment. + +------------------------------------------------------------------- +Fri Jun 9 06:26:02 UTC 2023 - Tom de Vries + +- Patches added (master backports): + * aarch64-avoid-initializers-for-vlas.patch + +------------------------------------------------------------------- +Tue Jun 6 06:00:11 UTC 2023 - Tom de Vries + +- Rebase to 13.2 release (fedora 38 @ fc4e284) + * Replace gdb-12.1.tar.bz2 with gdb-13.2.tar.bz2. +- Patches dropped: + * add-elfcompress_zstd.patch + * binutils-gdb-support-zstd-compressed-debug-section.patch + * fix-comparison-of-unsigned-long-int-to-int-in-record_linux_system_call.patch + * fix-core-file-detach-crash-corefiles-29275.patch + * fix-for-gdb.base-solib-search.exp-test.patch + * fix-gdb-build-elf-support-check-lzstd.patch + * fixup-gdb-rhbz1325795-framefilters-test.patch + * gdb-6.3-focus-cmd-prev-test.patch + * gdb-6.3-inheritancetest-20050726.patch + * gdb-6.3-test-dtorfix-20050121.patch + * gdb-6.3-test-movedir-20050125.patch + * gdb-6.3-threaded-watchpoints2-20050225.patch + * gdb-6.6-buildid-locate-rpm-scl.patch + * gdb-6.6-bz230000-power6-disassembly-test.patch + * gdb-add-gdb-syscalls-makefile.patch + * gdb-add-support-for-readline-8.2.patch + * gdb-bz601887-dwarf4-rh-test.patch + * gdb-disable-commit-resumed-in-target_kill.patch + * gdb-fix-assert-in-handle_jit_event.patch + * gdb-fix-assert-when-quitting-gdb-while-a-thread-is-stepping.patch + * gdb-fix-for-gdb.base-eof-exit.exp-test-failures.patch + * gdb-fix-selftest-fails-with-gdb-build-with-O2-flto.patch + * gdb-fortran-frame-string.patch + * gdb-handle-pending-c-after-rl_callback_read_char.patch + * gdb-improved-eof-handling-when-using-readline-7.patch + * gdb-physname-pr11734-test.patch + * gdb-physname-pr12273-test.patch + * gdb-record-handle-statx-system-call.patch + * gdb-rhbz1325795-framefilters-test.patch + * gdb-rhbz1398387-tab-crash-test.patch + * gdb-runtest-pie-override.patch + * gdb-symtab-fix-handling-of-dw_tag_unspecified_type.patch + * gdb-tdep-fix-powerpc-ieee-128-bit-format-arg-passing.patch + * gdb-tdep-handle-pipe2-syscall-for-amd64.patch + * gdb-tdep-support-catch-syscall-pipe2-for-i386.patch + * gdb-tdep-update-syscalls-ppc64-ppc-linux.xml.patch + * gdb-test-expr-cumulative-archer.patch + * gdb-testsuite-add-kfail-in-gdb.threads-fork-plus-threads.exp.patch + * gdb-testsuite-add-new-gdb_attach-to-check-attach-command.patch + * gdb-testsuite-address-test-failures-in-gdb.mi-mi-multi-commands.exp.patch + * gdb-testsuite-detect-change-instead-of-init-in-gdb.mi-mi-var-block.exp.patch + * gdb-testsuite-enable-some-test-cases-for-x86_64-m32.patch + * gdb-testsuite-fix-fail-in-gdb.threads-fork-and-threads.exp.patch + * gdb-testsuite-fix-gdb.ada-literals.exp-with-aarch64.patch + * gdb-testsuite-fix-gdb.base-break-idempotent.exp-on-ppc.patch + * gdb-testsuite-fix-gdb.base-catch-syscall.exp-with-with-expat-no.patch + * gdb-testsuite-fix-gdb.base-catch-syscall.exp-without-enable-targets.patch + * gdb-testsuite-fix-gdb.base-infoline-reloc-main-from-.patch + * gdb-testsuite-fix-gdb.base-nested-subp-2-3-.exp-with.patch + * gdb-testsuite-fix-gdb.dwarf2-dw2-dir-file-name.exp-w.patch + * gdb-testsuite-fix-gdb.dwarf2-dw2-out-of-range-end-of-seq.exp-on-aarch64.patch + * gdb-testsuite-fix-gdb.dwarf2-dw2-unspecified-type-foo.c-with-m32.patch + * gdb-testsuite-fix-gdb.mi-mi-sym-info.exp-on-opensuse-tumbleweed.patch + * gdb-testsuite-fix-gdb.opt-clobbered-registers-o2.exp-with-gcc-12.patch + * gdb-testsuite-fix-gdb.reverse-i387-env-reverse.exp-for-pie.patch + * gdb-testsuite-fix-gdb.reverse-test_ioctl_tcsetsw.exp-with-libc-debuginfo.patch + * gdb-testsuite-fix-gdb.threads-killed-outside.exp-on-aarch64.patch + * gdb-testsuite-fix-have_mpx-test.patch + * gdb-testsuite-fix-occasional-failure-in-gdb.mi-mi-multi-commands.exp.patch + * gdb-testsuite-fix-test-failure-when-building-against-readline-v7.patch + * gdb-testsuite-handle-init-errors-in-gdb.mi-user-selected-context-sync.exp.patch + * gdb-testsuite-handle-missing-.note.gnu-stack.patch + * gdb-testsuite-handle-older-python-in-gdb.python-py-send-packet.py.patch + * gdb-testsuite-handle-pipe2-syscall-in-gdb.base-catch-syscall.exp.patch + * gdb-testsuite-handle-quotes-in-gdb_py_module_available.patch + * gdb-testsuite-handle-unordered-dict-in-gdb.python-py-mi-cmd.exp.patch + * gdb-testsuite-refactor-gdb.threads-detach-step-over.exp.patch + * gdb-testsuite-remove-attach-test-from-can_spawn_for_attach.patch + * gdb-testsuite-remove-global-declarations-in-gdb.threads-detach-step-over.exp.patch + * gdb-testsuite-remove-target-limits-in-gdb.base-catch-syscall.exp.patch + * gdb-testsuite-skip-gdb.fortran-namelist.exp-for-gfortran-4.8.patch + * gdb-testsuite-support-recording-of-getrandom.patch + * gdb-testsuite-workaround-unnecessary-.s-file-with-gfortran-4.8.patch + * gdb-update-syscalls-amd64-i386-linux.xml.patch + * gdbserver-switch-to-right-process-in-find_one_thread.patch + * make-gdb.ada-float-bits.exp-more-generic.patch + * powerpc-add-support-for-ieee-128-bit-format.patch + * powerpc-correct-the-gdb-ioctl-values-for-tcgets-tcsets-tcsetsw-and-tcsetsf.patch + * powerpc-fix-for-gdb.base-eh_return.exp.patch + * powerpc-fix-gdb.base-watchpoint.exp-on-power-9.patch + * powerpc-update-expected-floating-point-output-for-gdb.arch-altivec-regs.exp-and-gdb.arch-vsx-regs.exp.patch +- Patches added: + * fixup-gdb-bz634108-solib_address.patch + * gdb-binutils29988-read_indexed_address.patch + * gdb-cli-handle-pending-c-after-rl_callback_read_char.patch + * gdb-rhbz2177655-aarch64-pauth-valid-regcache.patch + * gdb-rhbz2183595-rustc-inside_main.patch + * gdb-testsuite-fix-gdb.gdb-python-helper.exp-with-o2-.patch + * gdb-testsuite-handle-output-after-prompt-in-gdb.thre.patch + * gdb-testsuite-simplify-gdb.base-unwind-on-each-insn..patch + * remove-some-unnecessary-includes-from-exp.y.patch + * gdb-testsuite-fix-gdb.rust-main-crash.exp.patch +- Patches modified: + * gdb-6.3-bz140532-ppc-unwinding-test.patch + * gdb-6.3-gstack-20050411.patch + * gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch + * gdb-6.6-buildid-locate-rpm-suse.patch + * gdb-6.6-buildid-locate-rpm.patch + * gdb-6.6-buildid-locate-solib-missing-ids.patch + * gdb-6.6-buildid-locate.patch + * gdb-6.7-testsuite-stable-results.patch + * gdb-ccache-workaround.patch + * gdb-core-open-vdso-warning.patch + * gdb-fedora-libncursesw.patch + * gdb-gcore-bash.patch + * gdb-linux_perf-bundle.patch + * gdb-testsuite-ada-pie.patch + * gdb-testsuite-add-xfail-in-gdb.arch-i386-pkru.exp.patch + * gdb-testsuite-factor-out-proc-linux_kernel_version.patch + * gdb-testsuite-prevent-compilation-fails-with-unix-fpie-pie.patch +- Maintenance script qa.sh: + * Add -i586 and -x86_64. + * Add KFAILs for PR29040, PR30521, PR30180, PR30518, PR30519. + * Update some KFAIL patterns. + * Add some factory KFAILs. + * Add gdb.base/longjmp-until-in-main.exp in PR26967 KFAILs. +- Maintenance script qa-local.sh: + * Factor out version variable, update to 13.2. + * Try to give reason for build failure. + * Use -$arch as argument to qa.sh. + +------------------------------------------------------------------- + +Mon May 22 21:01:44 UTC 2023 - Dirk Müller + +- disable werror as a workaround for deprecation warnings with + python 3.11 (bsc#1211052) + +------------------------------------------------------------------- + +Fri Apr 7 07:48:58 UTC 2023 - Tom de Vries + +- Revert to singlespec multibuild. + +------------------------------------------------------------------- +Tue Apr 4 13:27:03 UTC 2023 - Tom de Vries + +- Add multispec _multibuild. + +------------------------------------------------------------------- +Tue Apr 4 11:29:35 UTC 2023 - Tom de Vries + +- Don't use multibuild. + +------------------------------------------------------------------- +Tue Apr 4 08:47:10 UTC 2023 - Tom de Vries + +- Fix license, again (bsc#1210081). + +------------------------------------------------------------------- +Fri Mar 3 12:41:21 UTC 2023 - Tom de Vries + +- Maintenance script qa.sh: + * Expand kfail pattern for PR29897. + * Add PR29965 kfail. + +------------------------------------------------------------------- +Thu Mar 2 08:28:32 UTC 2023 - Tom de Vries + +- Re-enable testing all test-cases, undoing accidental change in + previous commit. +- Add --with=for_chroot. + +------------------------------------------------------------------- +Thu Feb 16 10:57:10 UTC 2023 - Tom de Vries + +- Patches dropped (bsc#1207712): + * gdb-container-rh-pkg.patch +- Patches added (bsc#1207712): + * gdb-testsuite-add-gdb.suse-debranding.exp.patch +- Patches added (test-case fix): + * gdb-testsuite-fix-gdb.dwarf2-dw2-dir-file-name.exp-w.patch +- Patches added (fedora patch fixup): + * fixup-gdb-test-dw2-aranges.patch +- Patches added (master backports): + * gdb-testsuite-add-xfail-in-gdb.arch-i386-pkru.exp.patch + * gdb-testsuite-add-xfail-in-gdb.python-py-record-btra.patch + * gdb-testsuite-factor-out-proc-linux_kernel_version.patch + * gdb-testsuite-fix-gdb.base-infoline-reloc-main-from-.patch + * gdb-testsuite-fix-gdb.base-nested-subp-2-3-.exp-with.patch + * gdb-testsuite-fix-gdb.threads-schedlock.exp-on-fast-.patch + * gdb-testsuite-handle-missing-.note.gnu-stack.patch + * gdb-testsuite-simplify-gdb.arch-amd64-disp-step-avx..patch + * gdb-testsuite-fix-gdb.threads-schedlock.exp-for-gcc-.patch + * gdb-testsuite-add-xfail-case-in-gdb.python-py-record.patch + * add-elfcompress_zstd.patch + * binutils-gdb-support-zstd-compressed-debug-section.patch + * fix-gdb-build-elf-support-check-lzstd.patch +- Patches removed (dropped by fedora): + * gdb-test-ivy-bridge.patch +- Disable "BuildRequires: %{gcc}-fortran" for SLE-11. +- Maintenance script qa-local.sh: + * Add SLE-11 to configs. + * Build with --no-verify. +- Maintenance script qa.sh: + * Add -sle11. + +------------------------------------------------------------------- +Tue Dec 13 10:39:19 UTC 2022 - Tom de Vries + +- Maintenance script qa.sh: + * Re-enable PR26284 kfails. + * Remove mention of PR28275. + * Add PR29897 kfail. +- Mention CVE-2018-7208 and CVE-2017-16829. + +------------------------------------------------------------------- +Tue Dec 13 09:52:56 UTC 2022 - Tom de Vries + +- Mention SLE-21561, bnc#1081527, and bnc#1068950. + +------------------------------------------------------------------- +Thu Dec 1 15:20:21 UTC 2022 - Tom de Vries + +- Patches added (gdb 12 release branch backports): + * gdb-disable-commit-resumed-in-target_kill.patch + * gdb-fix-assert-when-quitting-gdb-while-a-thread-is-stepping.patch + * gdb-testsuite-add-new-gdb_attach-to-check-attach-command.patch + * gdb-testsuite-refactor-gdb.threads-detach-step-over.exp.patch + * gdb-testsuite-remove-global-declarations-in-gdb.threads-detach-step-over.exp.patch + * gdbserver-switch-to-right-process-in-find_one_thread.patch +- Patches removed: + * gdb-testsuite-fix-race-in-gdb.threads-detach-step-over.exp.patch +- Maintenance script qa.sh: + * Disable PR26284 kfails. + * Add PR29841 kfails. + * Add kfail_powerpc64le_sle12, kfail_s390 and kfail_s390x. + * Add -s390 and -s390x. + * Add gdb.base/gdb-rhbz1156192-recursive-dlopen.exp kfail. + * Add PR26967 kfails. + * Move PR27027 kfails from kfail_factory to kfail. + * Add -ppc64le alias for -powerpc64le. + * Add gdb.threads/interrupt-while-step-over.exp kfail. + * Add gdb.tui/tui-layout-asm-short-prog.exp kfail. + * Add unix/-fPIE/-fpie overrides -static kfails. + * Add gdb.guile/scm-disasm.exp kfail. + * Add gdb.base/gnu_vector.exp to existing kfail. + * Add gdb.guile/scm-symtab.exp kfail. + * Add gdb.base/write_mem.exp kfail. + +------------------------------------------------------------------- +Tue Nov 22 15:03:04 UTC 2022 - Tom de Vries + +- Maintenance script qa.sh: + - Add openSUSE Leap 15.4 ppc64le to known clean configs. + +------------------------------------------------------------------- +Wed Nov 16 13:49:01 UTC 2022 - Tom de Vries + +- Maintenance script qa.sh: + - Update PR26363 internal error pattern. + - Add PR29790 kfail. + - Add -powerpc64le option. + - Generalize PR26915 kfail patterns. + - Move PR28478 patterns from kfail_factory to kfail. + - Add PR29781 and PR27813 kfails. + - Add SLE-15 ppc64le to known clean configs. + +------------------------------------------------------------------- +Tue Nov 15 08:14:11 UTC 2022 - Tom de Vries + +- Maintenance script qa-remote.sh: + * Use qa.sh alongside qa-remote.sh. +- Maintenance script qa.sh: + * Add PR29783 internal error. +- Patch removed (intended effect not observed): + * gdb-fix-watchpoints-triggered.patch + +------------------------------------------------------------------- +Fri Nov 11 12:06:44 UTC 2022 - Tom de Vries + +- Maintenance script qa.sh: + * Handle librpm == "" and nolibrpm == "". +- Maintenance script qa-remote.sh: + * Make "Get remote testsuite results" even more verbose. + * Make hardcoded pattern gdb-testresults-12.1-*.*.rpm more + generic. + * Add missing setting of rpm variable in "Getting rpms" case. +- Patches added (backport from trunk): + * gdb-testsuite-fix-gdb.base-break-idempotent.exp-on-ppc.patch + * powerpc-fix-gdb.base-watchpoint.exp-on-power-9.patch + +------------------------------------------------------------------- +Fri Oct 21 08:03:27 UTC 2022 - Tom de Vries + +- Maintenance script qa-remote.sh: + * Make "Get remote testsuite results" more verbose. + +------------------------------------------------------------------- +Wed Oct 19 16:35:34 UTC 2022 - Tom de Vries + +- Patches added (swo#29277): + * gdb-fix-assert-in-handle_jit_event.patch +- Maintenance script qa.sh: + * Add PR29706 and PR28617 kfails. + +------------------------------------------------------------------- +Thu Sep 29 08:25:06 UTC 2022 - Fabian Vogt + +- Add patch to fix build with readline 8.2: + * gdb-add-support-for-readline-8.2.patch + +------------------------------------------------------------------- +Wed Sep 28 11:50:45 UTC 2022 - Tom de Vries + +- Patches added: + * gdb-testsuite-fix-gdb.mi-mi-sym-info.exp-on-opensuse-tumbleweed.patch +- Maintenance script qa.sh: + * Add PR26873 kfails. + +------------------------------------------------------------------- +Fri Sep 23 09:46:57 UTC 2022 - Tom de Vries + +- Maintenance script qa-remote.sh: + * Make rpm matching yet more precise. +- Update patch: + * gdb-tdep-fix-powerpc-ieee-128-bit-format-arg-passing.patch +- Add patches: + * gdb-handle-pending-c-after-rl_callback_read_char.patch + * gdb-testsuite-fix-have_mpx-test.patch + * gdb-symtab-fix-handling-of-dw_tag_unspecified_type.patch + * gdb-testsuite-fix-gdb.dwarf2-dw2-unspecified-type-foo.c-with-m32.patch + +------------------------------------------------------------------- +Thu Sep 22 13:38:31 UTC 2022 - Dirk Müller + +- use python3-xml if python is python3 + +------------------------------------------------------------------- +Fri Sep 2 09:13:08 UTC 2022 - Tom de Vries + +- Maintenance script qa.sh: + * Generalize PR29405 kfails. +- Maintenance script qa-remote.sh: + * Make rpm matching more precise. +- Patches added: + * gdb-tdep-fix-powerpc-ieee-128-bit-format-arg-passing.patch + +------------------------------------------------------------------- +Mon Aug 22 02:58:00 UTC 2022 - Martin LiÅ¡ka + +- Enable debuginfod for all archs as we index all TW RPM files. +- Recommend libdebuginfod1 when one installs gdb so that + it can utilize debuginfod server by default. + +------------------------------------------------------------------- +Tue Aug 2 12:01:23 UTC 2022 - Tom de Vries + +- Fix build with gcc 13 by using -Wno-error=enum-int-mismatch. + +------------------------------------------------------------------- +Sat Jul 30 07:24:23 UTC 2022 - Tom de Vries + +- Maintenance script qa.sh: + * Add SLE-12/x86_64 to "known clean configs". + * Add fail for PR29405. + * Add fail for PR26915. + +------------------------------------------------------------------- +Fri Jul 29 06:53:15 UTC 2022 - Tom de Vries + +- Patches added: + * gdb-testsuite-fix-gdb.threads-killed-outside.exp-on-aarch64.patch +- Maintenance script qa.sh: + * Remove PR29247 internal-error. + * Add SLE-15/aarch64 to "known clean configs". + +------------------------------------------------------------------- +Thu Jul 28 05:48:21 UTC 2022 - Tom de Vries + +- Patches added: + * gdb-fix-watchpoints-triggered.patch +- Maintenance script qa.sh: + * Add kfails for PR25038, PR29253, and PR29423. + * Remove gdb.mi/mi-var-invalidate-shlib.exp kfails. +- Mention qa-local.sh, qa-remote.sh and README.qa as sources. + +------------------------------------------------------------------- +Wed Jul 27 06:26:34 UTC 2022 - Tom de Vries + +- Maintenance script qa-local.sh: + * Use have_combo consistently. +- Maintenance script qa.sh: + * Add kfail_aarch64. + * Add PR29419/PR29409 kfails. + * Update PR29247 kfails. +- Patches added: + * make-gdb.ada-float-bits.exp-more-generic.patch + * gdb-testsuite-fix-gdb.ada-literals.exp-with-aarch64.patch + +------------------------------------------------------------------- +Tue Jul 26 06:56:40 UTC 2022 - Tom de Vries + +- Actually apply fixup-gdb-test-bt-cfi-without-die.patch and + fixup-2-gdb-rhbz1553104-s390x-arch12-test.patch. + +------------------------------------------------------------------- +Mon Jul 25 20:28:02 UTC 2022 - Tom de Vries + +- Also remove gdb-6.5-readline-long-line-crash-test.patch from + patches list in gdb.spec. + +------------------------------------------------------------------- +Mon Jul 25 08:11:07 UTC 2022 - Tom de Vries + +- Patches added: + * powerpc-add-support-for-ieee-128-bit-format.patch + * powerpc-correct-the-gdb-ioctl-values-for-tcgets-tcsets-tcsetsw-and-tcsetsf.patch + * gdb-testsuite-remove-target-limits-in-gdb.base-catch-syscall.exp.patch + * powerpc-fix-for-gdb.base-eh_return.exp.patch + * fix-comparison-of-unsigned-long-int-to-int-in-record_linux_system_call.patch + * gdb-testsuite-fix-gdb.reverse-test_ioctl_tcsetsw.exp-with-libc-debuginfo.patch + * fixup-gdb-test-bt-cfi-without-die.patch + * fix-core-file-detach-crash-corefiles-29275.patch + * gdb-testsuite-fix-gdb.dwarf2-dw2-out-of-range-end-of-seq.exp-on-aarch64.patch + * gdb-testsuite-fix-gdb.base-catch-syscall.exp-without-enable-targets.patch + * gdb-testsuite-fix-gdb.base-catch-syscall.exp-with-with-expat-no.patch + * fix-for-gdb.base-solib-search.exp-test.patch +- Patch removed: + * gdb-6.7-ppc-clobbered-registers-O2-test.patch + * gdb-6.5-readline-long-line-crash-test.patch +- Patches updated: + * gdb-tdep-update-syscalls-ppc64-ppc-linux.xml.patch + * gdb-testsuite-handle-pipe2-syscall-in-gdb.base-catch-syscall.exp.patch + +------------------------------------------------------------------- +Wed Jun 22 14:31:30 UTC 2022 - Tom de Vries + +- Maintenance script qa.sh: + * Add PR28504 KFAILs. + * Make .sum file matching less complex. + * Add fedora test-case kfail. +- Maintenance script qa-local.sh: + * Fix incorrect path name. +- Update comments in gdb.spec. +- Patches added: + * powerpc-update-expected-floating-point-output-for-gdb.arch-altivec-regs.exp-and-gdb.arch-vsx-regs.exp.patch + +------------------------------------------------------------------- +Wed Jun 22 12:41:23 UTC 2022 - Tom de Vries + +- Patches updated: + * gdb-testsuite-support-recording-of-getrandom.patch + (add aarch64 part) +- Maintenance script qa.sh: + * Add i586 to known clean configs. + +------------------------------------------------------------------- +Tue Jun 21 21:22:58 UTC 2022 - Tom de Vries + +- Patches added: + * gdb-testsuite-enable-some-test-cases-for-x86_64-m32.patch + * gdb-testsuite-fix-gdb.reverse-i387-env-reverse.exp-for-pie.patch + * gdb-testsuite-support-recording-of-getrandom.patch +- Patches updated: + * gdb-record-handle-statx-system-call.patch +- Maintenance script qa.sh: + * Allow only two summary files, for i586. + * Add i586 KFAILs. +- Maintenance script qa-local.sh: + * Add i586. + +------------------------------------------------------------------- +Thu Jun 16 13:23:31 UTC 2022 - Tom de Vries + +- Maintenance script qa-local.sh: + * Fix rpm pathname. +- Maintenance script qa-remote.sh: + * Skip stale config openSUSE_Leap_15.2. +- Maintenance script qa.sh: + * Drop known clean config: Leap 15.2 x86_64. + +------------------------------------------------------------------- +Mon Jun 13 09:37:45 UTC 2022 - Tom de Vries + +- Maintenance script qa-local.sh: + * Add cleanup step. + * Add "build all configs without testsuite" step. + * For "build all configs with testsuite" step, redirect output + to log and produce PASS/FAIL line, and make sure buildroot is + removed also in case of missing rpm. + * Use "--clean --trust-all-projects" for osc build commands. +* Drop openSUSE_Leap_15.2. +- Maintenance script qa.sh: + * Rename argument 6 to -local. + * Add PR29247 KFAILs. + * Update internal-error regexps. +- New maintenance script qa-remote.sh. +- Add "build all configs without testsuite" step in README.qa. +- Patches added (backport from trunk): + * gdb-testsuite-remove-attach-test-from-can_spawn_for_attach.patch +- README.qa: + * Add remote qa entry. + * Update local qa entry: + * Add notes entry. + * Other updates to match changes in qa-local.sh. + +------------------------------------------------------------------- +Mon Jun 13 03:16:35 UTC 2022 - Tom de Vries + +- Fix installed but unpackaged /usr/share/info/ctf-spec.info.gz. + +------------------------------------------------------------------- +Sat Jun 11 22:51:37 UTC 2022 - Tom de Vries + +- Rebase to 12.1 release (as in fedora 36 @ 89947a7): + * DBX mode is deprecated, and will be removed in GDB 13. + + * GDB 12 is the last release of GDB that will support building against + Python 2. From GDB 13, it will only be possible to build GDB itself + with Python 3 support. + + * Improved C++ template support: + GDB now treats functions/types involving C++ templates like it does function + overloads. Users may omit parameter lists to set breakpoints on families of + template functions, including types/functions composed of multiple template types: + (gdb) break template_func(template_1, int) + The above will set breakpoints at every function `template_func' where + the first function parameter is any template type named `template_1' and + the second function parameter is `int'. + TAB completion also gains similar improvements. + + * New commands: + + maint set backtrace-on-fatal-signal on|off + maint show backtrace-on-fatal-signal + This setting is 'on' by default. When 'on' GDB will print a limited + backtrace to stderr in the situation where GDB terminates with a + fatal signal. This only supported on some platforms where the + backtrace and backtrace_symbols_fd functions are available. + + set source open on|off + show source open + This setting, which is on by default, controls whether GDB will try + to open source code files. Switching this off will stop GDB trying + to open and read source code files, which can be useful if the files + are located over a slow network connection. + + set varsize-limit + show varsize-limit + These are now deprecated aliases for "set max-value-size" and + "show max-value-size". + + task apply [all | TASK-IDS...] [FLAG]... COMMAND + Like "thread apply", but applies COMMAND to Ada tasks. + + watch [...] task ID + Watchpoints can now be restricted to a specific Ada task. + + maint set internal-error backtrace on|off + maint show internal-error backtrace + maint set internal-warning backtrace on|off + maint show internal-warning backtrace + GDB can now print a backtrace of itself when it encounters either an + internal-error, or an internal-warning. This is on by default for + internal-error and off by default for internal-warning. + + set logging on|off + Deprecated and replaced by "set logging enabled on|off". + + set logging enabled on|off + show logging enabled + These commands set or show whether logging is enabled or disabled. + + exit + You can now exit GDB by using the new command "exit", in addition to + the existing "quit" command. + + set debug threads on|off + show debug threads + Print additional debug messages about thread creation and deletion. + + set debug linux-nat on|off + show debug linux-nat + These new commands replaced the old 'set debug lin-lwp' and 'show + debug lin-lwp' respectively. Turning this setting on prints debug + messages relating to GDB's handling of native Linux inferiors. + + maint flush source-cache + Flush the contents of the source code cache. + + maint set gnu-source-highlight enabled on|off + maint show gnu-source-highlight enabled + Whether GDB should use the GNU Source Highlight library for adding + styling to source code. When off, the library will not be used, even + when available. When GNU Source Highlight isn't used, or can't add + styling to a particular source file, then the Python Pygments + library will be used instead. + + set suppress-cli-notifications (on|off) + show suppress-cli-notifications + This controls whether printing the notifications is suppressed for CLI. + CLI notifications occur when you change the selected context + (i.e., the current inferior, thread and/or the frame), or when + the program being debugged stops (e.g., because of hitting a + breakpoint, completing source-stepping, an interrupt, etc.). + + set style disassembler enabled on|off + show style disassembler enabled + If GDB is compiled with Python support, and the Python Pygments + package is available, then, when this setting is on, disassembler + output will have styling applied. + + set ada source-charset + show ada source-charset + Set the character set encoding that is assumed for Ada symbols. Valid + values for this follow the values that can be passed to the GNAT + compiler via the '-gnati' option. The default is ISO-8859-1. + + * Changed commands: + + print + Printing of floating-point values with base-modifying formats like + /x has been changed to display the underlying bytes of the value in + the desired base. This was GDB's documented behavior, but was never + implemented correctly. + + maint packet + This command can now print a reply, if the reply includes + non-printable characters. Any non-printable characters are printed + as escaped hex, e.g. \x?? where '??' is replaces with the value of + the non-printable character. + + clone-inferior + The clone-inferior command now ensures that the TTY, CMD and ARGS + settings are copied from the original inferior to the new one. + All modifications to the environment variables done using the 'set + environment' or 'unset environment' commands are also copied to the new + inferior. + + set debug lin-lwp on|off + show debug lin-lwp + These commands have been removed from GDB. The new command 'set + debug linux-nat' and 'show debug linux-nat' should be used + instead. + + info win + This command now includes information about the width of the tui + windows in its output. + + * GDB's Ada parser now supports an extension for specifying the exact + byte contents of a floating-point literal. This can be useful for + setting floating-point registers to a precise value without loss of + precision. The syntax is an extension of the based literal syntax. + Use, e.g., "16lf#0123abcd#" -- the number of "l"s controls the width + of the floating-point type, and the "f" is the marker for floating + point. + + * MI changes: + + ** The '-add-inferior' with no option flags now inherits the + connection of the current inferior, this restores the behaviour of + GDB as it was prior to GDB 10. + + ** The '-add-inferior' command now accepts a '--no-connection' + option, which causes the new inferior to start without a + connection. + + * Python API: + + ** New function gdb.add_history(), which takes a gdb.Value object + and adds the value it represents to GDB's history list. An + integer, the index of the new item in the history list, is + returned. + + ** New function gdb.history_count(), which returns the number of + values in GDB's value history. + + ** New gdb.events.gdb_exiting event. This event is called with a + gdb.GdbExitingEvent object which has the read-only attribute + 'exit_code', which contains the value of the GDB exit code. This + event is triggered once GDB decides it is going to exit, but + before GDB starts to clean up its internal state. + + ** New function gdb.architecture_names(), which returns a list + containing all of the possible Architecture.name() values. Each + entry is a string. + + ** New function gdb.Architecture.integer_type(), which returns an + integer type given a size and a signed-ness. + + ** New gdb.TargetConnection object type that represents a connection + (as displayed by the 'info connections' command). A sub-class, + gdb.RemoteTargetConnection, is used to represent 'remote' and + 'extended-remote' connections. + + ** The gdb.Inferior type now has a 'connection' property which is an + instance of gdb.TargetConnection, the connection used by this + inferior. This can be None if the inferior has no connection. + + ** New 'gdb.events.connection_removed' event registry, which emits a + 'gdb.ConnectionEvent' when a connection is removed from GDB. + This event has a 'connection' property, a gdb.TargetConnection + object for the connection being removed. + + ** New gdb.connections() function that returns a list of all + currently active connections. + + ** New gdb.RemoteTargetConnection.send_packet(PACKET) method. This + is equivalent to the existing 'maint packet' CLI command; it + allows a user specified packet to be sent to the remote target. + + ** New function gdb.host_charset(), returns a string, which is the + name of the current host charset. + + ** New gdb.set_parameter(NAME, VALUE). This sets the gdb parameter + NAME to VALUE. + + ** New gdb.with_parameter(NAME, VALUE). This returns a context + manager that temporarily sets the gdb parameter NAME to VALUE, + then resets it when the context is exited. + + ** The gdb.Value.format_string method now takes a 'styling' + argument, which is a boolean. When true, the returned string can + include escape sequences to apply styling. The styling will only + be present if styling is otherwise turned on in GDB (see 'help + set styling'). When false, which is the default if the argument + is not given, then no styling is applied to the returned string. + + ** New read-only attribute gdb.InferiorThread.details, which is + either a string, containing additional, target specific thread + state information, or None, if there is no such additional + information. + + ** New read-only attribute gdb.Type.is_scalar, which is True for + scalar types, and False for all other types. + + ** New read-only attribute gdb.Type.is_signed. This attribute + should only be read when Type.is_scalar is True, and will be True + for signed types, and False for all other types. Attempting to + read this attribute for non-scalar types will raise a ValueError. + + ** It is now possible to add GDB/MI commands implemented in Python. + +- Update libipt to v2.0.5. +- Patches added: + * gdb-6.3-rh-testversion-20041202.patch + * gdb-6.5-BEA-testsuite.patch + * gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch + * gdb-6.7-charsign-test.patch + * gdb-6.8-bz466901-backtrace-full-prelinked.patch + * gdb-fix-for-gdb.base-eof-exit.exp-test-failures.patch + * gdb-improved-eof-handling-when-using-readline-7.patch + * gdb-libexec-add-index.patch + * gdb-tdep-detect-get_pc_thunk-call-in-i386-prologue.patch + * gdb-testsuite-address-test-failures-in-gdb.mi-mi-multi-commands.exp.patch + * gdb-testsuite-detect-change-instead-of-init-in-gdb.mi-mi-var-block.exp.patch + * gdb-testsuite-fix-gdb.opt-clobbered-registers-o2.exp-with-gcc-12.patch + * gdb-testsuite-fix-occasional-failure-in-gdb.mi-mi-multi-commands.exp.patch + * gdb-testsuite-fix-test-failure-when-building-against-readline-v7.patch + * gdb-testsuite-handle-older-python-in-gdb.python-py-send-packet.py.patch + * gdb-testsuite-handle-quotes-in-gdb_py_module_available.patch + * gdb-testsuite-handle-unordered-dict-in-gdb.python-py-mi-cmd.exp.patch + * gdb-testsuite-skip-gdb.fortran-namelist.exp-for-gfortran-4.8.patch + * gdb-testsuite-workaround-unnecessary-.s-file-with-gfortran-4.8.patch +- Patches dropped: + * aarch64-make-gdbserver-register-set-selection-dynamic.patch + * fix-build-with-current-gcc-el_explicit-location-always-non-null.patch + * fix-gdb.base-sigstep.exp-test-for-ppc.patch + * fix-gdb.multi-multi-term-settings.exp-race.patch + * fixup-2-gdb-6.6-buildid-locate.patch + * fixup-gdb-6.6-buildid-locate.patch + * gdb-6.3-inferior-notification-20050721.patch + * gdb-ada-fix-assert-in-ada_is_unconstrained_packed_array_type.patch + * gdb-build-add-cxx_dialect-to-cxx.patch + * gdb-build-make-c-exp.y-work-with-bison-3.8.patch + * gdb-doc-fix-print-inferior-events-default.patch + * gdb-exp-improve-error-reading-variable-message.patch + * gdb-fortran-handle-dw-at-string-length-with-loclistptr.patch + * gdb-r_version-check.patch + * gdb-rhbz1976887-field-location-kind.patch + * gdb-rhbz2012976-paper-over-fortran-lex-problems.patch + * gdb-symtab-add-call_site_eq-and-call_site_hash.patch + * gdb-symtab-c-ify-call_site.patch + * gdb-symtab-fix-htab_find_slot-call-in-read_call_site_scope.patch + * gdb-symtab-fix-segfault-in-search_one_symtab.patch + * gdb-symtab-remove-compunit_call_site_htab.patch + * gdb-symtab-use-unrelocated-addresses-in-call_site.patch + * gdb-tdep-fix-avx512-m32-support-in-gdbserver.patch + * gdb-tdep-rs6000-don-t-skip-system-call-in-skip_prologue.patch + * gdb-test-for-rhbz1976887.patch + * gdb-testsuite-add-gdb.arch-ppc64-break-on-_exit.exp.patch + * gdb-testsuite-add-gdb.opt-break-on-_exit.exp.patch + * gdb-testsuite-add-gdb.testsuite-dump-system-info.exp.patch + * gdb-testsuite-add-missing-wait-in-gdb.base-signals-state-child.exp.patch + * gdb-testsuite-add-nopie-in-two-test-cases.patch + * gdb-testsuite-detect-no-mpx-support.patch + * gdb-testsuite-disable-inferior-output-in-gdb.base-foll-vfork.exp.patch + * gdb-testsuite-don-t-error-when-trying-to-unset-last_spawn_tty_name.patch + * gdb-testsuite-factor-out-dump_info-in-gdb.testsuite-dump-system-info.exp.patch + * gdb-testsuite-fix-assembly-comments-in-gdb.dwarf2-clang-debug-names.exp.tcl.patch + * gdb-testsuite-fix-data-alignment-in-gdb.arch-i386-avx-sse-.exp.patch + * gdb-testsuite-fix-fail-in-gdb.base-annota1.exp.patch + * gdb-testsuite-fix-fail-in-gdb.tui-basic.exp.patch + * gdb-testsuite-fix-fail-in-gdb.tui-corefile-run.exp.patch + * gdb-testsuite-fix-gdb.ada-big_packed_array.exp-xfail-for-m32.patch + * gdb-testsuite-fix-gdb.arch-i386-pkru.exp-on-linux.patch + * gdb-testsuite-fix-gdb.base-annota1.exp-with-pie.patch + * gdb-testsuite-fix-gdb.base-dcache-flush.exp.patch + * gdb-testsuite-fix-gdb.gdb-selftest.exp.patch + * gdb-testsuite-fix-gdb.guile-scm-type.exp-with-gcc-4.8.patch + * gdb-testsuite-fix-gdb.python-py-events.exp.patch + * gdb-testsuite-fix-gdb.server-server-kill.exp-with-m32.patch + * gdb-testsuite-fix-gdb.threads-check-libthread-db.exp-with-glibc-2.34.patch + * gdb-testsuite-fix-gdb.threads-linux-dp.exp.patch + * gdb-testsuite-fix-gdb.threads-thread-specific-bp.exp.patch + * gdb-testsuite-fix-port-detection-in-gdb.debuginfod-fetch_src_and_symbols.exp.patch + * gdb-testsuite-fix-regexp-in-gdb.base-foll-vfork.exp.patch + * gdb-testsuite-fix-stepi-test-cases-with-unix-m32-fpie-pie.patch + * gdb-testsuite-handle-recursive-internal-problem-in-gdb_internal_error_resync.patch + * gdb-testsuite-handle-runto-fail-in-gdb.mi-mi-var-cp.exp.patch + * gdb-testsuite-handle-sigill-in-two-gdb.arch-powerpc-test-cases.patch + * gdb-testsuite-handle-supports_memtag-in-gdb.base-gdb-caching-proc.exp.patch + * gdb-testsuite-make-gdb.base-annota1.exp-more-robust.patch + * gdb-testsuite-refactor-regexp-in-gdb.base-annota1.exp.patch + * gdb-testsuite-support-fpie-fno-pie-pie-no-pie-in-gdb_compile_rust.patch + * gdb-testsuite-update-test-gdb.base-step-over-syscall.exp.patch + * gdb-testsuite-use-compiler-generated-instead-of-gas-generated-stabs.patch + * gdb-tui-fix-breakpoint-display-functionality.patch + * ibm-z-add-another-arch14-instruction.patch + * ibm-z-remove-lpswey-parameter.patch +- Patched updated: + * gdb-6.3-gstack-20050411.patch + * gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch + * gdb-6.6-buildid-locate-rpm-librpm-workaround.patch + * gdb-6.6-buildid-locate-rpm-scl.patch + * gdb-6.6-buildid-locate-rpm.patch + * gdb-6.6-buildid-locate-solib-missing-ids.patch + * gdb-6.6-buildid-locate.patch + * gdb-cli-add-ignore-errors-command.patch + * gdb-container-rh-pkg.patch + * gdb-core-open-vdso-warning.patch + * gdb-fedora-libncursesw.patch + * gdb-gcore-bash.patch + * gdb-linux_perf-bundle.patch + * gdb-testsuite-handle-init-errors-in-gdb.mi-user-selected-context-sync.exp.patch +- Add BuildRequires python-xml. +- Maintenance script qa.sh: + * Add -sle-12 and -factory options. + * Handle *.-fPIE.-pie.sum files. + * Add KFAILs for PRs 26292, 29238, 25059, 29240, 29241, 29244, + 29245, 29160, 29196. + * Move PR27539 KFAILs from kfail_factory to kfail. +- New maintenance script qa-local.sh. +- New file README.qa. + +------------------------------------------------------------------- +Mon May 9 12:05:38 UTC 2022 - Tom de Vries + +- Patches added (trunk backport): + * gdb-testsuite-detect-no-mpx-support.patch + * gdb-testsuite-handle-init-errors-in-gdb.mi-user-selected-context-sync.exp.patch + * gdb-add-gdb-syscalls-makefile.patch +- Patches added (ml backport): + * gdb-update-syscalls-amd64-i386-linux.xml.patch + * gdb-record-handle-statx-system-call.patch +- Patches added (to be upstreamed): + * gdb-tdep-update-syscalls-ppc64-ppc-linux.xml.patch +- Maintenance script qa.sh: + * Add another KFAIL for PR27027. + * Remove PR28461 KFAIL. + +------------------------------------------------------------------- +Wed May 4 13:49:10 UTC 2022 - Tom de Vries + +- patches added (trunk backport): + * gdb-testsuite-make-gdb.base-annota1.exp-more-robust.patch + * gdb-testsuite-fix-gdb.base-annota1.exp-with-pie.patch +- patches added (gdb-patches ml backport): + * gdb-tdep-handle-pipe2-syscall-for-amd64.patch + * gdb-testsuite-handle-pipe2-syscall-in-gdb.base-catch-syscall.exp.patch + * gdb-tdep-support-catch-syscall-pipe2-for-i386.patch +- Maintenance script qa.sh: + * Add Leap 15.4 x86_64 to know good configs. + +------------------------------------------------------------------- +Fri Apr 29 13:27:04 UTC 2022 - Martin LiÅ¡ka + +- Remove dependency on binutils-gold as the package will be removed + in the future. Gold linker is unmaintained by the upstream project. + +------------------------------------------------------------------- +Thu Apr 14 09:24:07 UTC 2022 - Tom de Vries + +- Fix unresolved BuildRequires fpc for Leap 15.4/i586. + +------------------------------------------------------------------- +Fri Feb 25 14:53:56 UTC 2022 - Tom de Vries + +- Patch added (backport from master): + * fix-build-with-current-gcc-el_explicit-location-always-non-null.patch + +------------------------------------------------------------------- +Fri Feb 11 15:15:58 UTC 2022 - Tom de Vries + +- Maintenance script qa.sh: + * Add KFAILs for PR28667. + +------------------------------------------------------------------- +Mon Feb 7 15:15:58 UTC 2022 - Tom de Vries + +- Patches added (jsc#SLE-22287): + * ibm-z-add-another-arch14-instruction.patch + * ibm-z-remove-lpswey-parameter.patch +- Fedora fixup patch added: + * fixup-gdb-6.5-bz243845-stale-testing-zombie-test.patch + +------------------------------------------------------------------- +Thu Feb 3 12:22:35 UTC 2022 - Andreas Schwab + +- gdb-r_version-check.patch: gdb: Don't assume r_ldsomap when r_version > + 1 on Linux + +------------------------------------------------------------------- +Mon Dec 6 17:19:44 UTC 2021 - Tom de Vries + +- Patches added (swo#28323): + gdb-ada-fix-assert-in-ada_is_unconstrained_packed_array_type.patch + +------------------------------------------------------------------- +Tue Nov 30 10:45:32 UTC 2021 - Tom de Vries + +- Patches added (swo#27028, swo#27257): + * gdb-testsuite-fix-gdb.arch-i386-pkru.exp-on-linux.patch + * gdb-tdep-fix-avx512-m32-support-in-gdbserver.patch + +------------------------------------------------------------------- +Fri Nov 26 14:04:38 UTC 2021 - Tom de Vries + +- Patch added (swo#28539, bsc#1192285): + * gdb-symtab-fix-segfault-in-search_one_symtab.patch + +------------------------------------------------------------------- +Mon Nov 22 19:40:55 UTC 2021 - Tom de Vries + +- Patches removed: + * gdb-testsuite-debug-gdb.arch-i386-sse.exp.patch + +------------------------------------------------------------------- +Mon Nov 22 17:47:57 UTC 2021 - Tom de Vries + +- Maintenance script qa.sh: + - Drop openSUSE Leap 15.1. + - Add KFAILs for PR28617. + +------------------------------------------------------------------- +Mon Nov 22 09:25:32 UTC 2021 - Tom de Vries + +- Fix SLE-12 x86_64 unresolvable by removing BuildRequire gcc-java. + +------------------------------------------------------------------- +Mon Nov 22 09:00:45 UTC 2021 - Tom de Vries + +- Fix openSUSE_Factory_ARM armv7l unresolvable by not doing + BuildRequire babeltrace-devel. + +------------------------------------------------------------------- + +Mon Nov 22 08:24:21 UTC 2021 - Tom de Vries + +- Fix SLE-12 x86_64 unresolvable by not doing BuildRequire + babeltrace-devel. + +------------------------------------------------------------------- +Fri Nov 19 15:31:46 UTC 2021 - Tom de Vries + +- Patches added (backport from master): + * gdb-testsuite-add-missing-wait-in-gdb.base-signals-state-child.exp.patch +- Add BuildRequire libsource-highlight. + +------------------------------------------------------------------- +Thu Nov 18 14:01:30 UTC 2021 - Tom de Vries + +- Maintenance script qa.sh: + - Add KFAIL. +- Patches updated (increase sleep time): + * gdb-testsuite-fix-race-in-gdb.threads-detach-step-over.exp.patch +- Patches added (debug hard to reproduce failure): + * gdb-testsuite-debug-gdb.arch-i386-sse.exp.patch + +------------------------------------------------------------------- +Thu Nov 18 11:45:00 UTC 2021 - Tom de Vries + +- Maintenance script qa.sh: + - Add internal-error KFAILs. + - Rewrite gdb.suse check to distinguish between: + "zypper hint printed (librpm)" and + "zypper hint printed (no librpm)". + +------------------------------------------------------------------- +Tue Nov 16 15:50:08 UTC 2021 - Tom de Vries + +- Patch updated (zypper hint doesn't use librpm on SLE-11): + * gdb-testsuite-add-gdb.suse-zypper-hint.exp.patch + +------------------------------------------------------------------- +Thu Nov 11 10:36:08 UTC 2021 - Tom de Vries + +- Patches added (backports from trunk): + * gdb-testsuite-add-gdb.opt-break-on-_exit.exp.patch + * gdb-tdep-rs6000-don-t-skip-system-call-in-skip_prologue.patch + * gdb-testsuite-fix-stepi-test-cases-with-unix-m32-fpie-pie.patch + * gdb-testsuite-fix-assembly-comments-in-gdb.dwarf2-clang-debug-names.exp.tcl.patch + * gdb-doc-fix-print-inferior-events-default.patch + * gdb-testsuite-fix-gdb.guile-scm-type.exp-with-gcc-4.8.patch + * gdb-testsuite-add-gdb.arch-ppc64-break-on-_exit.exp.patch + * gdb-testsuite-don-t-error-when-trying-to-unset-last_spawn_tty_name.patch + * gdb-exp-improve-error-reading-variable-message.patch + * fix-gdb.base-sigstep.exp-test-for-ppc.patch + * gdb-testsuite-fix-regexp-in-gdb.base-foll-vfork.exp.patch +- Patches added (backports from ml): + * gdb-testsuite-disable-inferior-output-in-gdb.base-foll-vfork.exp.patch +- Maintenance script qa.sh: + - Add -m32/-pie to known clean configs. + - Add kfail for PR28467. + +------------------------------------------------------------------- +Tue Nov 9 15:54:58 UTC 2021 - Tom de Vries + +- Fix empty patch: + * gdb-testsuite-fix-fail-in-gdb.tui-basic.exp.patch + +------------------------------------------------------------------- +Tue Nov 9 08:05:16 UTC 2021 - Tom de Vries + +- Limit SLE extra targets to SLE targets. +- Add avr-elf and pru-elf to openSUSE extra targets. + +------------------------------------------------------------------- +Mon Nov 8 14:53:20 UTC 2021 - Tom de Vries + +- Maintenance script qa.sh: + * Add note. + * Add KFAIL, improve KFAIL patterns. +- Patch updated: + * gdb-testsuite-fix-data-alignment-in-gdb.arch-i386-avx-sse-.exp.patch + * gdb-testsuite-fix-race-in-gdb.threads-detach-step-over.exp.patch + +------------------------------------------------------------------- +Sat Nov 6 09:25:28 UTC 2021 - Tom de Vries + +- Replace patch (patch from mailing list, fix SLE-11 apply failure): + * gdb-tdep-aarch64-make-gdbserver-register-set-selection-dynamic.patch + with (now backported from release branch): + * aarch64-make-gdbserver-register-set-selection-dynamic.patch +- Patches added: + * gdb-testsuite-fix-data-alignment-in-gdb.arch-i386-avx-sse-.exp.patch + * gdb-testsuite-fix-fail-in-gdb.tui-basic.exp.patch +- Patches dropped: + * gdb-testsuite-add-checks-to-gdb.arch-i386-sse.exp.patch +- Replace patch: + * gdb-testsuite-Fix-gdb.threads-thread-specific-bp.exp.patch + with (updated version, and patchname now generated by + import-patches.sh): + * gdb-testsuite-fix-gdb.threads-thread-specific-bp.exp.patch +- Maintenance script import-patches.sh: + * Improve argument checking. + * Add usage. + * Use filterdiff to filter out ChangeLog entries. +- Maintenance script qa.sh: + * Fix usage. + * Document todo. + +------------------------------------------------------------------- +Fri Nov 5 23:04:35 UTC 2021 - Tom de Vries + +- Re-enable big endian powerpc, but keep testing disabled. +- Add KFAIL for PR28553. + +------------------------------------------------------------------- +Fri Nov 5 19:15:43 UTC 2021 - Tom de Vries + +- Patch added (move zypper hint test to testsuite): + * gdb-testsuite-add-gdb.suse-zypper-hint.exp.patch + +------------------------------------------------------------------- +Fri Nov 5 15:21:03 UTC 2021 - Tom de Vries + +- Maintenance script qa.sh: + * Add PR28551 KFAIL. + * Add missing quotes for some KFAILs. + * Remove PR28355 KFAIL. + +------------------------------------------------------------------- +Tue Nov 2 13:03:51 UTC 2021 - Tom de Vries + +- Patches added (add back ignore-errors command, dropped in + 11.1 update): + * gdb-cli-add-ignore-errors-command.patch + +------------------------------------------------------------------- +Mon Nov 1 10:04:24 UTC 2021 - Tom de Vries + +- Patches added [swo#28355]: + * gdb-tdep-aarch64-make-gdbserver-register-set-selection-dynamic.patch + +------------------------------------------------------------------- +Thu Oct 28 13:40:28 UTC 2021 - Tom de Vries + +- Mention removed fedora patches: + * gdb-6.3-test-self-20050110.patch + * gdb-bz1219747-attach-kills.patch + * gdb-6.6-buildid-locate-core-as-arg.patch + * gdb-attach-fail-reasons-5of5.patch + * gdb-archer-pie-addons.patch + * gdb-jit-reader-multilib.patch + * gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch + * gdb-archer.patch + * gdb-config.patch + * gdb-6.8-quit-never-aborts.patch +- Mention removed patches: + * gdb-breakpoint-fix-assert-in-jit_event_handler.patch + * gdb-fix-section-matching-in-find_pc_sect_compunit.patch + * gdb-fortran-fix-print-dynamic-array.patch + * gdb-build-hardcode-with-included-regex.patch + * gdb-handle-no-upper-bound-in-value-subscript.patch + * gdb-fix-internal-error-in-process_event_stop_test.patch + * gdb-don-t-return-non-existing-path-in-debuginfod-source-query.patch + * gdb-archer-pie-addons-keep-disabled.patch + * gdb-fix-filename-in-not-in-executable-format-error.patch + * gdb-fix-use-of-invalid-pointer-in-remote-async-inferior-event-handler.patch + * gdb-breakpoints-handle-glibc-with-debuginfo-in-create_exception_master_breakpoint.patch +- Maintenance scripts: + * Add KFAILs in qa.sh. + * Add missing '-a' in gdb.log greps in qa.sh. + * Fix error handling in qa.sh. +- Patches added: + * gdb-testsuite-handle-sigill-in-two-gdb.arch-powerpc-test-cases.patch + * gdb-testsuite-work-around-skip_prologue-problems-in-gdb.threads-process-dies-while-detaching.exp.patch + +------------------------------------------------------------------- +Fri Oct 22 07:03:55 UTC 2021 - Tom de Vries + +- Disable big endian powerpc. +- Maintenance scripts: + * Fix patch filtering in clean.sh. + * Add KFAIL in qa.sh. +- Patches added: + * gdb-testsuite-add-checks-to-gdb.arch-i386-sse.exp.patch + * gdb-testsuite-add-gdb.testsuite-dump-system-info.exp.patch + * gdb-testsuite-add-kfail-in-gdb.threads-fork-plus-threads.exp.patch + * gdb-testsuite-factor-out-dump_info-in-gdb.testsuite-dump-system-info.exp.patch + * gdb-testsuite-fix-fail-in-gdb.threads-fork-and-threads.exp.patch + * gdb-testsuite-fix-gdb.threads-linux-dp.exp.patch + * gdb-testsuite-fix-port-detection-in-gdb.debuginfod-fetch_src_and_symbols.exp.patch + * gdb-testsuite-handle-recursive-internal-problem-in-gdb_internal_error_resync.patch + * gdb-testsuite-handle-runto-fail-in-gdb.mi-mi-var-cp.exp.patch + * gdb-tui-fix-breakpoint-display-functionality.patch + * gdb-testsuite-Fix-gdb.threads-thread-specific-bp.exp.patch +- Patches dropped: + * fix-gdb.threads-linux-dp.exp.patch + +------------------------------------------------------------------- +Wed Oct 20 15:48:40 UTC 2021 - Tom de Vries + +- Added maintenance script: + * qa.sh +- Drop 32bit packages for s390x. + +------------------------------------------------------------------- +Tue Oct 19 08:00:06 UTC 2021 - Tom de Vries + +- Fix SLE-15 s390x: unresolvable, nothing provides + glibc-devel-static-32bit. +- Disable test-case gdb.base/break-interp.exp for SLE-11. + It causes a + "glibc detected *** expect: double free or corruption (out)" in + expect and a subsequent runtest abort. This might be the cause + of the package build failure due to + "Job seems to be stuck here, killed. (after 8hrs of inactivity)" +- Patches added: + * gdb-testsuite-fix-gdb.base-step-over-syscall.exp-with-m32-amd-case.patch + * gdb-testsuite-fix-gdb.ada-big_packed_array.exp-xfail-for-m32.patch + * gdb-testsuite-fix-race-in-gdb.threads-detach-step-over.exp.patch + * fix-gdb.multi-multi-term-settings.exp-race.patch + * gdb-testsuite-update-test-gdb.base-step-over-syscall.exp.patch + +------------------------------------------------------------------- +Mon Oct 18 17:46:06 UTC 2021 - Tom de Vries - 11.1 + +- Rebase to 11.1 release (as in fedora 35 @ 9cd9368): + * Implements SLE-21561. + * GDB now supports general memory tagging functionality if the + underlying architecture supports the proper primitives and hooks. + Currently this is enabled only for AArch64 MTE. + * GDB will now look for the .gdbinit file in a config directory + before looking for ~/.gdbinit. The file is searched for in + the following locations: $XDG_CONFIG_HOME/gdb/gdbinit, + $HOME/.config/gdb/gdbinit, $HOME/.gdbinit. + * GDB will now load and process commands from + ~/.config/gdb/gdbearlyinit or ~/.gdbearlyinit if these files + are present. These files are processed earlier than any of + the other initialization files and can affect parts of GDB's + startup that previously had already been completed before the + initialization files were read, for example styling of the + initial GDB greeting. + * GDB now has two new options "--early-init-command" and + "--early-init-eval-command" with corresponding short options + "-eix" and "-eiex" that allow options (that would normally + appear in a gdbearlyinit file) to be passed on the command + line. + * set startup-quietly on|off + show startup-quietly + When 'on', this causes GDB to act as if "-silent" were passed + on the command line. This command needs to be added to an + early initialization file (e.g. ~/.config/gdb/gdbearlyinit) + in order to affect GDB. + * For RISC-V targets, the target feature + "org.gnu.gdb.riscv.vector" is now understood by GDB, and can + be used to describe the vector registers of a target. + * TUI windows now support mouse actions. The mouse wheel + scrolls the appropriate window. + * Key combinations that do not have a specific action on the + focused window are passed to GDB. For example, you now can + use Ctrl-Left/Ctrl-Right to move between words in the command + window regardless of which window is in focus. Previously + you would need to focus on the command window for such key + combinations to work. + * set python ignore-environment on|off + show python ignore-environment + When 'on', this causes GDB's builtin Python to ignore any + environment variables that would otherwise affect how Python + behaves. This command needs to be added to an early + initialization file (e.g. ~/.config/gdb/gdbearlyinit) in + order to affect GDB. + * set python dont-write-bytecode auto|on|off + show python dont-write-bytecode + When 'on', this causes GDB's builtin Python to not write any + byte-code (.pyc files) to disk. This command needs to be + added to an early initialization file + (e.g. ~/.config/gdb/gdbearlyinit) in order to affect GDB. + When 'off' byte-code will always be written. + When set to 'auto' (the default) Python will check the + PYTHONDONTWRITEBYTECODE environment variable. + * break [PROBE_MODIFIER] [LOCATION] [thread THREADNUM] + [-force-condition] [if CONDITION] + This command would previously refuse setting a breakpoint if + the CONDITION expression is invalid at a location. It now + accepts and defines the breakpoint if there is at least one + location at which the CONDITION is valid. The locations + for which the CONDITION is invalid, are automatically + disabled. If CONDITION is invalid at all of the locations, + setting the breakpoint is still rejected. However, the + '-force-condition' flag can be used in this case for forcing + GDB to define the breakpoint, making all the current + locations automatically disabled. This may be useful if the + user knows the condition will become meaningful at a future + location, e.g. due to a shared library load. +- Update libipt to v2.0.4. Dropped obsoleted patch: + * v1.5-libipt-static.patch +- Obsoleted fedora patches dropped: + * gdb-moribund-utrace-workaround.patch + * gdb-save-restore-file-offset-while-reading-notes-in-core-file.patch + * gdb-vla-intel-fix-print-char-array.patch + * gdb-vla-intel-fortran-strides.patch + * gdb-vla-intel-fortran-vla-strings.patch + * gdb-vla-intel-stringbt-fix.patch + * gdb-vla-intel-tests.patch +- Obsoleted fedora fixup patches dropped: + * fixup-2-gdb-archer-vla-tests.patch + * fixup-2-gdb-rhbz1156192-recursive-dlopen-test.patch + * fixup-3-gdb-archer-vla-tests.patch + * fixup-gdb-6.3-test-pie-20050107.patch + * fixup-gdb-6.3-threaded-watchpoints2-20050225.patch + * fixup-gdb-6.5-sharedlibrary-path.patch + * fixup-gdb-6.8-bz442765-threaded-exec-test.patch + * fixup-gdb-archer-vla-tests.patch + * fixup-gdb-base-gnu-ifunc-strstr-workaround-exp.patch + * fixup-gdb-btrobust.patch + * fixup-gdb-bz634108-solib_address.patch + * fixup-gdb-dts-rhel6-python-compat.patch + * fixup-gdb-gnat-dwarf-crash-3of3.patch + * fixup-gdb-rhbz1156192-recursive-dlopen-test.patch + * fixup-gdb-test-ivy-bridge.patch + * fixup-gdb-vla-intel-fortran-vla-strings.patch + * fixup-gdb-vla-intel-tests.patch +- Obsoleted patches dropped: + * amd64-linux-siginfo-include-order.patch + * gdb-powerpc-remove-512-bytes-region-limit-if-2nd-dawr-is-avaliable.patch + * gdb-support-dw-lle-start-end.patch + * gdb-symtab-fix-infinite-recursion-in-dwarf2_cu-get_builder-again.patch + * gdb-symtab-fix-language-of-frame-without-debug-info.patch + * gdb-symtab-read-cu-base-address-for-enqueued-cu.patch + * gdb-symtab-use-early-continue-in-find_pc_sect_compunit.patch + * gdb-testsuite-catch-condition-evaluation-errors-in-gdb-assert.patch + * gdb-testsuite-detect-gdb-prompt-after-monitor-exit.patch + * gdb-testsuite-disable-selftests-for-factory.patch + * gdb-testsuite-fix-control-flow-in-gdb-reverse-insn-reverse-exp.patch + * gdb-testsuite-fix-failure-in-gdb-base-step-over-no-symbols-exp.patch + * gdb-testsuite-fix-gdb-dlang-watch-loc-exp-on-ppc64.patch + * gdb-testsuite-fix-gdb-reverse-insn-reverse-x86-c-for-m32.patch + * gdb-testsuite-fix-gdb.arch-amd64-stap-three-arg-disp.s.patch + * gdb-testsuite-fix-unset-of-debuginfod_urls-in-default_gdb_init.patch + * gdb-testsuite-fix-xfail-handling-in-gdb.threads-gcore-thread.exp.patch + * gdb-testsuite-gdb-base-morestack-exp-no-clang.patch + * gdb-testsuite-gdb-tui-new-layout-exp-partly-require-tcl86.patch + * gdb-testsuite-handle-sigill-in-gdb-reverse-insn-reverse-exp.patch + * gdb-testsuite-ignore-debuginfod_urls.patch + * gdb-testsuite-prevent-pagination-in-gdb-internalflags.patch + * gdb-threads-fix-lin_thread_get_thread_signals-for-glibc-2.28.patch + * gdb-try-to-load-libthread_db-only-after-reading-all-shared-libraries-when-attaching.patch + * gdb-tui-fix-len_without_escapes-in-tui-disasm.c.patch +- Fedora patches updated: + * gdb-6.3-bz140532-ppc-unwinding-test.patch + * gdb-6.3-bz202689-exec-from-pthread-test.patch + * gdb-6.3-gstack-20050411.patch + * gdb-6.3-inheritancetest-20050726.patch + * gdb-6.3-mapping-zero-inode-test.patch + * gdb-6.3-test-dtorfix-20050121.patch + * gdb-6.3-test-movedir-20050125.patch + * gdb-6.3-threaded-watchpoints2-20050225.patch + * gdb-6.5-bz109921-DW_AT_decl_file-test.patch + * gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch + * gdb-6.5-bz218379-ppc-solib-trampoline-test.patch + * gdb-6.5-bz243845-stale-testing-zombie-test.patch + * gdb-6.5-ia64-libunwind-leak-test.patch + * gdb-6.5-last-address-space-byte-test.patch + * gdb-6.5-readline-long-line-crash-test.patch + * gdb-6.5-section-num-fixup-test.patch + * gdb-6.5-sharedlibrary-path.patch + * gdb-6.6-buildid-locate-rpm-scl.patch + * gdb-6.6-buildid-locate-rpm.patch + * gdb-6.6-buildid-locate-solib-missing-ids.patch + * gdb-6.6-buildid-locate.patch + * gdb-6.6-bz229517-gcore-without-terminal.patch + * gdb-6.6-bz230000-power6-disassembly-test.patch + * gdb-6.6-bz237572-ppc-atomic-sequence-test.patch + * gdb-6.8-bz442765-threaded-exec-test.patch + * gdb-bz601887-dwarf4-rh-test.patch + * gdb-bz634108-solib_address.patch + * gdb-ccache-workaround.patch + * gdb-container-rh-pkg.patch + * gdb-fedora-libncursesw.patch + * gdb-fortran-frame-string.patch + * gdb-glibc-strstr-workaround.patch + * gdb-lineno-makeup-test.patch + * gdb-linux_perf-bundle.patch + * gdb-physname-pr11734-test.patch + * gdb-ppc-power7-test.patch + * gdb-rhbz1156192-recursive-dlopen-test.patch + * gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch + * gdb-rhbz1350436-type-printers-error.patch + * gdb-rhbz1398387-tab-crash-test.patch + * gdb-test-dw2-aranges.patch + * gdb-test-ivy-bridge.patch + * gdb-test-pid0-core.patch +- Patches updated: + * gdb-fix-selftest-fails-with-gdb-build-with-O2-flto.patch + * gdb-gcore-bash.patch +- Fedora patches added: + * gdb-6.3-attach-see-vdso-test.patch + * gdb-6.3-inferior-notification-20050721.patch + * gdb-6.5-gcore-buffer-limit-test.patch + * gdb-6.5-missed-trap-on-step-test.patch + * gdb-rhbz1976887-field-location-kind.patch + * gdb-rhbz2012976-paper-over-fortran-lex-problems.patch + * gdb-test-for-rhbz1976887.patch +- Fedora fixup patches added: + * fixup-2-gdb-6.6-buildid-locate.patch + * fixup-gdb-glibc-strstr-workaround.patch + * fixup-gdb-linux_perf-bundle.patch + * fixup-gdb-rhbz1325795-framefilters-test.patch + * fixup-gdb-rhbz1553104-s390x-arch12-test.patch +- Patches added: + * fix-gdb.mi-new-ui-mi-sync.exp.patch + * fix-gdb.threads-linux-dp.exp.patch + * gdb-add-index.sh-fix-bashism.patch + * gdb-build-add-cxx_dialect-to-cxx.patch + * gdb-build-make-c-exp.y-work-with-bison-3.8.patch + * gdb-python-finishbreakpoint-update.patch + * gdb-symtab-add-call_site_eq-and-call_site_hash.patch + * gdb-symtab-c-ify-call_site.patch + * gdb-symtab-fix-htab_find_slot-call-in-read_call_site_scope.patch + * gdb-symtab-remove-compunit_call_site_htab.patch + * gdb-symtab-use-unrelocated-addresses-in-call_site.patch + * gdb-testsuite-add-nopie-in-two-test-cases.patch + * gdb-testsuite-fix-fail-in-gdb.base-annota1.exp.patch + * gdb-testsuite-fix-fail-in-gdb.tui-corefile-run.exp.patch + * gdb-testsuite-fix-gdb.base-dcache-flush.exp.patch + * gdb-testsuite-fix-gdb.gdb-selftest.exp.patch + * gdb-testsuite-fix-gdb.python-py-events.exp.patch + * gdb-testsuite-fix-gdb.server-server-kill.exp-with-m32.patch + * gdb-testsuite-fix-gdb.threads-check-libthread-db.exp-with-glibc-2.34.patch + * gdb-testsuite-handle-supports_memtag-in-gdb.base-gdb-caching-proc.exp.patch + * gdb-testsuite-prevent-compilation-fails-with-unix-fpie-pie.patch + * gdb-testsuite-refactor-regexp-in-gdb.base-annota1.exp.patch + * gdb-testsuite-support-fpie-fno-pie-pie-no-pie-in-gdb_compile_rust.patch + * gdb-testsuite-use-compiler-generated-instead-of-gas-generated-stabs.patch +- Fedora patches replaced: + * fixup-gdb-6.6-buildid-locate.patch +- Added maintenance scripts: + * import-patches.sh + * clean.sh + +------------------------------------------------------------------- +Tue Jul 20 13:46:59 UTC 2021 - Andreas Schwab + +- amd64-linux-siginfo-include-order.patch: Adjust include order to avoid + gnulib error + +------------------------------------------------------------------- +Wed Jun 23 11:52:54 UTC 2021 - Andreas Schwab + +- gdb-support-dw-lle-start-end.patch: Support DW_LLE_start_end + (bsc#1187044) + +------------------------------------------------------------------- +Thu Jun 17 11:19:14 UTC 2021 - Tom de Vries + +- Fix Leap 15.3 s390x gdb:testsuite build, by not requiring 32-bit + packages for openSUSE s390x. + +------------------------------------------------------------------- +Thu Jun 17 10:18:44 UTC 2021 - Tom de Vries + +- Fix Leap 15.3 s390x gdb:testsuite build, by not requiring + glibc-devel-static-32bit. + +------------------------------------------------------------------- +Thu Jun 17 09:36:06 UTC 2021 - Tom de Vries + +- Fix Leap 15.3 i586 gdb:testsuite build, by not requiring fpc. + +------------------------------------------------------------------- +Wed Jun 16 10:47:16 UTC 2021 - Tom de Vries + +- Backport updated fix from upstream [bsc#1185638, swo#26327]: + * gdb-symtab-fix-infinite-recursion-in-dwarf2_cu-get_builder-again.patch + +------------------------------------------------------------------- +Fri May 21 13:31:07 UTC 2021 - Tom de Vries + +- Backport fix for assert [bsc#1186040, swo#27889]: + * gdb-breakpoint-fix-assert-in-jit_event_handler.patch + +------------------------------------------------------------------- +Wed May 12 14:12:41 UTC 2021 - Tom de Vries + +- Remove fix due to regressions [bsc#1185638, swo#26327]: + * gdb-symtab-fix-infinite-recursion-in-dwarf2_cu-get_builder.patch + +------------------------------------------------------------------- +Fri May 7 10:43:38 UTC 2021 - Tom de Vries +- Replace tentative fix with upstreamed fix [swo#27681]: + Remove: + * gdb-build-workaround-pcre2_posix-linking-problem.patch + Add: + * gdb-build-hardcode-with-included-regex.patch +- Backport fix from upstream [bsc#1185638, swo#26327]: + * gdb-symtab-fix-infinite-recursion-in-dwarf2_cu-get_builder.patch +- Backport fix from upstream [rh#1931344]: + * gdb-save-restore-file-offset-while-reading-notes-in-core-file.patch + +------------------------------------------------------------------- +Sun May 2 18:24:36 UTC 2021 - Tom de Vries + +- Backport fix for tui assert [swo#27680]: + * gdb-tui-fix-len_without_escapes-in-tui-disasm.c.patch + +------------------------------------------------------------------- +Wed Apr 7 03:51:41 UTC 2021 - Tom de Vries + +- Backport fixes that ignore DEBUGINFOD_URLS during testing: + * gdb-testsuite-ignore-debuginfod_urls.patch + * gdb-testsuite-fix-unset-of-debuginfod_urls-in-default_gdb_init.patch + +------------------------------------------------------------------- +Tue Apr 6 15:15:10 UTC 2021 - Tom de Vries + +- Fix various testsuite fails on Factory using backports: + * gdb-testsuite-fix-gdb.arch-amd64-stap-three-arg-disp.s.patch + * gdb-testsuite-fix-xfail-handling-in-gdb.threads-gcore-thread.exp.patch + * gdb-threads-fix-lin_thread_get_thread_signals-for-glibc-2.28.patch +- Fix libthread_db problem on Factory [swo#27526, boo#1184214]: + * gdb-try-to-load-libthread_db-only-after-reading-all-shared-libraries-when-attaching.patch +- Workaround libncurses pulling in libpcre2_posix: + * gdb-build-workaround-pcre2_posix-linking-problem.patch + +------------------------------------------------------------------- +Thu Feb 11 16:13:14 UTC 2021 - Tom de Vries + +- Replace tentative fix with upstreamed fix [swo#26881]: + Remove: + * gdb-fix-assert-in-process-event-stop-test.patch + Add: + * gdb-fix-internal-error-in-process_event_stop_test.patch + * gdb-breakpoints-handle-glibc-with-debuginfo-in-create_exception_master_breakpoint.patch + +------------------------------------------------------------------- +Thu Feb 11 15:07:12 UTC 2021 - Tom de Vries + +- Fix license [bsc#1180786]. + +------------------------------------------------------------------- +Wed Dec 9 07:56:36 UTC 2020 - Tom de Vries + +- Backport from master [jsc#13656]: + * gdb-powerpc-remove-512-bytes-region-limit-if-2nd-dawr-is-avaliable.patch +- Require 8GB diskspace for x86_64. + +------------------------------------------------------------------- +Mon Nov 30 15:43:58 UTC 2020 - Tom de Vries + +- Patches to be upstreamed: + * gdb-fix-use-of-invalid-pointer-in-remote-async-inferior-event-handler.patch + +------------------------------------------------------------------- +Mon Nov 30 14:46:49 UTC 2020 - Tom de Vries + +- Mention fedora patch fixups added: + * fixup-3-gdb-archer-vla-tests.patch +- Mention patch to be upstreamed added: + * gdb-fix-selftest-fails-with-gdb-build-with-O2-flto.patch + +------------------------------------------------------------------- +Fri Nov 27 13:54:42 UTC 2020 - Tom de Vries + +- Fedora patch fixups update: + * fixup-2-gdb-rhbz1156192-recursive-dlopen-test.patch +- Fedora patch fixups added: + * fixup-gdb-test-ivy-bridge.patch +- Add xz to BuildRequires for testsuite flavour. +- Add note on mpfr-devel for SLE-11. + +------------------------------------------------------------------- +Thu Nov 26 08:05:44 UTC 2020 - Tom de Vries + +- Backport from master: + * gdb-testsuite-fix-failure-in-gdb-base-step-over-no-symbols-exp.patch +- Patch to be upstreamed: + * gdb-testsuite-fix-control-flow-in-gdb-reverse-insn-reverse-exp.patch + +------------------------------------------------------------------- +Thu Nov 26 00:35:52 UTC 2020 - Tom de Vries + +- Patch updated: + * gdb-testsuite-gdb-tui-new-layout-exp-partly-require-tcl86.patch + +------------------------------------------------------------------- +Wed Nov 25 23:45:19 UTC 2020 - Tom de Vries + +- Patch updated: + * gdb-testsuite-gdb-tui-new-layout-exp-partly-require-tcl86.patch + +------------------------------------------------------------------- +Tue Nov 24 13:10:46 UTC 2020 - Tom de Vries + +- Patch to be upstreamed: + * gdb-testsuite-gdb-base-morestack-exp-no-clang.patch + * gdb-testsuite-handle-sigill-in-gdb-reverse-insn-reverse-exp.patch + * gdb-testsuite-fix-gdb-reverse-insn-reverse-x86-c-for-m32.patch + * gdb-testsuite-gdb-tui-new-layout-exp-partly-require-tcl86.patch + * gdb-tui-enable-work-around-libncurses-segfault.patch +- Backport from master dropped: + * gdb-testsuite-fix-unbalanced-braces-in-gdb-tui-new-layout-exp.patch + +------------------------------------------------------------------- +Wed Nov 18 09:59:52 UTC 2020 - Tom de Vries - 10.1 + +- Fedora patch fixups updated: + * fixup-2-gdb-archer-vla-tests.patch +- Fedora patch fixups added: + * fixup-2-gdb-rhbz1156192-recursive-dlopen-test.patch +- Testsuite patch: + * gdb-testsuite-disable-selftests-for-factory.patch +- Backport from master: + * gdb-symtab-read-cu-base-address-for-enqueued-cu.patch + * gdb-symtab-use-early-continue-in-find_pc_sect_compunit.patch + * gdb-fix-section-matching-in-find_pc_sect_compunit.patch + * gdb-symtab-fix-language-of-frame-without-debug-info.patch +- Patch to be upstreamed: + * gdb-symtab-set-default-dwarf-max-cache-age-1000.patch + +------------------------------------------------------------------- +Thu Nov 12 22:30:53 UTC 2020 - Tom de Vries + +- BuildRequire curl for debuginfod test-case. +- Patch to be upstreamed: + * gdb-don-t-return-non-existing-path-in-debuginfod-source-query.patch + * gdb-fix-assert-in-process-event-stop-test.patch + * gdb-fix-filename-in-not-in-executable-format-error.patch + * gdb-handle-no-upper-bound-in-value-subscript.patch + * gdb-fortran-handle-dw-at-string-length-with-loclistptr.patch +- Testsuite patch: + * gdb-testsuite-fix-gdb-server-ext-run-exp-for-obs.patch +- Fedora patch fixups added: + * fixup-gdb-rhbz1156192-recursive-dlopen-test.patch +- Fedora patch fixups updated: + * fixup-gdb-btrobust.patch + * fixup-2-gdb-archer-vla-tests.patch + +------------------------------------------------------------------- +Thu Nov 12 17:04:42 UTC 2020 - Tom de Vries + +- Add missing patch command for: + * gdb-fortran-fix-print-dynamic-array.patch + +------------------------------------------------------------------- +Thu Nov 12 16:31:58 UTC 2020 - Tom de Vries + +- Fix patch application on SLE-11: + * gdb-testsuite-detect-gdb-prompt-after-monitor-exit.patch + +------------------------------------------------------------------- +Thu Nov 12 07:44:58 UTC 2020 - Tom de Vries + +- Disable xz-devel and binutils-gold for SLE-10. +- More enabling of gdbserver for riscv64. +- Backport from master: + * gdb-testsuite-fix-unbalanced-braces-in-gdb-tui-new-layout-exp.patch + * gdb-testsuite-catch-condition-evaluation-errors-in-gdb-assert.patch + * gdb-testsuite-detect-gdb-prompt-after-monitor-exit.patch + * gdb-testsuite-fix-gdb-dlang-watch-loc-exp-on-ppc64.patch +- Patch to be upstreamed: + * gdb-fortran-fix-print-dynamic-array.patch + +------------------------------------------------------------------- +Wed Nov 11 22:13:49 UTC 2020 - Tom de Vries + +- Enable gdbserver for riscv64. +- Restrict BuildRequires libdebuginfod to Factory and supporting + archs. + +------------------------------------------------------------------- +Tue Nov 10 15:12:24 UTC 2020 - Tom de Vries + +- Rebase to 10.1 release (as in fedora 33 @ 6c8ccd6). + * Debuginfod support. + * Multi-target debugging support. + * Multithreaded symbol loading enabled by default. + * New command set exec-file-mismatch. + * New command tui new-layout. + * Alias command can now specify default args for an alias. +- Update libipt to v2.0.2. +- Fedora-specific patches dropped: + * gdb-6.8-bz466901-backtrace-full-prelinked.patch +- Broken/obsolete fedora patches dropped: + * gdb-bz533176-fortran-omp-step.patch + * gdb-6.5-BEA-testsuite.patch + * gdb-6.7-charsign-test.patch +- Obsoleted fedora patches dropped: + * gdb-6.3-attach-see-vdso-test.patch + * gdb-6.3-inferior-notification-20050721.patch + * gdb-6.5-gcore-buffer-limit-test.patch + * gdb-6.5-missed-trap-on-step-test.patch + * gdb-rhbz1818011-bfd-gcc10-error.patch +- Fedora patches updated: + * gdb-6.3-gstack-20050411.patch + * gdb-6.3-test-self-20050110.patch + * gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch + * gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch + * gdb-6.6-buildid-locate-core-as-arg.patch + * gdb-6.6-buildid-locate-rpm-librpm-workaround.patch + * gdb-6.6-buildid-locate-rpm-scl.patch + * gdb-6.6-buildid-locate-rpm.patch + * gdb-6.6-buildid-locate-solib-missing-ids.patch + * gdb-6.6-buildid-locate.patch + * gdb-6.7-testsuite-stable-results.patch + * gdb-6.8-quit-never-aborts.patch + * gdb-archer-pie-addons-keep-disabled.patch + * gdb-archer-pie-addons.patch + * gdb-archer-vla-tests.patch + * gdb-attach-fail-reasons-5of5.patch + * gdb-bz1219747-attach-kills.patch + * gdb-bz533176-fortran-omp-step.patch + * gdb-container-rh-pkg.patch + * gdb-fedora-libncursesw.patch + * gdb-gnat-dwarf-crash-3of3.patch + * gdb-jit-reader-multilib.patch + * gdb-linux_perf-bundle.patch + * gdb-moribund-utrace-workaround.patch + * gdb-runtest-pie-override.patch + * gdb-vla-intel-fix-print-char-array.patch + * gdb-vla-intel-fortran-strides.patch + * gdb-vla-intel-fortran-vla-strings.patch + * gdb-vla-intel-stringbt-fix.patch + * gdb-vla-intel-tests.patch +- Fedora patches added: + * gdb-config.patch +- Obsoleted patched dropped: + * gdb-testsuite-avoid-pagination-in-attach-32.exp.patch + * gdb-fix-toplevel-types-with-fdebug-types-section.patch + * gdb-fix-range-loop-index-in-find_method.patch + * gdb-fix-python3.9-related-runtime-problems.patch + * gdb-fix-unused-function-error.patch + * gdb-fix-the-thread-pool.c-compilation.patch + * gdb-aarch64-fix-erroneous-use-of-spu-architecture-bfd.patch + * gdb-fix-debug-agent-odr-bool-int.patch + * gdbserver-fix-build-with-make-3.81.patch + * gdb-threads-fix-hang-in-stop_all_threads-after-killing-inferior.patch +- Fedora patch fixups added: + * fixup-gdb-6.3-test-pie-20050107.patch + * fixup-gdb-6.5-sharedlibrary-path.patch + * fixup-gdb-6.6-buildid-locate.patch + * fixup-gdb-6.8-bz442765-threaded-exec-test.patch + * fixup-gdb-archer-vla-tests.patch + * fixup-gdb-base-gnu-ifunc-strstr-workaround-exp.patch + * fixup-gdb-btrobust.patch + * fixup-gdb-bz634108-solib_address.patch + * fixup-gdb-dts-rhel6-python-compat.patch + * fixup-gdb-gnat-dwarf-crash-3of3.patch + * fixup-gdb-vla-intel-fortran-vla-strings.patch + * fixup-gdb-vla-intel-tests.patch + * fixup-gdb-6.3-threaded-watchpoints2-20050225.patch +- Patches renamed: + * gdb-testsuite-fix-perror-in-gdb.opt-fortran-string.exp.patch + to fixup-2-gdb-archer-vla-tests.patch +- Patches updated: + * gdb-testsuite-ada-pie.patch +- Backport from master: + * gdb-testsuite-prevent-pagination-in-gdb-internalflags.patch + +------------------------------------------------------------------- +Mon Sep 7 09:04:30 UTC 2020 - Andreas Schwab + +- Enable CTF support also for riscv64 + +------------------------------------------------------------------- +Tue Aug 11 09:56:29 UTC 2020 - Tom de Vries + +- Restore License/Group. + +------------------------------------------------------------------- +Fri Aug 7 08:10:52 UTC 2020 - Tom de Vries + +- Don't BuildRequire systemtap-sdt-devel for SLE-11. + +------------------------------------------------------------------- +Fri Aug 7 07:39:23 UTC 2020 - Tom de Vries + +- Add testsuite BuildRequire systemtap-sdt-devel. + +------------------------------------------------------------------- +Tue Aug 4 10:57:48 UTC 2020 - Tom de Vries + +- Add BuildRequire babeltrace-devel. On Factory this adds bdeps + babeltrace-devel, libuuid-devel, babeltrace, libglib-2_0-0, and + libgmodule-2_0-0. + +------------------------------------------------------------------- +Wed Jul 29 15:44:22 UTC 2020 - Tom de Vries + +- Fix internal error on aarch64 [swo#26316]. + gdb-aarch64-fix-erroneous-use-of-spu-architecture-bfd.patch + +------------------------------------------------------------------- +Tue Jul 28 11:29:35 UTC 2020 - Tom de Vries + +- Change into multibuild package and add flavour gdb-testsuite. + +------------------------------------------------------------------- +Fri Jul 24 12:39:06 UTC 2020 - Tom de Vries + +- Fix s390 -> s390x typo. + +------------------------------------------------------------------- +Fri Jul 24 12:34:41 UTC 2020 - Tom de Vries + +- Don't BuildRequire binutils-gold for SLE-12/s390. + +------------------------------------------------------------------- +Fri Jul 24 10:23:12 UTC 2020 - Tom de Vries + +- BuildRequire binutils-gold for testsuite + +------------------------------------------------------------------- +Thu Jul 23 15:34:40 UTC 2020 - Tom de Vries + +- Rebase to 9.2 release. + +------------------------------------------------------------------- +Tue Jul 14 14:33:12 UTC 2020 - Tom de Vries + +- Fix SLE-11 build. Gdb 9.1 requires make 3.82, but SLE-11 has + make 3.81: + * gdbserver-fix-build-with-make-3.81.patch + +------------------------------------------------------------------- +Tue Jul 14 08:31:27 UTC 2020 - Tom de Vries + +- Fix patch context: + * gdb-fix-the-thread-pool.c-compilation.patch + +------------------------------------------------------------------- +Mon Jul 13 22:13:07 UTC 2020 - Tom de Vries + +- Fix build error due to missing DIAGNOSTIC_IGNORE_UNUSED_FUNCTION. + * gdb-fix-the-thread-pool.c-compilation.patch + +------------------------------------------------------------------- +Mon Jul 13 15:36:16 UTC 2020 - Tom de Vries + +- Drop ChangeLog part of patch: + * gdb-fix-unused-function-error.patch + +------------------------------------------------------------------- +Mon Jul 13 15:24:53 UTC 2020 - Tom de Vries + +- Fix Werror=unused-function with gcc 4.8 (for Leap 42.3). + * gdb-fix-unused-function-error.patch + +------------------------------------------------------------------- +Mon Jul 13 13:56:50 UTC 2020 - Tom de Vries + +- Require %{suse_version} >= 1500 for --with-system-readline. + +------------------------------------------------------------------- +Mon Jul 13 12:21:04 UTC 2020 - Tom de Vries + +- Rebase to 9.1 release (as in fedora 32 @ 1735910). + * Breakpoints on nested functions and subroutines in Fortran. + * Multithreaded symbol loading, disabled by default. Enable + using 'maint set worker-threads unlimited'. + * Multi-target debugging support. + * New command pipe. + * New command set logging debugredirect [on|off]. + * New fortran commands info modules, info module functions, + info module variables. +- Fedora-specific patches dropped: + * gdb-libexec-add-index.patch + * gdb-6.3-rh-testversion-20041202.patch + * gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch +- Obsoleted fedora patches dropped: + * gdb-6.5-bz216711-clone-is-outermost.patch + * gdb-6.6-scheduler_locking-step-is-default.patch + * gdb-6.8-bz436037-reg-no-longer-active.patch + * gdb-bz541866-rwatch-before-run.patch + * gdb-bz568248-oom-is-error.patch + * gdb-follow-child-stale-parent.patch + * gdb-readline62-ask-more-rh.patch + * gdb-rhbz1371380-gcore-elf-headers.patch + * gdb-rhbz1553086-binutils-warning-loadable-section-outside-elf.patch + * gdb-rhbz1704406-disable-style-log-output-1of3.patch + * gdb-rhbz1704406-disable-style-log-output-2of3.patch + * gdb-rhbz1704406-disable-style-log-output-3of3.patch + * gdb-rhbz1708192-parse_macro_definition-crash.patch + * gdb-rhbz1723564-gdb-crash-PYTHONMALLOC-debug.patch + * gdb-rhbz795424-bitpos-20of25.patch + * gdb-rhbz795424-bitpos-21of25.patch + * gdb-rhbz795424-bitpos-22of25.patch + * gdb-rhbz795424-bitpos-23of25.patch + * gdb-rhbz795424-bitpos-25of25-test.patch + * gdb-rhbz795424-bitpos-25of25.patch + * gdb-rhbz795424-bitpos-arrayview.patch + * gdb-rhbz795424-bitpos-lazyvalue.patch + * gdb-testsuite-readline63-sigint.patch +- Fedora patches added: + * gdb-rhbz1818011-bfd-gcc10-error.patch +- Obsoleted patched dropped: + * gdb-fix-s390-build.diff + * gdb-fix-riscv-tdep.patch + * gdb-testsuite-add-missing-initial-prompt-read-in-multidictionary.exp.patch + * gdb-testsuite-pie-no-pie.patch + * gdb-testsuite-read1-fixes.patch + * gdb-testsuite-i386-pkru-exp.patch + * gdb-s390-handle-arch13.diff + * gdb-fix-heap-use-after-free-in-typename-concat.patch + * gdb-dwarf-reader-reject-sections-with-invalid-sizes.patch + * gdb-0001-remove-alloca-0-calls.patch + * gdb-arch13-1.diff + * gdb-arch13-2.diff + * gdb-arch13-3.diff + * bfd-change-num_group-to-unsigned-int.patch + * gdb-fix-incorrect-use-of-is-operator-for-comparison-in-python-lib-gdb-command-prompt.py.patch + * gdb-symtab-prefer-var-def-over-decl.patch + * gdb-only-force-interp_console-ui_out-for-breakpoint-commands-in-mi-mode.patch + * gdb-testsuite-8.3-kfail-xfail-unsupported.patch +- Backport from master: + * gdb-fix-debug-agent-odr-bool-int.patch + * gdb-fix-python3.9-related-runtime-problems.patch + +------------------------------------------------------------------- +Wed May 6 03:46:31 UTC 2020 - Tom de Vries + +- Fix .debug_types problems [swo#24480, swo#25889, bsc#1168394]. + - gdb-fix-range-loop-index-in-find_method.patch + - gdb-fix-toplevel-types-with-fdebug-types-section.patch + +------------------------------------------------------------------- +Mon Apr 20 14:29:12 UTC 2020 - Tom de Vries + +- Fix python 3.8 warning [bsc#1169495]. + * gdb-fix-incorrect-use-of-is-operator-for-comparison-in-python-lib-gdb-command-prompt.py.patch + +------------------------------------------------------------------- +Tue Apr 14 07:40:12 UTC 2020 - Tom de Vries + +- Fix build with gcc 10 [bsc#1169368, swo#25717]. + * bfd-change-num_group-to-unsigned-int.patch + +------------------------------------------------------------------- +Tue Feb 4 19:56:55 UTC 2020 - Tom de Vries + +- Fix hang after SIGKILL [swo#25478]. + * gdb-threads-fix-hang-in-stop_all_threads-after-killing-inferior.patch + +------------------------------------------------------------------- +Fri Jan 17 15:43:46 UTC 2020 - matz@suse.com + +- Add support for official name of s390 arch13: z15. + Add descriptions for arch13 instructions. Adds + gdb-arch13-1.diff, gdb-arch13-2.diff and gdb-arch13-3.diff. + [jsc#SLE-7903] + +------------------------------------------------------------------- +Fri Dec 6 14:20:21 UTC 2019 - Tom de Vries + +- Fix build with gcc 10 [bsc#1158539, swo#24653]. + * gdb-0001-remove-alloca-0-calls.patch + +------------------------------------------------------------------- +Mon Nov 11 08:57:18 UTC 2019 - Ludwig Nussel + +- make fpc optional (boo#1156284) as fpc requires itself for + bootstrapping. + +------------------------------------------------------------------- +Wed Nov 6 21:18:46 UTC 2019 - Tom de Vries + +- Fix for bsc#1146475 [bsc#1146475, swo#24971 ] + * gdb-symtab-prefer-var-def-over-decl.patch +- Fix for bsc#1146167 [bsc#1146167, swo#24956] + * gdb-only-force-interp_console-ui_out-for-breakpoint-commands-in-mi-mode.patch + +------------------------------------------------------------------- +Tue Oct 29 09:32:42 UTC 2019 - Tom de Vries + +- Backport 2nd part of fix for swo#23657. + [bsc#1142772, swo#23657, CVE-2019-1010180] + * gdb-dwarf-reader-reject-sections-with-invalid-sizes.patch + +------------------------------------------------------------------- +Mon Oct 14 17:52:55 UTC 2019 - matz@suse.com + +- Add gdb-s390-handle-arch13.diff to handle most new s390 arch13 + instructions. [fate#327369, jsc#ECO-368] + +------------------------------------------------------------------- +Mon Sep 30 10:34:54 UTC 2019 - Tom de Vries + +- Add gdb-testsuite-8.3-kfail-xfail-unsupported.patch + +------------------------------------------------------------------- +Thu Sep 26 16:51:17 UTC 2019 - Tom de Vries + +- Drop ChangeLog part of patch: + * gdb-rhbz1708192-parse_macro_definition-crash.patch + * gdb-rhbz1704406-disable-style-log-output-1of3.patch + * gdb-rhbz1704406-disable-style-log-output-2of3.patch + * gdb-rhbz1704406-disable-style-log-output-3of3.patch + * gdb-rhbz1723564-gdb-crash-PYTHONMALLOC-debug.patch + * gdb-rhbz1553086-binutils-warning-loadable-section-outside-elf.patch +- Update to gdb-8.3.1. + * Drop "Testsuite: Ensure pie is disabled on some tests" part of + gdb-testsuite-pie-no-pie.patch + * Drop patches included upstream: + - gdb-7.10-swo18929.patch + - gdb-handle-vfork-in-thread-with-follow-fork-mode-child.patch + - gdb-x86_64-i386-syscall-restart-master.patch + - gdb-suppress-sigttou-when-handling-errors.patch + - gdb-fix-breakpoints-on-file-reloads-for-pie-binaries.patch + - gdb-symtab-fix-symbol-loading-performance-regression.patch +- Fix macro in comment warning + +------------------------------------------------------------------- +Wed Sep 25 14:41:32 UTC 2019 - Tom de Vries + +- Upgrade libipt from v2.0 to v2.0.1. + * Use -DBUILD_SHARED_LIBS=OFF to build libipt.a, and drop part + of v1.5-libipt-static.patch that consequentially has become + unnecessary. + +------------------------------------------------------------------- +Tue Sep 24 08:31:04 UTC 2019 - Tom de Vries + +- Sync with f30, merging 1e222a3..8bf40c6. + * gdb-rhbz1708192-parse_macro_definition-crash.patch + * gdb-rhbz1704406-disable-style-log-output-1of3.patch + * gdb-rhbz1704406-disable-style-log-output-2of3.patch + * gdb-rhbz1704406-disable-style-log-output-3of3.patch + * gdb-rhbz1723564-gdb-crash-PYTHONMALLOC-debug.patch + * gdb-rhbz1553086-binutils-warning-loadable-section-outside-elf.patch + +------------------------------------------------------------------- +Sun Sep 22 05:54:09 UTC 2019 - Tom de Vries + +- Use ldd /usr/bin/rpm instead of ls /usr/%{_lib}/ to find librpm + +------------------------------------------------------------------- +Sat Sep 14 05:45:30 UTC 2019 - Michel Normand + +- Add _constraints for PowerPC need more than 3.5GB disk space + to avoid build failure + +------------------------------------------------------------------- +Tue Sep 10 15:45:17 UTC 2019 - matz@suse.com + +- Disable use of valgrind on old s390 (31bit) distros. + +------------------------------------------------------------------- +Fri Aug 23 16:00:18 UTC 2019 - Tom de Vries + +- Enable librpm for version > librpm.so.3 [bsc#1145692]: + * Allow any librpm.so.x + * Fix unused variables in HAVE_LIBRPM code in + gdb-6.6-buildid-locate-rpm-suse.patch + * Add %build test to check for "zypper install " + message +- Implements jsc#ECO-368, the 2019 toolchain module update + +------------------------------------------------------------------- +Tue Aug 6 21:36:49 UTC 2019 - Tom de Vries + +- Master backport: + * gdb-fix-breakpoints-on-file-reloads-for-pie-binaries.patch +- Master backports testsuite: + * gdb-testsuite-i386-pkru-exp.patch + * gdb-testsuite-read1-fixes.patch + * gdb-testsuite-pie-no-pie.patch + * gdb-testsuite-add-missing-initial-prompt-read-in-multidictionary.exp.patch +- Work around bsc#1115034: + * gdb-testsuite-ada-pie.patch +- Fixes for fedora patches: + * gdb-testsuite-fix-perror-in-gdb.opt-fortran-string.exp.patch + * gdb-testsuite-avoid-pagination-in-attach-32.exp.patch + +------------------------------------------------------------------- +Thu Jul 25 21:46:56 UTC 2019 - Stefan Brüns + +- Remove some conditionals for SLE-10 (build is disabled/unresolvable). +- BuildRequire makeinfo instead of full texinfo (requiring texlive) + where available (SLE >= 12). + +------------------------------------------------------------------- +Mon Jul 22 16:58:16 UTC 2019 - Tom de Vries + +- Add Wno-error=odr to work around swo#24835 +- Add BuildRequires xz-devel + +------------------------------------------------------------------- +Wed Jul 3 11:38:05 UTC 2019 - Tom de Vries + +- Add BuildRequires valgrind for make check + +------------------------------------------------------------------- +Wed Jul 3 11:02:06 UTC 2019 - Tom de Vries + +- Move BuildRequires gcc-go and fpc to %{with testsuite} portion + +------------------------------------------------------------------- +Wed Jul 3 10:53:05 UTC 2019 - Tom de Vries + +- Copy %ada_arch from gcc9 and use it to fix 'unresolvable: nothing + provides gcc-ada' for openSUSE_Leap_42.3_Ports/SLE-12 ppc64le. + +------------------------------------------------------------------- +Wed Jul 3 08:37:30 UTC 2019 - Tom de Vries + +- Drop ppc64le for fpc + +------------------------------------------------------------------- +Wed Jul 3 08:27:11 UTC 2019 - Tom de Vries + +- Add missing %endif + +------------------------------------------------------------------- +Wed Jul 3 08:15:33 UTC 2019 - Tom de Vries + +- Add BuildRequire fpc for make check + +------------------------------------------------------------------- +Wed Jul 3 06:47:49 UTC 2019 - Tom de Vries + +- Add comment explaining why guile support has been disabled for + newer distro versions. + +------------------------------------------------------------------- +Tue Jul 2 17:46:53 UTC 2019 - Tom de Vries + +- Add BuildRequire gcc-go to get gccgo command for make check + +------------------------------------------------------------------- +Tue Jul 2 13:48:51 UTC 2019 - Tom de Vries + +- Copy gdbinit from fedora master @ 25caf28. Add + gdbinit.without-python, and use it for --without=python. + +------------------------------------------------------------------- +Mon Jul 1 06:28:27 UTC 2019 - Tom de Vries + +- Remove unused code: gdbtui support + +------------------------------------------------------------------- +Mon Jun 24 07:00:28 UTC 2019 - Tom de Vries + +- Add comments to "patches to upstream" specifying when they can be + dropped. + +------------------------------------------------------------------- +Thu Jun 20 15:19:35 UTC 2019 - Tom de Vries + +- Remove -Wno-implicit-fallthrough, -Wno-error=cast-function-type + and -Wno-error=stringop-truncation + +------------------------------------------------------------------- +Wed Jun 19 06:54:23 UTC 2019 - Tom de Vries + +- Remove gdb-fix-buf-overflow.diff, which is a workaround for + swo#24698, which has been fixed since gdb 7.12. + +------------------------------------------------------------------- +Fri Jun 14 11:39:56 UTC 2019 - Tom de Vries + +- Fix rpmlint macro-in-comment errors + +------------------------------------------------------------------- +Fri Jun 14 11:27:41 UTC 2019 - Tom de Vries + +- Fix rpmlint error "deprecated-grep ['egrep']" . + +------------------------------------------------------------------- +Fri Jun 14 11:22:54 UTC 2019 - Tom de Vries + +- gdb-gcore-bash.patch: Fix rpmlint error env-script-interpreter by + replacing "/usr/bin/env bash" with "/bin/bash" in gcore. + +------------------------------------------------------------------- +Thu Jun 13 17:51:04 UTC 2019 - Tom de Vries + +- Rewrite gdbserver.1 workaround for riscv64 to avoid + %define _unpackaged_files_terminate_build 0 + +------------------------------------------------------------------- +Wed Jun 5 09:53:09 UTC 2019 - Andreas Schwab + +- gdb-suppress-sigttou-when-handling-errors.patch: Suppress SIGTTOU when + handling errors +- Enable ada tests on ppc64le and riscv64 +- Enable multitarget build on riscv64 +- Add ia64 and riscv64 to target_list +- Enable -Werror on riscv64 and aarch64 +- Don't remove %{buildroot} + +------------------------------------------------------------------- +Wed May 22 16:01:13 UTC 2019 - Tom de Vries + +- Remove gdb-gcc9-fix-build-with-latest-GCC-9.0-tree.patch and + gdb-gcc9-warning-on-elf32-arm.c-elf32_arm_final_link.patch, which are + already present in 8.3. + +------------------------------------------------------------------- +Wed May 22 08:44:01 UTC 2019 - Martin LiÅ¡ka + +- Add gdb-gcc9-fix-build-with-latest-GCC-9.0-tree.patch and + gdb-gcc9-warning-on-elf32-arm.c-elf32_arm_final_link.patch + in order to fix build with GCC9. + +------------------------------------------------------------------- +Tue May 21 13:32:17 UTC 2019 - Tom de Vries + +- Replace fedora patch gdb-x86_64-i386-syscall-restart.patch with + master backport gdb-x86_64-i386-syscall-restart-master.patch + +------------------------------------------------------------------- +Fri May 17 16:04:43 UTC 2019 - Tom de Vries + +- Work around riscv64 build error: gdbserver.1 is installed, but not + packaged + +------------------------------------------------------------------- +Thu May 16 15:12:24 UTC 2019 - Tom de Vries + +- Don't expect gdbserver for riscv64 + +------------------------------------------------------------------- +Thu May 16 13:00:08 UTC 2019 - Tom de Vries + +- Add gdb-fix-riscv-tdep.patch to fix RISC-V build breaker + +------------------------------------------------------------------- +Thu May 16 10:42:34 UTC 2019 - Tom de Vries + +- Rebase to 8.3 release (as in fedora 30 @ 1e222a3). + * DWARF index cache: GDB can now automatically save indices of DWARF + symbols on disk to speed up further loading of the same binaries. + * Ada task switching is now supported on aarch64-elf targets when + debugging a program using the Ravenscar Profile. + * Terminal styling is now available for the CLI and the TUI. + * Removed support for old demangling styles arm, edg, gnu, hp and + lucid. + * Support for new native configuration RISC-V GNU/Linux (riscv*-*-linux*). +- Obsoleted fedora patches dropped: + * gdb-6.3-ppc64syscall-20040622.patch + * gdb-6.3-ppc64displaysymbol-20041124.patch + * gdb-6.3-readnever-20050907.patch + * gdb-6.5-bz203661-emit-relocs.patch + * gdb-6.8-sparc64-silence-memcpy-check.patch + * gdb-6.8-watchpoint-conditionals-test.patch + * gdb-7.2.50-sparc-add-workaround-to-broken-debug-files.patch + * gdb-python-gil.patch + * gdb-rhbz881849-ipv6-1of3.patch + * gdb-rhbz881849-ipv6-2of3.patch + * gdb-rhbz881849-ipv6-3of3.patch + * gdb-rhbz1187581-power8-regs-1of7.patch + * gdb-rhbz1187581-power8-regs-2of7.patch + * gdb-rhbz1187581-power8-regs-3of7.patch + * gdb-rhbz1187581-power8-regs-4of7.patch + * gdb-rhbz1187581-power8-regs-5of7.patch + * gdb-rhbz1187581-power8-regs-6of7.patch + * gdb-rhbz1187581-power8-regs-7of7.patch + * gdb-rhbz1491128-batch-mode-exit-status-1of2.patch + * gdb-rhbz1491128-batch-mode-exit-status-2of2.patch + * gdb-use-pulongest-aarch64-linux-tdep.patch + * gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-1of5.patch + * gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-2of5.patch + * gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-3of5.patch + * gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-4of5.patch + * gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-5of5.patch +- Fedora patches added: + * gdb-rhbz795424-bitpos-arrayview.patch + * gdb-rhbz1371380-gcore-elf-headers.patch +- Obsoleted patched dropped: + * gdb-fix-crash-when-reading-core.patch + * power8-registers.diff + * gdb-fix-multidictionary.exp-for-gdb-8.2.patch +- Backport from master: + * gdb-handle-vfork-in-thread-with-follow-fork-mode-child.patch + [swo#gdb/24454] +- Added patches proposed for master: + * gdb-fix-heap-use-after-free-in-typename-concat.patch + [swo#24094] + * gdb-symtab-fix-symbol-loading-performance-regression.patch + [swo#24545] + +------------------------------------------------------------------- +Wed May 15 07:34:51 UTC 2019 - Tom de Vries + +- Add BuildRequires mpfr-devel + +------------------------------------------------------------------- +Thu Jan 24 10:13:33 UTC 2019 - tdevries@suse.com + +- Backport upstream fix for assertion failure + `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' + [swo#23712, rh#1560010] + patches: + gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-1of5.patch + gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-2of5.patch + gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-3of5.patch + gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-4of5.patch + gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-5of5.patch + * Add patches from fedora 29 @ 4513f72 + * Add gdb-fix-multidictionary.exp-for-gdb-8.2.patch to fix + multidictionary.exp test-case + +------------------------------------------------------------------- +Thu Dec 6 14:49:34 UTC 2018 - matz@suse.com + +- Add power8-registers.diff for implementing access to + more POWER8 registers. [fate#326120, fate#325178] + +------------------------------------------------------------------- +Mon Nov 12 13:26:01 UTC 2018 - tdevries@suse.com + +- Run tests with -fno-PIE/-no-pie and -fPIE/-pie. + +------------------------------------------------------------------- +Wed Nov 7 15:04:28 UTC 2018 - tdevries@suse.com + +- Fix crash when reading core [bsc #1109013] + * Add gdb-fix-crash-when-reading-core.patch + https://sourceware.org/ml/gdb-cvs/2018-11/msg00022.html + +------------------------------------------------------------------- +Tue Sep 11 15:01:59 UTC 2018 - matz@suse.com + +- Rebase to 8.2 release (as in fedora 29 @ c720d998): + * Contains fix for bnc#1081527, CVE-2018-7208. + * 'symbol-file' and 'add-symbol-file' accept -o to add relative + offset to all sections + * pager accepts 'c' response to disable it for rest of command + * accept _Alignof and alignof in C resp. C++ expressions + * new target riscv*-*-elf + * python API extensions: gdb.Type.align, gdb.execute deals + with multi-line gdb commands, gdb.convenience_variable and + gdb.set_convenience_variable to access convenience variables, + * aarch64: properly support hardware watchpoints on unaligned + addresses (needs kernel >= 4.10) +- Add gdb-fix-s390-build.diff for a Wformat error on s390. +- Support access to new POWER8 registers [fate#325178, fate#326120] + Add patches gdb-rhbz1187581-power8-regs-1of7.patch, + gdb-rhbz1187581-power8-regs-2of7.patch, + gdb-rhbz1187581-power8-regs-3of7.patch, + gdb-rhbz1187581-power8-regs-4of7.patch, + gdb-rhbz1187581-power8-regs-5of7.patch, + gdb-rhbz1187581-power8-regs-6of7.patch, + gdb-rhbz1187581-power8-regs-7of7.patch . +- Support ipv6 for gdbserver connections: + Add patches gdb-rhbz881849-ipv6-1of3.patch, + gdb-rhbz881849-ipv6-2of3.patch, + gdb-rhbz881849-ipv6-3of3.patch . +- Update to intel processor trace library 2.0 (from 1.6.1): + Add v2.0.tar.gz, remove v1.6.1.tar.gz + Remove obsolete v1.6.1-implicit-fallthrough.patch . +- Remove obsolete patches: + gdb-fix-python37-breakage.patch, + gdb-pahole-python2.patch . +- Added patches from Fedora: + gdb-rhbz1491128-batch-mode-exit-status-1of2.patch, + gdb-rhbz1491128-batch-mode-exit-status-2of2.patch, + gdb-rhbz1553104-s390x-arch12-test.patch, + gdb-use-pulongest-aarch64-linux-tdep.patch . +- Removed obsolete patches from Fedora: + gdb-6.6-bz235197-fork-detach-info.patch, + gdb-6.8-attach-signalled-detach-stopped.patch, + gdb-gdb-add-index-script.patch, + gdb-ppc64-stwux-tautological-compare.patch, + gdb-rhbz1540559-gdbaddindex-glibcdebug-regression.patch, + gdb-stale-frame_info.patch . +- Most other patches rebased. + +------------------------------------------------------------------- +Fri Aug 10 08:58:06 UTC 2018 - tchvatal@suse.com + +- Apply patch from fedora to build with python3.7: + * gdb-fix-python37-breakage.patch + +------------------------------------------------------------------- +Tue Mar 27 14:01:27 UTC 2018 - matz@suse.com + +- Add some -Wno-error flags for gcc-8 compatibility. + +------------------------------------------------------------------- +Fri Mar 9 16:27:10 UTC 2018 - matz@suse.com + +- Rebase to 8.1 release: + * Contains fix for bnc#1068950, CVE-2017-16829. + * ptype/o prints offsets and sizes of members (like pahole) + * tab-completion improved: quoting function names is not generally + necessary anymore, completion offers for breakpoint don't include + data symbol + * enable/disable breakpoints now accept ranges: 'disable 1.3-5' + * new commands: + - set/show cwd: working directory of debuggee + - set/show compile-gcc: program to use for 'compile' command + - starti: start program and stop at first instruction + - TUI single-key commands: 'i' for stepi and 'o' for nexti + * --readnever option disables any reading of debug info (for dumping) + * s390: guarded storage register access for z14 + * gcore option -a dumps all memory mapping + * C++ breakpoints: 'b foo' will now set a breakpoint on all functions + and methods named 'foo' no matter the scope. Use -qualified if you + don't want that + * python scripting: new events gdb.new_inferior, gdb.inferior_deleted + and gdb.new_thread; new command rbreak (breakpoint accepting regexps) + * gdbserver can be passed environment parameters to remote debuggee +- Added patches from Fedora: + gdb-ppc64-stwux-tautological-compare.patch + gdb-rhbz1540559-gdbaddindex-glibcdebug-regression.patch + gdb-vla-intel-fix-print-char-array.patch +- Removed unused gdb-libstdc++-v3-python-7.1.1-20170526.tar.bz2 +- Removed obsolete upstream patches: + gdb-s390x-1b63490.patch + gdb-s390x-289e23a.patch + gdb-s390x-8fe09d7.patch + gdb-s390x-96235dc.patch + gdb-s390x-ad33963.patch +- Removed obsolete Fedora patches: + gdb-6.3-rh-dummykfail-20041202.patch + gdb-6.6-threads-static-test.patch + gdb-add-index-chmod.patch + gdb-glibc-vdso-workaround.patch + gdb-rhbz1420304-s390x-01of35.patch + gdb-rhbz1420304-s390x-02of35.patch + gdb-rhbz1420304-s390x-03of35.patch + gdb-rhbz1420304-s390x-04of35.patch + gdb-rhbz1420304-s390x-05of35.patch + gdb-rhbz1420304-s390x-06of35.patch + gdb-rhbz1420304-s390x-07of35.patch + gdb-rhbz1420304-s390x-08of35.patch + gdb-rhbz1420304-s390x-09of35.patch + gdb-rhbz1420304-s390x-10of35.patch + gdb-rhbz1420304-s390x-11of35.patch + gdb-rhbz1420304-s390x-12of35.patch + gdb-rhbz1420304-s390x-13of35.patch + gdb-rhbz1420304-s390x-14of35.patch + gdb-rhbz1420304-s390x-15of35.patch + gdb-rhbz1420304-s390x-16of35.patch + gdb-rhbz1420304-s390x-17of35.patch + gdb-rhbz1420304-s390x-18of35.patch + gdb-rhbz1420304-s390x-19of35.patch + gdb-rhbz1420304-s390x-20of35.patch + gdb-rhbz1420304-s390x-21of35.patch + gdb-rhbz1420304-s390x-22of35.patch + gdb-rhbz1420304-s390x-23of35.patch + gdb-rhbz1420304-s390x-24of35.patch + gdb-rhbz1420304-s390x-25of35.patch + gdb-rhbz1420304-s390x-26of35.patch + gdb-rhbz1420304-s390x-27of35.patch + gdb-rhbz1420304-s390x-28of35.patch + gdb-rhbz1420304-s390x-29of35.patch + gdb-rhbz1420304-s390x-30of35.patch + gdb-rhbz1420304-s390x-31of35.patch + gdb-rhbz1420304-s390x-32of35.patch + gdb-rhbz1420304-s390x-33of35.patch + gdb-rhbz1420304-s390x-34of35.patch + gdb-rhbz1420304-s390x-35of35.patch + gdb-tls-1of2.patch + gdb-tls-2of2.patch + gdb-upstream.patch + +------------------------------------------------------------------- +Wed Nov 15 08:54:04 UTC 2017 - schwab@suse.de + +- Support --without=testsuite and disable testsuite for qemu-linux-user + builds + +------------------------------------------------------------------- +Wed Oct 25 12:14:54 UTC 2017 - jmatejek@suse.com + +- switch to Python 3 for Tumbleweed 1320 and up + +------------------------------------------------------------------- +Mon Oct 9 12:43:07 UTC 2017 - matz@suse.com + +- Remove %clean section. + +------------------------------------------------------------------- +Wed Oct 4 11:20:39 UTC 2017 - matz@suse.com + +- Link gdb against a bundled libipt (processor trace + library) on x86_64 and i686 for improved tracing support + on Intel CPUs. [bnc#985550] + Adds v1.6.1.tar.gz and patches + v1.5-libipt-static.patch and v1.6.1-implicit-fallthrough.patch. + +------------------------------------------------------------------- +Mon Oct 2 14:49:04 UTC 2017 - matz@suse.com + +- Rebase to 8.0.1 release (fixing PR21886, PR22046) +- Updated libstdc++ pretty printers to +- Replace gdb-libstdc++-v3-python-6.3.1-20170212.tar.bz2 with + gdb-libstdc++-v3-python-7.1.1-20170526.tar.bz2 . +- Add patches for s390x z14 feates [fate #321514, fate #322272] + gdb-s390x-1b63490.patch + gdb-s390x-289e23a.patch + gdb-s390x-8fe09d7.patch + gdb-s390x-96235dc.patch + gdb-s390x-ad33963.patch +- Adjust some patches: + gdb-ppc-power7-test.patch + gdb-rhbz795424-bitpos-20of25.patch + gdb-rhbz795424-bitpos-21of25.patch + gdb-vla-intel-fortran-vla-strings.patch +- Add some patches from Fedora: + gdb-rhbz1420304-s390x-01of35.patch + gdb-rhbz1420304-s390x-02of35.patch + gdb-rhbz1420304-s390x-03of35.patch + gdb-rhbz1420304-s390x-04of35.patch + gdb-rhbz1420304-s390x-05of35.patch + gdb-rhbz1420304-s390x-06of35.patch + gdb-rhbz1420304-s390x-07of35.patch + gdb-rhbz1420304-s390x-08of35.patch + gdb-rhbz1420304-s390x-09of35.patch + gdb-rhbz1420304-s390x-10of35.patch + gdb-rhbz1420304-s390x-11of35.patch + gdb-rhbz1420304-s390x-12of35.patch + gdb-rhbz1420304-s390x-13of35.patch + gdb-rhbz1420304-s390x-14of35.patch + gdb-rhbz1420304-s390x-15of35.patch + gdb-rhbz1420304-s390x-16of35.patch + gdb-rhbz1420304-s390x-17of35.patch + gdb-rhbz1420304-s390x-18of35.patch + gdb-rhbz1420304-s390x-19of35.patch + gdb-rhbz1420304-s390x-20of35.patch + gdb-rhbz1420304-s390x-21of35.patch + gdb-rhbz1420304-s390x-22of35.patch + gdb-rhbz1420304-s390x-23of35.patch + gdb-rhbz1420304-s390x-24of35.patch + gdb-rhbz1420304-s390x-25of35.patch + gdb-rhbz1420304-s390x-26of35.patch + gdb-rhbz1420304-s390x-27of35.patch + gdb-rhbz1420304-s390x-28of35.patch + gdb-rhbz1420304-s390x-29of35.patch + gdb-rhbz1420304-s390x-30of35.patch + gdb-rhbz1420304-s390x-31of35.patch + gdb-rhbz1420304-s390x-32of35.patch + gdb-rhbz1420304-s390x-33of35.patch + gdb-rhbz1420304-s390x-34of35.patch + gdb-rhbz1420304-s390x-35of35.patch + gdb-upstream.patch + +------------------------------------------------------------------- +Wed Sep 13 14:09:26 UTC 2017 - matz@suse.com + +- Disable guile extensions for new distros, the gdb support + is incompatible with guile 2.2. + +------------------------------------------------------------------- +Tue Jun 6 14:37:05 UTC 2017 - matz@suse.com + +- Rebase to gdb 8.0 release: [fate #319573] + * support for DWARF5 (except its .debug_names) + * support C++11 rvalue references + * support PKU register (memory protection keys on future Intel CPUs) + * python scripting: + - start, stop and access running btrace + - rvalue references in gdb.Type + * record/replay x86_64 rdrand and rdseed + * removed support for GCJ compiled java programs + * user commands accept more than 10 arguments + * "eval" expands user-defined command arguments + * new options: + set/show disassembler-options (on arm, ppc s390) +- Removed obsoleted patches: + gdb-release-werror.patch + +------------------------------------------------------------------- +Thu Apr 27 14:39:44 UTC 2017 - matz@suse.com + +- Rebase to gdb 7.99.90 (prerelease of gdb 8) [fate #319573] +- Updated libstdc++ pretty printers to + gdb-libstdc++-v3-python-6.3.1-20170212.tar.bz2. +- Added patches from fedora: + gdb-release-werror.patch + gdb-rhbz1398387-tab-crash-test.patch +- Removed obsoleted patches: + gdb-6.7-bz426600-DW_TAG_interface_type-test.patch + gdb-bison-old.patch + gdb-testsuite-casts.patch + gdb-testsuite-m-static.patch + gdb-upstream.patch + gdb-testsuite-morestack-gold.patch + gdb-fix-bnc-994537.diff + gdb-libiberty-demangler-fuzz.diff + +------------------------------------------------------------------- +Mon Apr 3 12:48:42 UTC 2017 - rguenther@suse.com + +- Fix rpm condition to allow build on SLE10. +- Do not require glibc-devel-static-32bit on SLE12 which is not available + there. + +------------------------------------------------------------------- +Wed Feb 15 15:55:11 UTC 2017 - matz@suse.com + +- Update to gdb 7.12.1 + * negative repeat count for x examines backwards + * fortran: support structs/arrays with dynamically types fields + * support MPX bound checking + * support for the Rust language + * 'catch syscall' now can catch groups of related syscalls + * New (sub)commands: + - skip {-file,-gfile,-function,-rfunction}: generic skip + mechanism + - maint {selftest,info line-table} + - new-ui: create new user interface for GUI clients + * (fast) tracepoints on s390x and ppc64le added to gdbserver + * New target Andes NDS32 +- Add rpmlint exception for historic libinproctrace place +- Remove obsolete patches: + gdb-aarch64-v81-hwbreakpoints.diff + gdb-bare-DW_TAG_lexical_block-1of2.patch + gdb-bare-DW_TAG_lexical_block-2of2.patch + gdb-fortran-stride-intel-1of6.patch + gdb-fortran-stride-intel-2of6.patch + gdb-fortran-stride-intel-3of6.patch + gdb-fortran-stride-intel-4of6.patch + gdb-fortran-stride-intel-5of6.patch + gdb-fortran-stride-intel-6of6-nokfail.patch + gdb-fortran-stride-intel-6of6.patch + gdb-testsuite-dw2-undefined-ret-addr.patch + gdb-vla-intel-04of23-fix.patch + gdb-vla-intel-logical-not.patch + gdb-vla-intel.patch +- Add patches from Fedora package: + gdb-6.7-testsuite-stable-results.patch + gdb-add-index-chmod.patch + gdb-bison-old.patch + gdb-container-rh-pkg.patch + gdb-libexec-add-index.patch + gdb-linux_perf-bundle.patch + gdb-physname-pr11734-test.patch + gdb-physname-pr12273-test.patch + gdb-rhbz1007614-memleak-infpy_read_memory-test.patch + gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch + gdb-rhbz1149205-catch-syscall-after-fork-test.patch + gdb-rhbz1156192-recursive-dlopen-test.patch + gdb-rhbz1186476-internal-error-unqualified-name-re-set-test.patch + gdb-rhbz1350436-type-printers-error.patch + gdb-test-ivy-bridge.patch + gdb-testsuite-casts.patch + gdb-testsuite-m-static.patch + gdb-testsuite-morestack-gold.patch + gdb-tls-1of2.patch + gdb-tls-2of2.patch + gdb-upstream.patch + gdb-vla-intel-fortran-strides.patch + gdb-vla-intel-fortran-vla-strings.patch + gdb-vla-intel-tests.patch + +------------------------------------------------------------------- +Mon Jan 9 15:37:41 UTC 2017 - matz@suse.com + +- Disable 32bit testing on openSUSE s390x. + +------------------------------------------------------------------- +Fri Dec 16 09:55:50 UTC 2016 - mliska@suse.cz + +- Make dependency of gcc-java conditional. + +------------------------------------------------------------------- +Sat Dec 3 10:27:31 UTC 2016 - schwab@suse.de + +- Enable ada testing on aarch64 for tumbleweed + +------------------------------------------------------------------- +Mon Nov 21 11:17:58 UTC 2016 - schwab@suse.de + +- BuildRequire glibc-devel-static for 12.1 or later, and + glibc-devel-static-32bit if biarch + +------------------------------------------------------------------- +Thu Aug 25 14:29:44 UTC 2016 - matz@suse.com + +- Add gdb-fix-bnc-994537.diff for ppc64le, fixing + two testcases. [bnc#994537] +- Add gdb-libiberty-demangler-fuzz.diff for fixing infinite + recursion in demangler. [bnc#987637] + +------------------------------------------------------------------- +Mon Aug 8 15:34:57 UTC 2016 - matz@suse.com + +- Amend gdb-glibc-vdso-workaround.patch to ignore further + vdso filenames on ppc64 and s390x. [bnc#944105] + +------------------------------------------------------------------- +Wed Aug 3 14:38:49 UTC 2016 - matz@suse.com + +- Add gdb-aarch64-v81-hwbreakpoints.diff for detecting + debug capabilities on ARMv8.1/8.2. [bnc#990697] + +------------------------------------------------------------------- +Mon Jun 20 16:36:04 UTC 2016 - matz@suse.com + +- Rebase to gdb 7.11.1: minor bug fixes. +- Remove gdb-gcc6-Wparentheses-warning.patch (applied upstream). +- Add some patches from Fedora F24: + gdb-bare-DW_TAG_lexical_block-1of2.patch + gdb-bare-DW_TAG_lexical_block-2of2.patch + gdb-bz1219747-attach-kills.patch + gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch + gdb-rhbz1325795-framefilters-test.patch + gdb-testsuite-dw2-undefined-ret-addr.patch + +------------------------------------------------------------------- +Tue May 24 10:49:47 UTC 2016 - martin.liska@suse.com + +- Add gdb-gcc6-Wparentheses-warning.patch to fix Werrors reported by GCC6. + +------------------------------------------------------------------- +Mon Apr 25 07:23:34 UTC 2016 - rguenther@suse.com + + [diverging changelog entry from SLE tree vs devel:gcc tree: + +- Add gdb-7.9-bnc976404.patch to fix thread support on s390x. [bnc #976404] + [bnc #970589] +- Add gdb-7.9-swo18929.patch to fix crash printing values. [bnc#971556] + ] +- Removed gdb-7.9-bnc976404.patch when updating to devel:gcc tree. +- Replaced gdb-7.9-swo18929.patch with gdb-7.10-swo18929.patch as well. + +------------------------------------------------------------------- +Thu Apr 7 09:56:22 UTC 2016 - normand@linux.vnet.ibm.com + +- update gdb-orphanripper.c from last fedora changes of 2013 + http://pkgs.fedoraproject.org/cgit/rpms/gdb.git/log/gdb-orphanripper.c + may be solution to transient build hung on Rings:1 ppc64le + tracked by bug boo#974419 + +------------------------------------------------------------------- +Mon Mar 21 09:02:11 UTC 2016 - rguenther@suse.com + +- Add gdb-7.10-swo18929.patch to fix crash printing values. [bnc#971556] + [swo#18929] + +------------------------------------------------------------------- +Mon Feb 29 18:50:39 UTC 2016 - matz@suse.de + +- Rebase to gdb version 7.11 as of version in Fedora 24: + * Per-inferior thread numbers. + * Breakpoint "explicit locations" (via CLI and GDB/MI). + * New convenience variables ($_gthread, $_inferior). + * Record btrace now supports non-stop mode. + * Various improvements on AArch64 GNU/Linux: + - Multi-architecture debugging support. + - displaced stepping. + - tracepoint support added in GDBserver. + * In Ada, the overloads selection menu provides the parameter + types and return types for the matching overloaded subprograms. + * Various remote protocol improvements, including several + new packets which can be used to support features such as + follow-exec-mode, exec catchpoints, syscall catchpoints, etc. + * Some minor improvements in the Python API for extending GDB. +- Added local patch gdb-fix-buf-overflow.diff. +- Added new patches from Fedora: + gdb-fedora-libncursesw.patch + gdb-fortran-stride-intel-1of6.patch + gdb-fortran-stride-intel-2of6.patch + gdb-fortran-stride-intel-3of6.patch + gdb-fortran-stride-intel-4of6.patch + gdb-fortran-stride-intel-5of6.patch + gdb-fortran-stride-intel-6of6-nokfail.patch + gdb-fortran-stride-intel-6of6.patch + gdb-opcodes-clflushopt-test.patch + gdb-testsuite-readline63-sigint.patch +- Removed obsolete patches: + gdb-6.3-bz231832-obstack-2gb.patch + gdb-probes-based-interface-robust-1of2.patch + gdb-probes-based-interface-robust-2of2.patch + gdb-rhbz1260558-ppc64le-skip_trampoline_code.patch + gdb-rhbz1270564-invalid-dwarf-regno.patch + gdb-rhel5-compat.patch +- Really disable problematic testcases. + +------------------------------------------------------------------- +Mon Jan 18 14:49:12 UTC 2016 - matz@suse.de + +- Disable guile support for SLE10. + +------------------------------------------------------------------- +Thu Jan 14 16:46:43 UTC 2016 - matz@suse.de + +- Rebase to gdb version 7.10.1 as of version in Fedora 23: + * reverse debugging on aarch64 + * new commands or subcommands: + - info os cpu, set/show serial parity, info dll + - maint print symbol-cache/symbol-cache-statistics, + maint flush-symbol-cache + - record btrace bts, record bts + - compile print + - show/set mpx bound + - tui enable/disable + - record btrace pt, record pt + - maint info btrace, + maint btrace packet-history/clear-packet-history/clear + * s390 support for vector ABI + * "set sysroot" improvements related to remote targets + * better support for debugging containerized programs + (without "set sysroot") + * HISTSIZE environment variable is replaced by GDBHISTSIZE + * python scripting: + - it's possible to write frame unwinders + - several new methods in Objfile, Type and Value classes + - gdb can auto-load scripts contained in special sections + named '.debug_gdb_scripts'. + * extensions for the MI interface, new remote packet types +- Removed obsolete patches: + 0001-S390-Add-target-descriptions-for-vector-register-set.patch + 0001-S390-Fix-compiler-invocation-with-compile-command.patch + 0001-S390-Support-new-vector-register-sections.patch + 0002-S390-Add-vector-register-support-to-gdb.patch + 0003-S390-Add-vector-register-support-to-gdbserver.patch + 0004-S390-Vector-register-test-case.patch + 0005-S390-Name-invisible-registers-with-the-empty-string-.patch + gdb-6.5-bz190810-gdbserver-arch-advice.patch + gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch + gdb-6.8-bz457187-largefile-test.patch + gdb-enable-count-crash.patch + gdb-libstdc++-v3-python-r155978.tar.bz2 + gdb-no-dg-extract-results-py.patch + gdb-python3-py_hash_t-32bit.patch + gdb-python3-testsuite.patch + gdb-s390-reorder-arch.diff + gdb-upstream.patch +- Added new patches from Fedora: + gdb-pahole-python2.patch + gdb-probes-based-interface-robust-1of2.patch + gdb-probes-based-interface-robust-2of2.patch + gdb-rhbz1260558-ppc64le-skip_trampoline_code.patch + gdb-rhbz1270564-invalid-dwarf-regno.patch + +------------------------------------------------------------------- +Fri Aug 14 13:39:13 UTC 2015 - matz@suse.de + +- Add missing patches from binutils for z13 support. [bnc #936050] + +------------------------------------------------------------------- +Fri Jul 10 13:49:28 UTC 2015 - matz@suse.de + +- Rebase to gdb version 7.9.1: + fixes PR python/18299, python/18285. +- Add gdb-s390-reorder-arch.diff [bnc #936050] +- Added patches for fate#318039, s390 z13 support: + 0001-S390-Fix-compiler-invocation-with-compile-command.patch + 0001-S390-Support-new-vector-register-sections.patch + 0001-S390-Add-target-descriptions-for-vector-register-set.patch + 0002-S390-Add-vector-register-support-to-gdb.patch + 0003-S390-Add-vector-register-support-to-gdbserver.patch + 0004-S390-Vector-register-test-case.patch + 0005-S390-Name-invisible-registers-with-the-empty-string-.patch +- Remove now obsolete SLE12-only patches: + gdb-7.7-bnc896586.patch, gdb-7.7-bnc895831.patch, + gdb-7.7-bnc891040-1.patch, gdb-7.7-bnc891040-2.patch, + gdb-7.7-bnc891040-3.patch, gdb-7.7-bnc891040-4.patch, + gdb-7.7-bnc891040-5.patch + +------------------------------------------------------------------- +Thu Jul 2 13:26:29 UTC 2015 - rguenther@suse.com + +- Remove auto-loading non-existent /etc/gdbinit.d/gdb-heap.py + from /etc/gdbinit + +------------------------------------------------------------------- +Mon Jun 29 07:27:44 UTC 2015 - schwab@suse.de + +- Add guile-devel to enable Scheme scripting support +- Run ada tests also on ppc64 and s390 + +------------------------------------------------------------------- +Tue Mar 3 11:42:10 UTC 2015 - schwab@suse.de + +- Build multi-target also on aarch64 + +------------------------------------------------------------------- +Fri Feb 27 11:10:19 UTC 2015 - rguenther@suse.com + +- Strip date and runtimes from gdb-testsuite contents. + +------------------------------------------------------------------- +Wed Feb 25 13:08:27 UTC 2015 - rguenther@suse.com + +- Use patchlist.pl to merge with gdb-7.9-10.fc22, a rebase to FSF GDB 7.9. + The GDB 7.8 features are: + * Python Scripting + - You can now access frame registers from Python scripts. + - New attribute 'producer' for gdb.Symtab objects. + * New Python-based convenience functions: + - $_caller_is(name [, number_of_frames]) + - $_caller_matches(regexp [, number_of_frames]) + - $_any_caller_is(name [, number_of_frames]) + - $_any_caller_matches(regexp [, number_of_frames]) + * New commands + - queue-signal signal-name-or-number + Queue a signal to be delivered to the thread when it is resumed. + * On resume, GDB now always passes the signal the program had stopped + for to the thread the signal was sent to, even if the user changed + threads before resuming. Previously GDB would often (but not + always) deliver the signal to the thread that happens to be current + at resume time. + * Conversely, the "signal" command now consistently delivers the + requested signal to the current thread. GDB now asks for + confirmation if the program had stopped for a signal and the user + switched threads meanwhile. + * "breakpoint always-inserted" modes "off" and "auto" merged. + Now, when 'breakpoint always-inserted mode' is set to "off", GDB + won't remove breakpoints from the target until all threads stop, + even in non-stop mode. The "auto" mode has been removed, and "off" + is now the default mode. + * MI changes + - The -list-thread-groups command outputs an exit-code field for + inferiors that have exited. +- removed (upstream) gdb-async-stopped-on-pid-arg-1of2.patch, + gdb-async-stopped-on-pid-arg-testsuite.patch, + gdb-python-completer-1of2.patch, gdb-python-completer-2of2.patch + and gdb-readline-6.3.5.patch +- added gdb-jit-reader-multilib.patch, gdb-no-dg-extract-results-py.patch, + gdb-python-gil.patch, gdb-python3-py_hash_t-32bit.patch, + gdb-python3-testsuite.patch and gdb-vla-intel-logical-not.patch + +------------------------------------------------------------------- +Mon Dec 15 07:33:31 UTC 2014 - cshorler@googlemail.com + +- Update for GDB 7.8.1 + * removed (already in upstream): + gdb-babeltrace-configure.patch + gdb-async-stopped-on-pid-arg-2of2.patch + * amended (partially in upstream): + gdb-archer.patch + gdb-attach-fail-reasons-5of5.patch + gdb-async-stopped-on-pid-arg-1of2.patch + gdb-async-stopped-on-pid-arg-testsuite.patch + +------------------------------------------------------------------- +Fri Oct 10 10:01:27 UTC 2014 - hrvoje.senjan@gmail.com + +- Added gdb-async-stopped-on-pid-arg-1of2.patch, + gdb-async-stopped-on-pid-arg-2of2.patch and + gdb-async-stopped-on-pid-arg-testsuite.patch to resolve + https://sourceware.org/bugzilla/show_bug.cgi?id=17347 + +------------------------------------------------------------------- +Wed Aug 13 07:54:35 UTC 2014 - rguenther@suse.com + +- Enable running the testsuite and store results in a gdb-testresults + package. +- Add gdb-rpmlintrc to filter errors about the buildroot mentioned + in testresult logs. + +------------------------------------------------------------------- +Fri Aug 8 12:22:24 UTC 2014 - rguenther@suse.com + +- Use patchlist.pl to merge with gdb-7.8-16.fc22, a rebase to FSF GDB 7.8. + The GDB 7.8 features are: + * Guile scripting support. + * Python scripting enhancements. + * New commands: + ** guile + ** guile-repl + ** info auto-load guile-scripts [REGEXP] + * New options: + ** maint ada set ignore-descriptive-types (on|off) + ** maint set target-async (on|off) + ** set|show auto-load guile-scripts (on|off) + ** set|show auto-connect-native-target + ** set|show guile print-stack (none|message|full) + ** set|show mi-async (on|off) + ** set|show print symbol-loading (off|brief|full) + ** set|show record btrace replay-memory-access (read-only|read-write) + * Remote Protocol: + ** The qXfer:btrace:read packet supports a new annex 'delta'. + * GDB/MI: + ** A new option "-gdb-set mi-async" replaces "-gdb-set target-async". + * New target configurations: + ** PowerPC64 GNU/Linux little-endian + * btrace enhancements: + ** The btrace record target now supports the 'record goto' command. + ** The btrace record target supports limited reverse execution and + replay. + * ISO C99 variable length automatic arrays support. + * It is no longer required to "set target-async on" in order to use + background execution commands (e.g., "c&", "s&", etc.). + * "catch syscall" now implemented on s390*-linux* targets. + * The "compare-sections" command now works on all targets. + * The "target native" command now connects to the native target, and + can be used to launch native programs, even if "set + auto-connect-native-target" is set to off. + * More robust backtraces. [bnc#891040] +- Obsoletes patch gdb-7.7-bnc877566.patch +- Obsoletes patch gdb-fix-s390-build.patch +- Obsoletes patch gdb-ppc64le.patch +- Drop gdb-ia64-tdep.patch, disable building the IA64 target +- Modifies gdb-6.3-test-pie-20050107.patch, + gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch, + gdb-6.6-buildid-locate-core-as-arg.patch, + gdb-6.6-buildid-locate-rpm.patch, gdb-6.6-buildid-locate.patch, + gdb-6.6-scheduler_locking-step-is-default.patch, + gdb-6.6-scheduler_locking-step-sw-watchpoints2.patch, + gdb-6.8-attach-signalled-detach-stopped.patch, + gdb-6.8-quit-never-aborts.patch, + gdb-archer-pie-addons-keep-disabled.patch, gdb-archer-pie-addons.patch, + gdb-archer.patch, gdb-attach-fail-reasons-5of5.patch, + gdb-glibc-strstr-workaround.patch, gdb-rhbz795424-bitpos-20of25.patch, + gdb-rhbz795424-bitpos-21of25.patch, gdb-rhbz795424-bitpos-22of25.patch, + gdb-rhbz795424-bitpos-23of25.patch, gdb-rhbz795424-bitpos-25of25.patch, + gdb-upstream.patch +- Adds gdb-archer-vla-tests.patch, gdb-bz533176-fortran-omp-step.patch, + gdb-bz541866-rwatch-before-run.patch + gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch, + gdb-babeltrace-configure.patch, gdb-btrobust.patch, + gdb-dts-rhel6-python-compat.patch, gdb-fortran-frame-string.patch, + gdb-gnat-dwarf-crash-3of3.patch, gdb-python-completer-1of2.patch, + gdb-python-completer-2of2.patch, gdb-readline-6.3.5.patch, + gdb-vla-intel-04of23-fix.patch, gdb-vla-intel-stringbt-fix.patch, + gdb-vla-intel.patch +- Removes gdb-rhel5-gcc44.patch, gdb-6.6-bfd-vdso8k.patch, + gdb-testsuite-nohostid.patch, gdb-python-stacksmash.patch + +------------------------------------------------------------------- +Mon Jul 15 07:42:50 UTC 2014 - rguenther@suse.com + (was: Mon Sep 15 07:42:50 UTC 2014 - rguenther@suse.com) + +- Backport fix for gdb internal-error on register info on PPC64LE. + Addds patch gdb-7.7-bnc896586.patch. [bnc#896586] + +------------------------------------------------------------------- +Wed Jul 10 07:41:20 UTC 2014 - rguenther@suse.com + (was: Wed Sep 10 07:41:20 UTC 2014 - rguenther@suse.com) + +- Backport fix for gdbserver PPC64LE byteorder issue. [bnc#895831] + Adds patch gdb-7.7-bnc895831.patch. + +------------------------------------------------------------------- +Tue Jul 8 08:13:11 UTC 2014 - rguenther@suse.com + + (was: Tue Aug 12 08:13:11 UTC 2014 - rguenther@suse.com) + +- Backport all frame-related changes from gdb 7.8. Adds patches + gdb-7.7-bnc891040-1.patch, gdb-7.7-bnc891040-2.patch, + gdb-7.7-bnc891040-3.patch, gdb-7.7-bnc891040-4.patch, + gdb-7.7-bnc891040-5.patch [bnc#891040] + +------------------------------------------------------------------- +Thu Jun 26 14:00:26 UTC 2014 - rguenther@suse.com + +- Add baselibs.conf to sources. + +------------------------------------------------------------------- +Thu Jun 26 08:59:49 UTC 2014 - rguenther@suse.com + +- For _with_testsuite require gcc-fortran, not gcc-gfortran. + [bnc#884399] + +------------------------------------------------------------------- +Wed May 14 07:43:54 UTC 2014 - rguenther@suse.com + +- Fix debugging of threaded 31bit inferiors on s390x + (gdb-7.7-bnc877566.patch). [bnc#877566] +- Add patchlist.pl and patchname_get.sh as sources. + +------------------------------------------------------------------- +Wed Feb 12 16:24:38 UTC 2014 - matz@suse.de + +- Fix build on s390 (gdb-fix-s390-build.patch). + +------------------------------------------------------------------- +Mon Feb 10 17:19:07 UTC 2014 - matz@suse.de + +- Use patchlist.pl to merge with gdb-Fedora at + e86a0cc13a5d91ba95242690237bb77511500897. +- Don't apply patches gdb-rhel5-gcc44.patch, + gdb-6.6-buildid-locate-rpm-scl.patch, + gdb-readline62-ask-more-rh.patch, + gdb-6.8-attach-signalled-detach-stopped.patch, + gdb-6.8-quit-never-aborts.patch, + gdb-rhel5-compat.patch; retained to have same structure as fedoras + package. +- Add gdb-testsuite-nohostid.patch (from fedora). +- Remove gdb-fix-attach-signalled-detach-stopped.patch again + (as base not applied), gdb-ppc-ptrace.diff (not applied since some time). + +------------------------------------------------------------------- +Sun Feb 9 15:44:04 UTC 2014 - burnus@net-b.de + +- Merge from fedoras gdb-7.7-1.fc21, a rebase to FSF GDB 7.7. + The 7.7 features are: + * For C++, the 'typeid' operator has been added and + exception catchpoints can be filtered by type. + * Python scripting has been extended + * New commands and new command options + * New convenice variables/functions + * Some GDB/MI improvements + * Remote protocal improvments + * SystemTap SDT probes support AArch64 GNU/Linux + * Support for Fission DWP file format version 2 + * 'tsave' command supports CTF (Common Trace Format) + * New script 'gcore' +- Remove now obsolete gdb-aarch64-hw-break.patch +- Remove merged bits from gdb-ppc64le.patch +- Rediff gdb-6.6-buildid-locate-rpm-suse.patch +- Add gdb-fix-attach-signalled-detach-stopped.patch + +------------------------------------------------------------------- +Mon Dec 9 14:16:53 UTC 2013 - uweigand@de.ibm.com + +- gdb-ppc64le.patch: add support for powerpc64le-linux + +------------------------------------------------------------------- +Fri Nov 15 12:08:19 UTC 2013 - rguenther@suse.com + +- Allow librpm3 to be used + +------------------------------------------------------------------- +Thu Sep 12 16:04:25 UTC 2013 - schwab@suse.de + +- gdb-aarch64-hw-break.patch: apply last change also to gdbserver + +------------------------------------------------------------------- +Mon Aug 12 15:30:32 UTC 2013 - schwab@suse.de + +- gdb-aarch64-hw-break.patch: fix setting hardware debug registers after + fork + +------------------------------------------------------------------- +Wed Aug 7 13:27:17 UTC 2013 - matz@suse.com + +- Merge from fedoras gdb-7.6.50-20130731-cvs, of what will become 7.7 + eventually. This includes 7.6, which gave: + * new native configurations (e.g. ARM AArch64 GNU/Linux) + * new targets (e.g. ARM AArch64, Lynx 178 PowerPC, x86_64/Cygwin) + * support for the "mini debuginfo" section, .gnu_debugdata + * the C++ ABI now defaults to the GNU v3 ABI + * more Python scripting improvements + * some GDB/MI improvements + * new configure options, new commands, and options + * new remote packets + * a new "target record-btrace" has been added while the + "target record" command has been renamed to "target record-full" +- gdb-ia64-tdep.patch: build fixes +- gdb-ppc-ptrace.diff: Remove patch, not needed on new kernels + +------------------------------------------------------------------- +Tue Jul 2 12:34:27 UTC 2013 - schwab@suse.de + +- Enable multi-target support +- gdb-ia64-tdep.patch: build fixes +- Use --build when configuring +- Don't remove %buildroot in %install +- Set pkgversion and bugurl + +------------------------------------------------------------------- +Sun Mar 17 05:16:06 UTC 2013 - matz@suse.com + +- Update to 7.5.50, mostly for aarch64. + +------------------------------------------------------------------- +Mon Dec 3 14:29:15 UTC 2012 - matz@suse.com + +- Merge from gdb-7.5.1-30.fc18.src.rpm. + + 7.5.1 gives: + * An "Attempt to dereference a generic pointer" errors (-var-create). + * Backtrace problems on x32 (PR backtrace/14646). + * next/step/finish problems on x32 (PR gdb/14647). + * A "malformed linespec error: unexpected keyword, [...]" error + (PR breakpoints/14643). + * GDB crash while stepping through powerpc (32bits) code. + * A failed assertion in linux_ptrace_test_ret_to_nx. + * A "!frame_id_inlined_p (frame_id)" failed assertion. + * A "No more reverse-execution history." error during reverse + "next" execution (PR 14548). + * Incomplete command descriptions in "apropos" output. + * PR gdb/14494 (a GDB crash difficult to characterize). + + 7.5 gives: + * Go language support. + * New targets (x32 ABI, microMIPS, Renesas RL78, HP OpenVMS ia64). + * More Python scripting improvements. + * SDT (Static Defined Tracing) probes support with SystemTap probes. + * GDBserver improvements (stdio connections, target-side evaluation + of breakpoint conditions, remote protocol improvements). + * Other miscellaneous improvements (ability to stop when a shared + library is loaded/unloaded, dynamic printf, etc). + * Reverse debugging on ARM. + +------------------------------------------------------------------- +Tue Jun 19 13:58:08 UTC 2012 - rguenther@suse.com + +- Do not provide a custom (safe) auto-load dir. + +------------------------------------------------------------------- +Tue Jun 12 13:00:14 UTC 2012 - rguenther@suse.com + +- Merge from gdb-7.4.50.20120603-3.fc18.src.rpm. + + * Wed Jun 6 2012 Jan Kratochvil - 7.4.50.20120603-3.fc18 + - Disable -lmcheck in the development builds. + - Fix assertion on some files as glibc-2.15.90-8.fc18 (Doug Evans). + + * Sun Jun 3 2012 Jan Kratochvil - 7.4.50.20120603-2.fc18 + - Fix Release. + - Make yum --enablerepo compatible with at least mock-1.1.21-1.fc16 Rawhide cfg. + + * Sun Jun 3 2012 Jan Kratochvil - 7.4.50.20120602-1.fc18 + - Rebase to FSF GDB 7.4.50.20120602. + - [testsuite] BuildRequire gcc-go. + - Drop printing 2D C++ vectors as matrices which no longer worked (BZ 562763). + - Fix dejagnu-1.5-4.fc17 compatibility for Go (for BZ 635651). + - Use librpm.so.3 for rpm-4.10.0 in Fedora 18. + - Revert recent breakage of UNIX objfiles order for symbols lookup. + + * Sat Jun 2 2012 Jan Kratochvil - 7.4.50.20120120-48.fc17 + - [ppc] Fix hardware watchpoints on PowerPC (BZ 827600, Edjunior Machado). + + * Mon May 28 2012 Jan Kratochvil - 7.4.50.20120120-47.fc17 + - Workaround PR libc/14166 for inferior calls of strstr. + + * Mon May 14 2012 Jan Kratochvil - 7.4.50.20120120-46.fc17 + - [RHEL5] Workaround doc build race. + + * Mon May 14 2012 Jan Kratochvil - 7.4.50.20120120-45.fc17 + - Rename "set auto-load" patchset variable $ddir to $datadir. + + * Wed May 9 2012 Jan Kratochvil - 7.4.50.20120120-44.fc17 + - Fix in "set auto-load" patchset for SCL scripts inheritance (BZ 815910). + + * Wed Apr 25 2012 Jan Kratochvil - 7.4.50.20120120-43.fc17 + - [RHEL5] Workaround kernel for detaching SIGSTOPped processes (BZ 809382). + + * Tue Apr 24 2012 Jan Kratochvil - 7.4.50.20120120-42.fc17 + - Update "set auto-load" patchset and the --with-auto-load-safe-path setting. + - [RHEL] Disable gdb-add-index even on RHEL-6 as RHEL-6.0 had too old elfutils. + + * Wed Apr 18 2012 Jan Kratochvil - 7.4.50.20120120-41.fc17 + - [RHEL] Fix --with-auto-load-safe-path systems prior to /usr move. + + * Wed Apr 18 2012 Jan Kratochvil - 7.4.50.20120120-40.fc17 + - Security fix for loading untrusted inferiors, see "set auto-load" (BZ 756117). + + * Fri Apr 13 2012 Jan Kratochvil - 7.4.50.20120120-39.fc17 + - [RHEL7] Fix/remove readline-devel BuildRequires redundant distro suffic .fc17. + + * Wed Apr 4 2012 Jan Kratochvil - 7.4.50.20120120-38.fc17 + - Workaround crashes from stale frame_info pointer (BZ 804256). + + * Wed Apr 4 2012 Jan Kratochvil - 7.4.50.20120120-37.fc17 + - testsuite: Fix break-interp.exp expections for updated glibc (BZ 752834). + + * Wed Apr 4 2012 Jan Kratochvil - 7.4.50.20120120-36.fc17 + - [RHEL5,RHEL6] Reintroduce fix attaching to stopped processes. + + * Fri Mar 30 2012 Jan Kratochvil - 7.4.50.20120120-35.fc17 + - Fix performance regressions with .gdb_index (Tom Tromey, BZ 805274). + + * Fri Mar 30 2012 Jan Kratochvil - 7.4.50.20120120-34.fc17 + - Fixup %{_datadir}/gdb timestamps for multilib conflicts on RHELs. + + * Mon Mar 26 2012 Jan Kratochvil - 7.4.50.20120120-33.fc17 + - [vla] Fix regression on no type for subrange from IBM XLF Fortran (BZ 806920). + + * Sat Mar 17 2012 Jan Kratochvil - 7.4.50.20120120-32.fc17 + - Fix loading of core files without build-ids but with build-ids in executables. + + * Fri Mar 9 2012 Jan Kratochvil - 7.4.50.20120120-31.fc17 + - Fix an implied regression by the inferior calls fix below (BZ 799531). + + * Fri Mar 9 2012 Jan Kratochvil - 7.4.50.20120120-30.fc17 + - Fix SELinux deny_ptrace .spec build rules (BZ 786878). + + * Tue Mar 6 2012 Jan Kratochvil - 7.4.50.20120120-29.fc17 + - Fix inferior calls, particularly uncaught thrown exceptions (BZ 799531). + - Fix DWARF DIEs CU vs. section relative offsets (Joel Brobecker, me). + + * Tue Mar 6 2012 Jan Kratochvil - 7.4.50.20120120-28.fc17 + - Print reasons for failed attach/spawn incl. SELinux deny_ptrace (BZ 786878). + + * Sun Mar 4 2012 Jan Kratochvil - 7.4.50.20120120-27.fc17 + - [rhel5] Fix up the previous commit (BZ 799318). + + * Sun Mar 4 2012 Jan Kratochvil - 7.4.50.20120120-26.fc17 + - [rhel5] Fix up the previous commit (BZ 799318). + + * Sun Mar 4 2012 Jan Kratochvil - 7.4.50.20120120-25.fc17 + - [rhel5] Workaround rpmbuild to make the doc subpkg noarch again (BZ 799318). + + * Fri Mar 2 2012 Jan Kratochvil - 7.4.50.20120120-24.fc17 + - [vla] Fix crash for dynamic.exp with gcc-gfortran-4.1.2-51.el5.x86_64. + - Reintroduce RHEL-5 glibc workaround for bt-clone-stop.exp. + - testsuite: Update/fix rh634108-solib_address.exp for the upstreamed API. + + * Wed Feb 29 2012 Jan Kratochvil - 7.4.50.20120120-23.fc17 + - Add kernel vDSO workaround (`no loadable ...') on RHEL-5 (kernel BZ 765875). + - Fix skipping of prologues on RHEL-5 gcc-4.1 -O2 -g code (BZ 797889). + - Fix breakpoint warning during 'next' over exit() (Tom Tromey, BZ 797892). + + * Tue Feb 28 2012 Jan Kratochvil - 7.4.50.20120120-22.fc17 + - testsuite: Fix gdb.base/macscp.exp ccache workaround in SCL mode. + - Adjust the RHEL/F version string automatically (BZ 797651, BZ 797646). + - Provide gdbtui for RHEL-5 and RHEL-6 as it is removed upstream (BZ 797664). + + * Fri Feb 24 2012 Jan Kratochvil - 7.4.50.20120120-21.fc17 + - testsuite: Do not use gcc44/gfortran44 on RHEL-5 if in SCL mode. + + * Wed Feb 22 2012 Jan Kratochvil - 7.4.50.20120120-20.fc17 + - Fix libinproctrace.so build on RHEL-5 i386 (disable it on RHEL-5). + + * Wed Feb 22 2012 Jan Kratochvil - 7.4.50.20120120-19.fc17 + - Implement SCL (scl-utils-build) macros. + + * Tue Feb 21 2012 Jan Kratochvil - 7.4.50.20120120-18.fc17 + - Fix debuginfo gdb-gdb.py build without redhat-rpm-config and on RHEL-5. + - Provide precompiled variants of gdb-gdb.py. + + * Mon Feb 13 2012 Jan Kratochvil - 7.4.50.20120120-17.fc17 + - gstack: Turn off --readnever (suggested by Oliver Henshaw). + + * Fri Feb 10 2012 Jan Kratochvil - 7.4.50.20120120-16.fc17 + - [RHELs] Drop simulation of legacy behavior - new GDB should behave as new GDB. + + * Fri Feb 10 2012 Jan Kratochvil - 7.4.50.20120120-15.fc17 + - Simplify %%setup .spec rule. + + * Fri Feb 10 2012 Jan Kratochvil - 7.4.50.20120120-14.fc17 + - Drop --with upstream .spec rules. + + * Fri Feb 10 2012 Jan Kratochvil - 7.4.50.20120120-13.fc17 + - Drop --with debug .spec rules. + + * Thu Feb 9 2012 Jan Kratochvil - 7.4.50.20120120-12.fc17 + - Improve performance for C++ symbols expansion (Tom Tromey, BZ 787487). + - Install also gdb-gdb.py pretty printers. + + * Thu Feb 9 2012 Jan Kratochvil - 7.4.50.20120120-11.fc17 + - Fix possible NULL crash in find_charset_names (Tom Tromey, BZ 786091). + - [ppc*] Fix build failure due to GCC aliasing warning (BZ 786504). + +------------------------------------------------------------------- +Tue Jun 12 07:41:22 UTC 2012 - cfarrell@suse.com + +- license update: GPL-3.0+ and GPL-3.0-with-GCC-exception and LGPL-2.1+ and + LGPL-3.0+ + SPDX format + +------------------------------------------------------------------- +Wed May 9 05:13:38 UTC 2012 - coolo@suse.com + +- Fix the minimum to get it through factory-auto + +------------------------------------------------------------------- +Tue Apr 3 14:08:43 UTC 2012 - rguenther@suse.com + +- Fixup missed debuginfo handling SUSE specifics. + +------------------------------------------------------------------- +Thu Jan 26 09:42:11 UTC 2012 - rguenther@suse.com + +- Merge from gdb-7.4.50.20120120-10.fc17.src.rpm. + + * Sat Jan 21 2012 Jan Kratochvil - 7.4.50.20120120-10.fc17 + - Rebase to FSF GDB 7.4.50.20120120. + - Drop the g77 .spec provisioning as it has been fixed in FSF GDB. + + * Thu Jan 19 2012 Jan Kratochvil - 7.4.50.20120103-9.fc17 + - Enable smaller %{_bindir}/gdb in future by no longer using -rdynamic. + - Make --enablerepo to use '*-debug*' for RHEL compatibility (BZ 781571). + - On older RHELs make readline bundled again (BZ 701131). + - Fix build compatibility with RHEL-5 due to false noarch build. + + * Wed Jan 11 2012 Jan Kratochvil - 7.4.50.20120103-8.fc17 + - Disable unexpected GDB directories relocatability. + + * Wed Jan 11 2012 Jan Kratochvil - 7.4.50.20120103-7.fc17 + - Fix BuildRequires for RHEL compatibility (BZ 701131). + + * Wed Jan 11 2012 Jan Kratochvil - 7.4.50.20120103-6.fc17 + - Provide %%snap timestamp for: Provides: bundled(librarypackage) + - Replace %%define by %%global. + - Replace Java in Summary with Fortran (only GCC-compiled Java is supported). + - Unbundle readline-6.2 with a workaround of skipped "ask" (BZ 701131). + - Work around readline-6.2 incompatibility not asking for --more-- (BZ 701131). + + * Sat Jan 7 2012 Jan Kratochvil - 7.4.50.20120103-5.fc17 + - Mark %{_sysconfdir}/gdbinit as %%config(noreplace). + - Add appropriate: Provides: bundled(librarypackage). + - Remove excessive explicit Requires: librarypackage. + + * Thu Jan 5 2012 Jan Kratochvil - 7.4.50.20120103-4.fc17 + - Fix linking on non-x86* (such as s390*) after libgdb.a removal. + + * Wed Jan 4 2012 Jan Kratochvil - 7.4.50.20120103-3.fc17 + - Reinclude gdb-dlopen-stap-probe.patch (missing in Fedora glibc - BZ 752476). + + * Tue Jan 3 2012 Jan Kratochvil - 7.4.50.20120103-2.fc17 + - Fix SystemTap support regression on i686 (Sergio Durigan Junior). + + * Tue Jan 3 2012 Jan Kratochvil - 7.4.50.20120103-1.fc17 + - Rebase to FSF GDB 7.4.50.20120103. + + * Mon Nov 28 2011 Jan Kratochvil - 7.3.50.20110722-11.fc17 + - No longer build bundled libstdc++ pretty printers on RHELs >= 7. + + * Sat Nov 5 2011 Sergio Durigan Junior - 7.3.50.20110722-10.fc16 + - Backport fix for crash in cp_scan_for_anonymous_namespace + (Aleksandar Ristovski, BZ 750341). + + * Fri Oct 14 2011 Jan Kratochvil - 7.3.50.20110722-9.fc16 + - Backport `info os processes' crash fix - for Eclipse (Pedro Alves, BZ 746294). + + * Tue Oct 11 2011 Jan Kratochvil - 7.3.50.20110722-8.fc16 + - Fix PIE testsuite run; new lib/future.exp hack and use -fPIC instead of -fPIE. + + * Mon Sep 26 2011 Jan Kratochvil - 7.3.50.20110722-7.fc16 + - [vla] Fix VLA arrays displayed in `bt full' (BZ 738482). + - Fix DW_OP_GNU_implicit_pointer for DWARF32 v3+ on 64-bit arches. + - Fix internal error on some optimized-out values. + + * Tue Aug 16 2011 Jan Kratochvil - 7.3.50.20110722-6.fc16 + - Python command/function auto-loading (Phil Muldoon, BZ 730976). + - Work around PR libc/13097 "linux-vdso.so.1" warning message. + - [TUI] Fix stepi on stripped code. + - Add BuildRequires: systemtap-sdt-devel for archer-sergiodj-stap-patch-split. + + * Wed Aug 10 2011 Jan Kratochvil - 7.3.50.20110722-5.fc16 + - Fix dlopen of libpthread.so, patched glibc required (Gary Benson, BZ 669432). + + * Tue Aug 9 2011 Jan Kratochvil - 7.3.50.20110722-4.fc16 + - Improve GDB performance on inferior dlopen calls (Gary Benson, BZ 698001). + - [python] Fix crash when pretty printer fails (Phil Muldoon, BZ 712715). + - Fix crash on invalid C++ mangled names (BZ 729283). + + * Fri Jul 29 2011 Jan Kratochvil - 7.3.50.20110722-3.fc16 + - Fix regression from VLA merge affecting -O0 -g watchpoints. + + * Fri Jul 29 2011 Jan Kratochvil - 7.3.50.20110722-2.fc16 + - Include gcc -g3 .debug_macro implementation by Tom Tromey. + + * Sat Jul 23 2011 Jan Kratochvil - 7.3.50.20110722-1.fc16 + - Rebase to FSF GDB 7.3.50.20110722. + - Improve gcc-4.6 stdarg false prologue end workaround (GDB PR 12435 + GCC PR 47471). + +------------------------------------------------------------------- +Wed Oct 12 12:09:41 UTC 2011 - rguenther@suse.com + +- Add patch to use old ptrace interface on powerpc to fix watchpoint + issues. [bnc#718313] + +------------------------------------------------------------------- +Thu Aug 4 10:28:50 UTC 2011 - rguenther@novell.com + +- Merge from gdb-7.3-41.fc15.src.rpm. [fate#310741] + + * Tue Jul 26 2011 Jan Kratochvil - 7.3-41.fc15 + - Rebase to the final FSF GDB 7.3 release. + - Improve gcc-4.6 stdarg false prologue end workaround (GDB PR 12435 + GCC PR 47471). + + * Sun Jul 3 2011 Jan Kratochvil - 7.2.90.20110703-40.fc15 + - Rebase to FSF GDB 7.2.90.20110703 (which is a 7.3 pre-release). + - Adjust the `print errno' patch due to the DW_AT_linkage_name following again. + + * Fri Jun 24 2011 Jan Kratochvil - 7.2.90.20110525-39.fc15 + - Fix install-info for the gdb-doc subpackage (BZ 715228). + +------------------------------------------------------------------- +Thu Jun 16 09:18:33 UTC 2011 - rguenther@novell.com + +- Merge from gdb-7.2.90.20110525-38.fc15.src.rpm. [fate#310741] + + * Wed May 25 2011 Jan Kratochvil - 7.2.90.20110525-38.fc15 + - Rebase to FSF GDB 7.2.90.20110525 (which is a 7.3 pre-release). + - [stap] Fix double free (Sergio Durigan Junior). + + * Tue May 3 2011 Jan Kratochvil - 7.2.90.20110429-37.fc15 + - Search also for . files in /usr/lib/debug/.build-id (BZ 641377). + +------------------------------------------------------------------- +Wed May 18 11:01:03 UTC 2011 - rguenther@novell.com + +- Merge from gdb-7.2.90.20110429-36.fc15.src.rpm. + + * Mon May 2 2011 Jan Kratochvil - 7.2.90.20110429-36.fc15 + - Bundle readline-6.2 with a workaround of skipped "ask" (BZ 701131). + - Use --without-system-readline, disable Requires and BuildRequires of readline. + - Drop gdb-6.5-readline-long-line-crash.patch and gdb-readline-6.0-signal.patch. + + * Fri Apr 29 2011 Jan Kratochvil - 7.2.90.20110429-35.fc15 + - Rebase to FSF GDB 7.2.90.20110429 (which is a 7.3 pre-release). + - Fix -O2 -g breakpoints internal error + prologue skipping (BZ 612253). + - Fix case insensitive symbols for Fortran by iFort (BZ 645773). + - Fix physname-related CU expansion issue for C++ (PR 12708). + - Fix Python access to inlined frames (BZ 694824). + + * Mon Apr 11 2011 Jan Kratochvil - 7.2.90.20110411-34.fc15 + - Rebase to FSF GDB 7.2.90.20110411 (which is a 7.3 pre-release). + - Include the proper fix for anonymous struct typedefs (Tom Tromey, BZ 672230). + + * Wed Mar 30 2011 Fabio M. Di Nitto - 7.2.50.20110328-33.fc15 + - Cleanup spec file to add sparc|sparcv9|sparc64. + - Add sparc specific workarounds to toolchain badness: + - disable mmap in bdf/ via --without-mmap configure option. + - add patch to not build mmap support on sparc for gdb/. + - gdb code is NOT at fault, but we need a working gdb while we sort out + the toolchain and rebuild all packages. this workaround is NOT for upstream. + + * Tue Mar 29 2011 Jan Kratochvil - 7.2.50.20110328-32.fc15 + - Fix occasional crash on `print errno' with no -pthread and no -g3 (BZ 690908). + +------------------------------------------------------------------- +Thu Apr 14 12:50:20 UTC 2011 - rguenther@novell.com + +- Merge from gdb-7.2.50.20110328-31.fc15.src.rpm. + + * Mon Mar 28 2011 Jan Kratochvil - 7.2.50.20110328-31.fc15 + - Rebase to FSF GDB 7.2.50.20110328 (which is a 7.3 pre-release). + - Bundle %%{libstdcxxpython}.tar.bz2 unconditionally - for rebulds on RHELs. + + * Sun Mar 20 2011 Jan Kratochvil - 7.2.50.20110320-30.fc15 + - Fix threading internal error on corrupted memory (BZ 677654). + - Fix i386 rwatch+awatch before run (BZ 688788, on top of BZ 541866). + + * Sun Mar 20 2011 Jan Kratochvil - 7.2.50.20110320-29.fc15 + - Rebase to FSF GDB 7.2.50.20110320 (which is a 7.3 pre-release). + - Merge archer-sergiodj-stap, the SystemTap probes breakpoints feature. + - [stap] Fix -O2 warnings. + - Fix Ada support crash on uninitialized gdbarch. + + * Sat Mar 5 2011 Jan Kratochvil - 7.2.50.20110305-28.fc15 + - Rebase to FSF GDB 7.2.50.20110305 (which is a 7.3 pre-release). + + * Fri Feb 25 2011 Jan Kratochvil - 7.2.50.20110222-27.fc15 + - Include doc also in the PDF form; new BuildRequires: texinfo-tex. + + * Wed Feb 23 2011 Jan Kratochvil - 7.2.50.20110222-26.fc15 + - Rebase to FSF GDB 7.2.50.20110222 (which is a 7.3 pre-release). + - Fix attach/core-load of {,un}prelinked i386 libs (bugreport by Michal Toman). + + * Mon Feb 21 2011 Jan Kratochvil - 7.2.50.20110218-25.fc15 + - Drop %%{_datadir}/gdb/syscalls/* for unsupported arches. + + * Fri Feb 18 2011 Jan Kratochvil - 7.2.50.20110218-24.fc15 + - Rebase to FSF GDB 7.2.50.20110218 (which is a 7.3 pre-release). + - [vla] Fox Fortran vector slices for allocated arrays (for BZ 609782). + + * Tue Feb 15 2011 Jan Kratochvil - 7.2.50.20110213-23.fc15 + - Move the GFDL License to gdb-doc. + + * Tue Feb 15 2011 Jan Kratochvil - 7.2.50.20110213-22.fc15 + - Fix gdb-doc Group to be Documentation, also provide it as noarch. + + * Tue Feb 15 2011 Jan Kratochvil - 7.2.50.20110213-21.fc15 + - Drop non-user (gdbint) and obsolete (stabs) documentation. + - Install also HTML files besides the INFO file. + - Create new subpackage gdb-doc for both INFO and HTML files. + + * Sun Feb 13 2011 Jan Kratochvil - 7.2.50.20110213-20.fc15 + - Rebase to FSF GDB 7.2.50.20110213 (which is a 7.3 pre-release). + - Fix occasionall unfound source lines (affecting at least glibc debugging). + - Fix const/volatile qualifiers of C++ types (PR c++/12328). + - Be backward compatible for --rebuild with <=fc14 librpm.so.1. + +- Revert documentation split. + +------------------------------------------------------------------- +Thu Mar 3 12:42:45 UTC 2011 - rguenther@novell.com + +- Merge from gdb-7.2.50.20110206-19.fc15.src.rpm. + + * Tue Feb 08 2011 Fedora Release Engineering - 7.2.50.20110206-19 + - Rebuilt for https://fedoraproject.org/wiki/Fedora_15_Mass_Rebuild + + * Sun Feb 6 2011 Jan Kratochvil - 7.2.50.20110206-18.fc15 + - Fix regressions on C++ names resolving (PR 11734, PR 12273, Keith Seitz). + + * Sun Feb 6 2011 Jan Kratochvil - 7.2.50.20110206-17.fc15 + - Rebase to FSF GDB 7.2.50.20110206 (which is a 7.3 pre-release). + + * Thu Jan 27 2011 Jan Kratochvil - 7.2.50.20110125-16.fc15 + - Fix Python new-backtrace command (BZ 672235, Phil Muldoon). + + * Wed Jan 26 2011 Jan Kratochvil - 7.2.50.20110125-15.fc15 + - Temporary fix of F15 gcc-4.6 child DIEs of DW_TAG_typedef (BZ 672230). + - Workaround gcc-4.6 stdarg false prologue end (GDB PR 12435 + GCC PR 47471). + + * Tue Jan 25 2011 Jan Kratochvil - 7.2.50.20110125-14.fc15 + - Rebase to FSF GDB 7.2.50.20110125 (which is a 7.3 pre-release). + - Fix discontiguous address ranges in .gdb_index - v3->v4 (BZ 672281). + - Fix DWARF-3+ DW_AT_accessibility default assumption for F15 gcc-4.6. + + * Thu Jan 20 2011 Jan Kratochvil - 7.2.50.20110117-13.fc15 + - Use librpm.so.2 for rpm-4.9.0 in Fedora 15. + + * Mon Jan 17 2011 Jan Kratochvil - 7.2.50.20110117-12.fc15 + - Use %%{?dist} for sanity checking tools compliance (suggested by Petr Muller). + + * Mon Jan 17 2011 Jan Kratochvil - 7.2.50.20110117-11.fc15 + - Rebase to FSF GDB 7.2.50.20110117 (which is a 7.3 pre-release). + - Fix callback-mode readline-6.0 regression for CTRL-C (for RHEL-6.0). + - Fix occasional NULL dereference of the readline-6.0 workaround (BZ 575516). + + * Sat Jan 15 2011 Jan Kratochvil - 7.2.50.20110107-10.fc15 + - [delayed-symfile] Test a backtrace regression on CFIs without DIE (BZ 614604). + - [archer-tromey-delayed-symfile] New test gdb.dwarf2/dw2-aranges.exp. + - [archer-keiths-expr-cumulative+upstream] Import C++ testcases. + - testsuite: Fix gdb-test-expr-cumulative-archer.patch compatibility. + + * Fri Jan 7 2011 Jan Kratochvil - 7.2.50.20110107-9.fc15 + - Remove --with-pythondir as no longer valid. + - Provide %{_bindir}gdb-add-index even on RHEL-5. + - Provide again libstdc++ pretty printers for any RHEL. + + * Fri Jan 7 2011 Jan Kratochvil - 7.2.50.20110107-8.fc15 + - Rebase to FSF GDB 7.2.50.20110107 (which is a 7.3 pre-release). + - Import archer-tromey-python (BZ 666177, branch update by Phil Muldoon). + + * Tue Jan 4 2011 Jan Kratochvil - 7.2.50.20110104-7.fc15 + - Rebase to FSF GDB 7.2.50.20110104 (which is a 7.3 pre-release). + - New testcase py-prettyprint.exp:print hint_error (for BZ 611569, BZ 629236). + - New test gdb.arch/x86_64-pid0-core.exp for kernel PID 0 cores (BZ 611435). + + * Sat Jan 1 2011 Jan Kratochvil - 7.2.50.20101231-6.fc15 + - Fix --with-system-readline doc build upstream regression. + + * Sat Jan 1 2011 Jan Kratochvil - 7.2.50.20101231-5.fc15 + - Rebase to FSF GDB 7.2.50.20101231 (which is a 7.3 pre-release). + - Remove gdb-6.3-bt-past-zero-20051201.patch, gdb-archer-ada.patch and + gdb-6.3-framepczero-20040927.patch already removed from .spec before. + - Remove gdb-6.5-dwarf-stack-overflow.patch, upstreamed (Tom Tromey). + - Remove gdb-6.6-bz225783-gdb-debuginfo-paths.patch, upstreamed (Tom Tromey). + - Remove gdb-6.6-readline-system.patch, reimplemented upstream (Tom Tromey). + - Remove gdb-bz642879-elfread-sigint-stale.patch, upstreamed (Jan Kratochvil). + - Remove gdb-next-over-throw.patch, upstreamed (Tom Tromey). + + * Mon Dec 27 2010 Jan Kratochvil - 7.2.50.20101117-4.fc15 + - Provide stub %%{_sysconfdir}/gdbinit (BZ 651232). + + * Mon Dec 27 2010 Jan Kratochvil - 7.2.50.20101117-3.fc15 + - Fix ppc* compilation of PRPSINFO in the core files (BZ 662995, for BZ 254229). + - Fix (disable) non-x86* compilation of libinproctrace.so (for BZ 662995). + + * Thu Nov 18 2010 Jan Kratochvil - 7.2.50.20101117-2.fc15 + - Drop gdb-6.8-glibc-headers-compat.patch: GNU/Linux irrelevant (Tom Tromey). + - Drop gdb-6.3-terminal-fix-20050214.patch: The bug is not reproducible. + - Drop gdb-6.7-kernel-headers-compat.patch: kernel-headers seem to be fixed. + - Drop gdb-archer-ada.patch: No longer needed for Ada (Keith Seitz). + - New PR backtrace/12237, drop gdb-6.3-framepczero-20040927.patch + gdb-6.3-bt-past-zero-20051201.patch as they already had no effect. + - Drop gdb-6.8-gcc35998-ada-memory-trash.patch as a different fix is upstream. + - Drop gdb-6.3-inheritance-20050324.patch: the call is redundent (Tom Tromey). + - Drop gdb-6.3-large-core-20051206.patch: obsoleted by MAX_COPY_BYTES. + + * Thu Nov 18 2010 Jan Kratochvil - 7.2.50.20101117-1.fc15 + - Rebase to FSF GDB 7.2.50.20101117 (which is a 7.3 pre-release). + + * Sun Nov 7 2010 Jan Kratochvil - 7.2-25.fc14 + - iFort compat. - case insensitive DWARF not in lowercase (BZ 645773). + + * Thu Oct 14 2010 Jan Kratochvil - 7.2-24.fc14 + - Add gdb.spec comments on the *.patch files upstream merge status. + + * Thu Oct 14 2010 Jan Kratochvil - 7.2-23.fc14 + - Workaround librpm BZ 643031 due to its unexpected exit() calls (BZ 642879). + - Fix crash on CTRL-C while reading an ELF symbol file (BZ 642879). + + * Tue Oct 12 2010 Jan Kratochvil - 7.2-22.fc14 + - testsuite: Provide missing lib/gdb-python.exp (for BZ 639089). + + * Tue Oct 12 2010 Jan Kratochvil - 7.2-21.fc14 + - Fix python stale error state, also fix its save/restore (BZ 639089). + - Fix inferior exec of new PIE x86_64 (BZ 638979). + + * Tue Oct 12 2010 Jan Kratochvil - 7.2-20.fc14 + - Fixup Release for 20.fc14. + + * Tue Oct 12 2010 Jan Kratochvil - 7.2-19.fc14 + - Use .gdb_index v3 to fix excessive resources rqmnts (BZ 640634, Tom Tromey). + + * Wed Oct 6 2010 Jan Kratochvil - 7.2-18.fc14 + - Fix false warning: non-absolute filename: (BZ 640648). + + * Thu Sep 30 2010 Jan Kratochvil - 7.2-17.fc14 + - New Conflicts: elfutils < 0.149 due to the .gdb_index .debug support. + +------------------------------------------------------------------- +Mon Dec 6 13:53:30 UTC 2010 - rguenther@novell.com + +- On SLE10 package libinproctrace in the main gdb package. + +------------------------------------------------------------------- +Wed Oct 13 10:52:15 UTC 2010 - rguenther@novell.com + +- Merge from gdb-7.2-16.fc14.src.rpm. + +------------------------------------------------------------------- +Mon Sep 13 10:42:49 UTC 2010 - rguenther@novell.com + +- Change python-base from recommends to requires, gdb no longer + works without some basic python modules. [bnc#638858] + +------------------------------------------------------------------- +Mon Sep 6 09:45:11 UTC 2010 - rguenther@novell.com + +- Merge from gdb-7.2-1.fc14.src.rpm. + +------------------------------------------------------------------- +Wed Aug 25 11:04:38 UTC 2010 - rguenther@novell.com + +- Backport fix for gcore not handling GNU_RELRO sections. [bnc#596646] + +------------------------------------------------------------------- +Wed Aug 25 10:53:50 UTC 2010 - rguenther@novell.com + +- Merge from gdb-7.1-33.fc13.src.rpm. + +------------------------------------------------------------------- +Fri Aug 6 12:25:13 UTC 2010 - rguenther@novell.com + +- Backport fix for setting of VSX registers. [bnc#626970] + +------------------------------------------------------------------- +Thu Aug 5 11:24:00 UTC 2010 - rguenther@novell.com + +- Merge from gdb-7.1-30.fc13.src.rpm. + +------------------------------------------------------------------- +Thu Aug 5 11:18:33 UTC 2010 - rguenther@novell.com + +- For SLE10 do not build a separate gdbserver package. + +------------------------------------------------------------------- +Thu Jul 22 09:54:36 UTC 2010 - rguenther@novell.com + +- Merge from gdb-7.1-29.fc13.src.rpm. + +------------------------------------------------------------------- +Tue Jun 1 11:46:20 UTC 2010 - rguenther@novell.com + +- Fix build on hppa fix. + +------------------------------------------------------------------- +Tue Jun 1 10:57:30 UTC 2010 - bg@novell.com + +- Fix build on hppa. + +------------------------------------------------------------------- +Fri May 21 12:17:19 UTC 2010 - rguenther@novell.com + +- Merge from gdb-7.1-20.fc13.src.rpm. + +------------------------------------------------------------------- +Thu Apr 22 19:13:48 UTC 2010 - aj@suse.de + +- Add upstream change to fix build with -Werror + +------------------------------------------------------------------- +Thu Apr 15 14:22:36 CEST 2010 - rguenther@novell.com + +- Merge from gdb-7.1-12.fc13.src.rpm. +- Re-write history to match SLE11 SP1 changelog + * Drop some more strange RHEL stuff. + * Fix build for SLE10. + +------------------------------------------------------------------- +Mon Mar 15 11:21:05 CET 2010 - rguenther@novell.com + +- Fix info documentation registering. [bnc#588278] + +------------------------------------------------------------------- +Thu Feb 11 13:43:11 CET 2010 - kukuk@suse.de + +- Re-Add baselibs.conf + +------------------------------------------------------------------- +Thu Oct 22 17:03:30 CEST 2009 - rguenther@suse.de + +- Merge from gdb-7.0-2.fc12.src.rpm. [fate#304116] + [bnc#488132] [bnc#498749] + +------------------------------------------------------------------- +Mon Oct 19 12:48:43 CEST 2009 - rguenther@suse.de + +- Recommend python-base. + +------------------------------------------------------------------- +Mon Oct 12 10:22:38 CEST 2009 - rguenther@suse.de + +- Fix python dependency. + +------------------------------------------------------------------- +Wed Oct 7 15:11:51 UTC 2009 - crrodriguez@opensuse.org + +- fix info files (un)installation. + +------------------------------------------------------------------- +Mon Oct 5 14:23:33 CEST 2009 - rguenther@suse.de + +- Merge from gdb-6.8.91.20090930-2.fc12.src.rpm. + +------------------------------------------------------------------- +Thu Sep 24 11:40:44 CEST 2009 - rguenther@suse.de + +- Merge from gdb-6.8.91.20090921-1.fc12.src.rpm. + +------------------------------------------------------------------- +Mon Sep 14 14:29:20 CEST 2009 - rguenther@suse.de + +- Merge from gdb-6.8.50.20090910-1.fc12.src.rpm. + +------------------------------------------------------------------- +Mon Aug 24 17:30:30 CEST 2009 - rguenther@suse.de + +- Fix gdb-6.3-ia64-sigtramp-frame-20050708.patch patch to allow + ia64 to build again. + +------------------------------------------------------------------- +Mon Aug 24 14:07:52 CEST 2009 - rguenther@suse.de + +- Merge from gdb-6.8.50.20090818-4.fc12.src.rpm. + +------------------------------------------------------------------- +Mon Aug 17 14:04:46 CEST 2009 - rguenther@suse.de + +- Merge from gdb-6.8.50.20090811-2.fc12.src.rpm. + +------------------------------------------------------------------- +Tue Aug 11 17:32:38 CEST 2009 - rguenther@suse.de + +- Remove no longer applied patches. + +------------------------------------------------------------------- +Thu Aug 6 12:29:19 CEST 2009 - rguenther@suse.de + +- Fixup the merge. + +------------------------------------------------------------------- +Thu Aug 6 12:11:40 CEST 2009 - rguenther@suse.de + +- Merge from gdb-6.8.50.20090803-2.fc12.src.rpm. + +------------------------------------------------------------------- +Tue Jul 28 13:44:45 CEST 2009 - rguenther@suse.de + +- Fix crash during debuginfo reading. + +------------------------------------------------------------------- +Wed Jul 8 13:22:36 CEST 2009 - rguenther@suse.de + +- Drop fixes done upstream. + +------------------------------------------------------------------- +Wed Jun 17 16:43:08 CEST 2009 - matz@suse.de + +- Apply fix for backtraces without unwind info again. [#390722] +- Disable gdb-6.5-bz218379-ppc-solib-trampoline-fix.patch, it's not + necessary anymore and breaks the above. + +------------------------------------------------------------------- +Wed May 27 18:07:26 CEST 2009 - rguenther@suse.de + +- Merge FC11 update 23. + - Fix crashes due to (missing) varobj revalidation, for VLA (for brc#377541). + - Archer update to the snapshot: e2812eadef2c15baeccd003e11fdf3fbc0b90dc2 + - Archer backport: 58dcda94ac5d6398f47382505e9d3d9d866d79bf + + f3de7bbd655337fe6705aeaafcc970deff3dd5d5 + - Implement Fortran modules namespaces (brc#466118). + +------------------------------------------------------------------- +Mon May 18 10:42:26 CEST 2009 - rguenther@suse.de + +- Add patch to fix handling of string DW_AT_const_values. [bnc#329420] +- Verified + * Fix printing of 'inf'. [bnc#466266] + * Stepping through templates. [bnc#414230] + * gcore script. [fate#303462] + +------------------------------------------------------------------- +Thu May 14 15:26:42 CEST 2009 - rguenther@suse.de + +- Change reported version to mention SUSE instead of Fedora. +- Fix handling of bogus global namespace DIEs from GCC 4.1. [bnc#329420] +- Fix Power7 DFP detection. [bnc#492331] + +------------------------------------------------------------------- +Thu May 7 15:00:14 CEST 2009 - rguenther@suse.de + +- Fix build for SLE10. [fate#305977] +- Adjust missing debug packages suggested install command. + +------------------------------------------------------------------- +Wed Apr 29 15:11:15 CEST 2009 - rguenther@suse.de + +- Adjust package name and release to not contain macros. + +------------------------------------------------------------------- +Mon Apr 27 16:18:02 CEST 2009 - rguenther@suse.de + +- Disable rpm support for locating debug info packages. + +------------------------------------------------------------------- +Mon Apr 27 13:33:06 CEST 2009 - rguenther@suse.de + +- Switch to Fedora 11 source RPM. + * includes partially merge from Archer. [bnc#329420, bnc#497141, + bnc#492782] + +------------------------------------------------------------------- +Tue Mar 10 11:14:25 CET 2009 - rguenther@suse.de + +- Add VLA support patch from Fedora to fix possible + dwarf_expr_frame_base NULL checking regression. +- Fix readline incompatibility. + +------------------------------------------------------------------- +Mon Mar 2 11:42:03 CET 2009 - rguenther@suse.de + +- Integrate support for transparently debugging inline functions. + +------------------------------------------------------------------- +Mon Feb 16 11:40:00 CET 2009 - schwab@suse.de + +- Update to head to trunk. + +------------------------------------------------------------------- +Tue Feb 3 16:18:13 CET 2009 - schwab@suse.de + +- Fix merge error. + +------------------------------------------------------------------- +Thu Jan 22 17:17:14 CET 2009 - schwab@suse.de + +- Add updates for Cell combined debugger. + +------------------------------------------------------------------- +Tue Jan 20 15:45:56 CET 2009 - schwab@suse.de + +- Do not call get_frame_arch for NULL frame pointers. +- Remove deprecated_safe_get_selected_frame call from read_var_value. + +------------------------------------------------------------------- +Fri Jan 16 15:30:23 CET 2009 - bwalle@suse.de + +- Recommend Python for GDB to prevent strange error messages to + be presented to the user in the default case. + +------------------------------------------------------------------- +Wed Dec 10 12:34:56 CET 2008 - olh@suse.de + +- use Obsoletes: -XXbit only for ppc64 to help solver during distupgrade + (bnc#437293) + +------------------------------------------------------------------- +Thu Nov 20 16:33:45 CET 2008 - schwab@suse.de + +- Update to head of trunk. +- Don't lose running state of the inferior. +- Fix dangling pointers after following fork. + +------------------------------------------------------------------- +Sun Nov 9 19:18:33 CET 2008 - schwab@suse.de + +- Update .debug_line parser patch. + +------------------------------------------------------------------- +Mon Nov 3 19:21:09 CET 2008 - schwab@suse.de + +- Update to head of trunk. +- Fix auxv decoding. + +------------------------------------------------------------------- +Mon Nov 3 12:51:52 CET 2008 - schwab@suse.de + +- Revert broken change from jblunck. + +------------------------------------------------------------------- +Thu Oct 30 12:34:56 CET 2008 - olh@suse.de + +- obsolete old -XXbit packages (bnc#437293) + +------------------------------------------------------------------- +Tue Oct 28 12:43:31 CET 2008 - jblunck@suse.de + +- Fix segfault when reading line number program (bnc #439457). + +------------------------------------------------------------------- +Mon Oct 27 16:05:13 CET 2008 - schwab@suse.de + +- Complain about invalid line number program. + +------------------------------------------------------------------- +Tue Oct 7 15:00:24 CEST 2008 - schwab@suse.de + +- Fix crash. + +------------------------------------------------------------------- +Wed Sep 24 14:23:01 CEST 2008 - schwab@suse.de + +- Update to head of trunk. +- Add POWER7 support. +- Add gcore. +- Add spu-elf to list of targets. + +------------------------------------------------------------------- +Fri Sep 12 11:36:50 CEST 2008 - schwab@suse.de + +- Update to head of trunk. +- Add Cell combined debugger patch. + +------------------------------------------------------------------- +Thu Sep 4 11:30:34 CEST 2008 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Fri Aug 15 17:58:02 CEST 2008 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Fri Aug 8 15:30:07 CEST 2008 - schwab@suse.de + +- Update to head of trunk. +- Enable multi-target support. + +------------------------------------------------------------------- +Fri Jul 18 13:18:33 CEST 2008 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Mon Jul 7 13:42:05 CEST 2008 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Wed Jun 18 16:47:02 CEST 2008 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Fri May 23 11:29:13 CEST 2008 - matz@suse.de + +- Try harder to provide backtraces without debuginfo on i386. [bnc #390722] + +------------------------------------------------------------------- +Wed May 21 10:39:41 CEST 2008 - schwab@suse.de + +- Fix assertion failure. + +------------------------------------------------------------------- +Fri May 9 14:05:00 CEST 2008 - schwab@suse.de + +- Split off gdbserver. +- Fix watchpoints. + +------------------------------------------------------------------- +Thu Apr 10 12:54:45 CEST 2008 - ro@suse.de + +- added baselibs.conf file to build xxbit packages + for multilib support + +------------------------------------------------------------------- +Fri Mar 28 10:55:28 CET 2008 - schwab@suse.de + +- Update to gdb 6.8. + * New native configurations + NetBSD/hppa hppa*-*netbsd* + Xtensa GNU/Linux xtensa*-*-linux* + * New targets + NetBSD/hppa hppa*-*-netbsd* + Xtensa GNU/Lunux xtensa*-*-linux* + * Change in command line behavior -- corefiles vs. process ids. + When the '-p NUMBER' or '--pid NUMBER' options are used, and + attaching to process NUMBER fails, GDB no longer attempts to open a + core file named NUMBER. Attaching to a program using the -c option + is no longer supported. Instead, use the '-p' or '--pid' options. + * GDB can now be built as a native debugger for debugging Windows x86 + (mingw32) Portable Executable (PE) programs. + * Pending breakpoints no longer change their number when their address + is resolved. + * GDB now supports breakpoints with multiple locations, + including breakpoints on C++ constructors, inside C++ templates, + and in inlined functions. + * GDB's ability to debug optimized code has been improved. GDB more + accurately identifies function bodies and lexical blocks that occupy + more than one contiguous range of addresses. + * Target descriptions can now describe registers for PowerPC. + * The GDB remote stub, gdbserver, now supports the AltiVec and SPE + registers on PowerPC targets. + * The GDB remote stub, gdbserver, now supports thread debugging on GNU/Linux + targets even when the libthread_db library is not available. + * The GDB remote stub, gdbserver, now supports the new file transfer + commands (remote put, remote get, and remote delete). + * The GDB remote stub, gdbserver, now supports run and attach in + extended-remote mode. + * hppa*64*-*-hpux11* target broken + The debugger is unable to start a program and fails with the following + error: "Error trying to get information about dynamic linker". + The gdb-6.7 release is also affected. + * GDB now supports the --enable-targets= configure option to allow + building a single GDB executable that supports multiple remote + target architectures. + * GDB now supports debugging C and C++ programs which use the + Decimal Floating Point extension. In addition, the PowerPC target + now has a set of pseudo-registers to inspect decimal float values + stored in two consecutive float registers. + * The -break-insert MI command can optionally create pending + breakpoints now. + * Improved support for debugging Ada + Many improvements to the Ada language support have been made. These + include: + - Better support for Ada2005 interface types + - Improved handling of arrays and slices in general + - Better support for Taft-amendment types + - The '{type} ADDRESS' expression is now allowed on the left hand-side + of an assignment + - Improved command completion in Ada + - Several bug fixes + * New commands + set print frame-arguments (all|scalars|none) + show print frame-arguments + The value of this variable can be changed to control which argument + values should be printed by the debugger when displaying a frame. + remote put + remote get + remote delete + Transfer files to and from a remote target, and delete remote files. + * New MI commands + -target-file-put + -target-file-get + -target-file-delete + Transfer files to and from a remote target, and delete remote files. + * New remote packets + vFile:open: + vFile:close: + vFile:pread: + vFile:pwrite: + vFile:unlink: + Open, close, read, write, and delete files on the remote system. + * GDB on GNU/Linux and HP/UX can now debug through "exec" of a new + process. + vAttach + Attach to an existing process on the remote system, in extended-remote + mode. + vRun + Run a new process on the remote system, in extended-remote mode. + +------------------------------------------------------------------- +Wed Mar 5 15:38:06 CET 2008 - schwab@suse.de + +- Update to head of gdb_6_8-branch. + +------------------------------------------------------------------- +Thu Feb 14 13:41:54 CET 2008 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Thu Jan 31 15:34:47 CET 2008 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Thu Jan 10 11:57:13 CET 2008 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Mon Nov 12 14:47:26 CET 2007 - schwab@suse.de + +- Update to gdb 6.7.1. + * hppa*64*-*-hpux11* target broken + The debugger is unable to start a program and fails with the following + error: "Error trying to get information about dynamic linker". + The gdb-6.7 release is also affected. + +------------------------------------------------------------------- +Fri Oct 19 15:02:27 CEST 2007 - olh@suse.de + +- allow build with old distributions, libexpat-devel is new in 10.3 + +------------------------------------------------------------------- +Thu Oct 11 18:52:04 CEST 2007 - schwab@suse.de + +- Update to gdb 6.7. + * Resolved 101 resource leaks, null pointer dereferences, etc. in gdb, + bfd, libiberty and opcodes, as revealed by static analysis donated by + Coverity, Inc. (http://scan.coverity.com). + * When looking up multiply-defined global symbols, GDB will now prefer the + symbol definition in the current shared library if it was built using the + -Bsymbolic linker option. + * When the Text User Interface (TUI) is not configured, GDB will now + recognize the -tui command-line option and print a message that the TUI + is not supported. + * The GDB remote stub, gdbserver, now has lower overhead for high + frequency signals (e.g. SIGALRM) via the QPassSignals packet. + * GDB for MIPS targets now autodetects whether a remote target provides + 32-bit or 64-bit register values. + * Support for C++ member pointers has been improved. + * GDB now understands XML target descriptions, which specify the + target's overall architecture. GDB can read a description from + a local file or over the remote serial protocol. + * Vectors of single-byte data use a new integer type which is not + automatically displayed as character or string data. + * The /s format now works with the print command. It displays + arrays of single-byte integers and pointers to single-byte integers + as strings. + * Target descriptions can now describe target-specific registers, + for architectures which have implemented the support (currently + only ARM, M68K, and MIPS). + * GDB and the GDB remote stub, gdbserver, now support the XScale + iWMMXt coprocessor. + * The GDB remote stub, gdbserver, has been updated to support + ARM Windows CE (mingw32ce) debugging, and GDB Windows CE support + has been rewritten to use the standard GDB remote protocol. + * GDB can now step into C++ functions which are called through thunks. + * GDB for the Cell/B.E. SPU now supports overlay debugging. + * The GDB remote protocol "qOffsets" packet can now honor ELF segment + layout. It also supports a TextSeg= and DataSeg= response when only + segment base addresses (rather than offsets) are available. + * The /i format now outputs any trailing branch delay slot instructions + immediately following the last instruction within the count specified. + * The GDB remote protocol "T" stop reply packet now supports a + "library" response. Combined with the new "qXfer:libraries:read" + packet, this response allows GDB to debug shared libraries on targets + where the operating system manages the list of loaded libraries (e.g. + Windows and SymbianOS). + * The GDB remote stub, gdbserver, now supports dynamic link libraries + (DLLs) on Windows and Windows CE targets. + * GDB now supports a faster verification that a .debug file matches its binary + according to its build-id signature, if the signature is present. + * New commands + set remoteflow + show remoteflow + Enable or disable hardware flow control (RTS/CTS) on the serial port + when debugging using remote targets. + set mem inaccessible-by-default + show mem inaccessible-by-default + If the target supplies a memory map, for instance via the remote + protocol's "qXfer:memory-map:read" packet, setting this variable + prevents GDB from accessing memory outside the memory map. This + is useful for targets with memory mapped registers or which react + badly to accesses of unmapped address space. + set breakpoint auto-hw + show breakpoint auto-hw + If the target supplies a memory map, for instance via the remote + protocol's "qXfer:memory-map:read" packet, setting this variable + lets GDB use hardware breakpoints automatically for memory regions + where it can not use software breakpoints. This covers both the + "break" command and internal breakpoints used for other commands + including "next" and "finish". + catch exception + catch exception unhandled + Stop the program execution when Ada exceptions are raised. + catch assert + Stop the program execution when an Ada assertion failed. + set sysroot + show sysroot + Set an alternate system root for target files. This is a more + general version of "set solib-absolute-prefix", which is now + an alias to "set sysroot". + info spu + Provide extended SPU facility status information. This set of + commands is available only when debugging the Cell/B.E. SPU + architecture. + * New native configurations + OpenBSD/sh sh*-*openbsd* + set tdesc filename + unset tdesc filename + show tdesc filename + Use the specified local file as an XML target description, and do + not query the target for its built-in description. + * New targets + OpenBSD/sh sh*-*-openbsd* + MIPS64 GNU/Linux (gdbserver) mips64-linux-gnu + Toshiba Media Processor mep-elf + * New remote packets + QPassSignals: + Ignore the specified signals; pass them directly to the debugged program + without stopping other threads or reporting them to GDB. + qXfer:features:read: + Read an XML target description from the target, which describes its + features. + qXfer:spu:read: + qXfer:spu:write: + Read or write contents of an spufs file on the target system. These + packets are available only on the Cell/B.E. SPU architecture. + qXfer:libraries:read: + Report the loaded shared libraries. Combined with new "T" packet + response, this packet allows GDB to debug shared libraries on + targets where the operating system manages the list of loaded + libraries (e.g. Windows and SymbianOS). + * Removed targets + Support for these obsolete configurations has been removed. + alpha*-*-osf1* + alpha*-*-osf2* + d10v-*-* + hppa*-*-hiux* + i[34567]86-ncr-* + i[34567]86-*-dgux* + i[34567]86-*-lynxos* + i[34567]86-*-netware* + i[34567]86-*-sco3.2v5* + i[34567]86-*-sco3.2v4* + i[34567]86-*-sco* + i[34567]86-*-sysv4.2* + i[34567]86-*-sysv4* + i[34567]86-*-sysv5* + i[34567]86-*-unixware2* + i[34567]86-*-unixware* + i[34567]86-*-sysv* + i[34567]86-*-isc* + m68*-cisco*-* + m68*-tandem-* + mips*-*-pe + rs6000-*-lynxos* + sh*-*-pe + * Other removed features + target abug + target cpu32bug + target est + target rom68k + Various m68k-only ROM monitors. + target hms + target e7000 + target sh3 + target sh3e + Various Renesas ROM monitors and debugging interfaces for SH and + H8/300. + target ocd + Support for a Macraigor serial interface to on-chip debugging. + GDB does not directly support the newer parallel or USB + interfaces. + DWARF 1 support + A debug information format. The predecessor to DWARF 2 and + DWARF 3, which are still supported. + Support for the HP aCC compiler on HP-UX/PA-RISC + SOM-encapsulated symbolic debugging information, automatic + invocation of pxdb, and the aCC custom C++ ABI. This does not + affect HP-UX for Itanium or GCC for HP-UX/PA-RISC. Code compiled + with aCC can still be debugged on an assembly level. + MIPS ".pdr" sections + A MIPS-specific format used to describe stack frame layout + in debugging information. + Scheme support + GDB could work with an older version of Guile to debug + the interpreter and Scheme programs running in it. + set mips stack-arg-size + set mips saved-gpreg-size + Use "set mips abi" to control parameter passing for MIPS. + +------------------------------------------------------------------- +Mon Oct 1 15:44:07 CEST 2007 - schwab@suse.de + +- Update to head of gdb_6_7-branch. + +------------------------------------------------------------------- +Mon Sep 24 11:33:32 CEST 2007 - schwab@suse.de + +- Fix internal error [#309928]. + +------------------------------------------------------------------- +Thu Jul 26 12:41:05 CEST 2007 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Fri Jul 13 11:46:27 CEST 2007 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Sun Jun 24 18:52:47 CEST 2007 - schwab@suse.de + +- Fix annotations for commands prompt. + +------------------------------------------------------------------- +Thu Jun 21 12:37:56 CEST 2007 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Fri Jun 8 17:15:17 CEST 2007 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Fri May 11 15:22:37 CEST 2007 - schwab@suse.de + +- Update to head of trunk. + +------------------------------------------------------------------- +Fri Apr 13 15:43:47 CEST 2007 - schwab@suse.de + +- Avoid crash on object with no text section [#176306]. + +------------------------------------------------------------------- +Wed Apr 11 17:16:45 CEST 2007 - schwab@suse.de + +- Handle non-threaded processes in gstack [#262694]. + +------------------------------------------------------------------- +Sun Apr 1 21:32:33 CEST 2007 - schwab@suse.de + +- Properly decode CR register number. + +------------------------------------------------------------------- +Thu Mar 29 13:45:08 CEST 2007 - schwab@suse.de + +- Update solib-extract-address patch. + +------------------------------------------------------------------- +Tue Mar 20 13:41:02 CET 2007 - schwab@suse.de + +- Update single stepping patch again [#154486]. + +------------------------------------------------------------------- +Fri Mar 16 13:39:50 CET 2007 - schwab@suse.de + +- Update single stepping patch [#154486]. + +------------------------------------------------------------------- +Thu Mar 15 18:22:31 CET 2007 - schwab@suse.de + +- Fix altivec vector return location [#250004]. + +------------------------------------------------------------------- +Mon Mar 12 18:07:07 CET 2007 - schwab@suse.de + +- Update ppc DWARF patch to also handle broken debug info from old + compilers. + +------------------------------------------------------------------- +Thu Mar 8 15:04:28 CET 2007 - schwab@suse.de + +- Deal with stepping over sequence of atomic insns [#154486]. + +------------------------------------------------------------------- +Wed Mar 7 14:05:16 CET 2007 - schwab@suse.de + +- Improve last change. + +------------------------------------------------------------------- +Tue Mar 6 18:47:10 CET 2007 - schwab@suse.de + +- Better handling of ppc64 function descriptor symbols. + +------------------------------------------------------------------- +Mon Mar 5 22:06:00 CET 2007 - schwab@suse.de + +- Remove obsolete patch. +- Fix show endian. + +------------------------------------------------------------------- +Thu Jan 11 18:29:13 CET 2007 - schwab@suse.de + +- Fix unchecked use of PC_REGNUM. + +------------------------------------------------------------------- +Wed Dec 20 12:37:40 CET 2006 - schwab@suse.de + +- Update to gdb 6.6. + * New targets + Xtensa xtensa-elf + Cell Broadband Engine SPU spu-elf + * GDB can now be configured as a cross-debugger targeting native Windows + (mingw32) or Cygwin. It can communicate with a remote debugging stub + running on a Windows system over TCP/IP to debug Windows programs. + * The GDB remote stub, gdbserver, has been updated to support Windows and + Cygwin debugging. Both single-threaded and multi-threaded programs are + supported. + * The "set trust-readonly-sections" command works again. This command was + broken in GDB 6.3, 6.4, and 6.5. + * Support for GNU/Linux Thread Local Storage (TLS, per-thread variables) no + longer requires symbolic debug information (e.g. DWARF-2). + * New commands + set substitute-path + unset substitute-path + show substitute-path + Manage a list of substitution rules that GDB uses to rewrite the name + of the directories where the sources are located. This can be useful + for instance when the sources were moved to a different location + between compilation and debugging. + set trace-commands + show trace-commands + Print each CLI command as it is executed. Each command is prefixed with + a number of `+' symbols representing the nesting depth. + The source command now has a `-v' option to enable the same feature. + * REMOVED features + The ARM Demon monitor support (RDP protocol, "target rdp"). + Kernel Object Display, an embedded debugging feature which only worked with + an obsolete version of Cisco IOS. + The 'set download-write-size' and 'show download-write-size' commands. + * New remote packets + qSupported: + Tell a stub about GDB client features, and request remote target features. + The first feature implemented is PacketSize, which allows the target to + specify the size of packets it can handle - to minimize the number of + packets required and improve performance when connected to a remote + target. + qXfer:auxv:read: + Fetch an OS auxilliary vector from the remote stub. This packet is a + more efficient replacement for qPart:auxv:read. + * Removed remote packets + qPart:auxv:read: + This packet has been replaced by qXfer:auxv:read. Only GDB 6.4 and 6.5 + used it, and only gdbserver implemented it. + +------------------------------------------------------------------- +Sat Dec 2 21:38:33 CET 2006 - schwab@suse.de + +- Update to gdb 6.5.90. + +------------------------------------------------------------------- +Sat Oct 28 00:25:25 CEST 2006 - schwab@suse.de + +- Rename detach-fork to detach fork. + +------------------------------------------------------------------- +Tue Oct 24 13:35:52 CEST 2006 - schwab@suse.de + +- Better fix for function descriptor handling on ppc64. + +------------------------------------------------------------------- +Fri Aug 25 13:40:31 CEST 2006 - schwab@suse.de + +- Minimal support for .gnu.hash. + +------------------------------------------------------------------- +Thu Aug 24 14:18:29 CEST 2006 - schwab@suse.de + +- Fix off-by-one in add_symbol_file_command [#200831]. + +------------------------------------------------------------------- +Fri Aug 11 14:45:43 CEST 2006 - schwab@suse.de + +- Correctly extend addresses read from link map. + +------------------------------------------------------------------- +Sun Jul 16 23:22:08 CEST 2006 - schwab@suse.de + +- Fix function decriptor handing on ppc64. + +------------------------------------------------------------------- +Wed Jun 21 10:16:16 CEST 2006 - schwab@suse.de + +- Update to final gdb 6.5. + +------------------------------------------------------------------- +Sat Jun 3 10:04:56 CEST 2006 - schwab@suse.de + +- Update to gdb 6.5 RC 1. + +------------------------------------------------------------------- +Wed May 31 14:41:40 CEST 2006 - schwab@suse.de + +- Set long double size to 16 [#180103]. + +------------------------------------------------------------------- +Mon May 22 14:53:53 CEST 2006 - schwab@suse.de + +- Update to gdb 6.4.90 snapshot 20060522. + +------------------------------------------------------------------- +Sun Apr 23 16:05:38 CEST 2006 - schwab@suse.de + +- Add patch to avoid losing compilation directory. +- Fix a parallel build problem. + +------------------------------------------------------------------- +Tue Apr 4 21:48:43 CEST 2006 - schwab@suse.de + +- Relocate PIEs. + +------------------------------------------------------------------- +Mon Mar 27 00:47:48 CEST 2006 - schwab@suse.de + +- Handle .eh_frame register encoding that is different from .dwarf_frame. +- Remove obsolete patch. + +------------------------------------------------------------------- +Wed Jan 25 21:30:16 CET 2006 - mls@suse.de + +- converted neededforbuild to BuildRequires + +------------------------------------------------------------------- +Mon Jan 23 12:01:15 CET 2006 - schwab@suse.de + +- Add fix for PIC prologue analyzer on powerpc. + +------------------------------------------------------------------- +Wed Dec 14 01:11:46 CET 2005 - schwab@suse.de + +- Add fix for observer notify queue after attach. + +------------------------------------------------------------------- +Fri Dec 2 15:13:15 CET 2005 - schwab@suse.de + +- Update to gdb 6.4. + +------------------------------------------------------------------- +Tue Nov 22 13:11:03 CET 2005 - schwab@suse.de + +- Update to gdb 6.3.90. + +------------------------------------------------------------------- +Fri Nov 4 01:06:09 CET 2005 - schwab@suse.de + +- Update to gdb-6.3.50 snapshot 20051103. + +------------------------------------------------------------------- +Mon Oct 3 14:47:06 CEST 2005 - schwab@suse.de + +- Update to gdb 6.3.50 snapshot 20051003. + +------------------------------------------------------------------- +Mon Sep 19 19:06:04 CEST 2005 - schwab@suse.de + +- Fix warnings. + +------------------------------------------------------------------- +Sun Aug 21 15:04:46 CEST 2005 - schwab@suse.de + +- Add DWARF CFI unwinder on ppc. + +------------------------------------------------------------------- +Mon Jun 20 23:33:40 CEST 2005 - schwab@suse.de + +- Require libunwind-devel on ia64. + +------------------------------------------------------------------- +Thu Jun 9 15:51:37 CEST 2005 - schwab@suse.de + +- Add patch for ia64 vDSO support and unwinding through signals and + syscalls [#60766]. + +------------------------------------------------------------------- +Mon Apr 11 20:35:27 CEST 2005 - schwab@suse.de + +- Fix backtrace through vsyscall [#63483]. + +------------------------------------------------------------------- +Mon Apr 11 01:13:30 CEST 2005 - schwab@suse.de + +- Add patch to fix bugs in rs6000/powerpc register set functions. +- Fix a testsuite bug. + +------------------------------------------------------------------- +Sun Mar 6 17:52:14 CET 2005 - schwab@suse.de + +- Add patch to suppress fork attach/detach messages. + +------------------------------------------------------------------- +Wed Mar 2 17:41:41 CET 2005 - schwab@suse.de + +- Add patch to fix following vfork from a secondary thread. + +------------------------------------------------------------------- +Mon Feb 28 15:26:00 CET 2005 - schwab@suse.de + +- Don't ignore DW_TAG_member [#66406]. + +------------------------------------------------------------------- +Tue Feb 1 17:02:10 CET 2005 - schwab@suse.de + +- Find separate debug symbol files in /usr/lib/debug by default. + +------------------------------------------------------------------- +Thu Jan 27 17:13:46 CET 2005 - schwab@suse.de + +- Add patch to handle back-to-back and nested signals. + +------------------------------------------------------------------- +Thu Jan 27 13:21:20 CET 2005 - schwab@suse.de + +- Add patch to implement reggroups for ppc. + +------------------------------------------------------------------- +Wed Jan 26 11:14:23 CET 2005 - schwab@suse.de + +- Add patch to implement PPC GNU/Linux sigtramp frame code. + +------------------------------------------------------------------- +Wed Jan 12 14:26:25 CET 2005 - schwab@suse.de + +- Don't error out when encountering an unavailable value. + +------------------------------------------------------------------- +Fri Dec 3 15:33:47 CET 2004 - schwab@suse.de + +- Downgrade errors to warnings during backtrace [#48484]. +- Undocument --readnever since it may not be supported by future releases. +- Fix patches from last change. + +------------------------------------------------------------------- +Fri Dec 3 14:05:13 CET 2004 - kukuk@suse.de + +- Add --readnever option as workaround for [#48485] + +------------------------------------------------------------------- +Sun Nov 14 21:47:53 CET 2004 - schwab@suse.de + +- Add libunwind-devel to neededforbuild. + +------------------------------------------------------------------- +Sat Nov 13 15:59:26 CET 2004 - schwab@suse.de + +- Fix missing dependencies. + +------------------------------------------------------------------- +Wed Nov 10 11:56:32 CET 2004 - schwab@suse.de + +- Version 6.2.91 renamed to 6.3. + +------------------------------------------------------------------- +Tue Nov 9 00:57:31 CET 2004 - schwab@suse.de + +- Update to gdb 6.2.91 (6.3 release candidate). + +------------------------------------------------------------------- +Mon Nov 8 15:34:08 CET 2004 - schwab@suse.de + +- Revert last change. +- Fix typo. + +------------------------------------------------------------------- +Mon Nov 8 15:04:27 CET 2004 - uli@suse.de + +- fixed to build on s390* + +------------------------------------------------------------------- +Mon Oct 25 14:51:07 CEST 2004 - schwab@suse.de + +- Fix building gdbserver on x86-64. + +------------------------------------------------------------------- +Mon Oct 25 11:43:37 CEST 2004 - schwab@suse.de + +- Update to gdb 6.2.90. +- Use libunwind on ia64. + +------------------------------------------------------------------- +Thu Sep 9 10:13:11 CEST 2004 - schwab@suse.de + +- Update to gdb 6.2.1. + +------------------------------------------------------------------- +Wed Aug 25 16:00:27 CEST 2004 - schwab@suse.de + +- Fix deadlock in child_wait [#42796]. + +------------------------------------------------------------------- +Tue Aug 24 16:43:36 CEST 2004 - schwab@suse.de + +- Import latest changes from 6.2 branch. + +------------------------------------------------------------------- +Fri Jul 30 15:23:17 CEST 2004 - schwab@suse.de + +- Update to gdb 6.2. + +------------------------------------------------------------------- +Thu Jul 29 15:53:51 CEST 2004 - schwab@suse.de + +- Update to gdb 6.1.92. + +------------------------------------------------------------------- +Mon Jul 26 21:08:42 CEST 2004 - schwab@suse.de + +- Fix handling of relative filenames in DWARF2 .debug_line. + +------------------------------------------------------------------- +Mon Jul 19 13:01:27 CEST 2004 - schwab@suse.de + +- Update to gdb 6.1.91. + +------------------------------------------------------------------- +Thu Jun 24 14:26:28 CEST 2004 - schwab@suse.de + +- Better handling of dying threads. + +------------------------------------------------------------------- +Fri Jun 18 23:57:13 CEST 2004 - schwab@suse.de + +- Update to gdb 6.1.1. + +------------------------------------------------------------------- +Tue May 25 17:14:03 CEST 2004 - schwab@suse.de + +- Fix handling of short lived threads [#40841]. + +------------------------------------------------------------------- +Sat May 1 15:07:32 CEST 2004 - schwab@suse.de + +- Restore removed hunk. + +------------------------------------------------------------------- +Fri Apr 30 21:31:35 CEST 2004 - meissner@suse.de + +- applied 3 patches to fix problems on ppc64. #39394 + +------------------------------------------------------------------- +Sat Apr 17 15:55:23 CEST 2004 - schwab@suse.de + +- Pacify autobuild. + +------------------------------------------------------------------- +Mon Apr 5 11:40:31 CEST 2004 - schwab@suse.de + +- Version 6.0.92 has been renamed to 6.1. + +------------------------------------------------------------------- +Sat Apr 3 20:34:55 CEST 2004 - schwab@suse.de + +- Update to gdb 6.0.92 (6.1 release candidate). + +------------------------------------------------------------------- +Tue Mar 30 16:50:40 CEST 2004 - schwab@suse.de + +- Fix invalid use of va_list. + +------------------------------------------------------------------- +Mon Mar 29 23:29:09 CEST 2004 - schwab@suse.de + +- Update to gdb 6.0.91. + +------------------------------------------------------------------- +Mon Mar 29 15:40:16 CEST 2004 - schwab@suse.de + +- Update to current CVS. + +------------------------------------------------------------------- +Fri Mar 19 11:59:48 CET 2004 - schwab@suse.de + +- Fix last change: don't disable testsuite. + +------------------------------------------------------------------- +Wed Mar 17 10:00:43 CET 2004 - mludvig@suse.cz + +- Added opcodes for VIA PadLock instructions. + +------------------------------------------------------------------- +Tue Mar 2 14:28:18 CET 2004 - schwab@suse.de + +- Update to gdb 6.0.90. +- Run testsuite. + +------------------------------------------------------------------- +Thu Jan 8 18:37:10 CET 2004 - schwab@suse.de + +- Fix gate area range. + +------------------------------------------------------------------- +Wed Dec 10 18:16:55 CET 2003 - schwab@suse.de + +- Support DW_TAG_subrange_type. +- Backport recent ia64 improvements from mainline. + +------------------------------------------------------------------- +Tue Oct 21 14:36:49 CEST 2003 - mludvig@ + +- Add support for debugging both i386 and amd64 apps by a single + amd64 GDB binary. + +------------------------------------------------------------------- +Mon Oct 20 16:44:00 CEST 2003 - mludvig@suse.cz + +- Correctly interpret symbol tables for debugging kernel modules + (gdb6-symtab-minimal.diff) +- Fixed support for GCC variable tracking (gdb6-vartrack.diff) +- Fixed support for Fortran arrays (gdb6-fortranarray.diff) + +------------------------------------------------------------------- +Tue Oct 7 14:50:24 CEST 2003 - schwab@suse.de + +- Hack to build on sparc. + +------------------------------------------------------------------- +Mon Oct 6 22:33:00 CEST 2003 - schwab@suse.de + +- Update to gdb 6.0. + +------------------------------------------------------------------- +Fri Oct 3 10:48:16 CEST 2003 - kukuk@suse.de + +- Remove unused tetex from neededforbuild + +------------------------------------------------------------------- +Mon Sep 29 12:00:35 CEST 2003 - schwab@suse.de + +- Update to gdb 5.3.93 pre-release. + +------------------------------------------------------------------- +Wed Sep 17 18:39:07 CEST 2003 - schwab@suse.de + +- Remove debugging hooks. + +------------------------------------------------------------------- +Wed Sep 17 17:50:23 CEST 2003 - schwab@suse.de + +- Ignore more insns during i386 prologue decoding [#30288]. +- Fix hash table mixup in bfd_simple interface. + +------------------------------------------------------------------- +Tue Sep 16 14:50:44 CEST 2003 - schwab@suse.de + +- Update to gdb 5.3.92 pre-release. + * Fixes bug 31033. + +------------------------------------------------------------------- +Wed Sep 3 17:56:43 CEST 2003 - schwab@suse.de + +- Update to gdb 5.3.91 pre-release. + +------------------------------------------------------------------- +Tue Aug 19 14:09:44 CEST 2003 - schwab@suse.de + +- Update to gdb 5.3.90 2003-08-19 cvs snapshot. + +------------------------------------------------------------------- +Mon Jun 23 13:16:24 CEST 2003 - kukuk@suse.de + +- Fix compiling on SPARC + +------------------------------------------------------------------- +Tue Jun 10 15:54:25 CEST 2003 - schwab@suse.de + +- Don't package mmalloc.info, since libmmalloc isn't included either. + +------------------------------------------------------------------- +Thu May 15 12:09:51 CEST 2003 - schwab@suse.de + +- Remove unwanted files. + +------------------------------------------------------------------- +Thu Apr 24 12:20:23 CEST 2003 - ro@suse.de + +- fix install_info --delete call and move from preun to postun + +------------------------------------------------------------------- +Fri Apr 11 10:14:30 CEST 2003 - mludvig@suse.cz + +- Fix read_2u() function in dwarf2cfi.c + +------------------------------------------------------------------- +Thu Apr 10 18:09:43 CEST 2003 - mludvig@suse.cz + +- Add 'info cfi
' command. +- Fix off-by-4 bug in the CFI parser. + +------------------------------------------------------------------- +Mon Apr 7 13:11:34 CEST 2003 - schwab@suse.de + +- Only delete info entries when removing last version. + +------------------------------------------------------------------- +Thu Mar 27 17:01:30 CET 2003 - schwab@suse.de + +- Fix specfile. + +------------------------------------------------------------------- +Thu Mar 6 15:46:52 CET 2003 - aj@suse.de + +- Fix neededforbuild. + +------------------------------------------------------------------- +Wed Feb 26 17:35:10 CET 2003 - mludvig@suse.cz + +- Added loclist support +- Fixed eh_frame parsing problems +- Updated for proposed x86-64 ABI change + +------------------------------------------------------------------- +Thu Feb 6 17:48:35 CET 2003 - schwab@suse.de + +- Use %install_info. + +------------------------------------------------------------------- +Tue Feb 4 20:22:27 CET 2003 - schwab@suse.de + +- Enable TUI. + +------------------------------------------------------------------- +Sun Jan 26 20:39:57 CET 2003 - olh@suse.de + +- add inital native ppc64 support + +------------------------------------------------------------------- +Thu Jan 09 13:51:58 CET 2003 - mludvig@suse.cz + +- Fixed compilation problem with last gdb-asmbtrace.diff. + No new feature. + +------------------------------------------------------------------- +Tue Jan 07 17:41:49 CET 2003 - mludvig@suse.cz + +- Several Dwarf2 and x86-64 specific changes + * Added ability to do backtrace from some functions + without debug info (patch gdb-asmbtrace.diff) + * Fixed crash on re-run of a debugged program. + * Added some more verbosity to dwarf2cfi engine. + +------------------------------------------------------------------- +Thu Dec 12 15:03:36 CET 2002 - schwab@suse.de + +- Update to gdb 5.3. + * GNU/Linux shared library multi-threaded performance improved. + * ``gdbserver'' now supports multi-threaded applications on some targets + * GDB now supports C/C++ preprocessor macros. + +------------------------------------------------------------------- +Fri Oct 11 11:44:53 CEST 2002 - aj@suse.de + +- Handle gcc code generated by gcc -f-elimante-dwarf2-dups -g. + +------------------------------------------------------------------- +Thu Sep 26 12:13:23 CEST 2002 - schwab@suse.de + +- Avoid installing libbfd, libopcodes, libiberty and libmmalloc [#20199]. + +------------------------------------------------------------------- +Wed Sep 18 17:15:11 CEST 2002 - sf@suse.de + +- added patch from mludvig to remove framepointer on x86_64 + +------------------------------------------------------------------- +Wed Sep 4 10:34:56 CEST 2002 - kukuk@suse.de + +- Add Patch for reading SPARC core files + +------------------------------------------------------------------- +Tue Sep 3 14:01:05 CEST 2002 - schwab@suse.de + +- Remove tetex from neededforbuild. + +------------------------------------------------------------------- +Wed Jul 24 10:51:03 CEST 2002 - schwab@suse.de + +- Update to gdb 5.2.1. + +------------------------------------------------------------------- +Thu Jul 18 12:26:11 CEST 2002 - mludvig@suse.de + +- Fix PLT recognisation. + +------------------------------------------------------------------- +Mon Jul 8 15:19:58 CEST 2002 - schwab@suse.de + +- Add fix for memory leak. + +------------------------------------------------------------------- +Tue Jul 2 16:05:09 CEST 2002 - mludvig@suse.cz + +- removed my previous patches +- added a huge one suse-521-x8664.diff + +------------------------------------------------------------------- +Thu Jun 6 12:38:48 CEST 2002 - sf@suse.de + +- added fpregset.diff (from mludvig@suse.de) +- added dwarf2cfi.diff (from mludvig@suse.de) + +------------------------------------------------------------------- +Wed May 15 12:05:22 CEST 2002 - sf@suse.de + +- added some dwarf2-patches for x86_64 + (from mludvig@suse.de) + +------------------------------------------------------------------- +Thu May 9 19:03:27 CEST 2002 - schwab@suse.de + +- Fix breakpoints on MLX bundle. + +------------------------------------------------------------------- +Mon May 6 17:57:10 CEST 2002 - schwab@suse.de + +- Sparc doesn't have gdbserver either. + +------------------------------------------------------------------- +Sun May 5 15:57:22 CEST 2002 - schwab@suse.de + +- Update to gdb 5.2. +- Gdbserver now available for all but alpha. + +------------------------------------------------------------------- +Fri Jan 25 11:10:12 CET 2002 - schwab@suse.de + +- Update to gdb 5.1.1. + +------------------------------------------------------------------- +Thu Nov 22 15:22:51 CET 2001 - schwab@suse.de + +- Update to gdb 5.1. +- Build and install gdbserver on i386 and ia64. + +------------------------------------------------------------------- +Sat Aug 18 22:59:47 CEST 2001 - schwab@suse.de + +- Update to gdb snapthot 20010316. + +------------------------------------------------------------------- +Fri May 18 15:40:30 CEST 2001 - schwab@suse.de + +- Include ia64 warning patches (from nadvornik@suse.cz). + +------------------------------------------------------------------- +Thu Apr 12 15:15:53 CEST 2001 - schwab@suse.de + +- Remove declaration of tilde_expand, now in readline header. + +------------------------------------------------------------------- +Sun Apr 1 01:12:02 CEST 2001 - schwab@suse.de + +- Fix hardware watchpoints on ia64. + +------------------------------------------------------------------- +Fri Mar 30 14:45:15 CEST 2001 - schwab@suse.de + +- Fix crash on info architecture (#6865). + +------------------------------------------------------------------- +Wed Mar 28 10:57:09 CEST 2001 - schwab@suse.de + +- Use installed readline library. + +------------------------------------------------------------------- +Tue Mar 6 18:25:45 CET 2001 - schwab@suse.de + +- Remove some ia64 hacks. + +------------------------------------------------------------------- +Tue Dec 12 18:22:12 CET 2000 - schwab@suse.de + +- Improve handling of breakpoints in shared libraries. + +------------------------------------------------------------------- +Fri Nov 17 11:25:57 CET 2000 - kukuk@suse.de + +- Update to working gdb snapshot + +------------------------------------------------------------------- +Wed Sep 27 12:56:18 CEST 2000 - fober@suse.de + +- s390: added s390-sigregs-SuSE.patch + +------------------------------------------------------------------- +Thu Sep 14 14:38:38 CEST 2000 - fober@suse.de + +- s390: incorporate new ibm patches for gdb 5.0 + +------------------------------------------------------------------- +Wed Sep 6 17:20:46 CEST 2000 - fober@suse.de + +- s390: incorporate ibm patches for gdb 5.0 + +------------------------------------------------------------------- +Fri Jun 30 16:37:17 CEST 2000 - kukuk@suse.de + +- Add gdb-5.0 + +------------------------------------------------------------------- +Tue Apr 4 12:43:40 MEST 2000 - bk@suse.de + +- s390 team added s390 support + +------------------------------------------------------------------- +Tue Mar 21 17:33:22 CET 2000 - schwab@suse.de + +- Fix core dump reading (#2586). + +------------------------------------------------------------------- +Fri Feb 4 14:14:20 CET 2000 - kukuk@suse.de + +- Add patches for PPC +- Move /usr/info -> /usr/share/info + +------------------------------------------------------------------- +Mon Dec 6 16:52:58 MET 1999 - kukuk@suse.de + +- Remove gdb 4.17 +- Add gdb 4.18 fixes for SPARC + +------------------------------------------------------------------- +Mon Sep 13 17:23:57 CEST 1999 - bs@suse.de + +- ran old prepare_spec on spec file to switch to new prepare_spec. + +------------------------------------------------------------------- +Fri Sep 3 12:00:15 MEST 1999 - kukuk@suse.de + +- Use RPM values for CFLAGS and configure + +------------------------------------------------------------------- +Tue Aug 24 17:05:53 MEST 1999 - uli@suse.de + +- added -fsigned-char to CFLAGS (PPC) + +------------------------------------------------------------------- +Mon Aug 23 18:14:32 MEST 1999 - kukuk@suse.de + +- Add gdb 4.18 thread patch from RH + +------------------------------------------------------------------- +Mon Jul 19 09:54:42 MEST 1999 - florian@suse.de + +- add gdb-4.17.0.12 as /usr/bin/gdb-4.17 + +------------------------------------------------------------------- +Wed Jul 7 17:16:59 MEST 1999 - kukuk@suse.de + +- update to 4.18 using diff from jurix + +------------------------------------------------------------------- +Mon Feb 22 23:39:42 MET 1999 - ro@suse.de + +- update to 4.17.0.11 using diff from jurix + +------------------------------------------------------------------- +Thu Jan 21 14:05:35 MET 1999 - ro@suse.de + +- update to 4.17.0.8 + +------------------------------------------------------------------- +Thu Oct 1 16:55:44 MEST 1998 - ro@suse.de + +- update to 4.17.0.4 using jurix-diff + +------------------------------------------------------------------- +Tue Sep 15 11:18:43 MEST 1998 - ro@suse.de + +- hacked for GLIBC: include sys/ucontext and sys/ptrace where needed +- catch strup redeclarations +- cleaned up patch-sequence + +---------------------------------------------------------------------- +Wed Oct 29 00:00:08 MET 1997 - florian@suse.de + +- fix in libc to correctly support core-files + +- add bug-fix to read symbols from dynamic symbol tables + +- apply all patches from debian gdb-4.16-11 + + +---------------------------------------------------------------------- +Tue Oct 22 15:43:38 MET DST 1996 - florian@suse.de + + +Neue Version 4.16. + +gdb kompiliert nur mit libc 5.4.7 richtig. Mit 5.2.18 kann gdb +keine core-files lesen. +Ich waere dafuer, einfach das Binary von libc 5.4.7 zu benutzen. +Wird schon funktionieren... diff --git a/gdb.spec b/gdb.spec new file mode 100644 index 0000000..b888fe8 --- /dev/null +++ b/gdb.spec @@ -0,0 +1,1450 @@ +# +# spec file +# +# Copyright (c) 2025 SUSE LLC +# Copyright (c) 2012 RedHat +# +# All modifications and additions to the file contributed by third parties +# remain the property of their copyright owners, unless otherwise agreed +# upon. The license for this file, and modifications and additions to the +# file, is the same license as for the pristine package itself (unless the +# license for the pristine package is not an Open Source License, in which +# case the license is the MIT License). An "Open Source License" is a +# license that conforms to the Open Source Definition (Version 1.9) +# published by the Open Source Initiative. + +# Please submit bugfixes or comments via https://bugs.opensuse.org/ +# + + +%define flavor @BUILD_FLAVOR@%{nil} + +%bcond_with ringdisabled +%bcond_with for_chroot + +%if "%flavor" == "testsuite" +%if %{with ringdisabled} +ExclusiveArch: do_not_build +%endif +%if 0%{?qemu_user_space_build} +# In a qemu_user_space_build ptrace is not supported, so we can't test gdb. +ExclusiveArch: do_not_build +%endif + +# Disable big-endian ppc testing. +ExcludeArch: ppc ppc64 + +%define build_main 0 +%define build_testsuite 1 +%else +%define build_main 1 +%define build_testsuite 0 +%endif + +%if %{build_testsuite} +%define debug_package %{nil} +%endif + +%if %{build_main} +%define name_suffix %{nil} +%else +%if %{build_testsuite} +%define name_suffix -testresults +%else +%define name_suffix -%{flavor} +%endif +%endif + +%bcond_without fpc + +%if %{build_main} +Summary: A GNU source-level debugger for C, C++, Fortran and other languages +License: GPL-3.0-only WITH GCC-exception-3.1 AND GPL-3.0-or-later AND LGPL-2.1-or-later AND LGPL-3.0-or-later +Group: Development/Languages/C and C++ +%endif +%if %{build_testsuite} +Summary: GDB testsuite results +License: SUSE-Public-Domain +Group: Development/Languages/C and C++ +%endif +Name: gdb%{name_suffix} + +Version: 14.2 +Release: 0 + +# 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. + +BuildRoot: %{_tmppath}/%{name}-%{version}-build +# Do not provide URL for snapshots as the file lasts there only for 2 days. +# ftp://sourceware.org/pub/gdb/releases/gdb-%%{version}.tar.gz +Source: gdb-%{version}.tar.bz2 +URL: http://gnu.org/software/gdb/ + +%if "%{scl}" == "devtoolset-1.1" +Obsoletes: devtoolset-1.0-%{pkg_name} +%endif + +# For our convenience +%global gdb_src gdb-%{version} +%global gdb_build build-%{_target_platform} +%global gdb_docdir %{_docdir}/gdb-doc + +%global have_inproctrace 0 +%ifarch %{ix86} x86_64 +%global have_inproctrace 1 +%endif # %%{ix86} x86_64 + +# Choose python version +%if 0%{?suse_version} >= 1200 +%define python python3 +%else +# Skip for SLE-11 due to lack of python3. +%define _without_python 1 +%endif + +# GDB patches have the format `gdb--bz-.patch'. +# They should be created using patch level 1: diff -up ./gdb (or gdb-6.3/gdb). + +#= +#push=Should be pushed upstream. +#maybepush=Should be pushed upstream unless it got obsoleted there. +#fedora=Should stay as a Fedora patch. +#ia64=Drop after RHEL-5 rebases and rebuilds are no longer meaningful. +#fedoratest=Keep it in Fedora only as a regression test safety. +#+ppc=Specific for ppc32/ppc64/ppc* +#+work=Requires some nontrivial work. + +# Cleanup any leftover testsuite processes as it may stuck mock(1) builds. +#=push +Source2: gdb-orphanripper.c + +# Man page for gstack(1). +#=push +Source3: gdb-gstack.man + +# /etc/gdbinit (from Debian but with Fedora compliant location). +#=fedora +Source4: gdbinit +Source5: gdbinit.without-python + +# libipt: Intel Processor Trace Decoder Library +%global libipt_version 2.0.5 +Source7: v%{libipt_version}.tar.gz + +# Infrastructure to sync patches from the Fedora rpm +Source10: patchlist.pl +Source11: patchname_get.sh +Source12: baselibs.conf +Source13: gdb-rpmlintrc + +# Infrastructure to maintain package. +Source14: clean.sh +Source15: import-patches.sh +Source16: qa.sh +Source17: qa-local.sh +Source18: qa-remote.sh +Source19: README.qa +Source20: import-fedora.sh + +%if %{build_testsuite} +NoSource: 0 +NoSource: 2 +NoSource: 3 +NoSource: 4 +NoSource: 5 +NoSource: 7 +NoSource: 10 +NoSource: 11 +NoSource: 12 +NoSource: 13 +NoSource: 14 +NoSource: 15 +NoSource: 16 +NoSource: 17 +NoSource: 18 +NoSource: 19 +NoSource: 20 +%endif + +# Fedora import from branch f38, commit 82cc8e0. + +#Fedora Packages begin +Patch2: gdb-6.3-gstack-20050411.patch +Patch3: gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch +Patch4: gdb-6.5-bz218379-ppc-solib-trampoline-test.patch +Patch5: gdb-6.6-bz229517-gcore-without-terminal.patch +Patch6: gdb-6.6-testsuite-timeouts.patch +Patch7: gdb-6.6-bz237572-ppc-atomic-sequence-test.patch +Patch8: gdb-6.3-attach-see-vdso-test.patch +Patch9: gdb-6.5-bz243845-stale-testing-zombie-test.patch +Patch10: gdb-6.6-buildid-locate.patch +Patch11: gdb-6.6-buildid-locate-solib-missing-ids.patch +Patch12: gdb-6.6-buildid-locate-rpm.patch +Patch14: gdb-6.5-gcore-buffer-limit-test.patch +Patch15: gdb-6.3-mapping-zero-inode-test.patch +Patch16: gdb-6.5-section-num-fixup-test.patch +Patch18: gdb-simultaneous-step-resume-breakpoint-test.patch +Patch19: gdb-core-open-vdso-warning.patch +Patch20: gdb-archer-next-over-throw-cxx-exec.patch +Patch21: gdb-6.6-buildid-locate-rpm-librpm-workaround.patch +Patch22: gdb-test-bt-cfi-without-die.patch +Patch23: gdb-bz634108-solib_address.patch +Patch24: gdb-test-dw2-aranges.patch +Patch25: gdb-glibc-strstr-workaround.patch +Patch26: gdb-rhbz-818343-set-solib-absolute-prefix-testcase.patch +Patch27: gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch +Patch28: gdb-rhbz1007614-memleak-infpy_read_memory-test.patch +Patch31: gdb-rhbz1149205-catch-syscall-after-fork-test.patch +Patch32: gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch +Patch33: gdb-fedora-libncursesw.patch +Patch34: gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch +Patch36: gdb-linux_perf-bundle.patch +Patch38: gdb-rhbz2232086-refactor-selftest-support.patch +Patch39: gdb-rhbz-2232086-reduce-size-of-gdb-index.patch +Patch40: gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch +Patch41: gdb-rhbz-2232086-generate-gdb-index-consistently.patch +Patch42: gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch +Patch43: gdb-rhbz2250652-gdbpy_gil.patch +Patch44: gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch +Patch45: gdb-ftbs-swapped-calloc-args.patch +Patch46: gdb-rhbz2261580-intrusive_list-assertion-fix.patch +#Fedora Packages end + +# Fedora patches fixup +# These need a number with at least four digits, otherwise patchlist.pl removes +# them when upgrading. + +Patch1000: fixup-gdb-linux_perf-bundle.patch +Patch1003: fixup-gdb-glibc-strstr-workaround.patch +Patch1004: fixup-gdb-6.5-bz243845-stale-testing-zombie-test.patch +Patch1005: fixup-gdb-test-bt-cfi-without-die.patch +Patch1007: fixup-gdb-test-dw2-aranges.patch +Patch1008: fixup-gdb-bz634108-solib_address.patch +Patch1009: fixup-gdb-6.3-gstack-20050411.patch +Patch1010: fixup-gdb-6.3-attach-see-vdso-test.patch +Patch1012: fixup-gdb-rhbz1261564-aarch64-hw-watchpoint-test.pat.patch +# Fixes up several patches, should be dropped when updating to +# rawhide @ 08bfd0a. +Patch1013: fixup-skip-tests.patch + +# openSUSE specific + +# Hardcodes /bin/bash, given that path is known. +Patch1100: gdb-gcore-bash.patch +# Make gdb emit zypper install hints, rather than debuginfo-install hints. +Patch1101: gdb-6.6-buildid-locate-rpm-suse.patch + +# openSUSE specific -- testsuite + +# Silences ada pie compilation FAILs. Todo: Fix ada pie compilation. +Patch1200: gdb-testsuite-ada-pie.patch +# Tests the zypper install hints. +Patch1203: gdb-testsuite-add-gdb.suse-zypper-hint.exp.patch +# Tests that no branding is leaked from sourcing the fedora package. +Patch1204: gdb-testsuite-add-gdb.suse-debranding.exp.patch + +# Patches to upstream + +# https://sourceware.org/bugzilla/show_bug.cgi?id=25703 +Patch1500: gdb-symtab-set-default-dwarf-max-cache-age-1000.patch +# https://bugzilla.suse.com/show_bug.cgi?id=1179210 +Patch1501: gdb-tui-enable-work-around-libncurses-segfault.patch +# Fixes: gdb.x86_64: W: potential-bashisms /usr/bin/gdb-add-index +Patch1503: gdb-add-index.sh-fix-bashism.patch +# Fixes: +# FAIL: gdb.mi/new-ui-mi-sync.exp: sync-command=run: add-inferior (timeout) +Patch1504: fix-gdb.mi-new-ui-mi-sync.exp.patch +# Fixes: +# FAIL: gdb.base/step-over-syscall.exp: fork: displaced=off: \ +# pc after stepi matches insn addr after syscall +Patch1505: gdb-testsuite-fix-gdb.base-step-over-syscall.exp-with-m32-amd-case.patch + +# Backports from current release branch (GDB 14). + +# + +# Backports from master, available in next release (GDB 15). + +Patch2000: gdb-symtab-work-around-pr-gas-29517.patch +Patch2001: gdb-symtab-add-producer_is_gas.patch +Patch2002: gdb-symtab-work-around-gas-pr28629.patch +Patch2003: gdb-tdep-fix-nr-array-elements-in-ppc64_aggregate_ca.patch +Patch2004: gdb-tui-fix-wmaybe-uninitialized-in-tui_find_disasse.patch +Patch2005: gdb-testsuite-add-missing-no-prompt-anchor-in-gdb.ba.patch +Patch2006: gdb-testsuite-remove-spurious-in-save_vars.patch +Patch2007: make-pascal_language-print_type-handle-varstring-nul.patch +Patch2008: gdb-symtab-work-around-pr-gas-29517-dwarf2-case.patch +Patch2010: fix-the-gdb.ada-inline-section-gc.exp-test.patch +Patch2011: gdb-testsuite-handle-pac-marker.patch +Patch2012: change-gdb.base-examine-backwards.exp-for-aix.patch +Patch2013: gdb-testsuite-fix-spurious-fails-with-examine-backwa.patch +Patch2014: gdb-testsuite-make-gdb.base-solib-search.exp-more-ro.patch +Patch2015: gdb-testsuite-fix-regexp-in-vgdb_start.patch +Patch2016: powerpc-and-aarch64-fix-reverse-stepping-failure.patch +Patch2017: gdb-tdep-fix-gdb.base-watch-bitfields.exp-on-aarch64.patch +Patch2018: gdb-tdep-fix-gdb.base-watchpoint-unaligned.exp-on-aa.patch +Patch2019: gdb-testsuite-add-pr-gdb-26967-kfail-in-two-more-tes.patch +Patch2020: gdb-testsuite-fix-gdb.base-eh_return.exp.patch +Patch2021: fixup-powerpc-and-aarch64-fix-reverse-stepping-failu.patch +Patch2022: gdb-exp-fix-printing-of-out-of-bounds-struct-members.patch +Patch2023: gdb-fix-heap-use-after-free-in-select_event_lwp.patch +Patch2024: fix-regression-on-aarch64-linux-gdbserver.patch +Patch2025: gdb-testsuite-factor-out-proc-get_portnum.patch +Patch2026: gdb-testsuite-make-portnum-a-persistent-global.patch +Patch2027: gdb-testsuite-factor-out-proc-with_lock.patch +Patch2028: gdb-testsuite-factor-out-proc-lock_dir.patch +Patch2029: gdb-testsuite-move-gpu-parallel.lock-to-cache-dir.patch +Patch2030: gdb-testsuite-use-unique-portnum-in-parallel-testing.patch +Patch2031: gdb-testsuite-use-unique-portnum-in-parallel-testing-check-slash-slash-case.patch +Patch2032: gdb-tdep-fix-reverse-execution-of-ldr-immediate-t4.patch +Patch2033: gdb-exp-fix-cast-handling-for-indirection.patch +Patch2034: gdb-remote-fix-abort-on-remote_close_error.patch +Patch2035: gdb-testsuite-use-find_gnatmake-instead-of-gdb_find_.patch +Patch2036: gdb-testsuite-simplify-gdb.server-server-kill-python.patch +Patch2037: gdb-testsuite-fix-gdbserver-pid-in-gdb.server-server.patch +Patch2038: gdb-testsuite-add-missing-include-in-gdb.base-ctf-pt.patch +Patch2039: gdb-testsuite-fix-gdb.ada-verylong.exp-on-32-bit-tar.patch +Patch2040: gdb-testsuite-add-missing-includes-in-gdb.trace-coll.patch +Patch2041: gdb-testsuite-fix-missing-return-type-in-gdb.linespe.patch +Patch2042: gdb-testsuite-fix-gdb.base-ending-run.exp-on-manjaro.patch +Patch2043: gdb-testsuite-fix-test-case-gdb.threads-attach-stopp.patch +Patch2044: gdb-testsuite-add-missing-include-in-gdb.base-rtld-s.patch +Patch2045: gdb-testsuite-fix-valgrind-tests-on-debian.patch +Patch2046: gdb-testsuite-fix-gdb.server-server-connect.exp-for-.patch +Patch2047: gdb-testsuite-handle-core-without-build-id-in-gdb.ba.patch +Patch2048: gdb-testsuite-fix-gdb.base-list-no-debug.exp-on-debi.patch +Patch2049: gdb-testsuite-reset-errcnt-and-warncnt-in-default_gd.patch +Patch2050: gdb-testsuite-fix-test-in-gdb.python-py-finish-break.patch +Patch2051: gdb-testsuite-further-handle-long-filenames-in-gdb.b.patch +Patch2052: gdb-testsuite-fix-license-text-in-gdb.reverse-map-to.patch +Patch2053: gdb-testsuite-call-ldd-version-in-gdb.testsuite-dump.patch +Patch2054: gdb-testsuite-fix-gdb.mi-mi-dprintf.exp-with-read1.patch +Patch2055: gdb-testsuite-fix-gdb.cp-namespace.exp-with-read1.patch +Patch2056: gdb-testsuite-fix-typo-in-gdb.base-catch-syscall.exp.patch +Patch2057: gdb-testsuite-use-more-progbits-for-arm.patch +Patch2058: gdb-testsuite-fix-gdb.dwarf2-dw2-gas-workaround.exp.patch +Patch2059: gdb-fix-segfault-in-for_each_block-part-1.patch +Patch2060: gdb-fix-segfault-in-for_each_block-part-2.patch +Patch2061: gdb-tui-allow-command-window-of-1-or-2-lines.patch +Patch2062: gdb-tui-fix-resizing-of-terminal-to-1-or-2-lines.patch +Patch2063: gdb-symtab-workaround-pr-gas-31115.patch +Patch2064: gdb-arm-remove-tpidruro-register-from-non-freebsd-ta.patch +Patch2065: gdb-tdep-fix-catching-syscall-execve-exit-for-arm.patch +Patch2066: gdb-arm-fix-epilogue-frame-id.patch +Patch2070: rs6000-unwind-on-each-instruction-fix.patch +Patch2071: gdb-python-make-gdb.unwindinfo.add_saved_register-mo.patch +Patch2072: gdb-arm-remove-thumb-bit-in-arm_adjust_breakpoint_ad.patch +Patch2073: gdb-build-fix-gdbserver-linux-aarch64-low.cc-build.patch +Patch2074: powerpc-fix-test-gdb.ada-finish-large.exp.patch +Patch2075: gdb-python-make-gdb.unwindinfo.add_saved_register-mo-fixup.patch +Patch2076: gdb-exp-redo-cast-handling-for-indirection.patch +Patch2077: s390-provide-ibm-z16-arch14-instruction-descriptions.patch +Patch2078: gdb-s390-add-arch14-record-replay-support.patch + +# Backports from master, not yet available in next release (GDB 16). + +Patch2090: gdb-python-fix-gdb.python-py-disasm.exp-on-arm-linux.patch +Patch2091: gdb-testsuite-fix-gdb.fortran-array-bounds.exp-on-ar.patch +Patch2092: gdb-symtab-return-correct-reader-for-top-level-cu-in.patch +Patch2093: gdb-tdep-s390-add-arch15-record-replay-support.patch +Patch2094: gdb-testsuite-avoid-intermittent-failures-on-a-debug.patch + +# + +# Backport from gdb-patches + +# https://sourceware.org/pipermail/gdb-patches/2021-September/182226.html +Patch2100: gdb-python-finishbreakpoint-update.patch +# https://sourceware.org/pipermail/gdb-patches/2021-October/182444.html +Patch2101: gdb-testsuite-prevent-compilation-fails-with-unix-fpie-pie.patch +# https://sourceware.org/pipermail/gdb-patches/2021-May/178990.html +Patch2102: gdb-cli-add-ignore-errors-command.patch +# https://sourceware.org/pipermail/gdb-patches/2024-May/209469.html +Patch2103: gdb-testsuite-fix-error-in-gdb.server-server-kill-py.patch +# https://sourceware.org/pipermail/gdb-patches/2024-May/209504.html +Patch2104: gdb-testsuite-fix-timeout-in-gdb.tui-resize-2.exp.patch +# https://sourceware.org/pipermail/gdb-patches/2024-June/209736.html +Patch2105: gdb-tdep-fix-gdb.base-watchpoint-running-on-arm-ppc6.patch + +# https://sourceware.org/pipermail/gdb-patches/2023-December/205054.html +Patch2120: gdb-symtab-refactor-condition-in-scan_attributes.patch +Patch2121: gdb-symtab-factor-out-m_die_range_map-usage.patch +Patch2122: gdb-symtab-handle-nullptr-parent-in-parent_map-set_p.patch +Patch2123: gdb-symtab-factor-out-m_deferred_entries-usage.patch +Patch2124: gdb-symtab-resolve-deferred-entries-inter-shard-case.patch +Patch2125: gdb-testsuite-add-gdb.dwarf2-forward-spec-inter-cu.e.patch +Patch2126: gdb-testsuite-add-gdb.dwarf2-backward-spec-inter-cu..patch +Patch2127: gdb-symtab-keep-track-of-processed-dies-in-shard.patch +Patch2128: gdb-symtab-resolve-deferred-entries-intra-shard-case.patch +Patch2129: gdb-symtab-don-t-defer-backward-refs-inter-cu-intra-.patch +Patch2130: gdb-symtab-recurse-into-c-dw_tag_subprogram-dies-for.patch +Patch2131: gdb-symtab-keep-track-of-all-parents-for-cooked-inde.patch +Patch2132: gdb-symtab-fix-dw_tag_inlined_subroutine-entries-in-.patch + +# Debug patches. + +# + +# Other. Needs comment for each patch. + +# + +# End of patches. + +%if 0%{?suse_version} >= 1600 +# Disable ptrace_scope on tumbleweed. +BuildRequires: aaa_base-yama-enable-ptrace +%endif + +BuildRequires: bison +BuildRequires: flex +%if 0%{suse_version} > 1110 +BuildRequires: gcc-c++ +%else +BuildRequires: gcc48 +BuildRequires: gcc48-c++ +%endif +BuildRequires: gettext +BuildRequires: glibc-devel +%if 0%{suse_version} > 1110 && 0%{suse_version} < 1330 +# GDB supports guile 2.0, but not guile 2.2 (swo#21104). Disable guile +# support for newer distro versions in anticipation of a move to guile 2.2. +BuildRequires: guile-devel +%endif +BuildRequires: libexpat-devel +%if 0%{suse_version} >= 1200 +BuildRequires: makeinfo +%else +BuildRequires: texinfo +%endif +BuildRequires: expect + +# Dependency is there for SLE-11, but configure test fails. +BuildRequires: mpfr-devel + +BuildRequires: ncurses-devel +BuildRequires: pkg-config +BuildRequires: readline-devel +BuildRequires: rpm-devel +# SLE-10 doesn't have xz-devel. +%if 0%{suse_version} >= 1110 +BuildRequires: xz-devel +%endif +BuildRequires: zlib-devel + +%if 0%{!?_without_python:1} +%if %{build_testsuite} +BuildRequires: %{python}-base +%else +Requires: %{python}-base +%endif +BuildRequires: %{python}-devel +%endif # 0%{!?_without_python:1} + +%global have_libdebuginfod 0 +# Enable for SLE15-SP4/Leap-15.4, ALP/Factory. +%if 0%{?sle_version} >= 150400 || 0%{?suse_version} >= 1600 +%global have_libdebuginfod 1 +%endif + +%if 0%{have_libdebuginfod} +BuildRequires: libdebuginfod-devel +# Indicate that we prefer libdebuginfod1 over libdebuginfod1-dummy. +BuildRequires: libdebuginfod1 +%endif + +%global have_libipt 0 +%if 0%{suse_version} > 1110 +%ifarch %{ix86} x86_64 +%global have_libipt 1 +BuildRequires: cmake +%endif +%endif + +# BuildArch would break RHEL-5 by overriding arch and not building noarch. +%if 0%{?el5:1} +ExclusiveArch: noarch i386 x86_64 ppc ppc64 ia64 s390 s390x +%endif # 0%{?el5:1} + +%ifarch s390x +%if %{suse_version} > 1500 +BuildRequires: babeltrace-devel +%endif +%endif + +%ifarch i386 x86_64 ppc64 ppc64le aarch64 riscv64 +%if %{suse_version} >= 1500 +BuildRequires: babeltrace-devel +%endif +%endif + +%if 0%{?suse_version} >= 1500 +BuildRequires: libboost_regex-devel +BuildRequires: libsource-highlight-devel +%endif + +%if 0%{?suse_version} >= 1500 +BuildRequires: libzstd-devel +%endif + +%if %{build_testsuite} + +# Copied from gcc9/gcc.spec.in +# Ada currently fails to build on a few platforms, enable it only +# on those that work +%if %{suse_version} >= 1310 +%if %{suse_version} >= 1330 +%define ada_arch %ix86 x86_64 ppc ppc64 ppc64le s390 s390x ia64 aarch64 riscv64 +%else +%define ada_arch %ix86 x86_64 ppc ppc64 s390 ia64 +%endif +%else +%define ada_arch %ix86 x86_64 ppc s390 ia64 +%endif + +# Ensure the devel libraries are installed for both multilib arches. +%global bits_local %{?_isa} +%global bits_other %{?_isa} +%if 0%{!?el5:1} +%ifarch s390x +%global bits_other (%{__isa_name}-32) +%else #!s390x +%ifarch ppc +%global bits_other (%{__isa_name}-64) +%else #!ppc +%ifarch sparc64 ppc64 s390x x86_64 +%global bits_other (%{__isa_name}-32) +%endif #sparc64 ppc64 s390x x86_64 +%endif #!ppc +%endif #!s390x +%endif #!el5 + +BuildRequires: dejagnu +BuildRequires: sharutils +# gcc-objc++ is not covered by the GDB testsuite. + +BuildRequires: gcc-fortran +BuildRequires: gcc-objc +%ifarch %ada_arch +BuildRequires: gcc-ada +%endif + +%define supported_32bit_arch x86_64 ppc64 + +%if 0%{!?disable_32bit:1} +%ifarch %{supported_32bit_arch} + +%if 0%{suse_version} >= 1330 +# Older distros miss this pseudo package, the Ada +# testsuite won't work completely +BuildRequires: gcc-ada-32bit +%endif + +%if 0%{suse_version} > 1110 +BuildRequires: gcc-c++-32bit +%else +# Use system g++ for testing for SLE-11. +BuildRequires: gcc-c++ +%endif + +%if 0%{suse_version} >= 1210 && 0%{suse_version} != 1315 +BuildRequires: glibc-devel-static-32bit +%endif + +%endif # supported_32bit_arch +%endif # !disable_32bit + +%if 0%{suse_version} >= 1210 +BuildRequires: glibc-devel-static +%endif + +%if 0%{?suse_version} > 1500 +# The gccgo command is used by make check for some gdb.go test-cases, so we +# need the gcc-go package. However, the gccgo command was missing from the +# gcc-go package (bsc#1096677), so we only require it for known fixed +# versions. +BuildRequires: gcc-go +%endif + +%if %{with fpc} && 0%{?is_opensuse} +%ifarch x86_64 aarch64 armv7l +# Tumbleweed and Leap 15.x. +%if 0%{?suse_version} >= 1500 +BuildRequires: fpc +%endif +%ifarch %{ix86} +# Tumbleweed and Leap 15.{0,1,2}. +# fpc seems to be unavailable for Leap 15.{3,4}/i586. +%if 0%{?suse_version} > 1500 || (0%{?sle_version} >= 150000 && 0%{?sle_version} <= 150200) +BuildRequires: fpc +%endif +%endif +%endif +%endif + +%if 0%{?suse_version} >= 1200 +%ifnarch s390 +# s390 (for SLE12) doesn't have valgrind +BuildRequires: valgrind +%endif +%endif + +%if 0%{?suse_version} >= 1200 +BuildRequires: systemtap-sdt-devel +%endif + +%if 0%{have_libdebuginfod} +BuildRequires: curl +BuildRequires: elfutils-debuginfod +# Fix: unresolvable: have choice for debuginfod-client needed by +# elfutils-debuginfod: debuginfod-client debuginfod-dummy-client. +BuildRequires: debuginfod-client +%endif + +# SLE-10 doesn't have xz. +%if 0%{suse_version} >= 1110 +# Missing on SLE-11 +BuildRequires: xz +%endif + +%if 0%{!?_without_python:1} +# Provide python package xml.etree.ElementTree, used by test-case +# gdb.python/py-send-packet.exp. +BuildRequires: %{python}-xml +%endif + +%endif # %%{build_testsuite} + +%ifarch ia64 +BuildRequires: libunwind-devel +Requires: libunwind +%endif + +%if %{build_main} + +%if 0%{!?_without_python:1} +%if 0%{?suse_version} >= 1500 +# For SLE-15 and later, we use source-highlight by default, and +# pygments as fallback. So, suggests rather than recommends is what we want. +# Don't bother older releases with this. +Suggests: %{python}-Pygments +%endif +%endif + +%description +GDB, the GNU debugger, allows you to debug programs written in C, C++, +Java, and other languages, by executing them in a controlled fashion +and printing their data. + +%package -n gdbserver +Summary: A standalone server for GDB (the GNU source-level debugger) +License: GPL-3.0-only WITH GCC-exception-3.1 AND GPL-3.0-or-later AND LGPL-2.1-or-later AND LGPL-3.0-or-later +Group: Development/Tools/Debuggers + +%description -n gdbserver +GDB, the GNU debugger, allows you to debug programs written in C, C++, +Java, and other languages, by executing them in a controlled fashion +and printing their data. + +This package provides a program that allows you to run GDB on a different +machine than the one which is running the program being debugged. + +%package doc +Summary: Documentation for GDB (the GNU source-level debugger) +License: GFDL-1.3-only +Group: Documentation/Other +PreReq: %{install_info_prereq} + +%if "%{scl}" == "devtoolset-1.1" +Obsoletes: devtoolset-1.0-%{pkg_name}-doc +%endif + +%description doc +GDB, the GNU debugger, allows you to debug programs written in C, C++, +Java, and other languages, by executing them in a controlled fashion +and printing their data. + +This package provides INFO, HTML and PDF user manual for GDB. +%endif + +%if %{build_testsuite} +%description +Results from running the GDB testsuite. +%endif + +%prep +%setup -q -n %{gdb_src} + +%if 0%{?rhel:1} && 0%{?rhel} <= 6 +# libstdc++ pretty printers. +tar xjf %{SOURCE5} +%endif # 0%{?rhel:1} && 0%{?rhel} <= 6 + +# Files have `# ' statements breaking VPATH / find-debuginfo.sh . +rm -f gdb/ada-exp.c gdb/ada-lex.c gdb/c-exp.c gdb/cp-name-parser.c gdb/f-exp.c +rm -f gdb/jv-exp.c gdb/m2-exp.c gdb/objc-exp.c gdb/p-exp.c gdb/go-exp.c + +# *.info* is needlessly split in the distro tar; also it would not get used as +# we build in %%{gdb_build}, just to be sure. +find -name "*.info*"|xargs rm -f + +#Fedora patching start +%patch -P 2 -p1 +%patch -P 3 -p1 +%patch -P 4 -p1 +%patch -P 5 -p1 +%patch -P 6 -p1 +%patch -P 7 -p1 +%patch -P 8 -p1 +%patch -P 9 -p1 +%patch -P 10 -p1 +%patch -P 11 -p1 +%patch -P 12 -p1 +%patch -P 14 -p1 +%patch -P 15 -p1 +%patch -P 16 -p1 +%patch -P 18 -p1 +%patch -P 19 -p1 +%patch -P 20 -p1 +%patch -P 21 -p1 +%patch -P 22 -p1 +%patch -P 23 -p1 +%patch -P 24 -p1 +%patch -P 25 -p1 +%patch -P 26 -p1 +%patch -P 27 -p1 +%patch -P 28 -p1 +%patch -P 31 -p1 +%patch -P 32 -p1 +%patch -P 33 -p1 +%patch -P 34 -p1 +%patch -P 36 -p1 +%patch -P 38 -p1 +%patch -P 39 -p1 +%patch -P 40 -p1 +%patch -P 41 -p1 +%patch -P 42 -p1 +%patch -P 43 -p1 +%patch -P 44 -p1 +%patch -P 45 -p1 +%patch -P 46 -p1 +#Fedora patching end + +%patch -P 1000 -p1 +%patch -P 1003 -p1 +%patch -P 1004 -p1 +%patch -P 1005 -p1 +%patch -P 1007 -p1 +%patch -P 1008 -p1 +%patch -P 1009 -p1 +%patch -P 1010 -p1 +%patch -P 1012 -p1 +%patch -P 1013 -p1 + +%patch -P 1100 -p1 +%patch -P 1101 -p1 + +%patch -P 1200 -p1 +%patch -P 1203 -p1 +%patch -P 1204 -p1 + +%patch -P 1500 -p1 +%patch -P 1501 -p1 +%patch -P 1503 -p1 +%patch -P 1504 -p1 +%patch -P 1505 -p1 + +%patch -P 2000 -p1 +%patch -P 2001 -p1 +%patch -P 2002 -p1 +%patch -P 2003 -p1 +%patch -P 2004 -p1 +%patch -P 2005 -p1 +%patch -P 2006 -p1 +%patch -P 2007 -p1 +%patch -P 2008 -p1 +%patch -P 2010 -p1 +%patch -P 2011 -p1 +%patch -P 2012 -p1 +%patch -P 2013 -p1 +%patch -P 2014 -p1 +%patch -P 2015 -p1 +%patch -P 2016 -p1 +%patch -P 2017 -p1 +%patch -P 2018 -p1 +%patch -P 2019 -p1 +%patch -P 2020 -p1 +%patch -P 2021 -p1 +%patch -P 2022 -p1 +%patch -P 2023 -p1 +%patch -P 2024 -p1 +%patch -P 2025 -p1 +%patch -P 2026 -p1 +%patch -P 2027 -p1 +%patch -P 2028 -p1 +%patch -P 2029 -p1 +%patch -P 2030 -p1 +%patch -P 2031 -p1 +%patch -P 2032 -p1 +%patch -P 2033 -p1 +%patch -P 2034 -p1 +%patch -P 2035 -p1 +%patch -P 2036 -p1 +%patch -P 2037 -p1 +%patch -P 2038 -p1 +%patch -P 2039 -p1 +%patch -P 2040 -p1 +%patch -P 2041 -p1 +%patch -P 2042 -p1 +%patch -P 2043 -p1 +%patch -P 2044 -p1 +%patch -P 2045 -p1 +%patch -P 2046 -p1 +%patch -P 2047 -p1 +%patch -P 2048 -p1 +%patch -P 2049 -p1 +%patch -P 2050 -p1 +%patch -P 2051 -p1 +%patch -P 2052 -p1 +%patch -P 2053 -p1 +%patch -P 2054 -p1 +%patch -P 2055 -p1 +%patch -P 2056 -p1 +%patch -P 2057 -p1 +%patch -P 2058 -p1 +%patch -P 2059 -p1 +%patch -P 2060 -p1 +%patch -P 2061 -p1 +%patch -P 2062 -p1 +%patch -P 2063 -p1 +%patch -P 2064 -p1 +%patch -P 2065 -p1 +%patch -P 2066 -p1 +%patch -P 2070 -p1 +%patch -P 2071 -p1 +%patch -P 2072 -p1 +%patch -P 2073 -p1 +%patch -P 2074 -p1 +%patch -P 2075 -p1 +%patch -P 2076 -p1 +%patch -P 2077 -p1 +%patch -P 2078 -p1 + +%patch -P 2090 -p1 +%patch -P 2091 -p1 +%patch -P 2092 -p1 +%patch -P 2093 -p1 +%patch -P 2094 -p1 + +%patch -P 2100 -p1 +%patch -P 2101 -p1 +%patch -P 2102 -p1 +%patch -P 2103 -p1 +%patch -P 2104 -p1 +%patch -P 2105 -p1 + +%patch -P 2120 -p1 +%patch -P 2121 -p1 +%patch -P 2122 -p1 +%patch -P 2123 -p1 +%patch -P 2124 -p1 +%patch -P 2125 -p1 +%patch -P 2126 -p1 +%patch -P 2127 -p1 +%patch -P 2128 -p1 +%patch -P 2129 -p1 +%patch -P 2130 -p1 +%patch -P 2131 -p1 +%patch -P 2132 -p1 + +#unpack libipt +%if 0%{have_libipt} +tar xzf %{SOURCE7} +mv libipt-%{libipt_version} processor-trace-%{libipt_version} +%endif + +find -name "*.orig" | xargs rm -f +! find -name "*.rej" # Should not happen. + +# Remove the info and other generated files added by the FSF release +# process. +rm -f libdecnumber/gstdint.h +rm -f bfd/doc/*.info +rm -f bfd/doc/*.info-* +rm -f gdb/doc/*.info +rm -f gdb/doc/*.info-* + +# Fixes problem building release tarball with --with-system-readline. +# Reported here: +# - https://sourceware.org/pipermail/gdb/2021-July/049552.html +# - https://sourceware.org/bugzilla/show_bug.cgi?id=27808 +rm -f gdb/doc/GDBvn.texi + +%build + +# Identify the build directory with the version of gdb as well as the +# architecture, to allow for mutliple versions to be installed and +# built. +# Initially we're in the %%{gdb_src} directory. + +for fprofile in %{?_with_profile:-fprofile} "" +do + +mkdir %{gdb_build}$fprofile +cd %{gdb_build}$fprofile + +%if 0%{suse_version} > 1110 +CC=gcc +CXX=g++ +%else +CC=gcc-4.8 +CXX=g++-4.8 +%endif +export CC +export CXX +export CFLAGS="$RPM_OPT_FLAGS" + +# Add your -Wno-x/-Wno-error=y options here: +for opt in -Wno-error=odr -Wno-error=enum-int-mismatch; do + # checking for acceptance of -Wno-foo is a bit wieldy: GCC doesn't + # warn about unknown -Wno- flags, _except_ if there are other + # diagnostics as well, so let's force an uninitialized use warning + # and grep for the diagnostic about the -Wno flag: + if ! echo "int foo(void) { int a; return a;} " | \ + $CC -x c -c - -o /dev/null -W ${opt} 2>&1 | \ + grep -E "Wno|no option" >/dev/null; then + CFLAGS="$CFLAGS ${opt}" + fi +done +%if %{have_libipt} +CFLAGS="$CFLAGS -DPERF_ATTR_SIZE_VER5_BUNDLE" +( + mkdir processor-trace-%{libipt_version}-root + mkdir processor-trace-%{libipt_version}-build + cd processor-trace-%{libipt_version}-build + # -DPTUNIT:BOOL=ON has no effect on ctest. + cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=RelWithDebInfo \ + -DBUILD_SHARED_LIBS=OFF \ + -DPTUNIT:BOOL=OFF \ + -DDEVBUILD:BOOL=ON \ + ../../processor-trace-%{libipt_version} + make VERBOSE=1 %{?_smp_mflags} + ctest -V %{?_smp_mflags} + make install DESTDIR=../processor-trace-%{libipt_version}-root +) +# There is also: --with-libipt-prefix +CFLAGS="$CFLAGS -I$PWD/processor-trace-%{libipt_version}-root%{_includedir}" +LDFLAGS="$LDFLAGS -L$PWD/processor-trace-%{libipt_version}-root%{_libdir}" +%endif + +export CXXFLAGS="$CFLAGS" + +export LIBRPM=$(ldd /bin/rpm \ + | grep librpm.so \ + | awk '{print $3}') +if [ "$LIBRPM" != "" ]; then + [ -f "$LIBRPM" ] +else + export LIBRPM=no +fi + +%ifarch %ix86 ia64 ppc ppc64 ppc64le s390 s390x x86_64 aarch64 riscv64 +%define build_multitarget 1 +%else +%define build_multitarget 0 +%endif + +%define extra_target_list_common i686 powerpc64le s390x x86_64 aarch64 +%if 0%{?is_opensuse} +%define extra_target_list %{extra_target_list_common} powerpc powerpc64 s390 arm m68k ia64 riscv64 +%define have_elf_extra_target_list 1 +%define elf_extra_target_list avr pru spu +%else +%define extra_target_list %{extra_target_list_common} +%define have_elf_extra_target_list 0 +%endif + +%define DIST %(echo '%distribution' | sed 's, /.*,,') + +%if %build_multitarget +EXTRA_TARGETS="%(printf ,%%s-suse-linux %{extra_target_list})" +%if %{have_elf_extra_target_list} +EXTRA_TARGETS="$EXTRA_TARGETS%(printf ,%%s-elf %{elf_extra_target_list})" +%endif +%else +EXTRA_TARGETS= +%endif + +# Reenable enable-werror on tumbleweed when upgrading to 13.1 (bsc#1211052) +../configure \ + --prefix=%{_prefix} \ + --libdir=%{_libdir} \ + --sysconfdir=%{_sysconfdir} \ + --mandir=%{_mandir} \ + --infodir=%{_infodir} \ + --htmldir=%{gdb_docdir} \ + --pdfdir=%{gdb_docdir} \ + --with-system-gdbinit=%{_sysconfdir}/gdbinit \ + --with-gdb-datadir=%{_datadir}/gdb \ + --enable-gdb-build-warnings=,-Wno-unused \ +%ifnarch %{ix86} alpha ia64 ppc s390 s390x x86_64 ppc64 ppc64le sparc sparcv9 sparc64 riscv64 aarch64 + --disable-werror \ +%else +%if %{suse_version} <= 1110 || %{suse_version} > 1500 + --disable-werror \ +%else + --enable-werror \ +%endif +%endif + --with-separate-debug-dir=/usr/lib/debug \ +%if 0%{have_libdebuginfod} + --with-debuginfod=yes \ +%endif + --disable-sim \ + --disable-rpath \ + --with-system-zlib \ +%if %{suse_version} >= 1500 + --with-system-readline \ +%else + --without-system-readline \ +%endif + --with-expat \ +$(: ppc64 host build crashes on ppc variant of libexpat.so ) \ + --without-libexpat-prefix \ + --enable-tui \ +%if 0%{!?_without_python:1} + --with-python=%{_bindir}/%{python} \ +%else + --without-python \ +%endif +%if %{suse_version} >= 1130 + --with-rpm=$LIBRPM \ +%else + --without-rpm \ +%endif +%ifarch ia64 + --with-libunwind-ia64 \ +%else + --without-libunwind \ +%endif +%ifarch sparc sparcv9 sparc64 + --without-mmap \ +%endif + --enable-64-bit-bfd \ +%if %{have_inproctrace} + --enable-inprocess-agent \ +%else + --disable-inprocess-agent \ +%endif +%if %{have_libipt} + --with-intel-pt \ +%else + --without-intel-pt \ +%endif + --with-bugurl=http://bugs.opensuse.org/ \ + --with-pkgversion="GDB; %{DIST}" \ +$(: ia64 is obsolete. ) \ + --enable-obsolete \ + ${EXTRA_TARGETS:+--enable-targets="${EXTRA_TARGETS#,}"} \ +%ifarch sparc sparcv9 + --build=sparc-%{_vendor}-%{_target_os}%{?_gnu} +%else +$(: It breaks RHEL-5 by %{_target_platform} being noarch-redhat-linux-gnu ) \ +%ifarch noarch + $(:) +%else + --build=%{_target_platform} +%endif +%endif + +if [ -z "%{!?_with_profile:no}" ] +then + # Run all the configure tests being incompatible with $FPROFILE_CFLAGS. + make %{?_smp_mflags} configure-host configure-target + make %{?_smp_mflags} clean + + # Workaround -fprofile-use: + # linux-x86-low.c:2225: Error: symbol `start_i386_goto' is already defined + make %{?_smp_mflags} -C gdb/gdbserver linux-x86-low.o +fi + +# Global CFLAGS would fail on: +# conftest.c:1:1: error: coverage mismatch for function 'main' while reading counter 'arcs' +if [ "$fprofile" = "-fprofile" ] +then + FPROFILE_CFLAGS='-fprofile-generate' +elif [ -z "%{!?_with_profile:no}" ] +then + FPROFILE_CFLAGS='-fprofile-use' + # We cannot use -fprofile-dir as the bare filenames clash. + (cd ../%{gdb_build}-fprofile; + # It was 333 on x86_64. + test $(find -name "*.gcda"|wc -l) -gt 300 + find -name "*.gcda" | while read -r i + do + ln $i ../%{gdb_build}/$i + done + ) +else + FPROFILE_CFLAGS="" +fi + +# Prepare gdb/config.h first. +make %{?_smp_mflags} V=1 CFLAGS="$CFLAGS $FPROFILE_CFLAGS" LDFLAGS="$LDFLAGS $FPROFILE_CFLAGS" maybe-configure-gdb +perl -i.relocatable -pe 's/^(D\[".*_RELOCATABLE"\]=" )1(")$/${1}0$2/' gdb/config.status + +make %{?_smp_mflags} V=1 CFLAGS="$CFLAGS $FPROFILE_CFLAGS" LDFLAGS="$LDFLAGS $FPROFILE_CFLAGS" + +! grep '_RELOCATABLE.*1' gdb/config.h + +if [ "$fprofile" = "-fprofile" ] +then + cd gdb + cp -p gdb gdb-withindex + PATH="$PWD:$PATH" sh ../../gdb/gdb-add-index $PWD/gdb-withindex + ./gdb -nx -ex q ./gdb-withindex + ./gdb -nx -readnow -ex q ./gdb-withindex + cd .. +fi + +cd .. + +done # fprofile + +cd %{gdb_build} + +#make %{?_smp_mflags} -C gdb/doc {gdb,annotate}{.info,/index.html,.pdf} MAKEHTMLFLAGS=--no-split + +# Copy the /gdb/NEWS file to the directory above it. +cp $RPM_BUILD_DIR/%{gdb_src}/gdb/NEWS $RPM_BUILD_DIR/%{gdb_src} + +%check +# Initially we're in the %%{gdb_src} directory. +cd %{gdb_build} + +%if !%{build_testsuite} +echo ====================TESTSUITE DISABLED========================= +%else +echo ====================TESTING========================= +cd gdb +CC=gcc +CXX=g++ +export CC +export CXX +$CC -o ./orphanripper %{SOURCE2} -Wall -lutil -ggdb2 +# Need to use a single --ignore option, second use overrides first. +# No `%{?_smp_mflags}' here as it may race. +# WARNING: can't generate a core file - core tests suppressed - check ulimit +# "readline-overflow.exp" - Testcase is broken, functionality is OK. +( + # ULIMIT required for `gdb.base/auxv.exp'. + ulimit -H -c + ulimit -c unlimited || : + + # Setup $CHECK as `check//unix/' or `check//unix/-m64' for explicit bitsize. + # Never use two different bitsizes as it fails on ppc64. + echo 'int main (void) { return 0; }' >biarch.c + CHECK="" + for BI in -m64 -m32 -m31 "" + do + # Do not use size-less options if any of the sizes works. + # On ia64 there is no -m64 flag while we must not leave a bare `check' here + # as it would switch over some testing scripts to the backward compatibility + # mode: when `make check' was executed from inside the testsuite/ directory. + if [ -z "$BI" -a -n "$CHECK" ];then + continue + fi + # Do not use $RPM_OPT_FLAGS as the other non-size options will not be used + # in the real run of the testsuite. + if ! $CC $BI -o biarch biarch.c + then + continue + fi + CHECK="$CHECK check//unix/$BI" + done + # Do not try -m64 inferiors for -m32 GDB as it cannot handle inferiors larger + # than itself. + # s390 -m31 still uses the standard ELF32 binary format. + $CC $RPM_OPT_FLAGS -o biarch biarch.c + RPM_SIZE="$(file ./biarch|sed -n 's/^.*: ELF \(32\|64\)-bit .*$/\1/p')" + if [ "$RPM_SIZE" != "64" ] + then + CHECK="$(echo " $CHECK "|sed 's# check//unix/-m64 # #')" + fi + + # Disable some problematic testcases. + # RUNTESTFLAGS='--ignore ...' is not used below as it gets separated by the + # `check//...' target spawn and too much escaping there would be dense. + DISABLE_TESTS= + DISABLE_TESTS="$DISABLE_TESTS gdb.base/bigcore.exp" + DISABLE_TESTS="$DISABLE_TESTS gdb.threads/attach-many-short-lived-threads.exp" + %if 0%{suse_version} == 1110 + DISABLE_TESTS="$DISABLE_TESTS gdb.base/break-interp.exp" + %endif + for test in $DISABLE_TESTS; do + mv -f ../../gdb/testsuite/$test ../../gdb/testsuite/$test-DISABLED || : + done + + # Run all the scheduled testsuite runs also in the PIE mode. + # See also: gdb-runtest-pie-override.exp + if rpm -q gcc-PIE; then + CHECK="$(echo $CHECK | sed 's#check//unix/[^ ]*#& &/-fno-PIE/-no-pie#g')" + else + CHECK="$(echo $CHECK | sed 's#check//unix/[^ ]*#& &/-fPIE/-pie#g')" + fi + +%if %{with for_chroot} + # When we want to chroot into a local osc build and run a test-case, we + # need -M testsuite to add all the buildrequires, but there's no need + # to run the testsuite. Instead, fail %check to make sure %clean doesn't + # remove buildroot. + false +%else + ./orphanripper make %{?_smp_mflags} -k $CHECK || : +%endif +) +for t in sum log +do + for file in testsuite*/gdb.$t + do + suffix="${file#testsuite.unix.}" + suffix="${suffix%/gdb.$t}" + ln $file gdb-%{_target_platform}$suffix.$t || : + done +done +# `tar | bzip2 | uuencode' may have some piping problems in Brew. +#tar cjf gdb-%%{_target_platform}.tar.bz2 gdb-%%{_target_platform}*.{sum,log} +#uuencode gdb-%%{_target_platform}.tar.bz2 gdb-%%{_target_platform}.tar.bz2 +# Strip dates and completion times from the log to make build-compare happy +sed -i -e '/Test Run By abuild on/d' -e 's/completed in [0-9]* seconds//' *.{sum,log} +cd ../.. +echo ====================TESTING END===================== +%endif + +%install +# Initially we're in the %%{gdb_src} directory. +cd %{gdb_build} + +# It would break RHEL-5 by leaving excessive files for the doc subpackage. +%ifnarch noarch + +make %{?_smp_mflags} install DESTDIR=$RPM_BUILD_ROOT + +mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/gdbinit.d +touch -r %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/gdbinit.d + +%if 0%{!?_without_python:1} +sed 's#%%{_sysconfdir}#%{_sysconfdir}#g' <%{SOURCE4} >$RPM_BUILD_ROOT%{_sysconfdir}/gdbinit +touch -r %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/gdbinit +%else +sed 's#%%{_sysconfdir}#%{_sysconfdir}#g' <%{SOURCE5} >$RPM_BUILD_ROOT%{_sysconfdir}/gdbinit +touch -r %{SOURCE5} $RPM_BUILD_ROOT%{_sysconfdir}/gdbinit +%endif + +for i in `find $RPM_BUILD_ROOT%{_datadir}/gdb/python/gdb -name "*.py"` +do + # Files could be also patched getting the current time. + touch -r $RPM_BUILD_DIR/%{gdb_src}/gdb/version.in $i +done + +%if 0%{?_enable_debug_packages:1} && 0%{!?_without_python:1} +mkdir -p $RPM_BUILD_ROOT/usr/lib/debug%{_bindir} +cp -p $RPM_BUILD_DIR/%{gdb_src}/gdb/gdb-gdb.py $RPM_BUILD_ROOT/usr/lib/debug%{_bindir}/ +for pyo in "" "-O";do + # RHEL-5: AttributeError: 'module' object has no attribute 'compile_file' + %{python} $pyo -c 'import compileall, re, sys; sys.exit (not compileall.compile_dir("'"$RPM_BUILD_ROOT/usr/lib/debug%{_bindir}"'", 1, "'"/usr/lib/debug%{_bindir}"'"))' +done +%endif # 0%{?_enable_debug_packages:1} && 0%{!?_without_python:1} + +mkdir $RPM_BUILD_ROOT%{_datadir}/gdb/auto-load +%if 0%{?rhel:1} && 0%{?rhel} <= 6 +%if 0%{!?_without_python:1} +# Temporarily now: +for LIB in lib lib64;do + LIBPATH="$RPM_BUILD_ROOT%{_datadir}/gdb/auto-load%{_root_prefix}/$LIB" + mkdir -p $LIBPATH + # basename is being run only for the native (non-biarch) file. + sed -e 's,@pythondir@,%{_datadir}/gdb/python,' \ + -e 's,@toolexeclibdir@,%{_root_prefix}/'"$LIB," \ + < $RPM_BUILD_DIR/%{gdb_src}/%{libstdcxxpython}/hook.in \ + > $LIBPATH/$(basename %{_root_prefix}/%{_lib}/libstdc++.so.6.*)-gdb.py + # Test the filename 'libstdc++.so.6.*' has matched. + test -f $LIBPATH/libstdc++.so.6.[0-9]*-gdb.py +done +test ! -e $RPM_BUILD_ROOT%{_datadir}/gdb/python/libstdcxx +cp -a $RPM_BUILD_DIR/%{gdb_src}/%{libstdcxxpython}/libstdcxx \ + $RPM_BUILD_ROOT%{_datadir}/gdb/python/libstdcxx +for i in `find $RPM_BUILD_ROOT%{_datadir}/gdb/python -name "*.py"` \ + `find $RPM_BUILD_ROOT%{_datadir}/gdb/auto-load%{_prefix} -name "*.py"` \ +; do + # Files come from gdb-archer.patch and can be also further patched. + touch -r $RPM_BUILD_DIR/%{gdb_src}/gdb/version.in $i +done +%endif # 0%{!?_without_python:1} +%endif # 0%{?rhel:1} && 0%{?rhel} <= 6 + +# Remove the files that are part of a gdb build but that are owned and +# provided by other packages. +# These are part of binutils + +rm -rf $RPM_BUILD_ROOT%{_datadir}/locale/ +rm -f $RPM_BUILD_ROOT%{_infodir}/bfd* +rm -f $RPM_BUILD_ROOT%{_infodir}/standard* +rm -f $RPM_BUILD_ROOT%{_infodir}/configure* +rm -f $RPM_BUILD_ROOT%{_infodir}/sframe-spec* +rm -rf $RPM_BUILD_ROOT%{_includedir} +rm -rf $RPM_BUILD_ROOT/%{_libdir}/lib{bfd*,opcodes*,iberty*,ctf*,sframe*} + +%if %{build_testsuite} +rm -rf $RPM_BUILD_ROOT%{_sysconfdir}/gdbinit +rm -rf $RPM_BUILD_ROOT%{_bindir} +rm -rf $RPM_BUILD_ROOT%{_libdir} +rm -rf $RPM_BUILD_ROOT%{_datadir}/gdb +rm -rf $RPM_BUILD_ROOT%{_infodir} +rm -rf $RPM_BUILD_ROOT%{_mandir} +rm -rf $RPM_BUILD_ROOT/usr/src +%endif + +# pstack obsoletion + +%if %{build_main} +cp -p %{SOURCE3} $RPM_BUILD_ROOT%{_mandir}/man1/gstack.1 +%endif +%endif # 0%{!?_with_upstream:1} + +%if %{build_main} +# Packaged GDB is not a cross-target one. +(cd $RPM_BUILD_ROOT%{_datadir}/gdb/syscalls + rm -f mips*.xml +%ifnarch sparc sparcv9 sparc64 + rm -f sparc*.xml +%endif +%ifnarch x86_64 + rm -f amd64-linux.xml +%endif +%ifnarch %{ix86} x86_64 + rm -f i386-linux.xml +%endif +%ifnarch ppc ppc64 + rm -f ppc{,64}-linux.xml +%endif +%ifnarch ppc64le + rm -f ppc64le-linux.xml +%endif +) + +# It would break RHEL-5 by leaving excessive files for the doc subpackage. +%if 0%{?el5:1} +rm -f $RPM_BUILD_ROOT%{_infodir}/annotate.info* +rm -f $RPM_BUILD_ROOT%{_infodir}/gdb.info* +%endif # 0%{?el5:1} +# -j1: There is some race resulting in: +# /usr/bin/texi2dvi: texinfo.tex appears to be broken, quitting. +make -j1 -C gdb/doc install DESTDIR=$RPM_BUILD_ROOT + +# Documentation only for development; keep 'rm's here after "noarch" above. +rm -f $RPM_BUILD_ROOT%{_infodir}/gdbint* +rm -f $RPM_BUILD_ROOT%{_infodir}/stabs* +rm -f $RPM_BUILD_ROOT%{_infodir}/ctf-spec* + +# Delete this too because the dir file will be updated at rpm install time. +# We don't want a gdb specific one overwriting the system wide one. + +rm -f $RPM_BUILD_ROOT%{_infodir}/dir + +%endif + +%post +# This step is part of the installation of the RPM. Not to be confused +# with the 'make install ' of the build (rpmbuild) process. + +# For --excludedocs: +if [ -e %{_infodir}/gdb.info.gz ] +then + %install_info --info-dir=%{_infodir} %{_infodir}/annotate.info.gz + %install_info --info-dir=%{_infodir} %{_infodir}/gdb.info.gz +fi + +%preun +if [ $1 = 0 ] +then + # For --excludedocs: + if [ -e %{_infodir}/gdb.info.gz ] + then + %install_info_delete --delete --info-dir=%{_infodir} %{_infodir}/annotate.info.gz + %install_info_delete --delete --info-dir=%{_infodir} %{_infodir}/gdb.info.gz + fi +fi + +%if %{build_main} +%files +%defattr(-,root,root) +%doc README NEWS +%if 0%{suse_version} >= 1320 +%license COPYING3 COPYING COPYING.LIB +%else +%doc COPYING3 COPYING COPYING.LIB +%endif +%{_bindir}/gcore +%{_mandir}/*/gcore.1* +%{_bindir}/gdb +%config(noreplace) %{_sysconfdir}/gdbinit +%{_sysconfdir}/gdbinit.d +%{_mandir}/*/gdb.1* +%{_bindir}/gstack +%{_mandir}/*/gstack.1* +%{_bindir}/gdb-add-index +%{_mandir}/*/gdb-add-index.1* +%{_mandir}/*/gdbinit.5* +%{_datadir}/gdb +%{_infodir}/annotate.info* +%{_infodir}/gdb.info* +%endif + +%if %{build_testsuite} +%files +%defattr(-,root,root) +%doc %{gdb_build}/gdb/gdb-*.sum +%doc %{gdb_build}/gdb/gdb-*.log +%endif + +# don't include the files in include, they are part of binutils + +%if %{build_main} +%ifnarch sparcv9 hppa +%files -n gdbserver +%defattr(-,root,root) +%{_bindir}/gdbserver +%{_mandir}/*/gdbserver.1* +%if %{have_inproctrace} +%{_libdir}/libinproctrace.so +%endif # %%{have_inproctrace} +%endif +%endif + +%if %{build_main} +%post doc +# This step is part of the installation of the RPM. Not to be confused +# with the 'make install ' of the build (rpmbuild) process. + +# For --excludedocs: +if [ -e %{_infodir}/gdb.info.gz ] +then + /sbin/install-info --info-dir=%{_infodir} %{_infodir}/annotate.info.gz || : + /sbin/install-info --info-dir=%{_infodir} %{_infodir}/gdb.info.gz || : +fi + +%preun doc +if [ $1 = 0 ] +then + # For --excludedocs: + if [ -e %{_infodir}/gdb.info.gz ] + then + /sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/annotate.info.gz || : + /sbin/install-info --delete --info-dir=%{_infodir} %{_infodir}/gdb.info.gz || : + fi +fi +%endif + +%changelog diff --git a/gdbinit b/gdbinit new file mode 100644 index 0000000..2ed6e59 --- /dev/null +++ b/gdbinit @@ -0,0 +1,8 @@ +# System-wide GDB initialization file. +python +import glob +for f in glob.glob('%{_sysconfdir}/gdbinit.d/*.gdb'): + gdb.execute('source %s' % f) +for f in glob.glob('%{_sysconfdir}/gdbinit.d/*.py'): + gdb.execute('source %s' % f) +end diff --git a/gdbinit.without-python b/gdbinit.without-python new file mode 100644 index 0000000..c70a140 --- /dev/null +++ b/gdbinit.without-python @@ -0,0 +1,5 @@ +# System-wide GDB initialization file. + +# FIXME: Source /etc/gdbinit.d/*.gdb +# Without python support, there's currently no way to do this. See also +# swo#13578 - "source command file globbing". diff --git a/import-fedora.sh b/import-fedora.sh new file mode 100644 index 0000000..abefcac --- /dev/null +++ b/import-fedora.sh @@ -0,0 +1,142 @@ +#!/bin/bash + +# Fedora Packages not copied: +# +skip_patches=( + # Not applicable for openSUSE. + gdb-add-index.patch + gdb-6.3-rh-testversion-20041202.patch + gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch + gdb-6.8-bz466901-backtrace-full-prelinked.patch + gdb-container-rh-pkg.patch + + # Fragile test-case, requires glibc to fail in a certain way. + gdb-rhbz1156192-recursive-dlopen-test.patch + + # Obsolete. + gdb-6.7-ppc-clobbered-registers-O2-test.patch +) + +usage () +{ + echo "usage: $(basename "$0") " +} + +dir="$1" + +if [ ! -f "$dir"/_patch_order ]; then + usage + exit 1 +fi + +mark1="^#Fedora Packages begin" +mark2="^#Fedora Packages end" +mark3="^#Fedora patching start" +mark4="^#Fedora patching end" + +remove_current_patches () +{ + # shellcheck disable=SC2207 + current_patches=($(awk "/$mark1/,/$mark2/{ print }" gdb.spec \ + | grep Patch \ + | awk '{print $2}')) + + for current_patch in "${current_patches[@]}"; do + rm -f "$current_patch" + done +} + +skip () +{ + local p + p="$1" + + for skip_patch in "${skip_patches[@]}"; do + if [ "$p" = "$skip_patch" ]; then + return 0 + fi + done + + return 1 +} + +import_patches () +{ + # Get the parts of gdb.spec that we want to keep unchanged. + awk "NR==1,/$mark1/" gdb.spec \ + > gdb.spec.1 + awk "/$mark2/,/$mark3/" gdb.spec \ + > gdb.spec.3 + awk "/$mark4/,0" gdb.spec \ + > gdb.spec.5 + + # Start generating the parts of gdb.spec that we want to change. + f1=gdb.spec.2 + f2=gdb.spec.4 + rm -f $f1 $f2 + + # Handle each fedora patch. + skipped_patches=() + n=1 + # shellcheck disable=SC2013 + for p in $(cat "$dir"/_patch_order); do + if skip "$p"; then + echo "Skipped: $p" + skipped_patches=("${skipped_patches[@]}" "$p") + + # Keep numbers the same as in fedora package. + n=$((n + 1)) + continue + fi + + cp "$dir"/"$p" . + + printf \ + "%-16s%s\n" "Patch$n:" "$p" \ + >> $f1 + + echo \ + "%patch -P $n -p1" \ + >> $f2 + + n=$((n + 1)) + done + + # Report which patches did not get skipped. + for skip_patch in "${skip_patches[@]}"; do + found=false + for skipped_patch in "${skipped_patches[@]}"; do + if [ "$skip_patch" = "$skipped_patch" ]; then + found=true + break + fi + done + if ! $found; then + echo "Not skipped: $skip_patch" + fi + done + + # Assemble new gdb.spec. + rm -f gdb.spec.new + for n in $(seq 1 5); do + cat gdb.spec."$n" \ + >> gdb.spec.new + done + + # Cleanup. + for n in $(seq 1 5); do + rm -f gdb.spec."$n" + done + + # Update gdb.spec. + mv gdb.spec.new gdb.spec +} + +main () +{ + remove_current_patches + + import_patches +} + +main "$@" diff --git a/import-patches.sh b/import-patches.sh new file mode 100644 index 0000000..a7ffcaa --- /dev/null +++ b/import-patches.sh @@ -0,0 +1,100 @@ +#!/bin/sh + +# Invoke as: +# $ ./import-patches.sh [ --dry-run ] /00*.patch + +usage () +{ + echo "./import-patches.sh [ --dry-run ] +" +} + +dryrun=false +case "$1" in + -dryrun|-dry-run|--dryrun|--dry-run) + dryrun=true + shift + ;; +esac + +n="$1" +shift + +case $n in + "") + echo "Missing argument" + usage + exit 1 + ;; + [0-9][0-9]*) + ;; + *) + echo "Need numeric argument" + usage + exit 1 + ;; +esac + +if [ "$n" = "" ]; then + echo "Missing argument" + usage + exit 1 +fi + +files="$*" + +rm -Rf tmp.patches +mkdir tmp.patches + +tmp= +for f in $files; do + dir=$(dirname "$f") + f=$(basename "$f") + orig_f="$f" + + # Remove numeric prefix. + f=$(echo "$f" \ + | sed 's/^[0-9]*-//') + + # To lowercase. + f=$(echo "$f" \ + | tr '[:upper:]' '[:lower:]') + + # Fix patch.patch. + f=$(echo "$f" \ + | sed 's/\.patch\.patch/.patch/') + + # Copy. + cp "$dir"/"$orig_f" tmp.patches/"$f" + + # Filter out ChangeLog entries. + filterdiff -x "*/ChangeLog" tmp.patches/"$f" > tmp.patches/tmp."$f" + mv tmp.patches/tmp."$f" tmp.patches/"$f" + + tmp="$tmp $f" +done +files="$tmp" + +i=$n +for f in $files; do + printf "Patch%-11s%s\n" "$i:" "$f" + + i=$((i + 1)) +done + +i=$n +for f in $files; do + echo "%patch$i -p1" + + i=$((i + 1)) +done + +if $dryrun; then + exit +fi + +for f in $files; do + mv tmp.patches/"$f" . + osc add "$f" +done + +rmdir tmp.patches diff --git a/make-pascal_language-print_type-handle-varstring-nul.patch b/make-pascal_language-print_type-handle-varstring-nul.patch new file mode 100644 index 0000000..c838c98 --- /dev/null +++ b/make-pascal_language-print_type-handle-varstring-nul.patch @@ -0,0 +1,43 @@ +From f27cc602d85c46b46f5b02d6f584a1d872e098e3 Mon Sep 17 00:00:00 2001 +From: Tom Tromey +Date: Wed, 27 Mar 2024 10:34:46 -0600 +Subject: [PATCH] Make pascal_language::print_type handle varstring==nullptr + +PR gdb/31524 points out a crash when pascal_language::print_type is +called with varstring==nullptr. This crash is a regression arising +from the printf/pager rewrite -- that indirectly removed a NULL check +from gdb's "puts". + +This patch instead fixes the problem by adding a check to print_type. +Passing nullptr here seems to be expected in other places (e.g., there +is a call to type_print like this in expprint.c), and other +implementations of this method (or related helpers) explicitly check +for NULL. + +I didn't write a test case for this because it seemed like overkill +for a Pascal bug that only occurs with -i=mi. However, if you want +one, let me know and I will do it. + +Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31524 +Approved-By: John Baldwin +--- + gdb/p-typeprint.c | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/gdb/p-typeprint.c b/gdb/p-typeprint.c +index e8542d6845a..68a94a65f64 100644 +--- a/gdb/p-typeprint.c ++++ b/gdb/p-typeprint.c +@@ -55,7 +55,8 @@ pascal_language::print_type (struct type *type, const char *varstring, + type_print_varspec_prefix (type, stream, show, 0, flags); + } + /* first the name */ +- gdb_puts (varstring, stream); ++ if (varstring != nullptr) ++ gdb_puts (varstring, stream); + + if ((varstring != NULL && *varstring != '\0') + && !(code == TYPE_CODE_FUNC +-- +2.35.3 + diff --git a/patchlist.pl b/patchlist.pl new file mode 100644 index 0000000..414a004 --- /dev/null +++ b/patchlist.pl @@ -0,0 +1,74 @@ +#!/usr/bin/perl + +die "need gdb-Fedora directory" unless -d $ARGV[0]; + +my $gdbFedora = $ARGV[0]; +my $dir = `pwd`; +chomp($dir); + +system "rm \$(grep \"^Patch[0-9]\\{1,3\\}:\" gdb.spec | awk '{print \$2}') 2>/dev/null"; +system "rm *.tar.bz2"; +system "cp -p $gdbFedora/*.tar.bz2 ./"; +system "pushd $gdbFedora ; sh $dir/patchname_get.sh -v gdb.spec 2>$dir/test.txt; popd"; +system "grep \"^Patch\" test.txt > test2.txt"; + +my @patchliste = `cat test2.txt`; +my @patchdeklarationen = (); +my @patchstatements = (); +my %seenpatches = (); +my $blockcounter = 0; +my @patchcopy = (); + +foreach my $line (@patchliste) { + chomp($line); + if ($line =~ /\((.*)\)/) { + $patchname = $1; + if (exists $seenpatches{$patchname}){ + my $oldcount = $seenpatches{$patchname}; + push @patchstatements, "%patch$oldcount -p1 -R\n"; + } + else { + $count = $count + 1; + push @patchdeklarationen, "Patch$count: ". (($count < 10) ? " " : (($count < 100) ? " " : "")) ."$patchname\n"; + push @patchstatements, "%patch$count -p1\n"; + $seenpatches{$patchname} = $count; + push @patchcopy, $patchname; + } + } +} + +foreach my $copy (@patchcopy) { + system "cp \"$gdbFedora/$copy\" ./"; +} + +open F, ">gdb.spec.new"; +foreach my $line (`cat gdb.spec`) { + if ($line eq "#Fedora Packages begin\n") { + print F $line; + $blockcounter = 1; + } + elsif ($line eq "#Fedora Packages end\n") { + $blockcounter = 0; + } + elsif($line eq "#Fedora patching start\n") { + print F $line; + $blockcounter = 3; + } + elsif($line eq "#Fedora patching end\n") { + $blockcounter = 0; + } + if ($blockcounter == 0){ + print F $line; + } elsif ($blockcounter == 1) { + print F @patchdeklarationen; + $blockcounter = 2; + } elsif ($blockcounter == 3) { + print F @patchstatements; + $blockcounter = 4; + } +} +close F; + +system "mv gdb.spec.new gdb.spec"; +system "rm test.txt test2.txt"; +system "osc addremove"; diff --git a/patchname_get.sh b/patchname_get.sh new file mode 100644 index 0000000..fe4ff82 --- /dev/null +++ b/patchname_get.sh @@ -0,0 +1,314 @@ +#!/bin/bash + + + +: ${QUILT_DIR=/usr/share/quilt} + + +if ! [ -r $QUILT_DIR/scripts/patchfns ] +then + echo "Cannot read library $QUILT_DIR/scripts/patchfns" >&2 + exit 1 +fi +. $QUILT_DIR/scripts/patchfns +cd ${SUBDIR:-.} + +usage() { + echo "Usage: ${0##*/} [--fuzz=N] specfile" + exit 1 +} + +options=$(getopt -o v --long sourcedir:,fuzz: -n "${0##*/}" -- "$@") || exit + +eval set -- "$options" + +sourcedir= + +while true +do + case "$1" in + -v) + verbose=1 + shift ;; + --sourcedir) + sourcedir=${2%/}/ + shift 2 ;; + --fuzz) + # Only works with rpm 4.6 and later + DEFINE_FUZZ="%define _default_patch_fuzz $2" + shift 2 ;; + --) + shift + break ;; + esac +done + +[ "${sourcedir:0:1}" = / ] || sourcedir=$PWD/$sourcedir + +specfile=$1 +if [ $# -ne 1 -o ! -f "$specfile" ] +then + + usage +fi +if [ "${specfile:0:1}" = / ] +then + specdir=$(dirname "$specfile") + specfile=${specfile##*/} +else + specdir=$PWD +fi + +tmpdir="$(gen_tempfile -d ${VARTMPDIR:-/var/tmp}/${0##*/})" +mkdir -p $tmpdir || exit 1 +add_exit_handler "rm -rf $tmpdir" +mkdir -p $tmpdir/build +mkdir -p $tmpdir/bin + +# Older versions of Suse packages have a symbolic release number, and rpmbuild +# won't like that, so change it to something compliant. +if grep -q '^Release:.*[<>]' "$specdir/$specfile" +then + sed -e '/^Release:/s/[<>]//g' < "$specdir/$specfile" > $tmpdir/"$specfile" + specdir=$tmpdir +fi + +# Redirect file descriptors +# 5 is used in verbose mode, 4 in non-verbose mode, and 2 for both (real errors) +if [ -n "$verbose" ] +then + exec 3>&1 5>&2 4>/dev/null +else + exec 3>&1 4>&2 5>/dev/null +fi + + + +# wrapper script for patch and tar +cat <<-'EOF' > $tmpdir/bin/wrapper + #! /bin/bash + + # find original data file by md5sum + original_file() { + local file=$1 md5sum + + set -- $(md5sum < $file) + md5sum=$1 + while read md5sum_ file_ + do + if [ "$md5sum" = "$md5sum_" ] + then + echo ${file_#\*} + return 0 + fi + done < $tmpdir/md5sums + + # Try harder + if ! [ -e $tmpdir/more-md5sums ] + then + ( cd $RPM_BUILD_DIR + find . -type f \ + | sed -e 's:^.\/::' \ + | xargs md5sum \ + ) > $tmpdir/more-md5sums + fi + + while read md5sum_ file_ + do + if [ "$md5sum" = "$md5sum_" ] + then + echo ${file_#\*} + return 0 + fi + done < $tmpdir/more-md5sums + return 1 + } + + + + + + # Extract a command line option with or without argument + cmdline_option() { + local letter=$1 no_arg=$2 + shift + + while [ $# -ne 0 ] + do + if [ "${1:0:2}" = -$letter ] + then + if [ -z "$no_arg" ] + then + [ "$1" = -$letter ] && set -- "$1$2" + fi + echo $1 + break + fi + shift + done + } + + + strip_option() { + set -- $(cmdline_option p "$@") + [ "$1" != -p1 ] && echo $1 + } + + # Extract the -p option from the command line + strip_option() { + set -- $(cmdline_option p "$@") + [ "$1" != -p1 ] && echo $1 + } + + # Extract the -R option from the command line + reverse_option() { + set -- $(cmdline_option R no_arg "$@") + echo $1 + } + + patch_opt_d() { + local subdir=$(cmdline_option d "$@") + [ -z "$subdir" ] || echo "${subdir:2}" + } + + + + patch_input_file() { + while [ $# -gt 0 ]; do + case "$1" in + -i|--input) + if [ $# -ge 2 ]; then + echo "$2" + return + fi + ;; + -i*) + echo "${1#-i}" + return + ;; + --input=*) + echo "${1#--input=}" + return + ;; + esac + shift + done + return + } + + tar_input_file() { + case "$1" in + *C*f*) + echo "$3" + ;; + *f*) + echo "$2" + ;; + esac + } + + + tar_opt_C() { + case "$1" in + *C*f*) + echo "$2" + return ;; + esac + } + + tmpdir=${RPM_BUILD_DIR%/*} + rm -f $tmpdir/data + case "${0##*/}" in + patch) + inputfile=$(patch_input_file "$@") + ;; + tar) + inputfile=$(tar_input_file "$@") + # For tar, file - means read from stdin + [ "$inputfile" = "-" ] && inputfile= + ;; + esac + if [ -z "$inputfile" ]; then + # put data from stdin into tmpfile + cat > $tmpdir/data + fi + + unpackfile="$(original_file ${inputfile:-$tmpdir/data})" + if [ -n "$unpackfile" ] + then + case "${0##*/}" in + patch) + echo -n p >&4 + subdir=$(patch_opt_d "$@") + if [ -n "$subdir" ] + then + dir=$(cd "$subdir" && echo $PWD) + else + dir=$PWD + fi + dir=${dir/$RPM_BUILD_DIR} + dir=${dir##/} + dir=${dir// /\\ } + echo "${0##*/} ${dir:-.} $unpackfile" \ + $(strip_option "$@") $(reverse_option "$@") >&3 + ;; + tar) + echo -n t >&4 + subdir=$(tar_opt_C "$@") + if [ -n "$subdir" ] + then + dir=$(cd "$subdir" && echo $PWD) + else + dir=$PWD + fi + dir=${dir/$RPM_BUILD_DIR} + dir=${dir##/} + dir=${dir// /\\ } + echo "${0##*/} ${dir:-.} $unpackfile" >&3 + ;; + esac + fi + + PATH=${PATH#*:} + if [ -n "$inputfile" ]; then + ${0##*/} "$@" + else + ${0##*/} "$@" < $tmpdir/data + fi + +EOF + +chmod 755 $tmpdir/bin/wrapper +# If $TMPDIR is mounted with noexec, rpmbuild won't be able to execute +# our wrapper script +if [ ! -x $tmpdir/bin/wrapper ] +then + printf "Cannot execute %s; filesystem mounted with noexec?\n" \ + $tmpdir/bin/wrapper >&2 + printf "Setting %s in ~/.quiltrc may help\n" "VARTMPDIR" >&2 + exit 1 +fi + +ln -s wrapper $tmpdir/bin/patch +ln -s wrapper $tmpdir/bin/tar + +# let rpm do all the dirty specfile stuff ... +echo -n "### rpmbuild: " >&4 + +export PATH="$tmpdir/bin:$PATH" +rpmbuild --eval "%define _sourcedir $sourcedir" \ + --eval "%define _specdir $specdir" \ + --eval "%define _builddir $tmpdir/build" \ + --eval "%define __patch $tmpdir/bin/patch" \ + --eval "%define __tar $tmpdir/bin/tar" \ + --eval "$DEFINE_FUZZ" \ + --nodeps \ + -bp "$specdir/$specfile" < /dev/null >&5 2>&5 +status=$? +echo >&4 +exit $status +### Local Variables: +### mode: shell-script +### End: +# vim:filetype=sh + diff --git a/powerpc-and-aarch64-fix-reverse-stepping-failure.patch b/powerpc-and-aarch64-fix-reverse-stepping-failure.patch new file mode 100644 index 0000000..b1d37b7 --- /dev/null +++ b/powerpc-and-aarch64-fix-reverse-stepping-failure.patch @@ -0,0 +1,478 @@ +From b826313e55938c8cf83b0889e2f6bdf8129bc004 Mon Sep 17 00:00:00 2001 +From: Carl Love +Date: Tue, 2 Jan 2024 17:46:02 -0500 +Subject: [PATCH 07/48] PowerPC and aarch64: Fix reverse stepping failure + +When running GDB's testsuite on aarch64-linux/Ubuntu 20.04 (also spotted on +the ppc backend), there are failures in gdb.reverse/solib-precsave.exp and +gdb.reverse/solib-reverse.exp. + +The failure happens around the following code: + +38 b[1] = shr2(17); /* middle part two */ +40 b[0] = 6; b[1] = 9; /* generic statement, end part two */ +42 shr1 ("message 1\n"); /* shr1 one */ + +Normal execution: + +- step from line 38 will land on line 40. +- step from line 40 will land on line 42. + +Reverse execution: +- step from line 42 will land on line 40. +- step from line 40 will land on line 40. +- step from line 40 will land on line 38. + +The problem here is that line 40 contains two contiguous but distinct +PC ranges in the line table, like so: + +Line 40 - [0x7ec ~ 0x7f4] +Line 40 - [0x7f4 ~ 0x7fc] + +The two distinct ranges are generated because GCC started outputting source +column information, which GDB doesn't take into account at the moment. + +When stepping forward from line 40, we skip both of these ranges and land on +line 42. When stepping backward from line 42, we stop at the start PC of the +second (or first, going backwards) range of line 40. + +Since we've reached ecs->event_thread->control.step_range_start, we stop +stepping backwards. + +The above issues were fixed by introducing a new function that looks for +adjacent PC ranges for the same line, until we notice a line change. Then +we take that as the start PC of the range. The new start PC for the range +is used for the control.step_range_start when setting up a step range. + +The test case gdb.reverse/map-to-same-line.exp is added to test the fix +for the above reverse step issues. + +Patch has been tested on PowerPC, X86 and AArch64 with no regressions. +--- + gdb/infrun.c | 57 +++++++ + gdb/symtab.c | 50 ++++++ + gdb/symtab.h | 17 ++ + gdb/testsuite/gdb.reverse/map-to-same-line.c | 58 +++++++ + .../gdb.reverse/map-to-same-line.exp | 153 ++++++++++++++++++ + 5 files changed, 335 insertions(+) + create mode 100644 gdb/testsuite/gdb.reverse/map-to-same-line.c + create mode 100644 gdb/testsuite/gdb.reverse/map-to-same-line.exp + +diff --git a/gdb/infrun.c b/gdb/infrun.c +index 4730d290442..069ef144a76 100644 +--- a/gdb/infrun.c ++++ b/gdb/infrun.c +@@ -114,6 +114,8 @@ static struct async_event_handler *infrun_async_inferior_event_token; + /* Stores whether infrun_async was previously enabled or disabled. + Starts off as -1, indicating "never enabled/disabled". */ + static int infrun_is_async = -1; ++static CORE_ADDR update_line_range_start (CORE_ADDR pc, ++ struct execution_control_state *ecs); + + /* See infrun.h. */ + +@@ -6886,6 +6888,27 @@ handle_signal_stop (struct execution_control_state *ecs) + process_event_stop_test (ecs); + } + ++/* Return the address for the beginning of the line. */ ++ ++CORE_ADDR ++update_line_range_start (CORE_ADDR pc, struct execution_control_state *ecs) ++{ ++ /* The line table may have multiple entries for the same source code line. ++ Given the PC, check the line table and return the PC that corresponds ++ to the line table entry for the source line that PC is in. */ ++ CORE_ADDR start_line_pc = ecs->event_thread->control.step_range_start; ++ std::optional real_range_start; ++ ++ /* Call find_line_range_start to get the smallest address in the ++ linetable for multiple Line X entries in the line table. */ ++ real_range_start = find_line_range_start (pc); ++ ++ if (real_range_start.has_value ()) ++ start_line_pc = *real_range_start; ++ ++ return start_line_pc; ++} ++ + /* Come here when we've got some debug event / signal we can explain + (IOW, not a random signal), and test whether it should cause a + stop, or whether we should resume the inferior (transparently). +@@ -7687,6 +7710,29 @@ process_event_stop_test (struct execution_control_state *ecs) + + if (stop_pc_sal.is_stmt) + { ++ if (execution_direction == EXEC_REVERSE) ++ { ++ /* We are stepping backwards make sure we have reached the ++ beginning of the line. */ ++ CORE_ADDR stop_pc = ecs->event_thread->stop_pc (); ++ CORE_ADDR start_line_pc ++ = update_line_range_start (stop_pc, ecs); ++ ++ if (stop_pc != start_line_pc) ++ { ++ /* Have not reached the beginning of the source code line. ++ Set a step range. Execution should stop in any function ++ calls we execute back into before reaching the beginning ++ of the line. */ ++ ecs->event_thread->control.step_range_start ++ = start_line_pc; ++ ecs->event_thread->control.step_range_end = stop_pc; ++ set_step_info (ecs->event_thread, frame, stop_pc_sal); ++ keep_going (ecs); ++ return; ++ } ++ } ++ + /* We are at the start of a statement. + + So stop. Note that we don't stop if we step into the middle of a +@@ -7749,6 +7795,17 @@ process_event_stop_test (struct execution_control_state *ecs) + set_step_info (ecs->event_thread, frame, stop_pc_sal); + + infrun_debug_printf ("keep going"); ++ ++ if (execution_direction == EXEC_REVERSE) ++ { ++ CORE_ADDR stop_pc = ecs->event_thread->stop_pc (); ++ ++ /* Make sure the stop_pc is set to the beginning of the line. */ ++ if (stop_pc != ecs->event_thread->control.step_range_start) ++ ecs->event_thread->control.step_range_start ++ = update_line_range_start (stop_pc, ecs); ++ } ++ + keep_going (ecs); + } + +diff --git a/gdb/symtab.c b/gdb/symtab.c +index e9bc7b2c933..ef63ec93c5a 100644 +--- a/gdb/symtab.c ++++ b/gdb/symtab.c +@@ -73,6 +73,7 @@ + #include "gdbsupport/gdb_string_view.h" + #include "gdbsupport/pathstuff.h" + #include "gdbsupport/common-utils.h" ++#include + + /* Forward declarations for local functions. */ + +@@ -3311,6 +3312,55 @@ find_pc_line (CORE_ADDR pc, int notcurrent) + return sal; + } + ++/* Compare two symtab_and_line entries. Return true if both have ++ the same line number and the same symtab pointer. That means we ++ are dealing with two entries from the same line and from the same ++ source file. ++ ++ Return false otherwise. */ ++ ++static bool ++sal_line_symtab_matches_p (const symtab_and_line &sal1, ++ const symtab_and_line &sal2) ++{ ++ return sal1.line == sal2.line && sal1.symtab == sal2.symtab; ++} ++ ++/* See symtah.h. */ ++ ++std::optional ++find_line_range_start (CORE_ADDR pc) ++{ ++ struct symtab_and_line current_sal = find_pc_line (pc, 0); ++ ++ if (current_sal.line == 0) ++ return {}; ++ ++ struct symtab_and_line prev_sal = find_pc_line (current_sal.pc - 1, 0); ++ ++ /* If the previous entry is for a different line, that means we are already ++ at the entry with the start PC for this line. */ ++ if (!sal_line_symtab_matches_p (prev_sal, current_sal)) ++ return current_sal.pc; ++ ++ /* Otherwise, keep looking for entries for the same line but with ++ smaller PC's. */ ++ bool done = false; ++ CORE_ADDR prev_pc; ++ while (!done) ++ { ++ prev_pc = prev_sal.pc; ++ ++ prev_sal = find_pc_line (prev_pc - 1, 0); ++ ++ /* Did we notice a line change? If so, we are done searching. */ ++ if (!sal_line_symtab_matches_p (prev_sal, current_sal)) ++ done = true; ++ } ++ ++ return prev_pc; ++} ++ + /* See symtab.h. */ + + struct symtab * +diff --git a/gdb/symtab.h b/gdb/symtab.h +index 365743384e1..e17d15c595b 100644 +--- a/gdb/symtab.h ++++ b/gdb/symtab.h +@@ -38,6 +38,7 @@ + #include "gdb-demangle.h" + #include "split-name.h" + #include "frame.h" ++#include + + /* Opaque declarations. */ + struct ui_file; +@@ -2362,6 +2363,22 @@ extern struct symtab_and_line find_pc_line (CORE_ADDR, int); + extern struct symtab_and_line find_pc_sect_line (CORE_ADDR, + struct obj_section *, int); + ++/* Given PC, and assuming it is part of a range of addresses that is part of ++ a line, go back through the linetable and find the starting PC of that ++ line. ++ ++ For example, suppose we have 3 PC ranges for line X: ++ ++ Line X - [0x0 - 0x8] ++ Line X - [0x8 - 0x10] ++ Line X - [0x10 - 0x18] ++ ++ If we call the function with PC == 0x14, we want to return 0x0, as that is ++ the starting PC of line X, and the ranges are contiguous. ++*/ ++ ++extern std::optional find_line_range_start (CORE_ADDR pc); ++ + /* Wrapper around find_pc_line to just return the symtab. */ + + extern struct symtab *find_pc_line_symtab (CORE_ADDR); +diff --git a/gdb/testsuite/gdb.reverse/map-to-same-line.c b/gdb/testsuite/gdb.reverse/map-to-same-line.c +new file mode 100644 +index 00000000000..3086e849231 +--- /dev/null ++++ b/gdb/testsuite/gdb.reverse/map-to-same-line.c +@@ -0,0 +1,58 @@ ++/* Copyright 2023 Free Software Foundation, Inc. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++/* The purpose of this test is to create a DWARF line table that contains two ++ or more entries for the same line. When stepping (forwards or backwards), ++ GDB should step over the entire line and not just a particular entry in ++ the line table. */ ++ ++int ++main (void) ++{ /* TAG: main prologue */ ++ asm ("main_label: .globl main_label"); ++ int i = 1, j = 2, k; ++ float f1 = 2.0, f2 = 4.1, f3; ++ const char *str_1 = "foo", *str_2 = "bar", *str_3; ++ ++ asm ("line1: .globl line1"); ++ k = i; f3 = f1; str_3 = str_1; /* TAG: line 1 */ ++ ++ asm ("line2: .globl line2"); ++ k = j; f3 = f2; str_3 = str_2; /* TAG: line 2 */ ++ ++ asm ("line3: .globl line3"); ++ k = i; f3 = f1; str_3 = str_1; /* TAG: line 3 */ ++ ++ asm ("line4: .globl line4"); ++ k = j; f3 = f2; str_3 = str_2; /* TAG: line 4 */ ++ ++ asm ("line5: .globl line5"); ++ k = i; f3 = f1; str_3 = str_1; /* TAG: line 5 */ ++ ++ asm ("line6: .globl line6"); ++ k = j; f3 = f2; str_3 = str_2; /* TAG: line 6 */ ++ ++ asm ("line7: .globl line7"); ++ k = i; f3 = f1; str_3 = str_1; /* TAG: line 7 */ ++ ++ asm ("line8: .globl line8"); ++ k = j; f3 = f2; str_3 = str_2; /* TAG: line 8 */ ++ ++ asm ("main_return: .globl main_return"); ++ k = j; f3 = f2; str_3 = str_2; /* TAG: main return */ ++ ++ asm ("end_of_sequence: .globl end_of_sequence"); ++ return 0; /* TAG: main return */ ++} +diff --git a/gdb/testsuite/gdb.reverse/map-to-same-line.exp b/gdb/testsuite/gdb.reverse/map-to-same-line.exp +new file mode 100644 +index 00000000000..63f8c9c76b3 +--- /dev/null ++++ b/gdb/testsuite/gdb.reverse/map-to-same-line.exp +@@ -0,0 +1,153 @@ ++# Copyright 2023 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++# When stepping (forwards or backwards), GDB should step over the entire line ++# and not just a particular entry in the line table. This test was added to ++# verify the find_line_range_start function properly sets the step range for a ++# line that consists of multiple statements, i.e. multiple entries in the line ++# table. This test creates a DWARF line table that contains two entries for ++# the same line to do the needed testing. ++ ++# This test can only be run on targets which support DWARF-2 and use gas. ++load_lib dwarf.exp ++require dwarf2_support ++ ++# The DWARF assembler requires the gcc compiler. ++require is_c_compiler_gcc ++ ++# This test suitable only for process that can do reverse execution ++require supports_reverse ++ ++standard_testfile .c .S ++ ++if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } { ++ return -1 ++} ++ ++set asm_file [standard_output_file $srcfile2] ++Dwarf::assemble $asm_file { ++ global srcdir subdir srcfile ++ declare_labels integer_label L ++ ++ # Find start address and length of program ++ lassign [function_range main [list ${srcdir}/${subdir}/$srcfile]] \ ++ main_start main_len ++ set main_end "$main_start + $main_len" ++ ++ cu {} { ++ compile_unit { ++ {language @DW_LANG_C} ++ {name map-to-same-line.c} ++ {stmt_list $L DW_FORM_sec_offset} ++ {low_pc 0 addr} ++ } { ++ subprogram { ++ {external 1 flag} ++ {name main} ++ {low_pc $main_start addr} ++ {high_pc $main_len DW_FORM_data4} ++ } ++ } ++ } ++ ++ lines {version 2 default_is_stmt 1} L { ++ include_dir "${srcdir}/${subdir}" ++ file_name "$srcfile" 1 ++ ++ # Generate the line table program with distinct source lines being ++ # mapped to the same line entry. Line 1, 5 and 8 contain 1 statement ++ # each. Line 2 contains 2 statements. Line 3 contains 3 statements. ++ program { ++ DW_LNE_set_address $main_start ++ line [gdb_get_line_number "TAG: main prologue"] ++ DW_LNS_copy ++ DW_LNE_set_address line1 ++ line [gdb_get_line_number "TAG: line 1" ] ++ DW_LNS_copy ++ DW_LNE_set_address line2 ++ line [gdb_get_line_number "TAG: line 2" ] ++ DW_LNS_copy ++ DW_LNE_set_address line3 ++ line [gdb_get_line_number "TAG: line 2" ] ++ DW_LNS_copy ++ DW_LNE_set_address line4 ++ line [gdb_get_line_number "TAG: line 3" ] ++ DW_LNS_copy ++ DW_LNE_set_address line5 ++ line [gdb_get_line_number "TAG: line 3" ] ++ DW_LNS_copy ++ DW_LNE_set_address line6 ++ line [gdb_get_line_number "TAG: line 3" ] ++ DW_LNS_copy ++ DW_LNE_set_address line7 ++ line [gdb_get_line_number "TAG: line 5" ] ++ DW_LNS_copy ++ DW_LNE_set_address line8 ++ line [gdb_get_line_number "TAG: line 8" ] ++ DW_LNS_copy ++ DW_LNE_set_address main_return ++ line [gdb_get_line_number "TAG: main return"] ++ DW_LNS_copy ++ DW_LNE_set_address end_of_sequence ++ DW_LNE_end_sequence ++ } ++ } ++} ++ ++if { [prepare_for_testing "failed to prepare" ${testfile} \ ++ [list $srcfile $asm_file] {nodebug} ] } { ++ return -1 ++} ++ ++if { ![runto_main] } { ++ return ++} ++ ++# Print the line table ++gdb_test_multiple "maint info line-table ${testfile}" "" { ++ -re "\r\n$decimal\[ \t\]+$decimal\[ \t\]+($hex)\[ \t\]+Y\[^\r\n\]*" { ++ lappend is_stmt $expect_out(1,string) ++ exp_continue ++ } ++ -re -wrap "" { ++ } ++} ++ ++# Do the reverse-step and reverse-next tests ++foreach_with_prefix cmd {step next} { ++ gdb_test_no_output "record" "turn on process record, test $cmd" ++ ++ set bp_main_return [gdb_get_line_number "TAG: main return" $srcfile] ++ gdb_breakpoint $srcfile:$bp_main_return ++ gdb_continue_to_breakpoint "run to end of main, reverse-$cmd test" ".*$srcfile:$bp_main_return.*" ++ gdb_test "display \$pc" ".*pc =.*" "display pc, reverse-$cmd test" ++ ++ # At this point, GDB has already recorded the execution up until the return ++ # statement. Reverse and test if GDB transitions between lines in the ++ # expected order. It should reverse-step or reverse-next across lines 8, ++ # 5, 3, 2 and 1. ++ foreach line {8 5 3 2 1} { ++ gdb_test "reverse-$cmd" ".*TAG: line $line.*" "reverse $cmd to line $line" ++ } ++ ++ if {$cmd =="step"} { ++ ## Clean restart, test reverse-next command ++ clean_restart ${testfile} ++ ++ if { ![runto_main] } { ++ return ++ } ++ } ++} +-- +2.35.3 + diff --git a/powerpc-fix-test-gdb.ada-finish-large.exp.patch b/powerpc-fix-test-gdb.ada-finish-large.exp.patch new file mode 100644 index 0000000..ef9899b --- /dev/null +++ b/powerpc-fix-test-gdb.ada-finish-large.exp.patch @@ -0,0 +1,49 @@ +From d95be7a5210b69ad879c86d23efaa2cd7dcda94a Mon Sep 17 00:00:00 2001 +From: Carl Love +Date: Mon, 20 Nov 2023 11:13:22 -0500 +Subject: [PATCH] PowerPC: Fix test gdb.ada/finish-large.exp + +Function Create_large returns a large data structure. On PowerPC, register +r3 contains the address of where the data structure to be returned is to +be stored. However, on exit the ABI does not guarantee that r3 has not +been changed. The GDB finish command prints the return value of the +function at the end of the function. GDB needs to use the +DW_TAG_call_site information to determine the value of r3 on entry to +the function to correctly print the return value at the end of the +function. The test must be compiled with -fvar-tracking for the +DW_TAG_call_site information to be included in the executable file. + +This patch adds the -fvar-tracking option to the compile line if the +option is supported. + +The patch fixes the one regression error for the test on PowerPC. + +The patch has been tested on Power 10 and X86-64 with no regressions. +--- + gdb/testsuite/gdb.ada/finish-large.exp | 8 +++++++- + 1 file changed, 7 insertions(+), 1 deletion(-) + +diff --git a/gdb/testsuite/gdb.ada/finish-large.exp b/gdb/testsuite/gdb.ada/finish-large.exp +index 5661d132a18..6c8b1b2648d 100644 +--- a/gdb/testsuite/gdb.ada/finish-large.exp ++++ b/gdb/testsuite/gdb.ada/finish-large.exp +@@ -19,7 +19,13 @@ require allow_ada_tests + + standard_ada_testfile p + +-if {[gdb_compile_ada "${srcfile}" "${binfile}" executable debug] != ""} { ++set flags {debug} ++ ++if {[have_fvar_tracking]} { ++ lappend flags "additional_flags=-fvar-tracking" ++} ++ ++if {[gdb_compile_ada "${srcfile}" "${binfile}" executable $flags] != ""} { + return -1 + } + + +base-commit: 0397481ff25b76d43b123f3d51828982ceb92834 +-- +2.35.3 + diff --git a/qa-local.sh b/qa-local.sh new file mode 100644 index 0000000..a41d7ea --- /dev/null +++ b/qa-local.sh @@ -0,0 +1,251 @@ +#!/bin/sh + +set -e + +pwd=$(pwd -P) + +root=$pwd/tmp-qa-local +logs=$root/logs +pkgs=$root/pkgs + +configs=" +openSUSE_Leap_15.6 +openSUSE_Leap_15.5 +openSUSE_Factory +openSUSE_Factory_LegacyX86 +SLE-15 +SLE-12 +SLFO +" + +archs="x86_64 i586" + +version=14.2 + +usage () +{ + echo "usage: $0 <1-4>" + echo "1: Cleanup" + echo "2: List configs" + echo "3: Verify quilt setup" + echo "4: Do local builds without testsuite" + echo "5: Do local builds with testsuite" + echo "6: Verify local testsuite results" +} + +if [ $# -eq 0 ]; then + usage + exit 1 +fi + +n="$1" +shift + +extract () +{ + local package + package="$1" + + rpm2cpio "$package" \ + | cpio -idmv \ + > /dev/null \ + 2>&1 +} + +cleanup () +{ + if [ -d $root ]; then + echo "About to remove dir $root" + echo "Press ^C to abort, enter to continue" + read + fi + rm -Rf $root + mkdir -p $root +} + +acquire_sudo_rights () +{ + # Acquire sudo rights. + sudo --validate + + # Keep sudo rights alive. + while true; do + sleep 100 + sudo --validate --non-interactive + kill -0 "$$" 2>/dev/null || exit + done & +} + +have_combo () +{ + arch="$1" + c="$2" + + if [ "$arch" = "i586" ]; then + case " $c " in + " openSUSE_Factory "|" SLFO ") + # Doesn't have i586. + return 1 + ;; + " SLE-11 "|" SLE-12 "|" SLE-15 ") + # SLE-12 and SLE-15 don't have i586. SLE-11 does, but + # we ignore that for now. + return 1 + ;; + esac + fi + if [ "$arch" = "x86_64" ]; then + case " $c " in + " openSUSE_Factory_LegacyX86 ") + # Doesn't have x86_64. + return 1 + ;; + esac + fi + return 0 +} + +case "$n" in + 1) + cleanup + ;; + + 2) + for arch in $archs; do + for c in $configs; do + if ! have_combo $arch $c; then + continue + fi + echo "$c $arch" + done + done + ;; + + 3) + quilt setup -d $root -v gdb.spec + rm -Rf $root/gdb-* + ;; + + 4) + acquire_sudo_rights + + rm -Rf $logs/$n + mkdir -p $logs/$n + + for arch in $archs; do + for c in $configs; do + if ! have_combo $arch $c; then + continue + fi + if osc build \ + --clean \ + --no-verify \ + --trust-all-projects \ + --no-service \ + $c $arch \ + > $logs/$n/LOG.$c.$arch \ + 2>&1; \ + st=$?; then + true + fi + + if [ $st -eq 0 ]; then + echo PASS: $c $arch + else + echo FAIL: $c $arch + fi + + sudo rm -Rf /var/tmp/build-root/$c-$arch + done + done + ;; + + 5) + acquire_sudo_rights + + rm -Rf $logs/$n + mkdir -p $logs/$n + + for arch in $archs; do + for c in $configs; do + if ! have_combo $arch $c; then + continue + fi + mkdir -p $pkgs/$c.$arch + if osc build \ + --clean \ + --no-verify \ + --trust-all-projects \ + --no-service \ + -k $pkgs/$c.$arch \ + $c $arch \ + -M testsuite \ + > $logs/$n/LOG.$c.$arch \ + 2>&1; \ + st=$?; then + true + fi + if [ $st -eq 0 ]; then + ok=true + else + reason="Build failed" + ok=false + fi + + if $ok; then + rpm=gdb-testresults-$version-0.$arch.rpm + if [ -f $pkgs/$c.$arch/$rpm ]; then + ( + cd $pkgs/$c.$arch + extract gdb-testresults-$version-0.$arch.rpm + ) + mv \ + $pkgs/$c.$arch/usr/share/doc/packages/gdb-testresults \ + $pkgs/gdb-testresults.$c.$arch + rm -Rf $pkgs/$c.$arch + else + ok=false + reason="Couldn't find $rpm" + fi + fi + if $ok; then + echo "PASS: $c $arch" + else + echo "FAIL: $c $arch ($reason)" + fi + + sudo rm -Rf /var/tmp/build-root/$c-$arch + done + done + ;; + + 6) + for arch in $archs; do + for c in $configs; do + if ! have_combo $arch $c; then + continue + fi + echo "CONFIG: $c $arch" + case $c in + openSUSE_Factory|openSUSE_Factory_LegacyX86|SLFO) + bash qa.sh -local -$arch -factory $pkgs/gdb-testresults.$c.$arch + ;; + SLE-12) + bash qa.sh -local -$arch -sle12 $pkgs/gdb-testresults.$c.$arch + ;; + SLE-11) + bash qa.sh -local -$arch -sle11 $pkgs/gdb-testresults.$c.$arch + ;; + *) + bash qa.sh -local -$arch $pkgs/gdb-testresults.$c.$arch + ;; + esac + done + done + ;; + + *) + echo "Don't know how to handle arg: $n" + exit 1 + ;; +esac diff --git a/qa-remote.sh b/qa-remote.sh new file mode 100644 index 0000000..f8c612d --- /dev/null +++ b/qa-remote.sh @@ -0,0 +1,163 @@ +#!/bin/sh + +scriptdir=$(cd $(dirname $0); pwd -P) + +pwd=$(pwd -P) + +root=$pwd/tmp-qa-remote +pkgs=$root/pkgs + +usage () +{ + echo "usage: $0 <1-2>" + echo " $0 <3> <1-5>" + echo "1: Cleanup" + echo "2: Get remote testsuite results" + echo "3: Verify remote testsuite result" +} + +if [ $# -eq 0 ]; then + usage + exit 1 +fi + +n="$1" +shift + +extract () +{ + local package + package="$1" + + rpm2cpio "$package" \ + | cpio -idmv \ + > /dev/null \ + 2>&1 +} + +get_item () +{ + c="$1" + arch="$2" + + if [ -d $root/binaries-testsuite.$c.$arch/gdb-testresults ]; then + echo "Already have $c $arch, skipping" + return + fi + + if [ "$c" = "openSUSE_Leap_15.2" ]; then + # Stale config, skip. + return + fi + + echo "Trying $c $arch" + + local dir + dir=$pkgs/$c.$arch + + if [ ! -d $dir ]; then + mkdir -p $dir + fi + + rpm=$(echo $dir/gdb-testresults-*.*.rpm) + rpm=$(for f in $rpm; do echo $f; done | grep -v nosrc) + rpm=$(basename $rpm) + if [ "$rpm" = "" ] || [ ! -f "$rpm" ]; then + echo "Getting rpms" + osc getbinaries -q -M testsuite -d $dir $c $arch + rpm=$(echo $dir/gdb-testresults-*.rpm) + rpm=$(for f in $rpm; do echo $f; done | grep -v nosrc) + rpm=$(basename $rpm) + echo "Got rpm: $rpm" + else + echo "Already have rpm: $rpm" + fi + + if [ ! -d $pkgs/gdb-testresults.$c.$arch ]; then + ( + echo "Extracting rpm: $rpm" + cd $dir + extract $rpm + ) + else + echo "Already extracted rpm: $rpm" + fi + + if [ -d $dir/usr/share/doc/packages/gdb-testresults ]; then + echo "Renaming" + mkdir $root/binaries-testsuite.$c.$arch + mv \ + $dir/usr/share/doc/packages/gdb-testresults \ + $root/binaries-testsuite.$c.$arch/gdb-testresults + fi + + if [ -d $root/binaries-testsuite.$c.$arch/gdb-testresults ]; then + echo "Cleaning up" + rm -Rf $dir + fi +} + +cleanup () +{ + if [ -d $root ]; then + echo "About to remove dir $root" + echo "Press ^C to abort, enter to continue" + read + fi + rm -Rf $root + mkdir -p $root +} + +report_todo () +{ + c="$1" + arch="$2" + status="$3" + + if [ "$c" = "SLE-10_SDK" ]; then + # Stale config. + return + fi + + if [ "$c" = "SLE-11" ]; then + # No longer supported, gdb requires more recent version of MPFR. + return + fi + + echo -e "Todo: $c\t$arch\t$status" +} + +case "$n" in + 1) + cleanup + ;; + + 2) + osc results -M testsuite \ + | grep succeeded \ + | awk '{print $1, $2}' \ + | while read line; do + get_item $line + done + osc results -M testsuite \ + | grep -v succeeded \ + | awk '{print $1, $2, $4}' \ + | while read line; do + report_todo $line + done + ;; + + 3) + m="$1" + shift + ( + cd $root + bash $scriptdir/qa.sh $m + ) + ;; + + *) + echo "Don't know how to handle arg: $n" + exit 1 + ;; +esac diff --git a/qa.sh b/qa.sh new file mode 100644 index 0000000..1e95056 --- /dev/null +++ b/qa.sh @@ -0,0 +1,1118 @@ +#!/bin/bash + +usage () +{ + echo "usage: $0 <1-5>" + echo " $0 -local [ -sle11 | -sle12 | -factory | -i586 | -x86_64 | -aarch64 | -powerpc64le | -s390 | -s390x ] " + echo + echo "Verify remote results at:" + echo " ./binaries-testsuite.distro.arch/gdb-testresults" + echo "1: gdb.sum: Check for 'FAIL: .* internal error' (all configs)" + echo "2: gdb.sum: Check for 'ERROR:' (all configs)" + echo "3: gdb.log: Check for 'internal-error:' (all configs)" + echo "4: gdb.sum: Check FAIL and ERROR (known clean configs)" + echo "5: gdb.sum: Check gdb.suse PASS (all configs)" + echo + echo "Verify local results at:" + echo " \$dir" + echo "-local: gdb.sum: Check FAIL and ERROR" +} + +if [ $# -eq 0 ]; then + usage + exit 1 +fi + +n="$1" +shift + +have_sle11=false +have_sle12=false +have_factory=false +have_aarch64=false +have_arm=false +have_powerpc64le=false +have_s390=false +have_s390x=false +have_i586=false +have_x86_64=false +if [ "$n" = "-local" ]; then + while [ $# -gt 1 ]; do + case $1 in + -sle11) + have_sle11=true + ;; + -sle12) + have_sle12=true + ;; + -factory) + have_factory=true + ;; + -aarch64) + have_aarch64=true + ;; + -arm) + have_arm=true + ;; + -powerpc64le|-ppc64le) + have_powerpc64le=true + ;; + -s390) + have_s390=true + ;; + -s390x) + have_s390x=true + ;; + -i586) + have_i586=true + ;; + -x86_64) + have_x86_64=true + ;; + *) + echo "Don't know how to handle arg: $1" + usage + exit 1 + ;; + esac + shift 1 + done + dir="$1" + shift +fi + +echo_line () +{ + for n in "$@"; do + echo "$n" + done +} + +join () +{ + local char + char="$1" + shift + + local res + res="" + + local first + first=true + for elem in "$@"; do + if $first; then + first=false + else + res+="$char" + fi + res+="$elem" + done + echo "$res" +} + +report_sum () +{ + local sum + sum="$1" + + echo + echo "$sum:" + + if [ ! -f "$sum" ]; then + echo "MISSING" + return + fi + + if false; then + for i in "${kfail[@]}"; do + echo "K$i" + done + fi + + kfail_re=$(join "|" "${kfail[@]}") + echo FAILs: + grep ^FAIL: "$sum" \ + | grep -E -v "$kfail_re" + echo -n "ERROR COUNT: " + grep -c ^ERROR: "$sum" +} + +kfail=( + + # https://sourceware.org/bugzilla/show_bug.cgi?id=26971 + "FAIL: gdb.arch/amd64-init-x87-values.exp: check_x87_regs_around_init: check post FLD1 value of .fop" + "FAIL: gdb.arch/amd64-init-x87-values.exp: check_x87_regs_around_init: check post FLD1 value of .fioff" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=24845 + "FAIL: gdb.base/step-over-syscall.exp: clone: displaced=off: single step over clone" + "FAIL: gdb.base/step-over-syscall.exp: clone: displaced=off: continue to marker \(clone\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=19436#c1 + "FAIL: gdb.cp/no-dmgl-verbose.exp: setting breakpoint at 'f\(std::string\)'" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=25504 + "FAIL: gdb.threads/process-dies-while-detaching.exp: single-process: continue: .*: continue" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=25503 + "FAIL: gdb.threads/signal-while-stepping-over-bp-other-thread.exp: step \(pattern 3\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=26915 + "FAIL: gdb.threads/schedlock.exp: schedlock=off: .*: other threads ran - unlocked" + "FAIL: gdb.threads/watchthreads-threaded.exp: watchpoint on args\[[1-3]\] hit in thread" + "FAIL: gdb.threads/watchthreads-threaded.exp: watch args\[[1-3]\]" + "FAIL: gdb.threads/watchthreads-threaded.exp: threaded watch loop" + "FAIL: gdb.threads/watchthreads-threaded.exp: combination of threaded watchpoints = 30 \+ initial values" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28479 + "FAIL: gdb.mi/mi-nonstop.exp: wait for thread exit \(timeout\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=26273 + "FAIL: gdb.threads/gcore-stale-thread.exp: save a corefile" + "FAIL: gdb.threads/gcore-stale-thread.exp: exited thread is current due to non-stop" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28617 + "FAIL: gdb.base/info-os.exp: get process list \(timeout\)" + "FAIL: gdb.base/info-os.exp: get process list" + "FAIL: gdb.base/info-os.exp: get process groups \(timeout\)" + "FAIL: gdb.base/info-os.exp: get threads \(timeout\)" + "FAIL: gdb.base/info-os.exp: get file descriptors \(timeout\)" + "FAIL: gdb.base/info-os.exp: get internet-domain sockets \(timeout\)" + "FAIL: gdb.base/info-os.exp: get shared-memory regions \(timeout\)" + "FAIL: gdb.base/info-os.exp: get semaphores \(timeout\)" + "FAIL: gdb.base/info-os.exp: get message queues \(timeout\)" + "FAIL: gdb.base/info-os.exp: info os unknown_entry \(timeout\)" + "FAIL: gdb.base/info-os.exp: continue \(timeout\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=26284 + # https://sourceware.org/bugzilla/show_bug.cgi?id=28343 + "FAIL: gdb.threads/detach-step-over.exp: .*internal error" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=26363 + "FAIL: gdb.xml/tdesc-reload.exp: .*internal error" + + # If a test-case fails to compile, it's not a GDB FAIL, ignore. + "FAIL: gdb.ada/.*\.exp: compilation .*\.adb" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=27539 + "FAIL: gdb.cp/typeid.exp: before starting: print &typeid\(i\)" + "FAIL: gdb.cp/typeid.exp: before starting: print &typeid\(i\) == &typeid\(typeof\(i\)\)" + "FAIL: gdb.cp/typeid.exp: before starting: print &typeid\(cp\)" + "FAIL: gdb.cp/typeid.exp: before starting: print &typeid\(cp\) == &typeid\(typeof\(cp\)\)" + "FAIL: gdb.cp/typeid.exp: before starting: print &typeid\(ccp\)" + "FAIL: gdb.cp/typeid.exp: before starting: print &typeid\(ccp\) == &typeid\(typeof\(ccp\)\)" + + # Fails for i586. Appearantly, glibc for i586 doesn't use vdso to do + # syscalls. Fedora test-case. + "FAIL: gdb.base/set-solib-absolute-prefix.exp: backtrace with __kernel_vsyscall" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28504 + "FAIL: gdb.arch/i386-sse.exp: check contents of data\[2\]" + "FAIL: gdb.arch/i386-sse.exp: check contents of data\[3\]" + "FAIL: gdb.arch/i386-sse.exp: check contents of data\[4\]" + "FAIL: gdb.arch/i386-sse.exp: check contents of data\[5\]" + "FAIL: gdb.arch/i386-sse.exp: check contents of data\[6\]" + "FAIL: gdb.arch/i386-sse.exp: check contents of data\[7\]" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse addps" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse addss" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse addsubpd" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse andpd" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse blendps" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse cmppd" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse cmpps" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse cmpss" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse comisd" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse comiss" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse cvtdq2pd" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse cvtpd2dq" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse cvtpd2ps" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse divpd" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse divsd" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse divss" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse mulps" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse mulss" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse orpd" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse orps" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse pabsw" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse packsswb" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse ucomisd" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse ucomiss" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse unpckhpd" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse unpckhps" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse xorpd" + "FAIL: gdb.reverse/i386-sse-reverse.exp: verify xmm2 after reverse xorps" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29419 + # https://sourceware.org/bugzilla/show_bug.cgi?id=29409 + "FAIL: gdb.opt/inline-small-func.exp: info breakpoints" + "FAIL: gdb.ada/access_tagged_param.exp: continue" + "FAIL: gdb.ada/inline-section-gc.exp: break callee.adb:22" + "FAIL: gdb.ada/ptype_tagged_param.exp: ptype s, with debug info" + "FAIL: gdb.ada/ref_param.exp: frame argument value printed" + "FAIL: gdb.reverse/singlejmp-reverse.exp: next to v = 1" + "FAIL: gdb.reverse/singlejmp-reverse.exp: next to f" + "FAIL: gdb.reverse/singlejmp-reverse.exp: next to nodebug" + "FAIL: gdb.reverse/singlejmp-reverse.exp: next to v = 3" + "FAIL: gdb.reverse/singlejmp-reverse.exp: reverse-step" + "FAIL: gdb.reverse/singlejmp-reverse.exp: reverse-next" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=25038 + "FAIL: gdb.reverse/test_ioctl_TCSETSW.exp: handle TCSETSW" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=26873 + "FAIL: gdb.threads/watchthreads-threaded.exp: threaded watch loop \(GDB internal error\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28617 + "FAIL: gdb.base/info-os.exp: get file descriptors" + "FAIL: gdb.base/info-os.exp: get internet-domain sockets" + "FAIL: gdb.base/info-os.exp: get message queues" + "FAIL: gdb.base/info-os.exp: get process groups" + "FAIL: gdb.base/info-os.exp: get semaphores" + "FAIL: gdb.base/info-os.exp: get shared-memory regions" + "FAIL: gdb.base/info-os.exp: get threads" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28478 + "FAIL: gdb.gdb/selftest.exp: backtrace through signal handler" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29781 + "FAIL: gdb.mi/mi-multi-commands.exp: args=.*: look for second command output, command length .* \(timeout\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=27027 + # https://sourceware.org/bugzilla/show_bug.cgi?id=28464 + "FAIL: gdb.ada/mi_var_access.exp: Create varobj \(unexpected output\)" + "FAIL: gdb.ada/mi_var_access.exp: update at stop 2 \(unexpected output\)" + + # Fragile test-case, requires glibc to fail in a certain way, ignore. + "FAIL: gdb.base/gdb-rhbz1156192-recursive-dlopen.exp:" + + # GDB fails to print "Thread $x stopped" message for all threads, but + # subsequent info threads shows all threads stopped, and a previous + # info threads show all threads running. Not harmful. + "FAIL: gdb.threads/interrupt-while-step-over.exp: displaced-stepping=off: iter=[0-9]*: wait for stops \(timeout\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29040 + "FAIL: gdb.threads/next-fork-other-thread.exp:" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31810 + "FAIL: gdb.threads/next-fork-exec-other-thread.exp:" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30521 + "FAIL: gdb.base/printcmds.exp: print {unsigned char\[\]}{0xffffffff}" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30528 + # Fixed in 15. Backportable to 14. + "FAIL: gdb.dwarf2/per-bfd-sharing.exp: couldn't remove files in temporary cache dir" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30480 + "FAIL: gdb.ada/info_auto_lang.exp: language_choice=auto: frame=0, frame_lang=c: info functions proc_in_" + "FAIL: gdb.ada/info_auto_lang.exp: language_choice=auto: frame=1, frame_lang=ada: info functions proc_in_" + "FAIL: gdb.ada/info_auto_lang.exp: language_choice=ada: frame=0, frame_lang=c: info functions proc_in_" + "FAIL: gdb.ada/info_auto_lang.exp: language_choice=ada: frame=1, frame_lang=ada: info functions proc_in_" + "FAIL: gdb.ada/info_auto_lang.exp: language_choice=c: frame=0, frame_lang=c: info functions proc_in_" + "FAIL: gdb.ada/info_auto_lang.exp: language_choice=c: frame=1, frame_lang=ada: info functions proc_in_" + "FAIL: gdb.ada/info_exc.exp: info exceptions task" + "FAIL: gdb.ada/info_exc.exp: info exceptions const.aint" + "FAIL: gdb.ada/mi_exc_info.exp: -info-ada-exceptions task \(unexpected output\)" + "FAIL: gdb.ada/mi_exc_info.exp: -info-ada-exceptions const.aint \(unexpected output\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31440 + "FAIL: gdb.python/py-progspace-events.exp: inferior 1 \(timeout\)" + "FAIL: gdb.python/py-progspace-events.exp: step" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31809 + "FAIL: gdb.threads/attach-slow-waitpid.exp: attach to target \(timeout\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31806 + "FAIL: gdb.debuginfod/fetch_src_and_symbols.exp: local_url: file corefile" + "FAIL: gdb.debuginfod/crc_mismatch.exp: local_debuginfod: debuginfod running, info downloaded, no CRC mismatch" + + # Fixed by commit 17f6581c36a ("gdb/testsuite: another attempt to fix + # gdb.threads/thread-specific-bp.exp"). + "FAIL: gdb.threads/thread-specific-bp.exp: non_stop=on: continue to end \(timeout\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31811 + "FAIL: gdb.threads/threads-after-exec.exp:" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29253 + "FAIL: gdb.server/stop-reply-no-thread.exp: to_disable=threads: continue to main \(timeout\)" + "FAIL: gdb.server/stop-reply-no-thread.exp: to_disable=threads: continue until exit \(timeout\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31831 + "FAIL: gdb.dap/log-message.exp: logging output \(checking body category\)" + + + # https://sourceware.org/bugzilla/show_bug.cgi?id=32121 + "FAIL: gdb.arch/i386-disp-step-self-call.exp: check return address was updated correctly" + "FAIL: gdb.arch/amd64-disp-step-self-call.exp: check return address was updated correctly" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=26867 + "FAIL: gdb.threads/signal-sigtrap.exp: sigtrap thread 1: signal SIGTRAP reaches handler" + "FAIL: gdb.threads/signal-command-handle-nopass.exp: step-over (yes|no): signal SIGUSR1" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=32439 + "FAIL: gdb.base/step-over-syscall.exp: (fork|vfork): displaced=on: check_pc_after_cross_syscall: single step over (fork|vfork) final pc" + +) # kfail + +kfail_sle12=( + + # https://sourceware.org/bugzilla/show_bug.cgi?id=26292 + "FAIL: gdb.base/checkpoint-ns.exp: .* \(timeout\)" + "FAIL: gdb.base/checkpoint.exp: .* \(timeout\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29238 + "FAIL: gdb.cp/ambiguous.exp: all vars: print jv" + "FAIL: gdb.cp/ambiguous.exp: all vars: print jva1" + "FAIL: gdb.cp/ambiguous.exp: all vars: print jva1v" + "FAIL: gdb.cp/ambiguous.exp: all vars: print jva2" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=25059 + "FAIL: gdb.cp/subtypes.exp:" + "FAIL: gdb.base/max-depth-c\+\+.exp:" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29240 + "FAIL: gdb.base/align-c.exp: print _Alignof\(double\)" + "FAIL: gdb.base/align-c.exp: print _Alignof\(long long\)" + "FAIL: gdb.base/align-c.exp: print _Alignof\(unsigned long long\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29241 + "FAIL: gdb.guile/scm-type.exp: lang_cpp: test_range: on flexible array member: guile \(print \(type-range \(field-type \(type-field \(value-type \(value-dereference f\)\) \"items\"\)\)\)\)" + "FAIL: gdb.guile/scm-type.exp: lang_cpp: test_range: on flexible array member: guile \(print \(value-subscript \(value-field \(value-dereference f\) \"items\"\) 0\)\)" + "FAIL: gdb.guile/scm-type.exp: lang_cpp: test_range: on flexible array member: guile \(print \(value-subscript \(value-field \(value-dereference f\) \"items\"\) 1\)\)" + + # Cluster of gcc 4.8 ada FAILs, to be investigated, but not high priority. + "FAIL: gdb.ada/info_locals_renaming.exp: info locals" + "FAIL: gdb.ada/interface.exp: info locals" + "FAIL: gdb.ada/length_cond.exp: cond 1 loc'first > 15" + "FAIL: gdb.ada/length_cond.exp: cond 1 loc'last > 15" + "FAIL: gdb.ada/length_cond.exp: cond 1 loc'length > 15" + "FAIL: gdb.ada/null_overload.exp: print f\(r_access'\(null\)\)" + "FAIL: gdb.ada/str_uninit.exp: print my_str" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29244 + "FAIL: gdb.arch/amd64-disp-step-avx.exp: running to main in runto" + "FAIL: gdb.arch/amd64-init-x87-values.exp: check_x87_regs_around_init: runto: run to main" + "FAIL: gdb.arch/amd64-init-x87-values.exp: check_setting_mxcsr_before_enable: runto: run to main" + "FAIL: gdb.arch/amd64-init-x87-values.exp: check_setting_x87_regs_before_enable: runto: run to main" + "FAIL: gdb.dwarf2/frame-inlined-in-outer-frame.exp: frame" + "FAIL: gdb.dwarf2/frame-inlined-in-outer-frame.exp: starti prompt" + "FAIL: gdb.dwarf2/frame-inlined-in-outer-frame.exp: step back into _start \(the program is no longer running\)" + "FAIL: gdb.dwarf2/frame-inlined-in-outer-frame.exp: step back into foo \(the program is no longer running\)" + "FAIL: gdb.dwarf2/frame-inlined-in-outer-frame.exp: step into bar \(the program is no longer running\)" + "FAIL: gdb.dwarf2/frame-inlined-in-outer-frame.exp: step into foo \(the program is no longer running\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=26967 + "FAIL: gdb.base/longjmp.exp: next over call_longjmp \(2\)" + "FAIL: gdb.base/longjmp.exp: next over longjmp\(1\)" + "FAIL: gdb.base/longjmp.exp: next over patt3" + "FAIL: gdb.base/premature-dummy-frame-removal.exp: p some_func \(\)" + "FAIL: gdb.base/premature-dummy-frame-removal.exp: set debug frame on" + "FAIL: gdb.base/longjmp-until-in-main.exp: until \\\$line, in main" + + # Test-cases that use -static but may turn out to be PIE when using + # unix/-fPIE/-fpie. + # https://sourceware.org/bugzilla/show_bug.cgi?id=29244 + "FAIL: gdb.base/break-entry.exp: runto: run to *" + "FAIL: gdb.base/catch-fork-static.exp: run to fork" + "FAIL: gdb.threads/staticthreads.exp: runto: run to main" + "FAIL: gdb.threads/staticthreads.exp: continue to main's call of sem_post" + "FAIL: gdb.threads/staticthreads.exp: handle SIG32 helps" + "FAIL: gdb.dwarf2/frame-inlined-in-outer-frame.exp: step back into _start" + "FAIL: gdb.dwarf2/frame-inlined-in-outer-frame.exp: step back into foo" + "FAIL: gdb.dwarf2/frame-inlined-in-outer-frame.exp: step into bar" + "FAIL: gdb.dwarf2/frame-inlined-in-outer-frame.exp: step into foo" + + # Fails on both i586 and s390x/-m31 for SLE-12-SP3, but does not reproduce + # on s390x/-m31 for SLE-12-SP5 with trunk. + "FAIL: gdb.guile/scm-disasm.exp: disassemble via memory port" + "FAIL: gdb.guile/scm-disasm.exp: memory-port: disassemble" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30180 + "FAIL: gdb.fortran/module.exp: print var_d" + "FAIL: gdb.fortran/module.exp: print var_x value 31" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30531 + "FAIL: gdb.threads/clone-thread_db.exp: continue to clone_fn \(the program exited\)" + "FAIL: gdb.threads/clone-thread_db.exp: continue to end \(the program is no longer running\)" + +) # kfail_sle12 + +kfail_sle11=( + + # FAILs for SLE-11 are not very interesting. This is with on old compiler: + # 4.3.4, and tests are likely to be broken. We're really only interested in + # segmentation faults and internal errors. + "FAIL: " + +) + +kfail_factory=( + + # yama ptrace_scope == 1 + # https://sourceware.org/pipermail/gdb-patches/2024-April/208251.html + "FAIL: .*attach.*" + "FAIL: .*detach.*" + "FAIL: gdb.base/gcore-excessive-memory.exp: verify we can get to main" + "FAIL: gdb.base/gcore-excessive-memory.exp: verify we can get to main" + "FAIL: gdb.base/gcore-excessive-memory.exp: Save the core file" + "FAIL: gdb.base/gcorebg.exp: Core file generated by standard gcore" + "FAIL: gdb.threads/check-libthread-db.exp: automated load-time check: libpthread.so fully initialized: check debug libthread-db output \(pattern 1\)" + + # https://sourceware.org/pipermail/gdb-patches/2021-October/182449.html + "FAIL: gdb.threads/current-lwp-dead.exp: continue to breakpoint: fn_return" + + # Similar error message to the one above, see if fixing that one fixes this. + "FAIL: gdb.threads/clone-new-thread-event.exp: catch SIGUSR1" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28551 + "FAIL: gdb.go/package.exp: going to first breakpoint \\(GDB internal error\\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28477 + "FAIL: gdb.base/step-over-syscall.exp: clone: displaced=off: continue to marker \(clone\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28510 + "FAIL: gdb.debuginfod/fetch_src_and_symbols.exp: local_url: br main" + "FAIL: gdb.debuginfod/fetch_src_and_symbols.exp: local_url: l" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28667 + "FAIL: gdb.reverse/watch-precsave.exp: watchpoint hit, fourth time \\(GDB internal error\\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29196 + "FAIL: gdb.base/gdb11531.exp: watchpoint variable triggers at next" + "FAIL: gdb.base/gdb11531.exp: watchpoint variable triggers at continue" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29706 + "FAIL: gdb.base/eof-exit.exp: with non-dump terminal: with bracketed-paste-mode on: close GDB with eof \(missed the prompt\)" + + # Looks like a problem with modern debug info, where stepping out of a + # function takes more one step. + "FAIL: gdb.base/rtld-step.exp: finish out of foo 1" + "FAIL: gdb.base/rtld-step.exp: next over baz in bar" + "FAIL: gdb.base/rtld-step.exp: step into foo 2" + "FAIL: gdb.base/rtld-step.exp: next over baz in foo" + "FAIL: gdb.base/rtld-step.exp: step out of foo back into bar" + "FAIL: gdb.base/rtld-step.exp: continue until exit" + "FAIL: gdb.base/rtld-step.exp: next over foo 0" + "FAIL: gdb.base/rtld-step.exp: step into bar" + "FAIL: gdb.base/rtld-step.exp: step into foo 1" + + # Sets breakpoints in gdb build with lto. This is known to be slow, and + # likely to cause timeouts. + gdb.gdb/python-helper.exp + + # Should be fixed by commit fe6356def67 ("PowerPC and aarch64: Fix reverse + # stepping failure"), available in gdb 15. + "FAIL: gdb.reverse/solib-precsave.exp: reverse-step into solib function one" + "FAIL: gdb.reverse/solib-precsave.exp: reverse-step within solib function one" + "FAIL: gdb.reverse/solib-precsave.exp: reverse-step back to main one" + "FAIL: gdb.reverse/solib-precsave.exp: reverse-step into solib function two" + "FAIL: gdb.reverse/solib-precsave.exp: reverse-step within solib function two" + "FAIL: gdb.reverse/solib-precsave.exp: reverse-step back to main two" + "FAIL: gdb.reverse/solib-precsave.exp: run until end part two" + "FAIL: gdb.reverse/solib-precsave.exp: reverse-next over solib function one" + "FAIL: gdb.reverse/solib-precsave.exp: reverse-next over solib function two" + "FAIL: gdb.reverse/solib-reverse.exp: reverse-step into solib function one" + "FAIL: gdb.reverse/solib-reverse.exp: reverse-step within solib function one" + "FAIL: gdb.reverse/solib-reverse.exp: reverse-step back to main one" + "FAIL: gdb.reverse/solib-reverse.exp: reverse-step into solib function two" + "FAIL: gdb.reverse/solib-reverse.exp: reverse-step within solib function two" + "FAIL: gdb.reverse/solib-reverse.exp: reverse-step back to main two" + "FAIL: gdb.reverse/solib-reverse.exp: run until end part two" + "FAIL: gdb.reverse/solib-reverse.exp: reverse-next over solib function one" + "FAIL: gdb.reverse/solib-reverse.exp: reverse-next over solib function two" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31564 + "FAIL: gdb.base/rtld-step.exp: runto: run to main" + +) # kfail_factory + +kfail_aarch64=( + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29405 + "FAIL: gdb.base/step-over-syscall.exp: (fork|vfork): displaced=(on|off): pc after stepi matches insn addr after syscall" + "FAIL: gdb.base/step-over-syscall.exp: (fork|vfork): displaced=(on|off): check_pc_after_cross_syscall: single step over fork final pc" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29423 + "FAIL: gdb.base/watchpoint-unaligned.exp: continue \(timeout\)" + "FAIL: gdb.base/watchpoint-unaligned.exp: size8twice write" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31214 + "FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q\.e: 0->5: continue" + "FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q\.a: 1->0: print expression before" + "FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q\.a: 1->0: continue \(the program exited\)" + "FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q\.e: 5->4: print expression before" + "FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q\.e: 5->4: continue \(the program is no longer running\)" + "FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: q\.e: 5->4: print expression after" + "FAIL: gdb.base/watch-bitfields.exp: -location watch against bitfields: continue until exit \(the program is no longer running\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28561 + # "[gdb/testsuite] Error due to not reading \r\n at end of mi prompt" + # We match pretty aggressively here. + "FAIL: gdb.mi/.*.exp:" + "FAIL: gdb.python/.*-mi.exp:" + "FAIL: gdb.python/py-mi-.*.exp:" + "FAIL: gdb.ada/mi.*.exp:" + "FAIL: gdb.base/annota.*.exp:" + "FAIL: gdb.dwarf2/dw2-opt-structptr.exp: mi" + "FAIL: gdb.trace/mi-.*.exp:" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31826 + "FAIL: gdb.arch/aarch64-unwind-pc.exp:" + +) # kfail_aarch64 + +kfail_powerpc64le=( + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29792 + "FAIL: gdb.opt/solib-intra-step.exp: second-hit" + + # Known to run into timeouts. + "FAIL: gdb.gdb/python-helper.exp" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30548 + "FAIL: gdb.base/inline-frame-cycle-unwind.exp: cycle at level [0-9]*: backtrace when the unwind is broken at frame [0-9]*" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29815 + "FAIL: gdb.reverse/finish-reverse-bkpt.exp: reverse-finish from void_func trips breakpoint at entry" + "FAIL: gdb.reverse/finish-reverse-bkpt.exp: no spurious proceed after breakpoint stop" + "FAIL: gdb.reverse/next-reverse-bkpt-over-sr.exp: reverse-next over call trips user breakpoint at function entry" + "FAIL: gdb.reverse/next-reverse-bkpt-over-sr.exp: stopped at the right callee call" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29897 + "FAIL: gdb.base/run-control-while-bg-execution.exp: action1=.*: action2=start: start \(GDB internal error\)" + "FAIL: gdb.base/run-control-while-bg-execution.exp: action1=.*: action2=run: run \(GDB internal error\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30021 + "FAIL: gdb.base/unwind-on-each-insn.exp: instruction 6: \\\$fba_value == \\\$main_fba" + "FAIL: gdb.base/unwind-on-each-insn.exp: instruction 6: \[string equal \\\$fid \\\$main_fid\]" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30542 + "FAIL: gdb.base/watch-before-fork.exp: test: continue to catch fork" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30543 + "FAIL: gdb.python/py-send-packet.exp: call python run_auxv_send_packet_test function" + + # Cluster of fails related to hw watchpoint support. + "FAIL: gdb.ada/scoped_watch.exp:" + "FAIL: gdb.ada/task_watch.exp:" + "FAIL: gdb.ada/watch_minus_l.exp:" + "FAIL: gdb.base/watch-before-fork.exp:" + "FAIL: gdb.base/watch-bitfields.exp:" + "FAIL: gdb.base/watch-cond.exp:" + "FAIL: gdb.base/watch-cond-infcall.exp:" + "FAIL: gdb.base/watchpoint-during-step.exp:" + "FAIL: gdb.base/watchpoint.exp:" + "FAIL: gdb.base/watchpoint-hw-attach.exp:" + "FAIL: gdb.base/watchpoint-hw-hit-once.exp:" + "FAIL: gdb.base/watchpoints.exp:" + "FAIL: gdb.base/watchpoint-solib.exp:" + "FAIL: gdb.base/watchpoint-stops-at-right-insn.exp:" + "FAIL: gdb.base/watchpoint-unaligned.exp:" + "FAIL: gdb.base/watch-read.exp:" + "FAIL: gdb.base/watch_thread_num.exp:" + "FAIL: gdb.base/watch-vfork.exp:" + "FAIL: gdb.cp/watch-cp.exp:" + "FAIL: gdb.mi/mi-watch.exp:" + "FAIL: gdb.threads/step-over-trips-on-watchpoint.exp:" + "FAIL: gdb.threads/watchpoint-fork.exp:" + "FAIL: gdb.threads/watchthreads2.exp:" + "FAIL: gdb.threads/wp-replication.exp:" + "FAIL: gdb.base/display.exp:" + "FAIL: gdb.base/recurse.exp:" + "FAIL: gdb.base/gdb11531.exp:" + "FAIL: gdb.base/pr11022.exp:" + "FAIL: gdb.base/value-double-free.exp: continue \(the program exited\)" + "FAIL: gdb.base/value-double-free.exp: print empty\(\)" + "FAIL: gdb.cp/annota2.exp: watch triggered on a.x \(timeout\)" + "FAIL: gdb.cp/annota2.exp: annotate-quit" + "FAIL: gdb.cp/annota3.exp: watch triggered on a.x \(timeout\)" + "FAIL: gdb.cp/annota3.exp: annotate-quit \(pattern 1\)" + "FAIL: gdb.mi/pr11022.exp:" + "FAIL: gdb.python/py-breakpoint.exp: test_watchpoints: Test watchpoint write \(the program exited\)" + "FAIL: gdb.python/py-breakpoint.exp: test_bkpt_internal: Test watchpoint write \(the program exited\)" + "FAIL: gdb.python/py-breakpoint.exp: test_bkpt_eval_funcs: Test watchpoint write \(the program exited\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31004 + "FAIL: gdb.base/run-control-while-bg-execution.exp: action1=.*: action2=run: run" + "FAIL: gdb.base/run-control-while-bg-execution.exp: action1=.*: action2=start: start" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31823 + "FAIL: gdb.base/nodebug.exp: p/c \(int\) array_index\(\"abcdef\",2\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31825 + "FAIL: gdb.base/break-interp.exp: ldprelink=NO: ldsepdebug=NO: binprelink=NO: binsepdebug=NO: binpie=YES: INNER: reach-\(_dl_debug_state|dl_main\)-2: reach" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31827 + "FAIL: gdb.base/gnu_vector.exp: call add_structvecs" + + # GLIBC problem with prctl on ppc64le. Fixed in 2.40. + # https://sourceware.org/bugzilla/show_bug.cgi?id=29770 + # https://bugzilla.suse.com/show_bug.cgi?id=1234665 + "FAIL: gdb.ada/tasks.exp: info threads" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31229 + "FAIL: gdb.linespec/explicit.exp: complete after -qualified -source: cmd complete .b -qualified -source thr." + "FAIL: gdb.linespec/explicit.exp: complete after -qualified -source: tab complete .b -qualified -source thr." + "FAIL: gdb.linespec/explicit.exp: complete after -source: cmd complete .b -source thr." + "FAIL: gdb.linespec/explicit.exp: complete after -source: tab complete .b -source thr." +) + +kfail_powerpc64le_sle12=( + + "FAIL: gdb.guile/scm-breakpoint.exp:.*" + # Cluster of fails related to hw watchpoint support. + "FAIL: gdb.guile/scm-breakpoint.exp: test_bkpt_eval_funcs: test watchpoint write \(the program exited\)" + "FAIL: gdb.guile/scm-breakpoint.exp: test_bkpt_internal: test invisible watchpoint write \(the program exited\)" + "FAIL: gdb.guile/scm-breakpoint.exp: test_watchpoints: test watchpoint write \(the program exited\)" + +) + +kfail_s390x_s390=( + +) + +# Plain s390 or s390x/-m31. +kfail_s390=( + + "${kfail_s390x_s390[@]}" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29841 + "FAIL: gdb.reverse/.*.exp:" + + # Doesn't reproduce with trunk on SLE-12SP5. + "FAIL: gdb.guile/scm-ports.exp: buffered: test byte at sp, before flush" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29867 + "FAIL: gdb.guile/scm-lazy-string.exp: ptr: lazy string length 2 value" + "FAIL: gdb.guile/scm-lazy-string.exp: ptr: lazy string value" + "FAIL: gdb.guile/scm-lazy-string.exp: ptr: print ptr" + "FAIL: gdb.base/sym-file.exp: add-symbol-file sym-file-lib.so addr" + "FAIL: gdb.base/sym-file.exp: continue to breakpoint: gdb_add_symbol_file" + "FAIL: gdb.python/py-lazy-string.exp: ptr: lazy string length 2 value" + "FAIL: gdb.python/py-lazy-string.exp: ptr: lazy string value" + "FAIL: gdb.python/py-lazy-string.exp: ptr: print ptr" + "FAIL: gdb.python/py-nested-maps.exp: headers=on: pretty=off: exp='\*mm': depth=1: p \*mm" + "FAIL: gdb.python/py-nested-maps.exp: headers=on: pretty=off: exp='\*mm': depth=2: p \*mm" + "FAIL: gdb.python/py-nested-maps.exp: headers=on: pretty=off: exp='\*mm': depth=3: p \*mm" + "FAIL: gdb.python/py-nested-maps.exp: headers=on: pretty=off: exp='\*mm': depth=unlimited: p \*mm" + "FAIL: gdb.python/py-nested-maps.exp: pretty=off: exp='\*mm': depth=1: p \*mm" + "FAIL: gdb.python/py-nested-maps.exp: pretty=off: exp='\*mm': depth=2: p \*mm" + "FAIL: gdb.python/py-nested-maps.exp: pretty=off: exp='\*mm': depth=3: p \*mm" + "FAIL: gdb.python/py-nested-maps.exp: pretty=off: exp='\*mm': depth=unlimited: p \*mm" + "FAIL: gdb.python/py-nested-maps.exp: pretty=on: exp='\*mm': depth=1: p \*mm" + "FAIL: gdb.python/py-nested-maps.exp: pretty=on: exp='\*mm': depth=2: p \*mm" + "FAIL: gdb.python/py-nested-maps.exp: pretty=on: exp='\*mm': depth=3: p \*mm" + "FAIL: gdb.python/py-nested-maps.exp: pretty=on: exp='\*mm': depth=unlimited: p \*mm" + "FAIL: gdb.base/info-shared.exp:" + "FAIL: gdb.python/py-strfns.exp: p /d {char\[4\]} arg" + "FAIL: gdb.python/py-strfns.exp: p arg" + +) + +# s390x/-m64. +kfail_s390x=( + + "${kfail_s390x_s390[@]}" + +) + +kfail_i586=( + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30519 + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test default value" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test default value via gdb.parameter" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to -1}" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -1" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -1 via gdb.parameter" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 1" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 1" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 1 via gdb.parameter" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to -5}" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of -5 via gdb.parameter" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 5" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 5 via gdb.parameter" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: {test set to None}" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of None" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of None via gdb.parameter" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test set to 0" + "FAIL: gdb.python/py-parameter.exp: test_integer_parameter: kind=PARAM_UINTEGER: test value of 0 via gdb.parameter" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=32407 + "FAIL: gdb.base/valgrind-bt.exp:" + "FAIL: gdb.base/valgrind-disp-step.exp:" + "FAIL: gdb.base/valgrind-infcall-2.exp:" + "FAIL: gdb.base/valgrind-infcall.exp:" +) + +kfail_arm=( + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30537 + "FAIL: gdb.fortran/intrinsics.exp: p cmplx \(4,4,16\) \(GDB internal error\)" + "FAIL: gdb.fortran/intrinsics.exp: ptype cmplx \(4,4,16\) \(GDB internal error\)" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31061 + "FAIL: gdb.base/gdb-sigterm.exp: .*internal error" + +) + +case $n in + 1) + # 'FAIL: .* internal error' in gdb.sum. + # Test fail due to internal error. + # + # Todo: apply kfail_factory/kfail_sle12 only when appropriate. + kfail+=("${kfail_factory[@]}") + kfail+=("${kfail_sle12[@]}") + kfail+=("${kfail_sle11[@]}") + kfail+=("${kfail_s390[@]}") + kfail+=("${kfail_powerpc64le[@]}") + kfail+=("${kfail_arm[@]}") + kfail+=("${kfail_aarch64[@]}") + kfail_re=$(join "|" "${kfail[@]}") + grep "^FAIL:.*internal error" binaries-testsuite*/gdb-testresults/*.sum \ + | grep -E -v "$kfail_re" + ;; + + 2) + # 'ERROR:' in gdb.sum. + # A dejagnu or tcl ERROR, may hide real problems. + # + kfail+=( + # https://sourceware.org/bugzilla/show_bug.cgi?id=28323 + "SLE-12.x86_64.*gdb.ada/mi_dyn_arr.exp" + + # Gdb runs out of virtual memory, we can expect an internal error. + "UNRESOLVED: gdb.base/gcore-excessive-memory.exp: attach" + "UNRESOLVED: gdb.base/gcore-excessive-memory.exp: verify we can get to main" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31001 + "UNRESOLVED: gdb.threads/async.exp: thread 1: current thread is 1" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31648 + "SLE-11.*UNRESOLVED: gdb.ada/tick_length_array_enum_idx.exp: print vars'length" + + # yama ptrace_scope == 1 + # https://sourceware.org/pipermail/gdb-patches/2024-April/208251.html + "(Factory|SLFO).*UNRESOLVED: gdb.base/gstack.exp: spawn gstack" + "(Factory|SLFO).*UNRESOLVED: gdb.multi/multi-term-settings.exp: inf1_how=run: inf2_how=attach: inf2: flush inferior output" + "(Factory|SLFO).*UNRESOLVED: gdb.multi/multi-term-settings.exp: inf1_how=attach: inf2_how=run: inf1: flush inferior output" + "(Factory|SLFO).*UNRESOLVED: gdb.multi/multi-term-settings.exp: inf1_how=attach: inf2_how=attach: inf2: flush inferior output" + "(Factory|SLFO).*UNRESOLVED: gdb.multi/multi-term-settings.exp: inf1_how=attach: inf2_how=run: continue" + "(Factory|SLFO).*UNRESOLVED: gdb.multi/multi-term-settings.exp: inf1_how=attach: inf2_how=run: continue" + "(Factory|SLFO).*UNRESOLVED: gdb.multi/multi-term-settings.exp: inf1_how=run: inf2_how=attach: continue" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31671 + "SLE-11.*UNRESOLVED: gdb.objc/basicclass.exp: call an Objective-C method with no arguments" + ) + + kfail_re=$(join "|" "${kfail[@]}") + grep -A1 "ERROR:.*no longer" binaries-testsuite*/gdb-testresults/*.sum \ + | grep -E -v "ERROR|\--" | grep -E -v "$kfail_re" + ;; + + 3) + # 'internal-error' in gdb.log + # Catch all internal-errors, not just the ones reported by dejagnu. + # + kfail+=( + # https://sourceware.org/bugzilla/show_bug.cgi?id=26284 + "infrun.c:[0-9]*: internal-error: finish_step_over: Assertion \`ecs->event_thread->control.trap_expected' failed." + # https://sourceware.org/bugzilla/show_bug.cgi?id=26363 + ".i586.*i386-linux-nat.c:[0-9]*: internal-error: Got request for bad register number [0-9]*." + + # https://sourceware.org/bugzilla/show_bug.cgi?id=19675 + # PR is fixed in gdb-15. + "linux-nat.c:[0-9]*: internal-error: wait returned unexpected status" + "linux-nat.c:[0-9]*: internal-error: wait returned unexpected PID" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28553 + "infrun.c:[0-9]*: internal-error: thread .* needs a step-over, but not in step-over queue" + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28604 + "x86-linux-dregs.c:[0-9]*: internal-error: void x86_linux_update_debug_registers\(lwp_info\*\): Assertion \`lwp_is_stopped \(lwp\)' failed." + + # https://sourceware.org/bugzilla/show_bug.cgi?id=28667 + "record-full.c:[0-9]*: internal-error: ptid_t record_full_wait_1\(target_ops\*, ptid_t, target_waitstatus\*, target_wait_flags\): Assertion \`\(options & TARGET_WNOHANG\) != 0' failed." + + # https://sourceware.org/bugzilla/show_bug.cgi?id=26873 + "infrun.c:[0-9]*: internal-error: resume_1: Assertion \`!\(thread_has_single_step_breakpoints_set \(tp\) && step\)' failed." + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29783 + "frame.c:[0-9]*: internal-error: get_selected_frame: Assertion \`selected_frame != NULL' failed." + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29841 + "regcache.c:[0-9]*: internal-error: raw_read: Assertion \`buf != NULL' failed." + + # https://sourceware.org/bugzilla/show_bug.cgi?id=29897 + "displaced-stepping.c:[0-9]*: internal-error: prepare: Assertion \`buf.current_thread != thread' failed." + + # https://sourceware.org/bugzilla/show_bug.cgi?id=30537 + "f-lang.c:[0-9]*: internal-error: eval_op_f_cmplx: Assertion \`kind_arg->code \(\) == TYPE_CODE_COMPLEX' failed." + + # Test-case gdb.base/gcore-excessive-memory.exp. + "utils.c:[0-9]*: internal-error: virtual memory exhausted: can't allocate [0-9]* bytes." + + # https://sourceware.org/bugzilla/show_bug.cgi?id=31061 + "intrusive_list.h:[0-9]*: internal-error: erase_element: Assertion \`elem_node->prev != INTRUSIVE_LIST_UNLINKED_VALUE' failed\." + + # Assumed to be variant of + # https://sourceware.org/bugzilla/show_bug.cgi?id=32446 + "linux-nat.c:[0-9]*: internal-error: mark_lwp_dead: Assertion .lp->status == 0. failed\." + + ) + + kfail_re=$(join "|" "${kfail[@]}") + grep -a -H internal-error: binaries-testsuite.*/gdb-testresults/*.log \ + | grep -a -v "maint.c:[0-9]" \ + | grep -a -E -v "$kfail_re" + ;; + + 4) + for id in SLE-12 \ + SLE-15 \ + SLFO \ + openSUSE_Leap_15.5 \ + openSUSE_Leap_15.6 \ + openSUSE_Factory; \ + do + for arch in x86_64 \ + i586 \ + aarch64 \ + ppc64le \ + s390x; \ + do + + config=$id.$arch + case $config in + SLE-15.i586|SLE-12.i586|SLFO.i586) + # No such config. + continue + ;; + SLFO.ppc64le|openSUSE_Factory.ppc64le|*.s390x) + # Not cleaned up yet. + continue + ;; + esac + + id2=$id + case $id in + openSUSE_Factory) + case $arch in + s390x) + id2=openSUSE_Factory_zSystems + ;; + ppc64le) + id2=openSUSE_Factory_PPC + ;; + i586) + id2=openSUSE_Factory_LegacyX86 + ;; + armv7l|aarch64) + id2=openSUSE_Factory_ARM + ;; + esac + esac + config=$id2.$arch + + config="$config/gdb-testresults" + + sums=() + case $arch in + x86_64) + case $id in + SLE-12|SLFO) + sums=("$config/gdb-$arch-suse-linux-m64.-fPIE.-pie.sum" + "$config/gdb-$arch-suse-linux-m64.sum" + "$config/gdb-$arch-suse-linux-m32.-fPIE.-pie.sum" + "$config/gdb-$arch-suse-linux-m32.sum") + ;; + *) + sums=("$config/gdb-$arch-suse-linux-m64.-fno-PIE.-no-pie.sum" + "$config/gdb-$arch-suse-linux-m64.sum" + "$config/gdb-$arch-suse-linux-m32.-fno-PIE.-no-pie.sum" + "$config/gdb-$arch-suse-linux-m32.sum") + ;; + esac + ;; + i586) + sums=("$config/gdb-$arch-suse-linux-m32.-fno-PIE.-no-pie.sum" + "$config/gdb-$arch-suse-linux-m32.sum") + ;; + aarch64) + case $id in + SLE-12|SLFO) + sums=("$config/gdb-$arch-suse-linux.-fPIE.-pie.sum" + "$config/gdb-$arch-suse-linux.sum") + ;; + *) + sums=("$config/gdb-$arch-suse-linux.-fno-PIE.-no-pie.sum" + "$config/gdb-$arch-suse-linux.sum") + ;; + esac + ;; + ppc64le|s390x) + case $id in + SLE-12|SLFO) + sums=("$config/gdb-$arch-suse-linux-m64.-fPIE.-pie.sum" + "$config/gdb-$arch-suse-linux-m64.sum") + ;; + *) + sums=("$config/gdb-$arch-suse-linux-m64.-fno-PIE.-no-pie.sum" + "$config/gdb-$arch-suse-linux-m64.sum") + ;; + esac + ;; + *) + echo "Don't know how to handle: $arch" + exit 1 + ;; + esac + + ( + case $arch in + i586) + kfail+=("${kfail_i586[@]}") + ;; + aarch64) + kfail+=("${kfail_aarch64[@]}") + ;; + ppc64le) + kfail+=("${kfail_powerpc64le[@]}") + ;; + *) + ;; + esac + + case $id in + SLE-12) + kfail+=("${kfail_sle12[@]}") + ;; + SLFO|openSUSE_Factory) + kfail+=("${kfail_factory[@]}") + ;; + *) + ;; + esac + + case $id.$arch in + SLE-12.ppc64le) + kfail+=("${kfail_powerpc64le_sle12[@]}") + ;; + esac + + for sum in "${sums[@]}"; do + sum=binaries-testsuite.$sum + report_sum "$sum" + done + ) + done + done + + ( + # Known cleanish config: Factory x86_64. + config=openSUSE_Factory.x86_64/gdb-testresults + sums=("$config/gdb-x86_64-suse-linux-m64.-fno-PIE.-no-pie.sum" + "$config/gdb-x86_64-suse-linux-m64.sum" + "$config/gdb-x86_64-suse-linux-m32.-fno-PIE.-no-pie.sum" + "$config/gdb-x86_64-suse-linux-m32.sum") + + kfail+=("${kfail_factory[@]}") + + for sum in "${sums[@]}"; do + sum=binaries-testsuite.$sum + report_sum "$sum" + done + ) + + ( + # Known clean config: Factory i586. + config=openSUSE_Factory_LegacyX86.i586/gdb-testresults + sums=("$config/gdb-i586-suse-linux-m32.-fno-PIE.-no-pie.sum" + "$config/gdb-i586-suse-linux-m32.sum") + + kfail+=("${kfail_factory[@]}") + kfail+=("${kfail_i586[@]}") + + for sum in "${sums[@]}"; do + sum=binaries-testsuite.$sum + report_sum "$sum" + done + ) + + ;; + + 5) + librpm=$(ls -1 binaries-testsuite*/gdb-testresults/*.sum \ + | grep -v SLE-11) + nolibrpm=$(ls -1 binaries-testsuite*/gdb-testresults/*.sum \ + | grep SLE-11) + if [ "$librpm" != "" ]; then + grep -c "PASS: gdb.suse/zypper-hint.exp: zypper hint printed (librpm)" \ + $librpm \ + | grep -E -v ":1" + fi + if [ "$nolibrpm" != "" ]; then + grep -c "PASS: gdb.suse/zypper-hint.exp: zypper hint printed (no librpm)" \ + $nolibrpm \ + | grep -E -v ":1" + fi + ;; + + -local) + sums=() + for f in "$dir"/*.sum; do + mapfile -t < <(echo_line "$f") + sums+=("${MAPFILE[@]}") + done + + if [ ${#sums[@]} -ne 4 ] && [ ${#sums[@]} -ne 2 ]; then + echo "No summary files to check" + exit 1 + fi + + + if $have_factory; then + kfail+=("${kfail_factory[@]}") + fi + if $have_sle11; then + kfail+=("${kfail_sle11[@]}") + fi + if $have_sle12; then + kfail+=("${kfail_sle12[@]}") + fi + if $have_aarch64; then + kfail+=("${kfail_aarch64[@]}") + fi + if $have_arm; then + kfail+=("${kfail_arm[@]}") + fi + if $have_powerpc64le; then + kfail+=("${kfail_powerpc64le[@]}") + fi + if $have_powerpc64le && $have_sle12; then + kfail+=("${kfail_powerpc64le_sle12[@]}") + fi + if $have_s390; then + kfail+=("${kfail_s390[@]}") + fi + if $have_s390x; then + kfail+=("${kfail_s390x[@]}") + fi + if $have_i586; then + kfail+=("${kfail_i586[@]}") + fi + if $have_x86_64; then + kfail+=("${kfail_x86_64[@]}") + fi + + for sum in "${sums[@]}"; do + report_sum "$sum" + done + ;; + + *) + echo "Don't know how to handle arg: $n" + exit 1 + ;; +esac + +true diff --git a/rs6000-unwind-on-each-instruction-fix.patch b/rs6000-unwind-on-each-instruction-fix.patch new file mode 100644 index 0000000..75d1ff3 --- /dev/null +++ b/rs6000-unwind-on-each-instruction-fix.patch @@ -0,0 +1,97 @@ +From 6d21f33bb8f63d1d9aeda88ca815e442da0dc160 Mon Sep 17 00:00:00 2001 +From: Carl Love +Date: Tue, 23 Jan 2024 17:12:34 -0500 +Subject: [PATCH 1/2] rs6000, unwind-on-each-instruction fix. + +The function rs6000_epilogue_frame_cache assumes the LR and gprs have been +restored. In fact register r31 and the link register, lr, may not have +been restored yet. This patch adds support to store the lr and gpr +register unrolling rules in the cache. The LR and GPR values can now be +unrolled correctly. + +Patch fixes all 10 regresion test failures for the unwind-on-each-insn.exp. +--- + gdb/rs6000-tdep.c | 53 +++++++++++++++++++++++++++++++++++++++++------ + 1 file changed, 47 insertions(+), 6 deletions(-) + +diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c +index 23397d037ae..ecc8766d319 100644 +--- a/gdb/rs6000-tdep.c ++++ b/gdb/rs6000-tdep.c +@@ -3805,6 +3805,8 @@ rs6000_epilogue_frame_cache (frame_info_ptr this_frame, void **this_cache) + struct rs6000_frame_cache *cache; + struct gdbarch *gdbarch = get_frame_arch (this_frame); + ppc_gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); ++ struct rs6000_framedata fdata; ++ int wordsize = tdep->wordsize; + + if (*this_cache) + return (struct rs6000_frame_cache *) *this_cache; +@@ -3815,17 +3817,56 @@ rs6000_epilogue_frame_cache (frame_info_ptr this_frame, void **this_cache) + + try + { +- /* At this point the stack looks as if we just entered the +- function, and the return address is stored in LR. */ +- CORE_ADDR sp, lr; ++ /* At this point the stack looks as if we just entered the function. ++ The SP (r1) has been restored but the LR and r31 may not have been ++ restored yet. Need to update the register unrolling information in ++ the cache for the LR and the saved gprs. */ ++ CORE_ADDR sp; ++ CORE_ADDR func = 0, pc = 0; + +- sp = get_frame_register_unsigned (this_frame, gdbarch_sp_regnum (gdbarch)); +- lr = get_frame_register_unsigned (this_frame, tdep->ppc_lr_regnum); ++ func = get_frame_func (this_frame); ++ cache->pc = func; ++ pc = get_frame_pc (this_frame); ++ skip_prologue (gdbarch, func, pc, &fdata); ++ ++ /* SP is in r1 and it has been restored. Get the current value. */ ++ sp = get_frame_register_unsigned (this_frame, ++ gdbarch_sp_regnum (gdbarch)); + + cache->base = sp; + cache->initial_sp = sp; + +- cache->saved_regs[gdbarch_pc_regnum (gdbarch)].set_value (lr); ++ /* Store the unwinding rules for the gpr registers that have not been ++ restored yet, specifically r31. ++ ++ if != -1, fdata.saved_gpr is the smallest number of saved_gpr. ++ All gpr's from saved_gpr to gpr31 are saved (except during the ++ prologue). */ ++ ++ if (fdata.saved_gpr >= 0) ++ { ++ int i; ++ CORE_ADDR gpr_addr = cache->base + fdata.gpr_offset; ++ ++ for(i = fdata.saved_gpr; i < ppc_num_gprs; i++) ++ { ++ if (fdata.gpr_mask & (1U << i)) ++ cache->saved_regs[tdep->ppc_gp0_regnum + i].set_addr (gpr_addr); ++ gpr_addr += wordsize; ++ } ++ } ++ ++ /* Store the lr unwinding rules. */ ++ if (fdata.lr_offset != 0) ++ cache->saved_regs[tdep->ppc_lr_regnum].set_addr (cache->base ++ + fdata.lr_offset); ++ ++ else if (fdata.lr_register != -1) ++ cache->saved_regs[tdep->ppc_lr_regnum].set_realreg (fdata.lr_register); ++ ++ /* The PC is found in the link register. */ ++ cache->saved_regs[gdbarch_pc_regnum (gdbarch)] ++ = cache->saved_regs[tdep->ppc_lr_regnum]; + } + catch (const gdb_exception_error &ex) + { + +base-commit: 800e56a120419b457ebda18c5478ebfea99f9b3a +-- +2.35.3 + diff --git a/s390-provide-ibm-z16-arch14-instruction-descriptions.patch b/s390-provide-ibm-z16-arch14-instruction-descriptions.patch new file mode 100644 index 0000000..e4307e7 --- /dev/null +++ b/s390-provide-ibm-z16-arch14-instruction-descriptions.patch @@ -0,0 +1,103 @@ +From 789e5514da246a792a78ce5f61a6c286f874b03c Mon Sep 17 00:00:00 2001 +From: Jens Remus +Date: Wed, 20 Dec 2023 11:16:38 +0100 +Subject: [PATCH 1/2] s390: Provide IBM z16 (arch14) instruction descriptions + +Provide descriptions for instructions introduced with commit ba2b480f103 +("IBM Z: Implement instruction set extensions"). This complements commit +69341966def ("IBM zSystems: Add support for z16 as CPU name."). Use +instruction names from IBM z/Architecture Principles of Operation [1] as +instruction description. + +[1]: IBM z/Architecture Principles of Operation, SA22-7832-13, IBM z16, + https://publibfp.dhe.ibm.com/epubs/pdf/a227832d.pdf + +opcodes/ + * s390-opc.txt: Add descriptions for IBM z16 (arch14) + instructions. + +Signed-off-by: Jens Remus +Reviewed-by: Andreas Krebbel +--- + opcodes/s390-opc.txt | 66 +++++++++++++++++++++++++------------------- + 1 file changed, 38 insertions(+), 28 deletions(-) + +diff --git a/opcodes/s390-opc.txt b/opcodes/s390-opc.txt +index b7efa813e47..b33ee34ea8f 100644 +--- a/opcodes/s390-opc.txt ++++ b/opcodes/s390-opc.txt +@@ -2018,31 +2018,41 @@ e60000000052 vcvbg VRR_RV0UU "vector convert to binary 64 bit" arch13 zarch optp + b93a kdsa RRE_RR "compute digital signature authentication" arch13 zarch + + +-# arch14 instructions +- +-e60000000074 vschp VRR_VVV0U0U " " arch14 zarch +-e60000002074 vschsp VRR_VVV0U0 " " arch14 zarch +-e60000003074 vschdp VRR_VVV0U0 " " arch14 zarch +-e60000004074 vschxp VRR_VVV0U0 " " arch14 zarch +-e6000000007c vscshp VRR_VVV " " arch14 zarch +-e6000000007d vcsph VRR_VVV0U0 " " arch14 zarch +-e60000000051 vclzdp VRR_VV0U2 " " arch14 zarch +-e60000000070 vpkzr VRI_VVV0UU2 " " arch14 zarch +-e60000000072 vsrpr VRI_VVV0UU2 " " arch14 zarch +-e60000000054 vupkzh VRR_VV0U2 " " arch14 zarch +-e6000000005c vupkzl VRR_VV0U2 " " arch14 zarch +- +-b93b nnpa RRE_00 " " arch14 zarch +-e60000000056 vclfnh VRR_VV0UU2 " " arch14 zarch +-e6000000005e vclfnl VRR_VV0UU2 " " arch14 zarch +-e60000000075 vcrnf VRR_VVV0UU " " arch14 zarch +-e6000000005d vcfn VRR_VV0UU2 " " arch14 zarch +-e60000000055 vcnf VRR_VV0UU2 " " arch14 zarch +- +-b98B rdp RRF_RURR2 " " arch14 zarch optparm +- +-eb0000000071 lpswey SIY_RD " " arch14 zarch +-b200 lbear S_RD " " arch14 zarch +-b201 stbear S_RD " " arch14 zarch +- +-b28f qpaci S_RD " " arch14 zarch ++# arch14 (z16) instructions ++ ++# Vector-Packed-Decimal-Enhancement Facility 2 ++ ++e60000000074 vschp VRR_VVV0U0U "decimal scale and convert to hfp" arch14 zarch ++e60000002074 vschsp VRR_VVV0U0 "decimal scale and convert to short hfp" arch14 zarch ++e60000003074 vschdp VRR_VVV0U0 "decimal scale and convert to long hfp" arch14 zarch ++e60000004074 vschxp VRR_VVV0U0 "decimal scale and convert to extended hfp" arch14 zarch ++e6000000007c vscshp VRR_VVV "decimal scale and convert and split to hfp" arch14 zarch ++e6000000007d vcsph VRR_VVV0U0 "vector convert hfp to scaled decimal" arch14 zarch ++e60000000051 vclzdp VRR_VV0U2 "vector count leading zero digits" arch14 zarch ++e60000000070 vpkzr VRI_VVV0UU2 "vector pack zoned register" arch14 zarch ++e60000000072 vsrpr VRI_VVV0UU2 "vector shift and round decimal register" arch14 zarch ++e60000000054 vupkzh VRR_VV0U2 "vector unpack zoned high" arch14 zarch ++e6000000005c vupkzl VRR_VV0U2 "vector unpack zoned low" arch14 zarch ++ ++# Neural-Network-Processing-Assist Facility ++ ++b93b nnpa RRE_00 "neural network processing assist" arch14 zarch ++e60000000056 vclfnh VRR_VV0UU2 "vector fp convert and lengthen from nnp high" arch14 zarch ++e6000000005e vclfnl VRR_VV0UU2 "vector fp convert and lengthen from nnp low" arch14 zarch ++e60000000075 vcrnf VRR_VVV0UU "vector fp convert and round to nnp" arch14 zarch ++e6000000005d vcfn VRR_VV0UU2 "vector fp convert from nnp" arch14 zarch ++e60000000055 vcnf VRR_VV0UU2 "vector fp convert to nnp" arch14 zarch ++ ++# Reset-DAT-Protection Facility ++ ++b98B rdp RRF_RURR2 "reset dat protection" arch14 zarch optparm ++ ++# BEAR-Enhancement Facility ++ ++eb0000000071 lpswey SIY_RD "load PSW extended" arch14 zarch ++b200 lbear S_RD "load bear" arch14 zarch ++b201 stbear S_RD "store bear" arch14 zarch ++ ++# Processor-Activity-Instrumentation Facility ++ ++b28f qpaci S_RD "query processor activity counter information" arch14 zarch + +base-commit: 84b9218d98eb2ac242fe3afc81598206279f7b13 +-- +2.35.3 + diff --git a/v2.0.5.tar.gz b/v2.0.5.tar.gz new file mode 100644 index 0000000..bab6fb3 --- /dev/null +++ b/v2.0.5.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:95acf499fdf0a0f5ebd07587bb443c702b1fd79f7d869749824234388b9bff80 +size 343369