diff --git a/_gdb.spec.Patch.include b/_gdb.spec.Patch.include index d2efe9ece54fdb6a055e9de01f2076b26eaa66c4..24289d3a11433d0e64be79cf07e7589a1400361e 100644 --- a/_gdb.spec.Patch.include +++ b/_gdb.spec.Patch.include @@ -12,774 +12,406 @@ Patch003: gdb-vla-intel-fortran-vla-strings.patch #=push+jan Patch004: gdb-vla-intel-stringbt-fix.patch -# Better parse 64-bit PPC system call prologues. -#=push: Write new testcase. -Patch005: gdb-6.3-ppc64syscall-20040622.patch - -# Include the pc's section when doing a symbol lookup so that the -# correct symbol is found. -#=push: Write new testcase. -Patch006: gdb-6.3-ppc64displaysymbol-20041124.patch - # Add a wrapper script to GDB that implements pstack using the # --readnever option. #=push -Patch007: gdb-6.3-gstack-20050411.patch +Patch005: gdb-6.3-gstack-20050411.patch # VSYSCALL and PIE #=fedoratest -Patch008: gdb-6.3-test-pie-20050107.patch +Patch006: gdb-6.3-test-pie-20050107.patch # Get selftest working with sep-debug-info #=fedoratest -Patch009: gdb-6.3-test-self-20050110.patch +Patch007: gdb-6.3-test-self-20050110.patch # Test support of multiple destructors just like multiple constructors #=fedoratest -Patch010: gdb-6.3-test-dtorfix-20050121.patch +Patch008: gdb-6.3-test-dtorfix-20050121.patch # Fix to support executable moving #=fedoratest -Patch011: gdb-6.3-test-movedir-20050125.patch +Patch009: gdb-6.3-test-movedir-20050125.patch # Test sibling threads to set threaded watchpoints for x86 and x86-64 #=fedoratest -Patch012: gdb-6.3-threaded-watchpoints2-20050225.patch +Patch010: gdb-6.3-threaded-watchpoints2-20050225.patch # Notify observers that the inferior has been created #=fedoratest -Patch013: gdb-6.3-inferior-notification-20050721.patch +Patch011: gdb-6.3-inferior-notification-20050721.patch # Verify printing of inherited members test #=fedoratest -Patch014: gdb-6.3-inheritancetest-20050726.patch - -# Add readnever option -#=push -Patch015: gdb-6.3-readnever-20050907.patch - -# Fix debuginfo addresses resolving for --emit-relocs Linux kernels (BZ 203661). -#=push+jan: There was some mail thread about it, this patch may be a hack. -Patch016: gdb-6.5-bz203661-emit-relocs.patch +Patch012: gdb-6.3-inheritancetest-20050726.patch # Support TLS symbols (+`errno' suggestion if no pthread is found) (BZ 185337). #=push+jan: It should be replaced by Infinity project. -Patch017: gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch +Patch013: gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch # Fix TLS symbols resolving for shared libraries with a relative pathname. # The testsuite needs `gdb-6.5-tls-of-separate-debuginfo.patch'. #=fedoratest: One should recheck if it is really fixed upstream. -Patch018: gdb-6.5-sharedlibrary-path.patch +Patch014: gdb-6.5-sharedlibrary-path.patch # Improved testsuite results by the testsuite provided by the courtesy of BEA. #=fedoratest: For upstream it should be rewritten as a dejagnu test, the test of no "??" was useful. -Patch019: gdb-6.5-BEA-testsuite.patch +Patch015: gdb-6.5-BEA-testsuite.patch # Testcase for deadlocking on last address space byte; for corrupted backtraces. #=fedoratest -Patch020: gdb-6.5-last-address-space-byte-test.patch +Patch016: gdb-6.5-last-address-space-byte-test.patch # Fix readline segfault on excessively long hand-typed lines. #=fedoratest -Patch021: gdb-6.5-readline-long-line-crash-test.patch - -# Fix bogus 0x0 unwind of the thread's topmost function clone(3) (BZ 216711). -#=fedora -Patch022: gdb-6.5-bz216711-clone-is-outermost.patch +Patch017: gdb-6.5-readline-long-line-crash-test.patch # Test sideeffects of skipping ppc .so libs trampolines (BZ 218379). #=fedoratest -Patch023: gdb-6.5-bz218379-ppc-solib-trampoline-test.patch +Patch018: gdb-6.5-bz218379-ppc-solib-trampoline-test.patch # Fix lockup on trampoline vs. its function lookup; unreproducible (BZ 218379). #=fedora -Patch024: gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch +Patch019: gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch # Find symbols properly at their original (included) file (BZ 109921). #=fedoratest -Patch025: gdb-6.5-bz109921-DW_AT_decl_file-test.patch +Patch020: gdb-6.5-bz109921-DW_AT_decl_file-test.patch # Update PPC unwinding patches to their upstream variants (BZ 140532). #=fedoratest -Patch026: gdb-6.3-bz140532-ppc-unwinding-test.patch +Patch021: gdb-6.3-bz140532-ppc-unwinding-test.patch # Testcase for exec() from threaded program (BZ 202689). #=fedoratest -Patch027: gdb-6.3-bz202689-exec-from-pthread-test.patch +Patch022: gdb-6.3-bz202689-exec-from-pthread-test.patch # Testcase for PPC Power6/DFP instructions disassembly (BZ 230000). #=fedoratest -Patch028: gdb-6.6-bz230000-power6-disassembly-test.patch +Patch023: gdb-6.6-bz230000-power6-disassembly-test.patch # Allow running `/usr/bin/gcore' with provided but inaccessible tty (BZ 229517). #=fedoratest -Patch029: gdb-6.6-bz229517-gcore-without-terminal.patch +Patch024: gdb-6.6-bz229517-gcore-without-terminal.patch # Avoid too long timeouts on failing cases of "annota1.exp annota3.exp". #=fedoratest -Patch030: gdb-6.6-testsuite-timeouts.patch +Patch025: gdb-6.6-testsuite-timeouts.patch # Support for stepping over PPC atomic instruction sequences (BZ 237572). #=fedoratest -Patch031: gdb-6.6-bz237572-ppc-atomic-sequence-test.patch - -# Make upstream `set scheduler-locking step' as default. -#=push+jan: How much is scheduler-locking relevant after non-stop? -Patch032: gdb-6.6-scheduler_locking-step-is-default.patch +Patch026: gdb-6.6-bz237572-ppc-atomic-sequence-test.patch # Test kernel VDSO decoding while attaching to an i386 process. #=fedoratest -Patch033: gdb-6.3-attach-see-vdso-test.patch +Patch027: gdb-6.3-attach-see-vdso-test.patch # Test leftover zombie process (BZ 243845). #=fedoratest -Patch034: gdb-6.5-bz243845-stale-testing-zombie-test.patch +Patch028: gdb-6.5-bz243845-stale-testing-zombie-test.patch # New locating of the matching binaries from the pure core file (build-id). #=push+jan -Patch035: gdb-6.6-buildid-locate.patch +Patch029: gdb-6.6-buildid-locate.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 -Patch036: gdb-6.6-buildid-locate-solib-missing-ids.patch +Patch030: gdb-6.6-buildid-locate-solib-missing-ids.patch #=push+jan -Patch037: gdb-6.6-buildid-locate-rpm.patch +Patch031: gdb-6.6-buildid-locate-rpm.patch # Fix displaying of numeric char arrays as strings (BZ 224128). #=fedoratest: But it is failing anyway, one should check the behavior more. -Patch038: gdb-6.7-charsign-test.patch +Patch032: gdb-6.7-charsign-test.patch # Test PPC hiding of call-volatile parameter register. #=fedoratest -Patch039: gdb-6.7-ppc-clobbered-registers-O2-test.patch +Patch033: gdb-6.7-ppc-clobbered-registers-O2-test.patch # Testsuite fixes for more stable/comparable results. #=fedoratest -Patch040: gdb-6.7-testsuite-stable-results.patch +Patch034: gdb-6.7-testsuite-stable-results.patch # Test ia64 memory leaks of the code using libunwind. #=fedoratest -Patch041: gdb-6.5-ia64-libunwind-leak-test.patch +Patch035: gdb-6.5-ia64-libunwind-leak-test.patch # Test hiding unexpected breakpoints on intentional step commands. #=fedoratest -Patch042: gdb-6.5-missed-trap-on-step-test.patch +Patch036: gdb-6.5-missed-trap-on-step-test.patch # Test gcore memory and time requirements for large inferiors. #=fedoratest -Patch043: gdb-6.5-gcore-buffer-limit-test.patch +Patch037: gdb-6.5-gcore-buffer-limit-test.patch # Test GCORE for shmid 0 shared memory mappings. #=fedoratest: But it is broken anyway, sometimes the case being tested is not reproducible. -Patch044: gdb-6.3-mapping-zero-inode-test.patch +Patch038: gdb-6.3-mapping-zero-inode-test.patch # Test a crash on `focus cmd', `focus prev' commands. #=fedoratest -Patch045: gdb-6.3-focus-cmd-prev-test.patch +Patch039: gdb-6.3-focus-cmd-prev-test.patch # Test various forms of threads tracking across exec() (BZ 442765). #=fedoratest -Patch046: gdb-6.8-bz442765-threaded-exec-test.patch - -# Silence memcpy check which returns false positive (sparc64) -#=push: But it is just a GCC workaround, look up the existing GCC PR for it. -Patch047: gdb-6.8-sparc64-silence-memcpy-check.patch +Patch040: gdb-6.8-bz442765-threaded-exec-test.patch # Test a crash on libraries missing the .text section. #=fedoratest -Patch048: gdb-6.5-section-num-fixup-test.patch - -# Fix register assignments with no GDB stack frames (BZ 436037). -#=push+jan: This fix is incorrect. -Patch049: gdb-6.8-bz436037-reg-no-longer-active.patch - -# Test the watchpoints conditionals works. -#=fedoratest -Patch050: gdb-6.8-watchpoint-conditionals-test.patch +Patch041: gdb-6.5-section-num-fixup-test.patch # Fix resolving of variables at locations lists in prelinked libs (BZ 466901). #=fedoratest -Patch051: gdb-6.8-bz466901-backtrace-full-prelinked.patch +Patch042: gdb-6.8-bz466901-backtrace-full-prelinked.patch # New test for step-resume breakpoint placed in multiple threads at once. #=fedoratest -Patch052: gdb-simultaneous-step-resume-breakpoint-test.patch +Patch043: gdb-simultaneous-step-resume-breakpoint-test.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@.*> -Patch053: gdb-core-open-vdso-warning.patch - -# Fix syscall restarts for amd64->i386 biarch. -#=push+jan -Patch054: gdb-x86_64-i386-syscall-restart.patch +Patch044: gdb-core-open-vdso-warning.patch # Fix stepping with OMP parallel Fortran sections (BZ 533176). #=push+jan: It requires some better DWARF annotations. -Patch055: gdb-bz533176-fortran-omp-step.patch - -# Fix regression by python on ia64 due to stale current frame. -#=push+jan -Patch056: gdb-follow-child-stale-parent.patch +Patch045: gdb-bz533176-fortran-omp-step.patch # Workaround ccache making lineno non-zero for command-line definitions. #=fedoratest: ccache is rarely used and it is even fixed now. -Patch057: gdb-ccache-workaround.patch +Patch046: gdb-ccache-workaround.patch #=push+jan: May get obsoleted by Tom's unrelocated objfiles patch. -Patch058: gdb-archer-pie-addons.patch +Patch047: gdb-archer-pie-addons.patch #=push+jan: Breakpoints disabling matching should not be based on address. -Patch059: gdb-archer-pie-addons-keep-disabled.patch +Patch048: gdb-archer-pie-addons-keep-disabled.patch # Testcase for "Do not make up line information" fix by Daniel Jacobowitz. #=fedoratest -Patch060: gdb-lineno-makeup-test.patch +Patch049: gdb-lineno-makeup-test.patch # Test power7 ppc disassembly. #=fedoratest -Patch061: gdb-ppc-power7-test.patch - -# Fix i386+x86_64 rwatch+awatch before run, regression against 6.8 (BZ 541866). -# Fix i386 rwatch+awatch before run (BZ 688788, on top of BZ 541866). -#=push+jan: It should be fixed properly instead. -Patch062: gdb-bz541866-rwatch-before-run.patch +Patch050: gdb-ppc-power7-test.patch # Workaround non-stop moribund locations exploited by kernel utrace (BZ 590623). #=push+jan: Currently it is still not fully safe. -Patch063: gdb-moribund-utrace-workaround.patch +Patch051: gdb-moribund-utrace-workaround.patch # Fix follow-exec for C++ programs (bugreported by Martin Stransky). #=fedoratest -Patch064: gdb-archer-next-over-throw-cxx-exec.patch +Patch052: gdb-archer-next-over-throw-cxx-exec.patch # Backport DWARF-4 support (BZ 601887, Tom Tromey). #=fedoratest -Patch065: gdb-bz601887-dwarf4-rh-test.patch +Patch053: gdb-bz601887-dwarf4-rh-test.patch #=push+jan -Patch066: gdb-6.6-buildid-locate-core-as-arg.patch +Patch054: gdb-6.6-buildid-locate-core-as-arg.patch # Workaround librpm BZ 643031 due to its unexpected exit() calls (BZ 642879). #=push+jan -Patch067: gdb-6.6-buildid-locate-rpm-librpm-workaround.patch +Patch055: gdb-6.6-buildid-locate-rpm-librpm-workaround.patch # [delayed-symfile] Test a backtrace regression on CFIs without DIE (BZ 614604). #=fedoratest -Patch068: gdb-test-bt-cfi-without-die.patch - -# Out of memory is just an error, not fatal (uninitialized VLS vars, BZ 568248). -#=push+jan: Inferior objects should be read in parts, then this patch gets obsoleted. -Patch069: gdb-bz568248-oom-is-error.patch +Patch056: gdb-test-bt-cfi-without-die.patch # Verify GDB Python built-in function gdb.solib_address exists (BZ # 634108). #=fedoratest -Patch070: gdb-bz634108-solib_address.patch +Patch057: gdb-bz634108-solib_address.patch # New test gdb.arch/x86_64-pid0-core.exp for kernel PID 0 cores (BZ 611435). #=fedoratest -Patch071: gdb-test-pid0-core.patch +Patch058: gdb-test-pid0-core.patch # [archer-tromey-delayed-symfile] New test gdb.dwarf2/dw2-aranges.exp. #=fedoratest -Patch072: gdb-test-dw2-aranges.patch +Patch059: gdb-test-dw2-aranges.patch # [archer-keiths-expr-cumulative+upstream] Import C++ testcases. #=fedoratest -Patch073: gdb-test-expr-cumulative-archer.patch +Patch060: gdb-test-expr-cumulative-archer.patch # Fix regressions on C++ names resolving (PR 11734, PR 12273, Keith Seitz). #=fedoratest -Patch074: gdb-physname-pr11734-test.patch +Patch061: gdb-physname-pr11734-test.patch # Fix regressions on C++ names resolving (PR 11734, PR 12273, Keith Seitz). #=fedoratest -Patch075: gdb-physname-pr12273-test.patch - -# Toolchain on sparc is slightly broken and debuginfo files are generated -# with non 64bit aligned tables/offsets. -# See for example readelf -S ../Xvnc.debug. -# -# As a consenquence calculation of sectp->filepos as used in -# dwarf2_read_section (gdb/dwarf2read.c:1525) will return a non aligned buffer -# that cannot be used directly as done with MMAP. -# Usage will result in a BusError. -# -# While we figure out what's wrong in the toolchain and do a full archive -# rebuild to fix it, we need to be able to use gdb :) -#=push -Patch076: gdb-7.2.50-sparc-add-workaround-to-broken-debug-files.patch +Patch062: gdb-physname-pr12273-test.patch # Test GDB opcodes/ disassembly of Intel Ivy Bridge instructions (BZ 696890). #=fedoratest -Patch077: gdb-test-ivy-bridge.patch +Patch063: gdb-test-ivy-bridge.patch # Hack for proper PIE run of the testsuite. #=fedoratest -Patch078: gdb-runtest-pie-override.patch +Patch064: gdb-runtest-pie-override.patch # Print reasons for failed attach/spawn incl. SELinux deny_ptrace (BZ 786878). #=push+jan -Patch079: gdb-attach-fail-reasons-5of5.patch +Patch065: gdb-attach-fail-reasons-5of5.patch # Workaround PR libc/14166 for inferior calls of strstr. -#=fedora: Compatibility with RHELs (unchecked which ones). -Patch080: gdb-glibc-strstr-workaround.patch +#=fedoratest: Compatibility with RHELs (unchecked which ones). +Patch066: gdb-glibc-strstr-workaround.patch # Include testcase for `Unable to see a variable inside a module (XLF)' (BZ 823789). #=fedoratest -Patch081: gdb-rhel5.9-testcase-xlf-var-inside-mod.patch +Patch067: gdb-rhel5.9-testcase-xlf-var-inside-mod.patch # Testcase for `Setting solib-absolute-prefix breaks vDSO' (BZ 818343). #=fedoratest -Patch082: gdb-rhbz-818343-set-solib-absolute-prefix-testcase.patch - -# Fix `GDB cannot access struct member whose offset is larger than 256MB' -# (RH BZ 795424). -#=push -Patch083: gdb-rhbz795424-bitpos-20of25.patch - -# Fix `GDB cannot access struct member whose offset is larger than 256MB' -# (RH BZ 795424). -#=push -Patch084: gdb-rhbz795424-bitpos-21of25.patch - -# Fix `GDB cannot access struct member whose offset is larger than 256MB' -# (RH BZ 795424). -#=push -Patch085: gdb-rhbz795424-bitpos-22of25.patch - -# Fix `GDB cannot access struct member whose offset is larger than 256MB' -# (RH BZ 795424). -#=push -Patch086: gdb-rhbz795424-bitpos-23of25.patch - -# Fix `GDB cannot access struct member whose offset is larger than 256MB' -# (RH BZ 795424). -#=push -Patch087: gdb-rhbz795424-bitpos-25of25.patch - -# Fix `GDB cannot access struct member whose offset is larger than 256MB' -# (RH BZ 795424). -#=push -Patch088: gdb-rhbz795424-bitpos-25of25-test.patch - -# Fix `GDB cannot access struct member whose offset is larger than 256MB' -# (RH BZ 795424). -#=push -Patch089: gdb-rhbz795424-bitpos-lazyvalue.patch +Patch068: gdb-rhbz-818343-set-solib-absolute-prefix-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 -Patch090: gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch +Patch069: gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch # Fix crash of -readnow /usr/lib/debug/usr/bin/gnatbind.debug (BZ 1069211). #=push+jan -Patch091: gdb-gnat-dwarf-crash-3of3.patch +Patch070: gdb-gnat-dwarf-crash-3of3.patch # Fix 'memory leak in infpy_read_memory()' (RH BZ 1007614) #=fedoratest -Patch092: gdb-rhbz1007614-memleak-infpy_read_memory-test.patch +Patch071: gdb-rhbz1007614-memleak-infpy_read_memory-test.patch # Fix 'gdb gives highly misleading error when debuginfo pkg is present, # but not corresponding binary pkg' (RH BZ 981154). #=push+jan -Patch093: gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch +Patch072: gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch #=fedoratest -Patch094: gdb-archer-vla-tests.patch +Patch073: gdb-archer-vla-tests.patch #=fedoratest -Patch095: gdb-vla-intel-tests.patch +Patch074: gdb-vla-intel-tests.patch # Continue backtrace even if a frame filter throws an exception (Phil Muldoon). #=push -Patch096: gdb-btrobust.patch +Patch075: gdb-btrobust.patch # Display Fortran strings in backtraces. #=fedoratest -Patch097: gdb-fortran-frame-string.patch - -# Fix Python GIL with gdb.execute("continue") (Phil Muldoon, BZ 1116957). -#=push -Patch098: gdb-python-gil.patch +Patch076: gdb-fortran-frame-string.patch # Testcase for '[SAP] Recursive dlopen causes SAP HANA installer to # crash.' (RH BZ 1156192). #=fedoratest -Patch099: gdb-rhbz1156192-recursive-dlopen-test.patch +Patch077: gdb-rhbz1156192-recursive-dlopen-test.patch # Fix jit-reader.h for multi-lib. #=push+jan -Patch100: gdb-jit-reader-multilib.patch +Patch078: gdb-jit-reader-multilib.patch # Fix '`catch syscall' doesn't work for parent after `fork' is called' # (Philippe Waroquiers, RH BZ 1149205). #=fedoratest -Patch101: gdb-rhbz1149205-catch-syscall-after-fork-test.patch +Patch079: gdb-rhbz1149205-catch-syscall-after-fork-test.patch # Fix 'backport GDB 7.4 fix to RHEL 6.6 GDB' [Original Sourceware bug # description: 'C++ (and objc): Internal error on unqualified name # re-set', PR 11657] (RH BZ 1186476). #=fedoratest -Patch102: gdb-rhbz1186476-internal-error-unqualified-name-re-set-test.patch +Patch080: gdb-rhbz1186476-internal-error-unqualified-name-re-set-test.patch # Test 'info type-printers' Python error (RH BZ 1350436). #=fedoratest -Patch103: gdb-rhbz1350436-type-printers-error.patch +Patch081: gdb-rhbz1350436-type-printers-error.patch # Fix '[ppc64] and [s390x] wrong prologue skip on -O2 -g code' (Jan # Kratochvil, RH BZ 1084404). #=fedoratest -Patch104: gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch +Patch082: gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch # Never kill PID on: gdb exec PID (Jan Kratochvil, RH BZ 1219747). #=push+jan -Patch105: gdb-bz1219747-attach-kills.patch +Patch083: gdb-bz1219747-attach-kills.patch # Force libncursesw over libncurses to match the includes (RH BZ 1270534). #=push+jan -Patch106: gdb-fedora-libncursesw.patch +Patch084: gdb-fedora-libncursesw.patch # Test clflushopt instruction decode (for RH BZ 1262471). #=fedoratest -Patch107: gdb-opcodes-clflushopt-test.patch +Patch085: gdb-opcodes-clflushopt-test.patch # [rhel6] DTS backward Python compatibility API (BZ 1020004, Phil Muldoon). #=fedora -Patch108: gdb-dts-rhel6-python-compat.patch +Patch086: gdb-dts-rhel6-python-compat.patch # [SCL] Skip deprecated .gdb_index warning for Red Hat built files (BZ 953585). #=push+jan -Patch109: gdb-6.6-buildid-locate-rpm-scl.patch - -# Work around readline-6.2 incompatibility not asking for --more-- (BZ 701131). -#=fedora -Patch110: gdb-readline62-ask-more-rh.patch +Patch087: gdb-6.6-buildid-locate-rpm-scl.patch # Make the GDB quit processing non-abortable to cleanup everything properly. #=fedora: It was useful only after gdb-6.8-attach-signalled-detach-stopped.patch . -Patch111: gdb-6.8-quit-never-aborts.patch +Patch088: gdb-6.8-quit-never-aborts.patch # [aarch64] Fix hardware watchpoints (RH BZ 1261564). #=fedoratest -Patch112: gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch +Patch089: gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch # Add messages suggesting more recent RHEL gdbserver (RH BZ 1321114). #=fedora -Patch113: gdb-container-rh-pkg.patch +Patch090: gdb-container-rh-pkg.patch # New test for Python "Cannot locate object file for block" (for RH BZ 1325795). #=fedoratest -Patch114: gdb-rhbz1325795-framefilters-test.patch +Patch091: gdb-rhbz1325795-framefilters-test.patch # [dts+el7] [x86*] Bundle linux_perf.h for libipt (RH BZ 1256513). #=fedora -Patch115: gdb-linux_perf-bundle.patch +Patch092: gdb-linux_perf-bundle.patch # Fix gdb-headless /usr/bin/ executables (BZ 1390251). +# +# Also, make /usr/bin/gdb.minimal be the default GDB used, if it's +# present. For rationale, see: +# +# https://fedoraproject.org/wiki/Changes/Minimal_GDB_in_buildroot #=fedora -Patch116: gdb-libexec-add-index.patch +Patch093: gdb-libexec-add-index.patch # New testcase for: Fix -completion crash (Gary Benson, RH BZ 1398387). #=fedoratest -Patch117: gdb-rhbz1398387-tab-crash-test.patch - -# [testsuite] Fix false selftest.exp FAIL from system readline-6.3+ (Patrick Palka). -#=fedoratest -Patch118: gdb-testsuite-readline63-sigint.patch +Patch094: gdb-rhbz1398387-tab-crash-test.patch # Python patches of: http://sourceware.org/gdb/wiki/ProjectArcher #=push -Patch119: gdb-archer.patch +Patch095: gdb-archer.patch # Revert upstream commit 469412dd9ccc4de5874fd3299b105833f36b34cd -Patch120: gdb-vla-intel-fix-print-char-array.patch +Patch096: gdb-vla-intel-fix-print-char-array.patch # [s390x] Backport arch12 instructions decoding (RH BZ 1553104). # =fedoratest -Patch121: gdb-rhbz1553104-s390x-arch12-test.patch - -# Implement IPv6 support for GDB/gdbserver (RH BZ 881849, Sergio Durigan Junior). -Patch122: gdb-rhbz881849-ipv6-1of3.patch - - -Patch123: gdb-rhbz881849-ipv6-2of3.patch - - -Patch124: gdb-rhbz881849-ipv6-3of3.patch - -# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). -Patch125: gdb-rhbz1187581-power8-regs-1of7.patch - -# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). -Patch126: gdb-rhbz1187581-power8-regs-2of7.patch - -# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). -Patch127: gdb-rhbz1187581-power8-regs-3of7.patch - -# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). -Patch128: gdb-rhbz1187581-power8-regs-4of7.patch - -# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). -Patch129: gdb-rhbz1187581-power8-regs-5of7.patch - -# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). -Patch130: gdb-rhbz1187581-power8-regs-6of7.patch - -# Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). -Patch131: gdb-rhbz1187581-power8-regs-7of7.patch - -# Fix for 'gdb in batch mode always exit with status 0' (Gary Benson) -# RHBZ #1491128 -Patch132: gdb-rhbz1491128-batch-mode-exit-status-1of2.patch - -# Fix for 'gdb in batch mode always exit with status 0' (Gary Benson) -# RHBZ #1491128 -Patch133: gdb-rhbz1491128-batch-mode-exit-status-2of2.patch - -# Use pulongest in aarch64-linux-tdep.c. -# This patch was forgotten during the 8.2 release process, and is -# needed to unbreak GDB when compiling on 32-bit arches. -Patch134: gdb-use-pulongest-aarch64-linux-tdep.patch - -# Fix for 'GDB crashes when running from a deleted directory' -# (Tom Tromey, RHBZ#1653410) -Patch135: gdb-rhbz1653410-avoid-crash-when-calling-warning-too-early.patch - -# Fix for 'py-bt is broken, results in exception'. -# RHBZ 1639242 -Patch136: gdb-rhbz1639242-fix-dwarf2_find_containing_comp_unit-binary-search.patch - -# Fix 'Assertion `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' failed.' -# Keith Seitz, RHBZ#1560010. -Patch137: gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-1of5.patch - -# Fix 'Assertion `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' failed.' -# Keith Seitz, RHBZ#1560010. -Patch138: gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-2of5.patch - -# Fix 'Assertion `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' failed.' -# Keith Seitz, RHBZ#1560010. -Patch139: gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-3of5.patch - -# Fix 'Assertion `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' failed.' -# Keith Seitz, RHBZ#1560010. -Patch140: gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-4of5.patch - -# Fix 'Assertion `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' failed.' -# Keith Seitz, RHBZ#1560010. -Patch141: gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-5of5.patch - -# Fix 'gdb suggests using "dnf debuginfo-install' -# Keith Seitz, RHBZ 1666249 -Patch142: gdb-rhbz1666249-suggest-yum-instead-of-dnf.patch - -# Fix 'libiberty: Memory leak in demangle_template function resulting in a denial of service" -# Simon Marchi, RH BZ 1668635 -Patch143: gdb-rhbz1668635-libiberty-demangle_template-memleak.patch - -# Fix 'gdb fails to read zN registers from corefile with aarch64 SVE' -# Alan Hayward, RH BZ 1669953 -Patch144: gdb-rhbz1669953-aarch64-sve-binutils.patch - -# Fix remote.c build failure -# Szabolcs Nagy, RH BZ 1187581 -Patch145: gdb-rhbz1187581-power8-regs-not-in-8.2-01of15.patch - -# Add grok/write functions for new ppc core note sections -# Edjunior Barbosa Machado, RH BZ 1187581 -Patch146: gdb-rhbz1187581-power8-regs-not-in-8.2-02of15.patch - -# Zero-initialize linux note sections -# Pedro Franco de Carvalho, RH BZ 1187581 -Patch147: gdb-rhbz1187581-power8-regs-not-in-8.2-03of15.patch - -# [PowerPC] Don't zero-initialize vector register buffers -# Pedro Franco de Carvalho, RH BZ 1187581 -Patch148: gdb-rhbz1187581-power8-regs-not-in-8.2-04of15.patch - -# Add decfloat registers to float reggroup -# Pedro Franco de Carvalho, RH BZ 1187581 -Patch149: gdb-rhbz1187581-power8-regs-not-in-8.2-05of15.patch - -# [PowerPC] Remove rs6000_pseudo_register_reggroup_p -# Pedro Franco de Carvalho, RH BZ 1187581 -Patch150: gdb-rhbz1187581-power8-regs-not-in-8.2-06of15.patch - -# [PowerPC] Fix two if statements in gdb/ppc-linux-nat.c -# Pedro Franco de Carvalho, RH BZ 1187581 -Patch151: gdb-rhbz1187581-power8-regs-not-in-8.2-07of15.patch +Patch097: gdb-rhbz1553104-s390x-arch12-test.patch -# [PowerPC] Fix indentation in arch/ppc-linux-common.c -# Pedro Franco de Carvalho, RH BZ 1187581 -Patch152: gdb-rhbz1187581-power8-regs-not-in-8.2-08of15.patch +# Fix int conversion error from bfd/elf.c when compiling with gcc 10 +Patch098: gdb-rhbz1818011-bfd-gcc10-error.patch -# [PowerPC] Refactor have_ initializers in rs6000-tdep.c -# Pedro Franco de Carvalho, RH BZ 1187581 -Patch153: gdb-rhbz1187581-power8-regs-not-in-8.2-09of15.patch +# Backport fix for deprecation of PyEval_InitThreads in Python 3.9. +Patch099: gdb-rhbz1822715-fix-python-deprecation.patch -# [PowerPC] Add support for PPR and DSCR -# Edjunior Barbosa Machado and Pedro Franco de Carvalho, RH BZ 1187581 -Patch154: gdb-rhbz1187581-power8-regs-not-in-8.2-10of15.patch +# Backport "Fix Python 3.9 related runtime problems" +# Kevin Buettner and Keith Seitz +Patch100: gdb-rhbz1829702-fix-python39.patch -# [PowerPC] Add support for TAR -# Edjunior Barbosa Machado and Pedro Franco de Carvalho, RH BZ 1187581 -Patch155: gdb-rhbz1187581-power8-regs-not-in-8.2-11of15.patch +# Fix fput?_unfiltered functions +# RH BZ 1844458 (Sergio Durigan Junior and Tom Tromey) +Patch101: gdb-rhbz1844458-use-fputX_unfiltered.patch -# [PowerPC] Add support for EBB and PMU registers -# Edjunior Barbosa Machado and Pedro Franco de Carvalho, RH BZ 1187581m -Patch156: gdb-rhbz1187581-power8-regs-not-in-8.2-12of15.patch - -# [PowerPC] Reject tdescs with VSX and no FPU or Altivec -# Pedro Franco de Carvalho, RH BZ 1187581 -Patch157: gdb-rhbz1187581-power8-regs-not-in-8.2-13of15.patch - -# [PowerPC] Add support for HTM registers -# Edjunior Barbosa Machado and Pedro Franco de Carvalho, RH BZ 1187581 -Patch158: gdb-rhbz1187581-power8-regs-not-in-8.2-14of15.patch - -# [PowerPC] Document requirements for VSX feature -# Pedro Franco de Carvalho, RH BZ 1187581 -Patch159: gdb-rhbz1187581-power8-regs-not-in-8.2-15of15.patch +# Backport debuginofd support. +# (Aaron Merey, RH BZ 183877) +Patch102: gdb-rhbz1838777-debuginfod.patch -# "Fix" segfault that happens on parse_macro_definition because -# debugedit corrupts the .debug_macro section. -# Sergio Durigan Junior, RH BZ 1708192. -Patch160: gdb-rhbz1708192-parse_macro_definition-crash.patch - -# Prevent buffer overflow with sections with invalid sizes. -# Keith Seitz, RH BZ 1740299. -Patch161: gdb-rhbz1742099-reject-sections-with-invalid-sizes.patch - -# Fix 'GDB needs s390x arch13 binutils patches' -# RHBZ 1768593, Andreas Krebbel -# This patch contains only the opcodes change. -Patch162: gdb-rhbz1768593-s390x-arch13-01.patch - -# Fix 'GDB needs s390x arch13 binutils patches' -# RHBZ 1768593, Andreas Krebbel -# This patch contains only the opcodes and include changes. -Patch163: gdb-rhbz1768593-s390x-arch13-02.patch - -# Fix 'GDB needs s390x arch13 binutils patches' -# RHBZ 1768593, Andreas Krebbel -Patch164: gdb-rhbz1768593-s390x-arch13-03.patch - -# Backport z15 record/replay -# Andreas Arnaz, RH BZ 1659535 -Patch165: gdb-rhbz1659535-z15-record-replay.patch - -# Fix terminal problems when error() is called -# Alan Hayward (RH BZ 1852580) -Patch166: gdb-rhbz1852580-terminal-woes.patch - -# Remove hack for GDB which sets the section size to 0 -# Kevin Buettner, RH BZ 1842691 -Patch167: gdb-rhbz1842691-corefile-mem-access-1of15.patch - -# Adjust corefile.exp test to show regression after bfd hack removal -# Kevin Buettner, RH BZ 1842691 -Patch168: gdb-rhbz1842691-corefile-mem-access-2of15.patch - -# section_table_xfer_memory: Replace section name with callback predicate -# Kevin Buettner, RH BZ 1842691 -Patch169: gdb-rhbz1842691-corefile-mem-access-3of15.patch - -# Provide access to non SEC_HAS_CONTENTS core file sections -# Kevin Buettner, RH BZ 1842961 -Patch170: gdb-rhbz1842691-corefile-mem-access-4of15.patch - -# Test ability to access unwritten-to mmap data in core file -# Kevin Buettner, RH BZ 1842961 -Patch171: gdb-rhbz1842691-corefile-mem-access-5of15.patch - -# Update binary_get_section_contents to seek using section's file position -# Kevin Buettner, RH BZ 1842961 -Patch172: gdb-rhbz1842691-corefile-mem-access-6of15.patch - -# Add new gdbarch method, read_core_file_mappings -# Kevin Buettner, RH BZ 1842961 -Patch173: gdb-rhbz1842691-corefile-mem-access-7of15.patch - -# Use NT_FILE note section for reading core target memory -# Kevin Buettner, RH BZ 1842961 -Patch174: gdb-rhbz1842691-corefile-mem-access-8of15.patch - -# Add test for accessing read-only mmapped data in a core file -# Kevin Buettner, RH BZ 1842691 -Patch175: gdb-rhbz1842691-corefile-mem-access-9of15.patch - -# gcore command: Place all file-backed mappings in NT_FILE note -# Kevin Buettner, RH BZ 1842961 -Patch176: gdb-rhbz1842691-corefile-mem-access-10of15.patch - -# Adjust coredump-filter.exp to account for NT_FILE note handling -# Kevin Buettner, RH BZ 1842961 -Patch177: gdb-rhbz1842691-corefile-mem-access-11of15.patch - -# Add new command "maint print core-file-backed-mappings" -# Kevin Buettner, RH BZ 1842961 -Patch178: gdb-rhbz1842691-corefile-mem-access-12of15.patch - -# Add documentation for "maint print core-file-backed-mappings" -# Kevin Buettner, RH BZ 1842961 -Patch179: gdb-rhbz1842691-corefile-mem-access-13of15.patch - -# New core file tests with mappings over existing program memory -# Kevin Buettner, RH BZ 1842961 -Patch180: gdb-rhbz1842691-corefile-mem-access-14of15.patch - -# Add period to help text for maint print core-file-backed-mappings -# Kevin Buettner, RH BZ 1842961 -Patch181: gdb-rhbz1842691-corefile-mem-access-15of15.patch - -# Backport "Stop the BFD library from issuing a warning message when -# processing allocated sections in debuginfo files that lie outside of -# Nick Clifton and Keith Seitz, RH BZ 1878810 -Patch182: gdb-rhbz1878810-bfd-suppress-loadable-section-outside-ELF-sections.patch - -# Backport "fortran dynamic type related fixes" -# Andrew Burgess (RH BZ 1905701) -Patch183: gdb-rhbz1905701-DWARF-data_location.patch - -# Backport of "Correct recording of 'store on condition' insns" -# Andreas Arnaz (RH BZ 1903374) -Patch184: gdb-rhbz1903374-s390x-store-on-condition.patch - -# Fix segfault with nameless fortran modules. -# Bernhard Heckel, RH BZ 1943673 -Patch185: gdb-rhbz1934673-fortran-nameless-modules.patch - -# Backport "Add low_new_clone method to linux_nat_target." -# (Pedro Franco de Carvalho, RH BZ 1854784) -Patch186: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-1of7.patch - -# Backport "Add linux_get_hwcap" -# (Alan Hayward, RH BZ 1854784) -Patch187: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-2of7.patch - -# Backport "[PowerPC] Move up some register access routines" -# (Pedro Franco de Carvalho, RH BZ 1854784) -Patch188: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-3of7.patch - -# Backport "[PowerPC] Fix debug register issues in ppc-linux-nat" -# (Pedro Franco de Carvalho, RH BZ 1854784) -Patch189: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-4of7.patch - -# Backport "[PowerPC] Use < 0 and >= 0 for watchpoint ptrace calls" -# (Pedro Franco de Carvalho, RH BZ 1854784) -Patch190: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-5of7.patch - -# Backport "[PowerPC] Always clear watchpoint with PTRACE_SET_DEBUGREG" -# (Pedro Franco de Carvalho, RH BZ 1854784) -Patch191: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-6of7.patch - -# Backport "PowerPC remove 512 bytes region limit if 2nd DAWR is available." -# (Rogerio Alves, RH BZ 1854784) -Patch192: gdb-rhbz1854784-powerpc-remove-region-limit-dawr-7of7.patch +# Backport patches fixing abort when working directory is deleted. +Patch103: gdb-rhbz1869484-deleted-working-directory diff --git a/_gdb.spec.patch.include b/_gdb.spec.patch.include index 13ee90b635d9b523b4d1fb881e757e62f0c35229..0557da6edd84ca67a43fe3691ed36a5fc37f596c 100644 --- a/_gdb.spec.patch.include +++ b/_gdb.spec.patch.include @@ -101,92 +101,3 @@ %patch101 -p1 %patch102 -p1 %patch103 -p1 -%patch104 -p1 -%patch105 -p1 -%patch106 -p1 -%patch107 -p1 -%patch108 -p1 -%patch109 -p1 -%patch110 -p1 -%patch111 -p1 -%patch112 -p1 -%patch113 -p1 -%patch114 -p1 -%patch115 -p1 -%patch116 -p1 -%patch117 -p1 -%patch118 -p1 -%patch119 -p1 -%patch120 -p1 -%patch121 -p1 -%patch122 -p1 -%patch123 -p1 -%patch124 -p1 -%patch125 -p1 -%patch126 -p1 -%patch127 -p1 -%patch128 -p1 -%patch129 -p1 -%patch130 -p1 -%patch131 -p1 -%patch132 -p1 -%patch133 -p1 -%patch134 -p1 -%patch135 -p1 -%patch136 -p1 -%patch137 -p1 -%patch138 -p1 -%patch139 -p1 -%patch140 -p1 -%patch141 -p1 -%patch142 -p1 -%patch143 -p1 -%patch144 -p1 -%patch145 -p1 -%patch146 -p1 -%patch147 -p1 -%patch148 -p1 -%patch149 -p1 -%patch150 -p1 -%patch151 -p1 -%patch152 -p1 -%patch153 -p1 -%patch154 -p1 -%patch155 -p1 -%patch156 -p1 -%patch157 -p1 -%patch158 -p1 -%patch159 -p1 -%patch160 -p1 -%patch161 -p1 -%patch162 -p1 -%patch163 -p1 -%patch164 -p1 -%patch165 -p1 -%patch166 -p1 -%patch167 -p1 -%patch168 -p1 -%patch169 -p1 -%patch170 -p1 -%patch171 -p1 -%patch172 -p1 -%patch173 -p1 -%patch174 -p1 -%patch175 -p1 -%patch176 -p1 -%patch177 -p1 -%patch178 -p1 -%patch179 -p1 -%patch180 -p1 -%patch181 -p1 -%patch182 -p1 -%patch183 -p1 -%patch184 -p1 -%patch185 -p1 -%patch186 -p1 -%patch187 -p1 -%patch188 -p1 -%patch189 -p1 -%patch190 -p1 -%patch191 -p1 -%patch192 -p1 diff --git a/gdb-6.3-gstack-20050411.patch b/gdb-6.3-gstack-20050411.patch index 37b09de089ba3a0fc18bb59967868b6143684ff7..982863adb85d87cfa6dcee0f79696dcb71f35277 100644 --- a/gdb-6.3-gstack-20050411.patch +++ b/gdb-6.3-gstack-20050411.patch @@ -16,7 +16,7 @@ Subject: gdb-6.3-gstack-20050411.patch diff --git a/gdb/Makefile.in b/gdb/Makefile.in --- a/gdb/Makefile.in +++ b/gdb/Makefile.in -@@ -1735,7 +1735,7 @@ info install-info clean-info dvi pdf install-pdf html install-html: force +@@ -1768,7 +1768,7 @@ info install-info clean-info dvi pdf install-pdf html install-html: force install: all @$(MAKE) $(FLAGS_TO_PASS) install-only @@ -25,7 +25,7 @@ diff --git a/gdb/Makefile.in b/gdb/Makefile.in transformed_name=`t='$(program_transform_name)'; \ echo gdb | sed -e "$$t"` ; \ if test "x$$transformed_name" = x; then \ -@@ -1784,7 +1784,25 @@ install-guile: +@@ -1817,7 +1817,25 @@ install-guile: install-python: $(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(GDB_DATADIR)/python/gdb @@ -52,7 +52,7 @@ diff --git a/gdb/Makefile.in b/gdb/Makefile.in transformed_name=`t='$(program_transform_name)'; \ echo gdb | sed -e $$t` ; \ if test "x$$transformed_name" = x; then \ -@@ -1807,6 +1825,18 @@ uninstall: force $(CONFIG_UNINSTALL) +@@ -1840,6 +1858,18 @@ uninstall: force $(CONFIG_UNINSTALL) fi @$(MAKE) DO=uninstall "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) subdir_do @@ -171,7 +171,7 @@ diff --git a/gdb/testsuite/gdb.base/gstack.exp b/gdb/testsuite/gdb.base/gstack.e new file mode 100644 --- /dev/null +++ b/gdb/testsuite/gdb.base/gstack.exp -@@ -0,0 +1,66 @@ +@@ -0,0 +1,84 @@ +# Copyright (C) 2012 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify @@ -202,6 +202,10 @@ new file mode 100644 + 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 { @@ -217,7 +221,6 @@ new file mode 100644 + return + } +} -+gdb_exit + +# 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. @@ -229,12 +232,27 @@ new file mode 100644 + perror "Spawning $command failed." + fail $test +} -+set pid [exp_pid -i $res] ++ ++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_exit + -+remote_exec host "kill -9 $pid" ++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-inferior-notification-20050721.patch b/gdb-6.3-inferior-notification-20050721.patch index b94b432f8200405cb5179061daaf2b3c8f370c81..d09fe1e1da35f496b447e944b62f94c9229065d8 100644 --- a/gdb-6.3-inferior-notification-20050721.patch +++ b/gdb-6.3-inferior-notification-20050721.patch @@ -262,7 +262,7 @@ new file mode 100644 +} + +set GDBFLAGS_orig $GDBFLAGS -+set GDBFLAGS "--pid=$testpid" ++set GDBFLAGS "-iex \"set height 0\" --pid=$testpid" +gdb_start +set GDBFLAGS $GDBFLAGS_orig + @@ -284,7 +284,7 @@ new file mode 100644 +} + +set GDBFLAGS_orig $GDBFLAGS -+set GDBFLAGS "--pid=$testpid" ++set GDBFLAGS "-iex \"set height 0\" --pid=$testpid" +gdb_start +set GDBFLAGS $GDBFLAGS_orig + diff --git a/gdb-6.3-ppc64displaysymbol-20041124.patch b/gdb-6.3-ppc64displaysymbol-20041124.patch deleted file mode 100644 index a09b0fe954de15b0b4360646dd6cd8486ef382cc..0000000000000000000000000000000000000000 --- a/gdb-6.3-ppc64displaysymbol-20041124.patch +++ /dev/null @@ -1,32 +0,0 @@ -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-ppc64displaysymbol-20041124.patch - -;; Include the pc's section when doing a symbol lookup so that the -;; correct symbol is found. -;;=push: Write new testcase. - -2004-11-24 Andrew Cagney - - * printcmd.c (build_address_symbolic): Find a section for the - address. - -diff --git a/gdb/printcmd.c b/gdb/printcmd.c ---- a/gdb/printcmd.c -+++ b/gdb/printcmd.c -@@ -587,6 +587,14 @@ build_address_symbolic (struct gdbarch *gdbarch, - addr = overlay_mapped_address (addr, section); - } - } -+ /* To ensure that the symbol returned belongs to the correct setion -+ (and that the last [random] symbol from the previous section -+ isn't returned) try to find the section containing PC. First try -+ the overlay code (which by default returns NULL); and second try -+ the normal section code (which almost always succeeds). */ -+ section = find_pc_overlay (addr); -+ if (section == NULL) -+ section = find_pc_section (addr); - - /* First try to find the address in the symbol table, then - in the minsyms. Take the closest one. */ diff --git a/gdb-6.3-ppc64syscall-20040622.patch b/gdb-6.3-ppc64syscall-20040622.patch deleted file mode 100644 index e6319bebf0895274b5787d9230f8ea13ce9e897e..0000000000000000000000000000000000000000 --- a/gdb-6.3-ppc64syscall-20040622.patch +++ /dev/null @@ -1,118 +0,0 @@ -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-ppc64syscall-20040622.patch - -;; Better parse 64-bit PPC system call prologues. -;;=push: Write new testcase. - -2004-06-22 Andrew Cagney - - * rs6000-tdep.c (struct rs6000_framedata): Add field "func_start". - (skip_prologue): Delete local variable "orig_pc", use - "func_start". Add local variable "num_skip_linux_syscall_insn", - use to skip over first half of a GNU/Linux syscall and update - "func_start". - -diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c ---- a/gdb/rs6000-tdep.c -+++ b/gdb/rs6000-tdep.c -@@ -134,6 +134,7 @@ static const char *powerpc_vector_abi_string = "auto"; - - struct rs6000_framedata - { -+ CORE_ADDR func_start; /* True function start. */ - int offset; /* total size of frame --- the distance - by which we decrement sp to allocate - the frame */ -@@ -1426,7 +1427,6 @@ static CORE_ADDR - skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR lim_pc, - struct rs6000_framedata *fdata) - { -- CORE_ADDR orig_pc = pc; - CORE_ADDR last_prologue_pc = pc; - CORE_ADDR li_found_pc = 0; - gdb_byte buf[4]; -@@ -1445,12 +1445,14 @@ skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR lim_pc, - int minimal_toc_loaded = 0; - int prev_insn_was_prologue_insn = 1; - int num_skip_non_prologue_insns = 0; -+ int num_skip_ppc64_gnu_linux_syscall_insn = 0; - int r0_contains_arg = 0; - const struct bfd_arch_info *arch_info = gdbarch_bfd_arch_info (gdbarch); - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - enum bfd_endian byte_order = gdbarch_byte_order (gdbarch); - - memset (fdata, 0, sizeof (struct rs6000_framedata)); -+ fdata->func_start = pc; - fdata->saved_gpr = -1; - fdata->saved_fpr = -1; - fdata->saved_vr = -1; -@@ -1484,6 +1486,55 @@ skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR lim_pc, - break; - op = extract_unsigned_integer (buf, 4, byte_order); - -+ /* A PPC64 GNU/Linux system call function is split into two -+ sub-functions: a non-threaded fast-path (__NAME_nocancel) -+ which does not use a frame; and a threaded slow-path -+ (Lpseudo_cancel) that does create a frame. Ref: -+ nptl/sysdeps/unix/sysv/linux/powerpc/powerpc32/sysdep-cancel.h -+ -+ *INDENT-OFF* -+ NAME: -+ SINGLE_THREAD_P -+ bne- .Lpseudo_cancel -+ __NAME_nocancel: -+ li r0,162 -+ sc -+ bnslr+ -+ b 0x7fe014ef64 <.__syscall_error> -+ Lpseudo_cancel: -+ stdu r1,-128(r1) -+ ... -+ *INDENT-ON* -+ -+ Unfortunatly, because the latter case uses a local label (not -+ in the symbol table) a PC in "Lpseudo_cancel" appears to be -+ in "__NAME_nocancel". The following code recognizes this, -+ adjusting FUNC_START to point to where "Lpseudo_cancel" -+ should be, and parsing the prologue sequence as if -+ "Lpseudo_cancel" was the entry point. */ -+ -+ if (((op & 0xffff0000) == 0x38000000 /* li r0,N */ -+ && pc == fdata->func_start + 0 -+ && num_skip_ppc64_gnu_linux_syscall_insn == 0) -+ || (op == 0x44000002 /* sc */ -+ && pc == fdata->func_start + 4 -+ && num_skip_ppc64_gnu_linux_syscall_insn == 1) -+ || (op == 0x4ca30020 /* bnslr+ */ -+ && pc == fdata->func_start + 8 -+ && num_skip_ppc64_gnu_linux_syscall_insn == 2)) -+ { -+ num_skip_ppc64_gnu_linux_syscall_insn++; -+ continue; -+ } -+ else if ((op & 0xfc000003) == 0x48000000 /* b __syscall_error */ -+ && pc == fdata->func_start + 12 -+ && num_skip_ppc64_gnu_linux_syscall_insn == 3) -+ { -+ num_skip_ppc64_gnu_linux_syscall_insn = -1; -+ fdata->func_start = pc; -+ continue; -+ } -+ - if ((op & 0xfc1fffff) == 0x7c0802a6) - { /* mflr Rx */ - /* Since shared library / PIC code, which needs to get its -@@ -1673,9 +1724,9 @@ skip_prologue (struct gdbarch *gdbarch, CORE_ADDR pc, CORE_ADDR lim_pc, - we have no line table information or the line info tells - us that the subroutine call is not part of the line - associated with the prologue. */ -- if ((pc - orig_pc) > 8) -+ if ((pc - fdata->func_start) > 8) - { -- struct symtab_and_line prologue_sal = find_pc_line (orig_pc, 0); -+ struct symtab_and_line prologue_sal = find_pc_line (fdata->func_start, 0); - struct symtab_and_line this_sal = find_pc_line (pc, 0); - - if ((prologue_sal.line == 0) diff --git a/gdb-6.3-readnever-20050907.patch b/gdb-6.3-readnever-20050907.patch deleted file mode 100644 index b70b58f6ae1906020d92d287703bfd021b94b57a..0000000000000000000000000000000000000000 --- a/gdb-6.3-readnever-20050907.patch +++ /dev/null @@ -1,35 +0,0 @@ -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-readnever-20050907.patch - -;; Add readnever option -;;=push - -2004-11-18 Andrew Cagney - - * dwarf2read.c: Include "top.c". - (dwarf2_has_info): Check for readnever_symbol_files. - * symfile.c (readnever_symbol_files): Define. - * top.h (readnever_symbol_files): Declare. - * main.c (captured_main): Add --readnever option. - (print_gdb_help): Ditto. - -2004-11-18 Andrew Cagney - - * gdb.texinfo (File Options): Document --readnever. - -Pushed upstream: https://sourceware.org/ml/gdb-cvs/2017-12/msg00007.html - -diff --git a/gdb/gcore.in b/gdb/gcore.in ---- a/gdb/gcore.in -+++ b/gdb/gcore.in -@@ -97,7 +97,7 @@ for pid in "$@" - do - # ` 0)); + } diff --git a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch index fbeb88cb608a7a660cd1656b20124d1c1ddf47f7..a89de0ac8f242f40ae46c2d4f5d791c2927a6b3f 100644 --- a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch +++ b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch @@ -44,9 +44,9 @@ glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug: diff --git a/gdb/printcmd.c b/gdb/printcmd.c --- a/gdb/printcmd.c +++ b/gdb/printcmd.c -@@ -1190,6 +1190,10 @@ print_command_1 (const char *exp, int voidprint) +@@ -1214,6 +1214,10 @@ print_command_1 (const char *args, int voidprint) - if (exp && *exp) + if (exp != nullptr && *exp) { + /* '*((int *(*) (void)) __errno_location) ()' is incompatible with + function descriptors. */ diff --git a/gdb-6.5-bz203661-emit-relocs.patch b/gdb-6.5-bz203661-emit-relocs.patch deleted file mode 100644 index 75ca84f70ba25728bd362f26e693c6e7081c3c7a..0000000000000000000000000000000000000000 --- a/gdb-6.5-bz203661-emit-relocs.patch +++ /dev/null @@ -1,24 +0,0 @@ -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-bz203661-emit-relocs.patch - -;; Fix debuginfo addresses resolving for --emit-relocs Linux kernels (BZ 203661). -;;=push+jan: There was some mail thread about it, this patch may be a hack. - -diff --git a/gdb/symfile.c b/gdb/symfile.c ---- a/gdb/symfile.c -+++ b/gdb/symfile.c -@@ -3584,6 +3584,12 @@ default_symfile_relocate (struct objfile *objfile, asection *sectp, - DWO file. */ - bfd *abfd = sectp->owner; - -+ /* Executable files have all the relocations already resolved. -+ Handle files linked with --emit-relocs. -+ http://sources.redhat.com/ml/gdb/2006-08/msg00137.html */ -+ if ((abfd->flags & EXEC_P) != 0) -+ return NULL; -+ - /* We're only interested in sections with relocation - information. */ - if ((sectp->flags & SEC_RELOC) == 0) diff --git a/gdb-6.5-bz216711-clone-is-outermost.patch b/gdb-6.5-bz216711-clone-is-outermost.patch deleted file mode 100644 index f11df0a9b41d6fe8b13eca01d1ca0356fff2c6e5..0000000000000000000000000000000000000000 --- a/gdb-6.5-bz216711-clone-is-outermost.patch +++ /dev/null @@ -1,304 +0,0 @@ -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-bz216711-clone-is-outermost.patch - -;; Fix bogus 0x0 unwind of the thread's topmost function clone(3) (BZ 216711). -;;=fedora - -https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=216711 - -FIXME: This workaround should be dropped and -glibc/sysdeps/unix/sysv/linux/x86_64/clone.S should get CFI for the child -instead. - -2006-12-17 Jan Kratochvil - - * gdb/amd64-linux-tdep.c (linux_clone_code): New variable. - (LINUX_CLONE_LEN): New definition. - (amd64_linux_clone_running, amd64_linux_outermost_frame): New function. - (amd64_linux_init_abi): Initialize `outermost_frame_p'. - * gdb/i386-tdep.c (i386_gdbarch_init): Likewise. - * gdb/i386-tdep.h (gdbarch_tdep): Add `outermost_frame_p' member. - * gdb/amd64-tdep.c (amd64_frame_this_id): Call `outermost_frame_p'. - -2006-12-17 Jan Kratochvil - - * gdb.threads/bt-clone-stop.exp, gdb.threads/bt-clone-stop.c: - New file. - -2007-10-16 Jan Kratochvil - - Port to GDB-6.7. - -diff --git a/gdb/amd64-linux-tdep.c b/gdb/amd64-linux-tdep.c ---- a/gdb/amd64-linux-tdep.c -+++ b/gdb/amd64-linux-tdep.c -@@ -291,6 +291,80 @@ amd64_linux_register_reggroup_p (struct gdbarch *gdbarch, int regnum, - - /* Set the program counter for process PTID to PC. */ - -+/* Detect the outermost frame; during unwind of -+ #5 0x000000305cec68c3 in clone () from /lib64/tls/libc.so.6 -+ avoid the additional bogus frame -+ #6 0x0000000000000000 in ?? -+ We compare if the `linux_clone_code' block is _before_ unwound PC. */ -+ -+static const unsigned char linux_clone_code[] = -+{ -+/* libc/sysdeps/unix/sysv/linux/x86_64/clone.S */ -+/* #ifdef RESET_PID */ -+/* ... */ -+/* mov $SYS_ify(getpid), %eax */ -+/* 0xb8, 0x27, 0x00, 0x00, 0x00 */ -+/* OR */ -+/* mov $SYS_ify(getpid), %rax */ -+/* 0x48, 0xc7, 0xc0, 0x27, 0x00, 0x00, 0x00 */ -+/* so just: */ -+ 0x27, 0x00, 0x00, 0x00, -+/* syscall */ -+ 0x0f, 0x05, -+/* movl %eax, %fs:PID */ -+ 0x64, 0x89, 0x04, 0x25, 0x94, 0x00, 0x00, 0x00, -+/* movl %eax, %fs:TID */ -+ 0x64, 0x89, 0x04, 0x25, 0x90, 0x00, 0x00, 0x00, -+/* #endif */ -+/* |* Set up arguments for the function call. *| */ -+/* popq %rax |* Function to call. *| */ -+ 0x58, -+/* popq %rdi |* Argument. *| */ -+ 0x5f, -+/* call *%rax$ */ -+ 0xff, 0xd0 -+}; -+ -+#define LINUX_CLONE_LEN (sizeof linux_clone_code) -+ -+static int -+amd64_linux_clone_running (struct frame_info *this_frame) -+{ -+ CORE_ADDR pc = get_frame_pc (this_frame); -+ unsigned char buf[LINUX_CLONE_LEN]; -+ -+ if (!safe_frame_unwind_memory (this_frame, pc - LINUX_CLONE_LEN, buf, -+ LINUX_CLONE_LEN)) -+ return 0; -+ -+ if (memcmp (buf, linux_clone_code, LINUX_CLONE_LEN) != 0) -+ return 0; -+ -+ return 1; -+} -+ -+static int -+amd64_linux_outermost_frame (struct frame_info *this_frame) -+{ -+ CORE_ADDR pc = get_frame_pc (this_frame); -+ const char *name; -+ -+ find_pc_partial_function (pc, &name, NULL, NULL); -+ -+ /* If we have NAME, we can optimize the search. -+ `clone' NAME still needs to have the code checked as its name may be -+ present in the user code. -+ `__clone' NAME should not be present in the user code but in the initial -+ parts of the `__clone' implementation the unwind still makes sense. -+ More detailed unwinding decision would be too much sensitive to possible -+ subtle changes in specific glibc revisions. */ -+ if (name == NULL || strcmp (name, "clone") == 0 -+ || strcmp ("__clone", name) == 0) -+ return (amd64_linux_clone_running (this_frame) != 0); -+ -+ return 0; -+} -+ - static void - amd64_linux_write_pc (struct regcache *regcache, CORE_ADDR pc) - { -@@ -1808,6 +1882,8 @@ amd64_linux_init_abi_common(struct gdbarch_info info, struct gdbarch *gdbarch) - - tdep->xsave_xcr0_offset = I386_LINUX_XSAVE_XCR0_OFFSET; - -+ tdep->outermost_frame_p = amd64_linux_outermost_frame; -+ - /* Add the %orig_rax register used for syscall restarting. */ - set_gdbarch_write_pc (gdbarch, amd64_linux_write_pc); - -diff --git a/gdb/amd64-tdep.c b/gdb/amd64-tdep.c ---- a/gdb/amd64-tdep.c -+++ b/gdb/amd64-tdep.c -@@ -2595,6 +2595,7 @@ amd64_frame_unwind_stop_reason (struct frame_info *this_frame, - { - struct amd64_frame_cache *cache = - amd64_frame_cache (this_frame, this_cache); -+ struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame)); - - if (!cache->base_p) - return UNWIND_UNAVAILABLE; -@@ -2603,6 +2604,10 @@ amd64_frame_unwind_stop_reason (struct frame_info *this_frame, - if (cache->base == 0) - return UNWIND_OUTERMOST; - -+ /* Detect OS dependent outermost frames; such as `clone'. */ -+ if (tdep->outermost_frame_p && tdep->outermost_frame_p (this_frame)) -+ return UNWIND_OUTERMOST; -+ - return UNWIND_NO_REASON; - } - -@@ -2737,6 +2742,7 @@ amd64_sigtramp_frame_this_id (struct frame_info *this_frame, - { - struct amd64_frame_cache *cache = - amd64_sigtramp_frame_cache (this_frame, this_cache); -+ struct gdbarch_tdep *tdep = gdbarch_tdep (get_frame_arch (this_frame)); - - if (!cache->base_p) - (*this_id) = frame_id_build_unavailable_stack (get_frame_pc (this_frame)); -@@ -2745,6 +2751,11 @@ amd64_sigtramp_frame_this_id (struct frame_info *this_frame, - /* This marks the outermost frame. */ - return; - } -+ else if (tdep->outermost_frame_p && tdep->outermost_frame_p (this_frame)) -+ { -+ /* Detect OS dependent outermost frames; such as `clone'. */ -+ return; -+ } - else - (*this_id) = frame_id_build (cache->base + 16, get_frame_pc (this_frame)); - } -diff --git a/gdb/i386-tdep.c b/gdb/i386-tdep.c ---- a/gdb/i386-tdep.c -+++ b/gdb/i386-tdep.c -@@ -8406,6 +8406,9 @@ i386_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - - tdep->xsave_xcr0_offset = -1; - -+ /* Unwinding stops on i386 automatically. */ -+ tdep->outermost_frame_p = NULL; -+ - tdep->record_regmap = i386_record_regmap; - - set_gdbarch_type_align (gdbarch, i386_type_align); -diff --git a/gdb/i386-tdep.h b/gdb/i386-tdep.h ---- a/gdb/i386-tdep.h -+++ b/gdb/i386-tdep.h -@@ -251,6 +251,9 @@ struct gdbarch_tdep - - /* Regsets. */ - const struct regset *fpregset; -+ -+ /* Detect OS dependent outermost frames; such as `clone'. */ -+ int (*outermost_frame_p) (struct frame_info *this_frame); - }; - - /* Floating-point registers. */ -diff --git a/gdb/testsuite/gdb.threads/bt-clone-stop.c b/gdb/testsuite/gdb.threads/bt-clone-stop.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/bt-clone-stop.c -@@ -0,0 +1,39 @@ -+/* 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., 51 Franklin Street, Fifth Floor, Boston, -+ MA 02110-1301, USA. */ -+ -+ -+#include -+#include -+#include -+ -+ -+void *threader (void *arg) -+{ -+ assert (0); -+ return NULL; -+} -+ -+int main (void) -+{ -+ pthread_t t1; -+ -+ pthread_create (&t1, NULL, threader, (void *) NULL); -+ for (;;) -+ pause(); -+} -diff --git a/gdb/testsuite/gdb.threads/bt-clone-stop.exp b/gdb/testsuite/gdb.threads/bt-clone-stop.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/bt-clone-stop.exp -@@ -0,0 +1,61 @@ -+# 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. -+ -+# Backtraced `clone' must not have `PC == 0' as its previous frame. -+ -+if $tracelevel then { -+ strace $tracelevel -+} -+ -+set testfile bt-clone-stop -+set srcfile ${testfile}.c -+set binfile [standard_output_file ${testfile}] -+if { [gdb_compile_pthreads "${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} -+ -+# threader: threader.c:8: threader: Assertion `0' failed. -+# Program received signal SIGABRT, Aborted. -+ -+gdb_test "run" \ -+ {Thread 2 "bt-clone-stop" received signal SIGABRT.*} \ -+ "run" -+ -+# Former gdb unwind (the first function is `clone'): -+# #5 0x0000003421ecd62d in ?? () from /lib64/libc.so.6 -+# #6 0x0000000000000000 in ?? () -+# (gdb) -+# Tested `amd64_linux_outermost_frame' functionality should omit the line `#6'. -+# -+# Two `-re' cases below must be in this order (1st is a subset of the 2nd one). -+# Unhandled case below should not happen and it is fortunately handled by -+# `amd64_linux_outermost_frame' as FAIL (and result `0x0 entry output invalid'). -+gdb_test_multiple "bt" "0x0 entry output invalid" { -+ -re "in threader \\(.*\n#\[0-9\]* *0x0* in .*$gdb_prompt $" { -+ fail "0x0 entry found" -+ } -+ -re "in threader \\(.*$gdb_prompt $" { -+ pass "0x0 entry not found" -+ } -+} diff --git a/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch b/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch index 45d857003ed234a71616f882751ddd6568dcdd06..0a66b3ded9d12ac861be66115c5a037c585dc86e 100644 --- a/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch +++ b/gdb-6.5-bz218379-solib-trampoline-lookup-lock-fix.patch @@ -11,8 +11,8 @@ https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=218379 diff --git a/gdb/symtab.c b/gdb/symtab.c --- a/gdb/symtab.c +++ b/gdb/symtab.c -@@ -3165,6 +3165,13 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent) - SYMBOL_LINKAGE_NAME (msymbol)); */ +@@ -3166,6 +3166,13 @@ find_pc_sect_line (CORE_ADDR pc, struct obj_section *section, int notcurrent) + msymbol->linkage_name ()); */ ; /* fall through */ + /* `msymbol' trampoline may be located before its .text symbol @@ -20,7 +20,7 @@ diff --git a/gdb/symtab.c b/gdb/symtab.c + Avoid `find_pc_sect_line'<->`find_pc_line' infinite loop. + Red Hat Bug 218379. */ + else if (BMSYMBOL_VALUE_ADDRESS (mfunsym) == pc) -+ warning ("In stub for %s (0x%s); interlocked, please submit the binary to http://bugzilla.redhat.com", MSYMBOL_LINKAGE_NAME (msymbol.minsym), paddress (target_gdbarch (), pc)); ++ warning ("In stub for %s (0x%s); interlocked, please submit the binary to http://bugzilla.redhat.com", msymbol.minsym->linkage_name (), paddress (target_gdbarch (), pc)); + /* fall through */ else return find_pc_line (BMSYMBOL_VALUE_ADDRESS (mfunsym), 0); diff --git a/gdb-6.5-readline-long-line-crash-test.patch b/gdb-6.5-readline-long-line-crash-test.patch index 5410899cfae7859300acc4320470472c68e813c4..c4127b76abe200469b57addd82e4325273281667 100644 --- a/gdb-6.5-readline-long-line-crash-test.patch +++ b/gdb-6.5-readline-long-line-crash-test.patch @@ -12,7 +12,7 @@ diff --git a/gdb/testsuite/gdb.base/readline-overflow.exp b/gdb/testsuite/gdb.ba new file mode 100644 --- /dev/null +++ b/gdb/testsuite/gdb.base/readline-overflow.exp -@@ -0,0 +1,126 @@ +@@ -0,0 +1,104 @@ +# Copyright 2006 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify @@ -44,98 +44,76 @@ new file mode 100644 + strace $tracelevel +} + -+# Don't let a .inputrc file or an existing setting of INPUTRC mess up -+# the test results. Even if /dev/null doesn't exist on the particular -+# platform, the readline library will use the default setting just by -+# failing to open the file. OTOH, opening /dev/null successfully will -+# also result in the default settings being used since nothing will be -+# read from this file. +global env -+if [info exists env(INPUTRC)] { -+ set old_inputrc $env(INPUTRC) -+} -+set env(INPUTRC) "/dev/null" + -+set oldtimeout1 $timeout -+set timeout 600 ++save_vars { env(INPUTRC) env(GDBHISTFILE) env(HISTSIZE) TERM timeout } { ++ # The arrow key test relies on the standard VT100 bindings, so ++ # make sure that an appropriate terminal is selected. The same ++ # bug doesn't show up if we use ^P / ^N instead. ++ setenv TERM vt100 + -+if [info exists env(GDBHISTFILE)] { -+ set old_gdbhistfile $env(GDBHISTFILE) -+} -+if [info exists env(HISTSIZE)] { -+ set old_histsize $env(HISTSIZE) -+} -+set env(GDBHISTFILE) "${srcdir}/${subdir}/gdb_history" -+set env(HISTSIZE) "10" ++ # Don't let a .inputrc file or an existing setting of INPUTRC mess up ++ # the test results. Even if /dev/null doesn't exist on the particular ++ # platform, the readline library will use the default setting just by ++ # failing to open the file. OTOH, opening /dev/null successfully will ++ # also result in the default settings being used since nothing will be ++ # read from this file. ++ set env(INPUTRC) "/dev/null" ++ ++ set timeout 600 + -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir ++ set env(GDBHISTFILE) "${srcdir}/${subdir}/gdb_history" ++ set env(HISTSIZE) "10" + ++ gdb_exit ++ gdb_start ++ gdb_reinitialize_dir $srcdir/$subdir + -+set width 11 -+gdb_test "set width $width" \ -+ "" \ -+ "Setting width to $width." -+#gdb_test "set height 1" \ -+# "" \ -+# "Setting height to 1." -+send_gdb "run X" -+set i 0 -+# It crashes using `set width 7' on `set total 3560'. -+# Sometimes it corrupts screen on `set width 7'. -+# Bugreport used `set total 130001': -+# https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=214196 -+# Check also `timeout' above. -+set total 4200 -+gdb_expect { ++ ++ set width 11 ++ gdb_test "set width $width" \ ++ "" \ ++ "Setting width to $width." ++ #gdb_test "set height 1" \ ++ # "" \ ++ # "Setting height to 1." ++ send_gdb "run X" ++ set i 0 ++ # It crashes using `set width 7' on `set total 3560'. ++ # Sometimes it corrupts screen on `set width 7'. ++ # Bugreport used `set total 130001': ++ # https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=214196 ++ # Check also `timeout' above. ++ set total 4200 ++ gdb_expect { + -re X { -+ incr i -+ if {$i <= $total} { -+ send_gdb "X" -+ exp_continue -+ } ++ incr i ++ if {$i <= $total} { ++ send_gdb "X" ++ exp_continue ++ } + } + -re "\[ \b\r\n\]" { -+ exp_continue ++ exp_continue + } + eof { -+ fail "gdb sending total $total characters" -+ note "Failed after sending $i characters, reason: EOF" -+ gdb_clear_suppressed ++ fail "gdb sending total $total characters" ++ note "Failed after sending $i characters, reason: EOF" ++ gdb_clear_suppressed + } + timeout { -+ fail "gdb sending total $total characters" -+ note "Failed after sending $i characters (timeout $timeout), reason: TIMEOUT" -+ gdb_clear_suppressed ++ fail "gdb sending total $total characters" ++ note "Failed after sending $i characters (timeout $timeout), reason: TIMEOUT" ++ gdb_clear_suppressed + } + default { -+ fail "gdb sending total $total characters" -+ note "Failed after sending $i characters, reason: 0=\[$expect_out(0,string)\] buffer=\[$expect_out(buffer)\]" -+ gdb_clear_suppressed ++ fail "gdb sending total $total characters" ++ note "Failed after sending $i characters, reason: 0=\[$expect_out(0,string)\] buffer=\[$expect_out(buffer)\]" ++ gdb_clear_suppressed + } ++ } ++ send_gdb "\r" ++ gdb_test "" \ ++ "No executable file specified..*" \ ++ "All the characters transferred" +} -+send_gdb "\r" -+gdb_test "" \ -+ "No executable file specified..*" \ -+ "All the characters transferred" -+ -+ -+# Restore globals modified in this test... -+if [info exists old_inputrc] { -+ set env(INPUTRC) $old_inputrc -+} else { -+ unset env(INPUTRC) -+} -+if [info exists old_gdbhistfile] { -+ set env(GDBHISTFILE) $old_gdbhistfile -+} else { -+ unset env(GDBHISTFILE) -+} -+if [info exists old_histsize] { -+ set env(HISTSIZE) $old_histsize -+} else { -+ unset env(HISTSIZE) -+} -+set timeout $oldtimeout1 -+ diff --git a/gdb-6.6-buildid-locate-core-as-arg.patch b/gdb-6.6-buildid-locate-core-as-arg.patch index 40938a540ed7fb45342ffc2b499f7b44a70f2b9b..d182ae1c5ef45139d3b9d738d82ccc9ce3bc4dcd 100644 --- a/gdb-6.6-buildid-locate-core-as-arg.patch +++ b/gdb-6.6-buildid-locate-core-as-arg.patch @@ -61,31 +61,19 @@ Http://sourceware.org/ml/gdb-patches/2010-01/msg00517.html * exec.c (exec_file_attach): Print a more useful error message if the user did "gdb core". -diff --git a/gdb/common/common-exceptions.h b/gdb/common/common-exceptions.h ---- a/gdb/common/common-exceptions.h -+++ b/gdb/common/common-exceptions.h -@@ -104,6 +104,9 @@ enum errors { - "_ERROR" is appended to the name. */ - MAX_COMPLETIONS_REACHED_ERROR, - -+ /* Attempt to load a core file as executable. */ -+ IS_CORE_ERROR, -+ - /* Add more errors here. */ - NR_ERRORS - }; diff --git a/gdb/exec.c b/gdb/exec.c --- a/gdb/exec.c +++ b/gdb/exec.c -@@ -36,6 +36,7 @@ - #include "gdb_bfd.h" - #include "gcore.h" - #include "source.h" -+#include "exceptions.h" +@@ -18,6 +18,8 @@ + along with this program. If not, see . */ - #include - #include "readline/readline.h" -@@ -357,12 +358,27 @@ exec_file_attach (const char *filename, int from_tty) + #include "defs.h" ++#include "arch-utils.h" ++#include "exceptions.h" + #include "frame.h" + #include "inferior.h" + #include "target.h" +@@ -345,12 +347,27 @@ exec_file_attach (const char *filename, int from_tty) if (!bfd_check_format_matches (exec_bfd, bfd_object, &matching)) { @@ -102,24 +90,37 @@ diff --git a/gdb/exec.c b/gdb/exec.c exec_close (); - error (_("\"%s\": not in executable format: %s"), - scratch_pathname, -- gdb_bfd_errmsg (bfd_get_error (), matching)); +- gdb_bfd_errmsg (bfd_get_error (), matching).c_str ()); + + if (is_core != 0) + throw_error (IS_CORE_ERROR, -+ _("\"%s\" is a core file.\n" -+ "Please specify an executable to debug."), -+ scratch_pathname); ++ _("\"%s\" is a core file.\n" ++ "Please specify an executable to debug."), ++ scratch_pathname); + else -+ error (_("\"%s\": not in executable format: %s"), ++ error (_("\"%ss\": not in executable format: %s"), + scratch_pathname, -+ gdb_bfd_errmsg (bfd_get_error (), matching)); ++ gdb_bfd_errmsg (bfd_get_error (), matching).c_str ()); } if (build_section_table (exec_bfd, §ions, §ions_end)) +diff --git a/gdb/gdbsupport/common-exceptions.h b/gdb/gdbsupport/common-exceptions.h +--- a/gdb/gdbsupport/common-exceptions.h ++++ b/gdb/gdbsupport/common-exceptions.h +@@ -106,6 +106,9 @@ enum errors { + "_ERROR" is appended to the name. */ + MAX_COMPLETIONS_REACHED_ERROR, + ++ /* Attempt to load a core file as executable. */ ++ IS_CORE_ERROR, ++ + /* Add more errors here. */ + NR_ERRORS + }; diff --git a/gdb/main.c b/gdb/main.c --- a/gdb/main.c +++ b/gdb/main.c -@@ -447,6 +447,37 @@ struct cmdarg +@@ -467,6 +467,34 @@ struct cmdarg char *string; }; @@ -130,15 +131,13 @@ diff --git a/gdb/main.c b/gdb/main.c +static void +exec_or_core_file_attach (const char *filename, int from_tty) +{ -+ volatile struct gdb_exception e; -+ + gdb_assert (exec_bfd == NULL); + -+ TRY ++ try + { + exec_file_attach (filename, from_tty); + } -+ CATCH (e, RETURN_MASK_ALL) ++ catch (gdb_exception_error &e) + { + if (e.error == IS_CORE_ERROR) + { @@ -149,15 +148,14 @@ diff --git a/gdb/main.c b/gdb/main.c + if (exec_bfd != NULL) + return; + } -+ throw_exception (e); ++ throw_exception (std::move (e)); + } -+ END_CATCH +} + static void captured_main_1 (struct captured_main_args *context) { -@@ -883,6 +914,8 @@ captured_main_1 (struct captured_main_args *context) +@@ -907,6 +935,8 @@ captured_main_1 (struct captured_main_args *context) { symarg = argv[optind]; execarg = argv[optind]; @@ -166,7 +164,7 @@ diff --git a/gdb/main.c b/gdb/main.c optind++; } -@@ -1033,11 +1066,25 @@ captured_main_1 (struct captured_main_args *context) +@@ -1063,12 +1093,25 @@ captured_main_1 (struct captured_main_args *context) && symarg != NULL && strcmp (execarg, symarg) == 0) { @@ -185,13 +183,14 @@ diff --git a/gdb/main.c b/gdb/main.c /* The exec file and the symbol-file are the same. If we can't open it, better only print one error message. - catch_command_errors returns non-zero on success! */ -- if (catch_command_errors (exec_file_attach, execarg, -- !batch_flag)) +- ret = catch_command_errors (exec_file_attach, execarg, +- !batch_flag); +- if (ret != 0) + catch_command_errors returns non-zero on success! + Do not load EXECARG as a symbol file if it has been already processed + as a core file. */ -+ if (catch_command_errors (func, execarg, !batch_flag) -+ && core_bfd == NULL) - catch_command_errors (symbol_file_add_main_adapter, symarg, - !batch_flag); ++ ret = catch_command_errors (func, execarg, !batch_flag); ++ if (ret != 0 && core_bfd == NULL) + ret = catch_command_errors (symbol_file_add_main_adapter, + symarg, !batch_flag); } diff --git a/gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch b/gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch index a25057ec30d85c4094a6975a257409d0a59dbc1e..985cb6a5d99839e96fd0464d5b359a77e49f98c5 100644 --- a/gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch +++ b/gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch @@ -25,21 +25,6 @@ Comments by Sergio Durigan Junior : NULL after it is free'd, otherwise the code below thinks that it is still valid and doesn't print the necessary warning ("Try: yum install ..."). -diff --git a/gdb/build-id.c b/gdb/build-id.c ---- a/gdb/build-id.c -+++ b/gdb/build-id.c -@@ -581,7 +581,10 @@ build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id, - do_cleanups (inner); - - if (abfd == NULL) -- continue; -+ { -+ filename = NULL; -+ continue; -+ } - - if (build_id_verify (abfd.get(), build_id_len, build_id)) - break; diff --git a/gdb/testsuite/gdb.base/rhbz981154-misleading-yum-install-warning.exp b/gdb/testsuite/gdb.base/rhbz981154-misleading-yum-install-warning.exp new file mode 100644 --- /dev/null diff --git a/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch b/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch index 375b1780c9fef8100092f63593f8989ee6cba423..abea6e62fe235e32fe07e5bc11e9147b5cf15480 100644 --- a/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch +++ b/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch @@ -9,7 +9,7 @@ Subject: gdb-6.6-buildid-locate-rpm-librpm-workaround.patch diff --git a/gdb/build-id.c b/gdb/build-id.c --- a/gdb/build-id.c +++ b/gdb/build-id.c -@@ -652,6 +652,19 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return) +@@ -709,6 +709,19 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return) #include #endif diff --git a/gdb-6.6-buildid-locate-rpm-scl.patch b/gdb-6.6-buildid-locate-rpm-scl.patch index 7e3948857c44b7332f323080ace16b7c8c021905..ca683ed952a603ba98aeaaefb8fa967b6ff6cf98 100644 --- a/gdb-6.6-buildid-locate-rpm-scl.patch +++ b/gdb-6.6-buildid-locate-rpm-scl.patch @@ -12,7 +12,7 @@ https://bugzilla.redhat.com/show_bug.cgi?id=953585 diff --git a/gdb/build-id.c b/gdb/build-id.c --- a/gdb/build-id.c +++ b/gdb/build-id.c -@@ -689,7 +689,11 @@ static int missing_rpm_list_entries; +@@ -743,7 +743,11 @@ static int missing_rpm_list_entries; /* Returns the count of newly added rpms. */ static int @@ -24,7 +24,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c { static int rpm_init_done = 0; rpmts ts; -@@ -796,7 +800,11 @@ missing_rpm_enlist (const char *filename) +@@ -850,7 +854,11 @@ missing_rpm_enlist (const char *filename) mi = rpmtsInitIterator_p (ts, RPMTAG_BASENAMES, filename, 0); if (mi != NULL) { @@ -36,7 +36,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c { Header h; char *debuginfo, **slot, *s, *s2; -@@ -914,6 +922,37 @@ missing_rpm_enlist (const char *filename) +@@ -968,6 +976,37 @@ missing_rpm_enlist (const char *filename) xfree (debuginfo); count++; } @@ -74,10 +74,10 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c rpmdbFreeIterator_p (mi); } -@@ -924,6 +963,21 @@ missing_rpm_enlist (const char *filename) +@@ -977,6 +1016,20 @@ missing_rpm_enlist (const char *filename) + return count; } - static int +#ifdef GDB_INDEX_VERIFY_VENDOR +missing_rpm_enlist (const char *filename) +{ @@ -90,16 +90,15 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c +{ + return missing_rpm_enlist_1 (filename, 1); +} -+ -+static int +#endif - missing_rpm_list_compar (const char *const *ap, const char *const *bp) ++ + static bool + missing_rpm_list_compar (const char *ap, const char *bp) { - return strcoll (*ap, *bp); diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c -@@ -3469,6 +3469,16 @@ read_gdb_index_from_section (struct objfile *objfile, +@@ -3497,6 +3497,16 @@ read_gdb_index_from_buffer (struct objfile *objfile, "set use-deprecated-index-sections on". */ if (version < 6 && !deprecated_ok) { @@ -116,7 +115,7 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c static int warning_printed = 0; if (!warning_printed) { -@@ -3480,6 +3490,10 @@ to use the section anyway."), +@@ -3508,6 +3518,10 @@ to use the section anyway."), warning_printed = 1; } return 0; diff --git a/gdb-6.6-buildid-locate-rpm.patch b/gdb-6.6-buildid-locate-rpm.patch index d5ec4b08c7d1f1692edd216cae7e69bcc83a9fc0..6e1cef82af6cd9b84e4187690d0a7107e452d39f 100644 --- a/gdb-6.6-buildid-locate-rpm.patch +++ b/gdb-6.6-buildid-locate-rpm.patch @@ -235,16 +235,15 @@ diff --git a/gdb/aclocal.m4 b/gdb/aclocal.m4 diff --git a/gdb/build-id.c b/gdb/build-id.c --- a/gdb/build-id.c +++ b/gdb/build-id.c -@@ -35,6 +35,8 @@ - #include "elf/common.h" - #include "elf-bfd.h" - #include -+#include "elf/external.h" +@@ -33,6 +33,7 @@ + #include "gdb_bfd.h" + #include "gdbcmd.h" + #include "gdbcore.h" +#include "inferior.h" - - #define BUILD_ID_VERBOSE_NONE 0 - #define BUILD_ID_VERBOSE_FILENAMES 1 -@@ -640,8 +642,366 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return) + #include "libbfd.h" + #include "objfiles.h" + #include "observable.h" +@@ -698,8 +699,374 @@ build_id_to_filename (const struct bfd_build_id *build_id, char **link_return) return result; } @@ -513,10 +512,10 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c + return count; +} + -+static int -+missing_rpm_list_compar (const char *const *ap, const char *const *bp) ++static bool ++missing_rpm_list_compar (const char *ap, const char *bp) +{ -+ return strcoll (*ap, *bp); ++ return strcoll (ap, bp) < 0; +} + +/* It returns a NULL-terminated array of strings needing to be FREEd. It may @@ -525,39 +524,50 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c +static void +missing_rpm_list_print (void) +{ -+ char **array, **array_iter; + struct missing_rpm *list_iter; -+ struct cleanup *cleanups; + + if (missing_rpm_list_entries == 0) + return; + -+ array = (char **) xmalloc (sizeof (*array) * missing_rpm_list_entries); -+ cleanups = make_cleanup (xfree, array); ++ std::vector array (missing_rpm_list_entries); ++ size_t idx = 0; + -+ array_iter = array; + for (list_iter = missing_rpm_list; list_iter != NULL; + list_iter = list_iter->next) + { -+ *array_iter++ = list_iter->rpm; ++ array[idx++] = list_iter->rpm; + } -+ gdb_assert (array_iter == array + missing_rpm_list_entries); ++ 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 ... + -+ qsort (array, missing_rpm_list_entries, sizeof (*array), -+ (int (*) (const void *, const void *)) missing_rpm_list_compar); ++ For this reason, we make sure MISSING_RPM_LIST_ENTRIES is zero ++ *before* calling any print function. */ ++ missing_rpm_list_entries = 0; + + printf_unfiltered (_("Missing separate debuginfos, use: %s"), +#ifdef DNF_DEBUGINFO_INSTALL + "dnf " +#endif + "debuginfo-install"); -+ for (array_iter = array; array_iter < array + missing_rpm_list_entries; -+ array_iter++) ++ for (const char *el : array) + { -+ putchar_unfiltered (' '); -+ puts_unfiltered (*array_iter); ++ puts_unfiltered (" "); ++ puts_unfiltered (el); + } -+ putchar_unfiltered ('\n'); ++ puts_unfiltered ("\n"); + + while (missing_rpm_list != NULL) + { @@ -565,9 +575,6 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c + missing_rpm_list = list_iter->next; + xfree (list_iter); + } -+ missing_rpm_list_entries = 0; -+ -+ do_cleanups (cleanups); +} + +static void @@ -612,7 +619,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c avoidance. */ struct missing_filepair -@@ -695,11 +1055,17 @@ missing_filepair_change (void) +@@ -753,11 +1120,17 @@ missing_filepair_change (void) /* All their memory came just from missing_filepair_OBSTACK. */ missing_filepair_hash = NULL; } @@ -630,7 +637,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c missing_filepair_change (); } -@@ -766,14 +1132,39 @@ debug_print_missing (const char *binary, const char *debug) +@@ -824,14 +1197,38 @@ debug_print_missing (const char *binary, const char *debug) *slot = missing_filepair; @@ -639,14 +646,13 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c +#ifdef HAVE_LIBRPM + if (missing_exec == MISSING_EXEC_NOT_TRIED) + { -+ char *execfilename; ++ const char *execfilename = get_exec_file (0); - fprintf_unfiltered (gdb_stdlog, - _("Missing separate debuginfo for %s\n"), binary); - if (debug != NULL) - fprintf_unfiltered (gdb_stdlog, _("Try to install the hash file %s\n"), - debug); -+ execfilename = get_exec_file (0); + if (execfilename != NULL) + { + if (missing_rpm_enlist (execfilename) == 0) @@ -680,7 +686,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c diff --git a/gdb/config.in b/gdb/config.in --- a/gdb/config.in +++ b/gdb/config.in -@@ -33,6 +33,9 @@ +@@ -36,6 +36,9 @@ /* Define to BFD's default target vector. */ #undef DEFAULT_BFD_VEC @@ -690,9 +696,9 @@ diff --git a/gdb/config.in b/gdb/config.in /* Define to 1 if translation of program messages to the user's native language is requested. */ #undef ENABLE_NLS -@@ -270,6 +273,9 @@ - /* Define if Python 2.7 is being used. */ - #undef HAVE_LIBPYTHON2_7 +@@ -245,6 +248,9 @@ + /* Define if you have the mpfr library. */ + #undef HAVE_LIBMPFR +/* Define if librpm library is being used. */ +#undef HAVE_LIBRPM @@ -703,7 +709,7 @@ diff --git a/gdb/config.in b/gdb/config.in diff --git a/gdb/configure b/gdb/configure --- a/gdb/configure +++ b/gdb/configure -@@ -749,6 +749,11 @@ CODESIGN_CERT +@@ -761,6 +761,11 @@ CODESIGN_CERT HAVE_NATIVE_GCORE_TARGET TARGET_OBS subdirs @@ -715,15 +721,15 @@ diff --git a/gdb/configure b/gdb/configure GDB_DATADIR DEBUGDIR MAKEINFO_EXTRA_FLAGS -@@ -853,6 +858,7 @@ with_gdb_datadir +@@ -864,6 +869,7 @@ with_gdb_datadir with_relocated_sources with_auto_load_dir with_auto_load_safe_path +with_rpm enable_targets enable_64_bit_bfd - enable_gdbcli -@@ -912,6 +918,11 @@ CCC + enable_gdbmi +@@ -926,6 +932,11 @@ CCC CPP MAKEINFO MAKEINFOFLAGS @@ -735,7 +741,7 @@ diff --git a/gdb/configure b/gdb/configure YACC YFLAGS XMKMF' -@@ -1583,6 +1594,8 @@ Optional Packages: +@@ -1598,6 +1609,8 @@ Optional Packages: [--with-auto-load-dir] --without-auto-load-safe-path do not restrict auto-loaded files locations @@ -744,7 +750,7 @@ diff --git a/gdb/configure b/gdb/configure --with-libunwind-ia64 use libunwind frame unwinding for ia64 targets --with-curses use the curses library instead of the termcap library -@@ -1640,6 +1653,13 @@ Some influential environment variables: +@@ -1661,6 +1674,13 @@ Some influential environment variables: MAKEINFO Parent configure detects if it is of sufficient version. MAKEINFOFLAGS Parameters for MAKEINFO. @@ -758,7 +764,7 @@ diff --git a/gdb/configure b/gdb/configure YACC The `Yet Another Compiler Compiler' implementation to use. Defaults to the first program found out of: `bison -y', `byacc', `yacc'. -@@ -6575,6 +6595,494 @@ _ACEOF +@@ -6587,6 +6607,494 @@ _ACEOF { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_auto_load_safe_path" >&5 $as_echo "$with_auto_load_safe_path" >&6; } @@ -1256,7 +1262,7 @@ diff --git a/gdb/configure b/gdb/configure diff --git a/gdb/configure.ac b/gdb/configure.ac --- a/gdb/configure.ac +++ b/gdb/configure.ac -@@ -166,6 +166,199 @@ AC_DEFINE_DIR(AUTO_LOAD_SAFE_PATH, escape_dir, +@@ -144,6 +144,199 @@ AC_DEFINE_DIR(AUTO_LOAD_SAFE_PATH, escape_dir, [Directories safe to hold auto-loaded files.]) AC_MSG_RESULT([$with_auto_load_safe_path]) @@ -1456,30 +1462,18 @@ diff --git a/gdb/configure.ac b/gdb/configure.ac AC_CONFIG_SUBDIRS(testsuite) # Check whether to support alternative target configurations -diff --git a/gdb/corelow.c b/gdb/corelow.c ---- a/gdb/corelow.c -+++ b/gdb/corelow.c -@@ -366,7 +366,7 @@ build_id_locate_exec (int from_tty) - symfile_objfile->flags |= OBJF_BUILD_ID_CORE_LOADED; - } - else -- debug_print_missing (_("the main executable file"), build_id_filename); -+ debug_print_missing (BUILD_ID_MAIN_EXECUTABLE_FILENAME, build_id_filename); - - do_cleanups (back_to); - diff --git a/gdb/event-top.c b/gdb/event-top.c --- a/gdb/event-top.c +++ b/gdb/event-top.c -@@ -40,6 +40,7 @@ - #include "buffer.h" +@@ -41,6 +41,7 @@ #include "ser-event.h" #include "gdb_select.h" + #include "gdbsupport/gdb-sigmask.h" +#include "symfile.h" /* readline include files. */ #include "readline/readline.h" -@@ -359,6 +360,8 @@ display_gdb_prompt (const char *new_prompt) +@@ -363,6 +364,8 @@ display_gdb_prompt (const char *new_prompt) /* Reset the nesting depth used when trace-commands is set. */ reset_command_nest_depth (); @@ -1488,7 +1482,7 @@ diff --git a/gdb/event-top.c b/gdb/event-top.c /* Do not call the python hook on an explicit prompt change as passed to this function, as this forms a secondary/local prompt, IE, displayed but not set. */ -@@ -774,7 +777,10 @@ command_line_handler (char *rl) +@@ -772,7 +775,10 @@ command_line_handler (gdb::unique_xmalloc_ptr &&rl) command_handler (cmd); if (ui->prompt_state != PROMPTED) @@ -1503,7 +1497,7 @@ diff --git a/gdb/event-top.c b/gdb/event-top.c diff --git a/gdb/symfile.h b/gdb/symfile.h --- a/gdb/symfile.h +++ b/gdb/symfile.h -@@ -540,6 +540,8 @@ void map_symbol_filenames (symbol_filename_ftype *fun, void *data, +@@ -542,6 +542,8 @@ 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); diff --git a/gdb-6.6-buildid-locate-solib-missing-ids.patch b/gdb-6.6-buildid-locate-solib-missing-ids.patch index 2b961666c9034755b2b5ebdc1e41897375bc4d4f..73b763a1c303b4f2b884efaa22b619a2480aafd2 100644 --- a/gdb-6.6-buildid-locate-solib-missing-ids.patch +++ b/gdb-6.6-buildid-locate-solib-missing-ids.patch @@ -14,7 +14,7 @@ https://bugzilla.redhat.com/show_bug.cgi?id=1339862 diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c --- a/gdb/solib-svr4.c +++ b/gdb/solib-svr4.c -@@ -1358,14 +1358,27 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm, +@@ -1346,14 +1346,27 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, } { @@ -44,7 +44,7 @@ diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c if (build_id != NULL) { char *name, *build_id_filename; -@@ -1380,23 +1393,7 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm, +@@ -1368,23 +1381,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, xfree (name); } else diff --git a/gdb-6.6-buildid-locate.patch b/gdb-6.6-buildid-locate.patch index 6acb6bc744454bf8016e258ca34ad0f9a63f5e8f..504c6a9e47337f78863d31350664252b795788cc 100644 --- a/gdb-6.6-buildid-locate.patch +++ b/gdb-6.6-buildid-locate.patch @@ -6,22 +6,50 @@ 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 +@@ -127,7 +127,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 +@@ -132,7 +132,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 -@@ -26,11 +26,67 @@ +@@ -24,13 +24,71 @@ + #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 "libbfd.h" -+#include "gdbcore.h" -+#include "gdbcmd.h" ++#include "objfiles.h" +#include "observable.h" -+#include "elf/external.h" -+#include "elf/internal.h" -+#include "elf/common.h" -+#include "elf-bfd.h" -+#include ++#include "symfile.h" + +#define BUILD_ID_VERBOSE_NONE 0 +#define BUILD_ID_VERBOSE_FILENAMES 1 @@ -55,13 +83,13 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c + && namesz == sizeof "GNU" + && memcmp (xnp->name, "GNU", sizeof "GNU") == 0) + { -+ size_t size = descsz; ++ size_t sz = descsz; + gdb_byte *data = (gdb_byte *) descdata; + struct bfd_build_id *retval; + -+ retval = (struct bfd_build_id *) xmalloc (sizeof *retval - 1 + size); -+ retval->size = size; -+ memcpy (retval->data, data, size); ++ retval = (struct bfd_build_id *) xmalloc (sizeof *retval - 1 + sz); ++ retval->size = sz; ++ memcpy (retval->data, data, sz); + + return retval; + } @@ -76,9 +104,9 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c -build_id_bfd_get (bfd *abfd) +build_id_bfd_shdr_get (bfd *abfd) { - if (!bfd_check_format (abfd, bfd_object)) - return NULL; -@@ -42,6 +98,348 @@ build_id_bfd_get (bfd *abfd) + if (!bfd_check_format (abfd, bfd_object) + && !bfd_check_format (abfd, bfd_core)) +@@ -43,6 +101,348 @@ build_id_bfd_get (bfd *abfd) return NULL; } @@ -367,7 +395,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c + +static void build_id_addr_candidate (bfd *abfd, asection *sect, void *obj) +{ -+ if (build_id_addr >= bfd_section_vma (abfd, sect)) ++ if (build_id_addr >= bfd_section_vma (sect)) + { + struct build_id_addr_sect *candidate; + @@ -402,7 +430,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c + candidate = candidate->next) + { + i_phdr = elf_get_phdr (core_bfd, -+ bfd_section_vma (core_bfd, candidate->sect), ++ bfd_section_vma (candidate->sect), + &e_phnum, &loadbase); + if (i_phdr != NULL) + break; @@ -427,7 +455,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c /* See build-id.h. */ int -@@ -50,7 +448,7 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) +@@ -51,7 +451,7 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) const struct bfd_build_id *found; int retval = 0; @@ -436,7 +464,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c if (found == NULL) warning (_("File \"%s\" has no build-id, file skipped"), -@@ -65,11 +463,50 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) +@@ -66,56 +466,159 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) return retval; } @@ -474,123 +502,126 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c + return retval; +} + - /* See build-id.h. */ + /* 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. */ - 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, int add_debug_suffix) + 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) { -+ char *debugdir; -+ std::string link, link_all; -+ struct cleanup *back_to; -+ int ix; - gdb_bfd_ref_ptr abfd; - - /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will -@@ -82,63 +519,296 @@ build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id) ++ gdb_bfd_ref_ptr ret_bfd = {}; ++ std::string ret_link; ++ + if (separate_debug_file_debug) { - const gdb_byte *data = build_id; - size_t size = build_id_len; -+ char *filename = NULL; -+ struct cleanup *inner; -+ unsigned seqno; -+ struct stat statbuf_trash; -+ std::string link0; - -- std::string link = debugdir.get (); -+ link = debugdir.get (); - link += "/.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++); +- printf_unfiltered (_(" Trying %s..."), link.c_str ()); ++ printf_unfiltered (_(" Trying %s..."), orig_link.c_str ()); + gdb_flush (gdb_stdout); + } -- link += ".debug"; +- /* lrealpath() is expensive even for the usually non-existent files. */ +- gdb::unique_xmalloc_ptr filename; +- if (access (link.c_str (), F_OK) == 0) +- filename.reset (lrealpath (link.c_str ())); - - if (separate_debug_file_debug) - printf_unfiltered (_(" Trying %s\n"), link.c_str ()); +- if (filename == NULL) ++ for (unsigned seqno = 0;; seqno++) + { +- if (separate_debug_file_debug) +- printf_unfiltered (_(" no, unable to compute real path\n")); ++ std::string link = orig_link; -- /* lrealpath() is expensive even for the usually non-existent files. */ -- gdb::unique_xmalloc_ptr filename; -- if (access (link.c_str (), F_OK) == 0) -- filename.reset (lrealpath (link.c_str ())); -- -- if (filename == NULL) -- continue; -+ for (seqno = 0;; seqno++) +- return {}; +- } ++ if (seqno > 0) + { -+ if (seqno) -+ { -+ /* 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. */ -+ -+ string_appendf (link, ".%u", seqno); -+ } -+ -+ if (add_debug_suffix) -+ link += ".debug"; ++ /* 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. */ + +- /* We expect to be silent on the non-existing files. */ +- gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename.get (), gnutarget, -1); ++ string_appendf (link, ".%u", seqno); ++ } + +- if (debug_bfd == NULL) +- { +- if (separate_debug_file_debug) +- printf_unfiltered (_(" no, unable to open.\n")); ++ ret_link = link; + -+ if (!seqno) -+ { -+ /* If none of the real files is found report as missing file -+ always the non-.%u-suffixed file. */ -+ link0 = link; -+ } ++ struct stat statbuf_trash; + -+ /* `access' automatically dereferences LINK. */ -+ if (lstat (link.c_str (), &statbuf_trash) != 0) -+ { -+ /* Stop increasing SEQNO. */ -+ break; -+ } ++ /* `access' automatically dereferences LINK. */ ++ if (lstat (link.c_str (), &statbuf_trash) != 0) ++ { ++ /* Stop increasing SEQNO. */ ++ break; ++ } + -+ filename = lrealpath (link.c_str ()); -+ if (filename == NULL) -+ continue; ++ /* lrealpath() is expensive even for the usually non-existent files. */ ++ gdb::unique_xmalloc_ptr filename; + -+ /* We expect to be silent on the non-existing files. */ -+ inner = make_cleanup (xfree, filename); -+ abfd = gdb_bfd_open (filename, gnutarget, -1); -+ do_cleanups (inner); ++ if (access (link.c_str (), F_OK) == 0) ++ filename.reset (lrealpath (link.c_str ())); + -+ if (abfd == NULL) -+ continue; ++ if (filename == NULL) ++ { ++ if (separate_debug_file_debug) ++ printf_unfiltered (_(" no, unable to compute real path\n")); + -+ if (build_id_verify (abfd.get(), build_id_len, build_id)) -+ break; ++ continue; ++ } + +- return {}; ++ /* We expect to be silent on the non-existing files. */ ++ gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename.get (), gnutarget, -1); + -+ abfd.release (); ++ if (debug_bfd == NULL) ++ { ++ if (separate_debug_file_debug) ++ printf_unfiltered (_(" no, unable to open.\n")); + -+ filename = NULL; ++ continue; + } - -- /* We expect to be silent on the non-existing files. */ -- abfd = gdb_bfd_open (filename.get (), gnutarget, -1); -+ if (filename != NULL) ++ ++ if (!build_id_verify (debug_bfd.get(), build_id_len, build_id)) + { -+ /* LINK_ALL is not used below in this non-NULL FILENAME case. */ -+ break; ++ if (separate_debug_file_debug) ++ printf_unfiltered (_(" no, build-id does not match.\n")); ++ ++ continue; + } ++ ++ ret_bfd = debug_bfd; ++ break; + } -- if (abfd == NULL) -- continue; +- 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) +- printf_unfiltered (_(" no, build-id does not match.\n")); +- +- return {}; ++ printf_unfiltered (_(" 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; ++ + /* 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 */ ++ 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 (build_id_verify (abfd.get(), build_id_len, build_id)) -- break; ++ + if (link_all.empty ()) + link_all = link0_resolved; + else @@ -599,22 +630,69 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c + its possible use as an argument for installation command. */ + link_all += " " + link0_resolved; + } -+ } + } -- abfd.release (); +- if (separate_debug_file_debug) +- printf_unfiltered (_(" yes!\n")); + if (link_return != NULL) + { -+ if (abfd != NULL) ++ if (ret_bfd != NULL) + { -+ *link_return = xstrdup (link.c_str ()); ++ *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 +@@ -124,7 +627,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. */ +@@ -147,16 +650,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; - return abfd; + 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; + +@@ -170,7 +674,8 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, + if (strcmp (gdb_sysroot, TARGET_SYSROOT_PREFIX) != 0) + { + link = gdb_sysroot + link; +- 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, ++ link_return); + if (debug_bfd != NULL) + return debug_bfd; + } +@@ -179,38 +684,208 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, + return {}; } +char * @@ -623,12 +701,11 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c + gdb_bfd_ref_ptr abfd; + char *result; + -+ abfd = build_id_to_debug_bfd (build_id->size, build_id->data, link_return, 0); ++ 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)); -+ abfd.release (); ++ result = xstrdup (bfd_get_filename (abfd.get ())); + return result; +} + @@ -770,6 +847,29 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c + /* 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) +find_separate_debug_file_by_buildid (struct objfile *objfile, @@ -792,7 +892,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c 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), 1)); ++ (!build_id_filename_return ? NULL : &build_id_filename_cstr))); + if (build_id_filename_return) + { + if (!build_id_filename_cstr) @@ -807,7 +907,7 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c /* Prevent looping on a stripped .debug file. */ if (abfd != NULL && filename_cmp (bfd_get_filename (abfd.get ()), -@@ -151,3 +821,21 @@ find_separate_debug_file_by_buildid (struct objfile *objfile) +@@ -223,3 +898,21 @@ find_separate_debug_file_by_buildid (struct objfile *objfile) return std::string (); } @@ -832,9 +932,9 @@ diff --git a/gdb/build-id.c b/gdb/build-id.c diff --git a/gdb/build-id.h b/gdb/build-id.h --- a/gdb/build-id.h +++ b/gdb/build-id.h -@@ -22,9 +22,10 @@ - +@@ -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. @@ -845,18 +945,26 @@ diff --git a/gdb/build-id.h b/gdb/build-id.h /* Return true if ABFD has NT_GNU_BUILD_ID matching the CHECK value. Otherwise, issue a warning and return false. */ -@@ -38,13 +39,18 @@ extern int build_id_verify (bfd *abfd, - the caller. */ +@@ -38,21 +39,26 @@ 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, -+ int add_debug_suffix); ++ char **link_return); + +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 separate debug file, otherwise, return an empty string. */ @@ -866,11 +974,12 @@ diff --git a/gdb/build-id.h b/gdb/build-id.h +extern std::string find_separate_debug_file_by_buildid (struct objfile *objfile, + gdb::unique_xmalloc_ptr *build_id_filename_return); - #endif /* BUILD_ID_H */ + /* 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 -@@ -733,7 +733,8 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) +@@ -709,7 +709,8 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) /* Try to add separate debug file if no symbols table found. */ if (!objfile_has_partial_symbols (objfile)) { @@ -883,88 +992,55 @@ diff --git a/gdb/coffread.c b/gdb/coffread.c diff --git a/gdb/corelow.c b/gdb/corelow.c --- a/gdb/corelow.c +++ b/gdb/corelow.c -@@ -45,6 +45,10 @@ - #include "gdb_bfd.h" - #include "completer.h" - #include "filestuff.h" +@@ -22,6 +22,10 @@ + #include + #include + #include "frame.h" /* required by inferior.h */ +#include "auxv.h" ++#include "build-id.h" +#include "elf/common.h" +#include "gdbcmd.h" -+#include "build-id.h" - - #ifndef O_LARGEFILE - #define O_LARGEFILE 0 -@@ -321,6 +325,54 @@ add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg) + #include "inferior.h" + #include "infrun.h" + #include "symtab.h" +@@ -322,6 +326,8 @@ add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg) inferior_ptid = ptid; /* Yes, make it current. */ } -+static int build_id_core_loads = 1; -+ -+static void -+build_id_locate_exec (int from_tty) -+{ -+ CORE_ADDR at_entry; -+ struct bfd_build_id *build_id; -+ char *execfilename, *debug_filename; -+ char *build_id_filename; -+ struct cleanup *back_to; -+ -+ if (exec_bfd != NULL || symfile_objfile != NULL) -+ return; -+ -+ if (target_auxv_search (current_top_target (), AT_ENTRY, &at_entry) <= 0) -+ return; -+ -+ build_id = build_id_addr_get (at_entry); -+ if (build_id == NULL) -+ return; -+ back_to = make_cleanup (xfree, build_id); -+ -+ /* SYMFILE_OBJFILE should refer to the main executable (not only to its -+ separate debug info file). gcc44+ keeps .eh_frame only in the main -+ executable without its duplicate .debug_frame in the separate debug info -+ file - such .eh_frame would not be found if SYMFILE_OBJFILE would refer -+ directly to the separate debug info file. */ -+ -+ execfilename = build_id_to_filename (build_id, &build_id_filename); -+ make_cleanup (xfree, build_id_filename); -+ -+ if (execfilename != NULL) -+ { -+ make_cleanup (xfree, execfilename); -+ exec_file_attach (execfilename, from_tty); -+ symbol_file_add_main (execfilename, -+ symfile_add_flag (!from_tty ? 0 : SYMFILE_VERBOSE)); -+ if (symfile_objfile != NULL) -+ symfile_objfile->flags |= OBJF_BUILD_ID_CORE_LOADED; -+ } -+ else -+ debug_print_missing (_("the main executable file"), build_id_filename); -+ -+ do_cleanups (back_to); -+ -+ /* No automatic SOLIB_ADD as the libraries would get read twice. */ -+} ++static bool build_id_core_loads = true; + /* Issue a message saying we have no core to debug, if FROM_TTY. */ static void -@@ -464,6 +516,14 @@ core_target_open (const char *arg, int from_tty) - switch_to_thread (thread); - } +@@ -358,19 +364,25 @@ core_file_command (const char *filename, int from_tty) + 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; -+ /* Find the build_id identifiers. If it gets executed after -+ POST_CREATE_INFERIOR we would clash with asking to discard the already -+ loaded VDSO symbols. If it gets executed before bfd_map_over_sections -+ INFERIOR_PTID is still not set and libthread_db initialization crashes on -+ PID == 0 in ps_pglobal_lookup. */ -+ if (build_id_core_loads != 0) -+ build_id_locate_exec (from_tty); -+ - post_create_inferior (target, from_tty); ++ 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); - /* Now go through the target stack looking for threads since there -@@ -1072,4 +1132,11 @@ void + if (execbfd != nullptr) + { + 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 (symfile_objfile != NULL) ++ symfile_objfile->flags |= OBJF_BUILD_ID_CORE_LOADED; + } ++ else ++ debug_print_missing (BUILD_ID_MAIN_EXECUTABLE_FILENAME, build_id_filename); + } + + /* See gdbcore.h. */ +@@ -998,4 +1010,11 @@ void _initialize_corelow (void) { add_target (core_target_info, core_target_open, filename_completer); @@ -979,7 +1055,7 @@ diff --git a/gdb/corelow.c b/gdb/corelow.c diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo -@@ -19570,6 +19570,27 @@ information files. +@@ -20862,6 +20862,27 @@ information files. @end table @@ -1007,22 +1083,62 @@ diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo @cindex @code{.gnu_debuglink} sections @cindex debug link sections A debug link is a special section of the executable file named +diff --git a/gdb/dwarf-index-cache.c b/gdb/dwarf-index-cache.c +--- a/gdb/dwarf-index-cache.c ++++ b/gdb/dwarf-index-cache.c +@@ -94,7 +94,7 @@ index_cache::store (struct dwarf2_per_objfile *dwarf2_per_objfile) + return; + + /* Get build id of objfile. */ +- const bfd_build_id *build_id = build_id_bfd_get (obj->obfd); ++ const bfd_build_id *build_id = build_id_bfd_shdr_get (obj->obfd); + if (build_id == nullptr) + { + if (debug_index_cache) +@@ -112,7 +112,8 @@ index_cache::store (struct dwarf2_per_objfile *dwarf2_per_objfile) + + 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/dwarf2read.c b/gdb/dwarf2read.c --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c -@@ -2683,7 +2683,7 @@ dwarf2_get_dwz_file (struct dwarf2_per_objfile *dwarf2_per_objfile) +@@ -2718,7 +2718,7 @@ dwarf2_get_dwz_file (struct dwarf2_per_objfile *dwarf2_per_objfile) } if (dwz_bfd == NULL) - dwz_bfd = build_id_to_debug_bfd (buildid_len, buildid); -+ dwz_bfd = build_id_to_debug_bfd (buildid_len, buildid, NULL, 1); ++ dwz_bfd = build_id_to_debug_bfd (buildid_len, buildid, NULL); if (dwz_bfd == NULL) error (_("could not find '.gnu_debugaltlink' file for %s"), +@@ -6276,7 +6276,7 @@ get_gdb_index_contents_from_section (objfile *obj, T *section_owner) + static gdb::array_view + get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_objfile *dwarf2_obj) + { +- const bfd_build_id *build_id = build_id_bfd_get (obj->obfd); ++ const bfd_build_id *build_id = build_id_bfd_shdr_get (obj->obfd); + if (build_id == nullptr) + return {}; + +@@ -6289,7 +6289,7 @@ get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_objfile *dwarf2_obj) + 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 -@@ -1290,7 +1290,9 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) +@@ -1299,7 +1299,9 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) && objfile->separate_debug_objfile == NULL && objfile->separate_debug_objfile_backlink == NULL) { @@ -1033,22 +1149,26 @@ diff --git a/gdb/elfread.c b/gdb/elfread.c if (debugfile.empty ()) debugfile = find_separate_debug_file_by_debuglink (objfile); -@@ -1302,6 +1304,10 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) - symbol_file_add_separate (abfd.get (), debugfile.c_str (), +@@ -1311,8 +1313,12 @@ elf_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) + symbol_file_add_separate (debug_bfd.get (), debugfile.c_str (), symfile_flags, objfile); } +- else +- has_dwarf2 = false; + /* Check if any separate debug info has been extracted out. */ + else if (bfd_get_section_by_name (objfile->obfd, ".gnu_debuglink") + != NULL) + debug_print_missing (objfile_name (objfile), build_id_filename.get ()); ++ else ++ has_dwarf2 = false; } - } + /* Read the CTF section only if there is no DWARF info. */ diff --git a/gdb/objfiles.h b/gdb/objfiles.h --- a/gdb/objfiles.h +++ b/gdb/objfiles.h -@@ -470,6 +470,10 @@ struct objfile - htab_t static_links {}; +@@ -627,6 +627,10 @@ struct objfile + htab_up static_links; }; +/* This file was loaded according to the BUILD_ID_CORE_LOADS rules. */ @@ -1061,16 +1181,16 @@ diff --git a/gdb/objfiles.h b/gdb/objfiles.h 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 -@@ -137,7 +137,7 @@ objfpy_get_build_id (PyObject *self, void *closure) +@@ -132,7 +132,7 @@ objfpy_get_build_id (PyObject *self, void *closure) - TRY + try { - build_id = build_id_bfd_get (objfile->obfd); + build_id = build_id_bfd_shdr_get (objfile->obfd); } - CATCH (except, RETURN_MASK_ALL) + catch (const gdb_exception &except) { -@@ -544,7 +544,7 @@ objfpy_lookup_objfile_by_build_id (const char *build_id) +@@ -600,7 +600,7 @@ objfpy_lookup_objfile_by_build_id (const char *build_id) /* Don't return separate debug files. */ if (objfile->separate_debug_objfile_backlink != NULL) continue; @@ -1090,7 +1210,7 @@ diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c static struct link_map_offsets *svr4_fetch_link_map_offsets (void); static int svr4_have_link_map_offsets (void); -@@ -1356,9 +1357,51 @@ svr4_read_so_list (CORE_ADDR lm, CORE_ADDR prev_lm, +@@ -1344,9 +1345,51 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, continue; } @@ -1148,10 +1268,17 @@ diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c diff --git a/gdb/symfile.h b/gdb/symfile.h --- a/gdb/symfile.h +++ b/gdb/symfile.h -@@ -537,6 +537,10 @@ void expand_symtabs_matching +@@ -532,12 +532,17 @@ void expand_symtabs_matching void map_symbol_filenames (symbol_filename_ftype *fun, void *data, int 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); @@ -1210,10 +1337,10 @@ diff --git a/gdb/testsuite/gdb.base/new-ui-pending-input.exp b/gdb/testsuite/gdb diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp -@@ -1695,6 +1695,16 @@ proc default_gdb_start { } { - warning "Couldn't set the width to 0." +@@ -1891,6 +1891,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 { @@ -1224,9 +1351,10 @@ diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp + 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 diff --git a/gdb-6.6-scheduler_locking-step-is-default.patch b/gdb-6.6-scheduler_locking-step-is-default.patch deleted file mode 100644 index ebc4aa6151cde0ef12bf5b8422bf905311aae3cb..0000000000000000000000000000000000000000 --- a/gdb-6.6-scheduler_locking-step-is-default.patch +++ /dev/null @@ -1,78 +0,0 @@ -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-scheduler_locking-step-is-default.patch - -;; Make upstream `set scheduler-locking step' as default. -;;=push+jan: How much is scheduler-locking relevant after non-stop? - -diff --git a/gdb/infrun.c b/gdb/infrun.c ---- a/gdb/infrun.c -+++ b/gdb/infrun.c -@@ -2193,7 +2193,7 @@ static const char *const scheduler_enums[] = { - schedlock_replay, - NULL - }; --static const char *scheduler_mode = schedlock_replay; -+static const char *scheduler_mode = schedlock_step; - static void - show_scheduler_mode (struct ui_file *file, int from_tty, - struct cmd_list_element *c, const char *value) -diff --git a/gdb/testsuite/gdb.mi/mi-cli.exp b/gdb/testsuite/gdb.mi/mi-cli.exp ---- a/gdb/testsuite/gdb.mi/mi-cli.exp -+++ b/gdb/testsuite/gdb.mi/mi-cli.exp -@@ -199,7 +199,7 @@ mi_expect_stop "breakpoint-hit" "main" "" ".*basics.c" \ - # Test that the token is output even for CLI commands - # Also test that *stopped includes frame information. - mi_gdb_test "34 next" \ -- ".*34\\\^running.*\\*running,thread-id=\"all\"" \ -+ ".*34\\\^running.*\\*running,thread-id=\"1\"" \ - "34 next: run" - - # Test that the new current source line is output to the console -diff --git a/gdb/testsuite/gdb.mi/mi-console.exp b/gdb/testsuite/gdb.mi/mi-console.exp ---- a/gdb/testsuite/gdb.mi/mi-console.exp -+++ b/gdb/testsuite/gdb.mi/mi-console.exp -@@ -60,6 +60,9 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb - - mi_run_to_main - -+# thread-id=\"all\" vs. thread-id=\"1\" below: -+mi_gdb_test "210-gdb-set scheduler-locking off" "210\\^done" "set scheduler-locking off" -+ - # The output we get from the target depends on how it is hosted. If - # we are semihosted (e.g., the sim or a remote target that supports - # the File I/O remote protocol extension), we see the target I/O -diff --git a/gdb/testsuite/gdb.mi/mi-logging.exp b/gdb/testsuite/gdb.mi/mi-logging.exp ---- a/gdb/testsuite/gdb.mi/mi-logging.exp -+++ b/gdb/testsuite/gdb.mi/mi-logging.exp -@@ -53,7 +53,7 @@ close $chan - - set mi_log_prompt "\[(\]gdb\[)\] \[\r\n\]+" - --if [regexp "\\^done\[\r\n\]+$mi_log_prompt\\^running\[\r\n\]+\\*running,thread-id=\"all\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt\\^running\[\r\n\]+\\*running,thread-id=\"all\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt" $logcontent] { -+if [regexp "\\^done\[\r\n\]+$mi_log_prompt\\^running\[\r\n\]+\\*running,thread-id=\"1\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt\\^running\[\r\n\]+\\*running,thread-id=\"1\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt" $logcontent] { - pass "log file contents" - } else { - fail "log file contents" -@@ -76,7 +76,7 @@ set chan [open $milogfile] - set logcontent [read $chan] - close $chan - --if [regexp "1001\\^done\[\r\n\]+$mi_log_prompt.*1002\\^running\[\r\n\]+\\*running,thread-id=\"all\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt.*1003\\^running\[\r\n\]+\\*running,thread-id=\"all\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt" $logcontent] { -+if [regexp "1001\\^done\[\r\n\]+$mi_log_prompt.*1002\\^running\[\r\n\]+\\*running,thread-id=\"1\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt.*1003\\^running\[\r\n\]+\\*running,thread-id=\"1\"\[\r\n\]+$mi_log_prompt\\*stopped,reason=\"end-stepping-range\",.*\[\r\n\]+$mi_log_prompt" $logcontent] { - pass "redirect log file contents" - } else { - fail "redirect log file contents" -diff --git a/gdb/testsuite/gdb.opt/inline-cmds.exp b/gdb/testsuite/gdb.opt/inline-cmds.exp ---- a/gdb/testsuite/gdb.opt/inline-cmds.exp -+++ b/gdb/testsuite/gdb.opt/inline-cmds.exp -@@ -331,7 +331,7 @@ proc mi_cli_step {cli_output_re message} { - - send_gdb "interpreter-exec console \"step\"\n" - gdb_expect { -- -re "\\^running\r\n\\*running,thread-id=\"all\"\r\n${mi_gdb_prompt}${cli_output_re}" { -+ -re "\\^running\r\n\\*running,thread-id=\"1\"\r\n${mi_gdb_prompt}${cli_output_re}" { - pass $message - } - timeout { diff --git a/gdb-6.8-bz436037-reg-no-longer-active.patch b/gdb-6.8-bz436037-reg-no-longer-active.patch deleted file mode 100644 index ea240afae457acc0e03d25037c524a3148cb0051..0000000000000000000000000000000000000000 --- a/gdb-6.8-bz436037-reg-no-longer-active.patch +++ /dev/null @@ -1,37 +0,0 @@ -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.8-bz436037-reg-no-longer-active.patch - -;; Fix register assignments with no GDB stack frames (BZ 436037). -;;=push+jan: This fix is incorrect. - -diff --git a/gdb/valops.c b/gdb/valops.c ---- a/gdb/valops.c -+++ b/gdb/valops.c -@@ -1104,6 +1104,8 @@ value_assign (struct value *toval, struct value *fromval) - struct gdbarch *gdbarch; - int value_reg; - -+ value_reg = VALUE_REGNUM (toval); -+ - /* Figure out which frame this is in currently. - - We use VALUE_FRAME_ID for obtaining the value's frame id instead of -@@ -1113,8 +1115,14 @@ value_assign (struct value *toval, struct value *fromval) - frame. */ - frame = frame_find_by_id (VALUE_FRAME_ID (toval)); - -- value_reg = VALUE_REGNUM (toval); -- -+ /* "set $reg+=1" should work on programs with no debug info, -+ but frame_find_by_id returns NULL here (RH bug 436037). -+ Use current frame, it represents CPU state in this case. -+ If frame_find_by_id is changed to do it internally -+ (it is contemplated there), remove this. */ -+ if (!frame) -+ frame = get_current_frame (); -+ /* Probably never happens. */ - if (!frame) - error (_("Value being assigned to is no longer active.")); - diff --git a/gdb-6.8-quit-never-aborts.patch b/gdb-6.8-quit-never-aborts.patch index 85db824bcc2eb9ccc3869ce327667bc7861c1eb5..4dd01c50533e255a77f1a67ed9b07c5b4a293501 100644 --- a/gdb-6.8-quit-never-aborts.patch +++ b/gdb-6.8-quit-never-aborts.patch @@ -30,7 +30,7 @@ diff --git a/gdb/defs.h b/gdb/defs.h diff --git a/gdb/extension.c b/gdb/extension.c --- a/gdb/extension.c +++ b/gdb/extension.c -@@ -820,6 +820,11 @@ check_quit_flag (void) +@@ -823,6 +823,11 @@ check_quit_flag (void) int i, result = 0; const struct extension_language_defn *extlang; @@ -45,7 +45,7 @@ diff --git a/gdb/extension.c b/gdb/extension.c diff --git a/gdb/top.c b/gdb/top.c --- a/gdb/top.c +++ b/gdb/top.c -@@ -1606,7 +1606,13 @@ quit_force (int *exit_arg, int from_tty) +@@ -1703,7 +1703,13 @@ quit_force (int *exit_arg, int from_tty) qt.from_tty = from_tty; @@ -58,13 +58,13 @@ diff --git a/gdb/top.c b/gdb/top.c +#endif /* Get out of tfind mode, and kill or detach all inferiors. */ - TRY + try diff --git a/gdb/utils.c b/gdb/utils.c --- a/gdb/utils.c +++ b/gdb/utils.c -@@ -108,6 +108,13 @@ static std::chrono::steady_clock::duration prompt_for_continue_wait_time; +@@ -102,6 +102,13 @@ static std::chrono::steady_clock::duration prompt_for_continue_wait_time; - static int debug_timestamp = 0; + static bool debug_timestamp = false; +#ifdef NEED_DETACH_SIGSTOP +/* Nonzero means we are already processing the quitting cleanups and we should @@ -73,6 +73,6 @@ diff --git a/gdb/utils.c b/gdb/utils.c +int quit_flag_cleanup; +#endif + - /* Nonzero means that strings with character values >0x7F should be printed - as octal escapes. Zero means just print the value (e.g. it's an + /* True means that strings with character values >0x7F should be printed + as octal escapes. False means just print the value (e.g. it's an international character, and the terminal or window can cope.) */ diff --git a/gdb-6.8-sparc64-silence-memcpy-check.patch b/gdb-6.8-sparc64-silence-memcpy-check.patch deleted file mode 100644 index 6c0848d2577d2f038ade6cf5ec1b92d4920d48fd..0000000000000000000000000000000000000000 --- a/gdb-6.8-sparc64-silence-memcpy-check.patch +++ /dev/null @@ -1,19 +0,0 @@ -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.8-sparc64-silence-memcpy-check.patch - -;; Silence memcpy check which returns false positive (sparc64) -;;=push: But it is just a GCC workaround, look up the existing GCC PR for it. - -diff --git a/gdb/sparc-tdep.c b/gdb/sparc-tdep.c ---- a/gdb/sparc-tdep.c -+++ b/gdb/sparc-tdep.c -@@ -1462,6 +1462,7 @@ sparc32_store_return_value (struct type *type, struct regcache *regcache, - if (sparc_floating_p (type) || sparc_complex_floating_p (type)) - { - /* Floating return values. */ -+ len = (len <= 8) ? len : 8; - memcpy (buf, valbuf, len); - regcache->cooked_write (SPARC_F0_REGNUM, buf); - if (len > 4) diff --git a/gdb-6.8-watchpoint-conditionals-test.patch b/gdb-6.8-watchpoint-conditionals-test.patch deleted file mode 100644 index 5096a6788d996e7fc6d0b974a600f315ac0219c5..0000000000000000000000000000000000000000 --- a/gdb-6.8-watchpoint-conditionals-test.patch +++ /dev/null @@ -1,90 +0,0 @@ -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.8-watchpoint-conditionals-test.patch - -;; Test the watchpoints conditionals works. -;;=fedoratest - -For: -http://sourceware.org/ml/gdb-patches/2008-04/msg00379.html -http://sourceware.org/ml/gdb-cvs/2008-04/msg00104.html - -diff --git a/gdb/testsuite/gdb.base/watchpoint-cond.c b/gdb/testsuite/gdb.base/watchpoint-cond.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/watchpoint-cond.c -@@ -0,0 +1,31 @@ -+/* 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 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 */ -+ -+int -+main (int argc, char **argv) -+{ -+ static int i = 0; /* `static' to start initialized. */ -+ int j = 2; -+ -+ for (j = 0; j < 30; j++) -+ i = 30 - j; -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/watchpoint-cond.exp b/gdb/testsuite/gdb.base/watchpoint-cond.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/watchpoint-cond.exp -@@ -0,0 +1,37 @@ -+# 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 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 watchpoint-cond -+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} -+ -+if { [runto_main] < 0 } { -+ untested watchpoint-cond -+ return -1 -+} -+ -+gdb_test "watch i if i < 20" "atchpoint \[0-9\]+: i" -+gdb_test "cont" "atchpoint \[0-9\]+: i.*Old value = 20.*New value = 19.*" diff --git a/gdb-7.2.50-sparc-add-workaround-to-broken-debug-files.patch b/gdb-7.2.50-sparc-add-workaround-to-broken-debug-files.patch deleted file mode 100644 index fc753294edcaa5370f637569401360605d99ca16..0000000000000000000000000000000000000000 --- a/gdb-7.2.50-sparc-add-workaround-to-broken-debug-files.patch +++ /dev/null @@ -1,68 +0,0 @@ -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-7.2.50-sparc-add-workaround-to-broken-debug-files.patch - -;; Toolchain on sparc is slightly broken and debuginfo files are generated -;; with non 64bit aligned tables/offsets. -;; See for example readelf -S ../Xvnc.debug. -;; -;; As a consenquence calculation of sectp->filepos as used in -;; dwarf2_read_section (gdb/dwarf2read.c:1525) will return a non aligned buffer -;; that cannot be used directly as done with MMAP. -;; Usage will result in a BusError. -;; -;; While we figure out what's wrong in the toolchain and do a full archive -;; rebuild to fix it, we need to be able to use gdb :) -;;=push - -diff --git a/gdb/gdb_bfd.c b/gdb/gdb_bfd.c ---- a/gdb/gdb_bfd.c -+++ b/gdb/gdb_bfd.c -@@ -24,12 +24,14 @@ - #include "hashtab.h" - #include "filestuff.h" - #include "vec.h" -+#ifndef __sparc__ - #ifdef HAVE_MMAP - #include - #ifndef MAP_FAILED - #define MAP_FAILED ((void *) -1) - #endif - #endif -+#endif - #include "target.h" - #include "gdb/fileio.h" - #include "inferior.h" -@@ -484,6 +486,7 @@ free_one_bfd_section (bfd *abfd, asection *sectp, void *ignore) - - if (sect != NULL && sect->data != NULL) - { -+#ifndef __sparc__ - #ifdef HAVE_MMAP - if (sect->map_addr != NULL) - { -@@ -493,6 +496,7 @@ free_one_bfd_section (bfd *abfd, asection *sectp, void *ignore) - gdb_assert (res == 0); - } - else -+#endif - #endif - xfree (sect->data); - } -@@ -659,6 +663,7 @@ gdb_bfd_map_section (asection *sectp, bfd_size_type *size) - if (descriptor->data != NULL) - goto done; - -+#ifndef __sparc__ - #ifdef HAVE_MMAP - if (!bfd_is_section_compressed (abfd, sectp)) - { -@@ -693,6 +698,7 @@ gdb_bfd_map_section (asection *sectp, bfd_size_type *size) - } - } - #endif /* HAVE_MMAP */ -+#endif - - /* Handle compressed sections, or ordinary uncompressed sections in - the no-mmap case. */ diff --git a/gdb-8.2.tar.xz b/gdb-9.2.tar.xz similarity index 67% rename from gdb-8.2.tar.xz rename to gdb-9.2.tar.xz index fc5ae3c1535a9337abac634e3cec57c7e303be81..45c82f8603527b34338db5f4b3475f168f0feeb0 100644 Binary files a/gdb-8.2.tar.xz and b/gdb-9.2.tar.xz differ diff --git a/gdb-archer-next-over-throw-cxx-exec.patch b/gdb-archer-next-over-throw-cxx-exec.patch index 26643f8def36d2832cae96964720589a4c9aa691..ba71cd3a2da95679fe22bf2ecff1b03e75616f69 100644 --- a/gdb-archer-next-over-throw-cxx-exec.patch +++ b/gdb-archer-next-over-throw-cxx-exec.patch @@ -43,7 +43,7 @@ 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,51 @@ +@@ -0,0 +1,42 @@ +# Copyright 2010 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify @@ -83,15 +83,6 @@ new file mode 100644 + } +} + -+set test continue -+gdb_test_multiple $test $test { -+ -re "Cannot access memory at address 0x\[0-9a-f\]+\r\n$gdb_prompt $" { -+ fail $test -+ } -+ -re "\r\n$gdb_prompt $" { -+ pass $test -+ } -+} -+ -+# `info inferiors' can show on older GDBs. -+gdb_test "info threads" "info threads" "program finished" ++# 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-archer-pie-addons-keep-disabled.patch b/gdb-archer-pie-addons-keep-disabled.patch index 8824e5420e56c6a502d7fc6fed636b3cd0c42ea9..40ab16be583f086accfc1d3dd4c186570896c0ee 100644 --- a/gdb-archer-pie-addons-keep-disabled.patch +++ b/gdb-archer-pie-addons-keep-disabled.patch @@ -8,9 +8,9 @@ Subject: gdb-archer-pie-addons-keep-disabled.patch diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c -@@ -15522,6 +15522,50 @@ initialize_breakpoint_ops (void) +@@ -15396,6 +15396,51 @@ static struct cmd_list_element *enablebreaklist = NULL; - static struct cmd_list_element *enablebreaklist = NULL; + cmd_list_element *commands_cmd_element = nullptr; +void +breakpoints_relocate (struct objfile *objfile, struct section_offsets *delta) @@ -52,17 +52,18 @@ diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c + } + + if (changed) -+ qsort (bp_locations, bp_locations_count, sizeof (*bp_locations), -+ bp_locations_compare); ++ std::sort (bp_locations, bp_locations + bp_locations_count, ++ bp_location_is_less_than); +} + ++void _initialize_breakpoint (void); void _initialize_breakpoint (void) { diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h -@@ -1679,6 +1679,9 @@ extern const char *ep_parse_optional_if_clause (const char **arg); +@@ -1696,6 +1696,9 @@ extern const char *ep_parse_optional_if_clause (const char **arg); UIOUT iff debugging multiple threads. */ extern void maybe_print_thread_hit_breakpoint (struct ui_out *uiout); @@ -75,7 +76,7 @@ diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h diff --git a/gdb/objfiles.c b/gdb/objfiles.c --- a/gdb/objfiles.c +++ b/gdb/objfiles.c -@@ -883,6 +883,11 @@ objfile_relocate1 (struct objfile *objfile, +@@ -816,6 +816,11 @@ objfile_relocate1 (struct objfile *objfile, obj_section_addr (s)); } @@ -87,3 +88,15 @@ diff --git a/gdb/objfiles.c b/gdb/objfiles.c /* Data changed. */ return 1; } +diff --git a/gdb/value.c b/gdb/value.c +--- a/gdb/value.c ++++ b/gdb/value.c +@@ -2840,7 +2840,7 @@ value_static_field (struct type *type, int fieldno) + case FIELD_LOC_KIND_PHYSADDR: + retval = value_at_lazy (TYPE_FIELD_TYPE (type, fieldno), + TYPE_FIELD_STATIC_PHYSADDR (type, fieldno) +- + (TYPE_OBJFILE (type) == NULL ? 0 : TYPE_OBJFILE (type)->section_offsets[SECT_OFF_TEXT (TYPE_OBJFILE (type))])); ++ + (TYPE_OBJFILE (type) == NULL ? 0 : ANOFFSET (TYPE_OBJFILE (type)->section_offsets, SECT_OFF_TEXT (TYPE_OBJFILE (type))))); + break; + case FIELD_LOC_KIND_PHYSNAME: + { diff --git a/gdb-archer-pie-addons.patch b/gdb-archer-pie-addons.patch index 9aef61725654664c2c5924ce1766a3653b86c1ec..e3af3a99baf474f8f3b08c3686b6d9b56a7b7544 100644 --- a/gdb-archer-pie-addons.patch +++ b/gdb-archer-pie-addons.patch @@ -8,7 +8,7 @@ Subject: gdb-archer-pie-addons.patch diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h -@@ -505,6 +505,7 @@ enum field_loc_kind +@@ -516,6 +516,7 @@ enum field_loc_kind { FIELD_LOC_KIND_BITPOS, /**< bitpos */ FIELD_LOC_KIND_ENUMVAL, /**< enumval */ @@ -16,7 +16,7 @@ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h FIELD_LOC_KIND_PHYSADDR, /**< physaddr */ FIELD_LOC_KIND_PHYSNAME, /**< physname */ FIELD_LOC_KIND_DWARF_BLOCK /**< dwarf_block */ -@@ -556,6 +557,7 @@ union field_location +@@ -566,6 +567,7 @@ union field_location field. Otherwise, physname is the mangled label of the static field. */ @@ -24,7 +24,7 @@ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h CORE_ADDR physaddr; const char *physname; -@@ -1438,6 +1440,7 @@ extern void set_type_vptr_basetype (struct type *, struct type *); +@@ -1474,6 +1476,7 @@ extern void set_type_vptr_basetype (struct type *, struct type *); #define FIELD_ENUMVAL_LVAL(thisfld) ((thisfld).loc.enumval) #define FIELD_ENUMVAL(thisfld) (FIELD_ENUMVAL_LVAL (thisfld) + 0) #define FIELD_STATIC_PHYSNAME(thisfld) ((thisfld).loc.physname) @@ -32,7 +32,7 @@ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h #define FIELD_STATIC_PHYSADDR(thisfld) ((thisfld).loc.physaddr) #define FIELD_DWARF_BLOCK(thisfld) ((thisfld).loc.dwarf_block) #define SET_FIELD_BITPOS(thisfld, bitpos) \ -@@ -1449,6 +1452,7 @@ extern void set_type_vptr_basetype (struct type *, struct type *); +@@ -1485,6 +1488,7 @@ extern void set_type_vptr_basetype (struct type *, struct type *); #define SET_FIELD_PHYSNAME(thisfld, name) \ (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSNAME, \ FIELD_STATIC_PHYSNAME (thisfld) = (name)) @@ -40,7 +40,7 @@ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h #define SET_FIELD_PHYSADDR(thisfld, addr) \ (FIELD_LOC_KIND (thisfld) = FIELD_LOC_KIND_PHYSADDR, \ FIELD_STATIC_PHYSADDR (thisfld) = (addr)) -@@ -1465,6 +1469,7 @@ extern void set_type_vptr_basetype (struct type *, struct type *); +@@ -1501,6 +1505,7 @@ extern void set_type_vptr_basetype (struct type *, struct type *); #define TYPE_FIELD_BITPOS(thistype, n) FIELD_BITPOS (TYPE_FIELD (thistype, n)) #define TYPE_FIELD_ENUMVAL(thistype, n) FIELD_ENUMVAL (TYPE_FIELD (thistype, n)) #define TYPE_FIELD_STATIC_PHYSNAME(thistype, n) FIELD_STATIC_PHYSNAME (TYPE_FIELD (thistype, n)) @@ -51,13 +51,13 @@ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h diff --git a/gdb/value.c b/gdb/value.c --- a/gdb/value.c +++ b/gdb/value.c -@@ -2829,7 +2829,8 @@ value_static_field (struct type *type, int fieldno) +@@ -2839,7 +2839,8 @@ value_static_field (struct type *type, int fieldno) { case FIELD_LOC_KIND_PHYSADDR: retval = value_at_lazy (TYPE_FIELD_TYPE (type, fieldno), - TYPE_FIELD_STATIC_PHYSADDR (type, fieldno)); + TYPE_FIELD_STATIC_PHYSADDR (type, fieldno) -+ + (TYPE_OBJFILE (type) == NULL ? 0 : ANOFFSET (TYPE_OBJFILE (type)->section_offsets, SECT_OFF_TEXT (TYPE_OBJFILE (type))))); ++ + (TYPE_OBJFILE (type) == NULL ? 0 : TYPE_OBJFILE (type)->section_offsets[SECT_OFF_TEXT (TYPE_OBJFILE (type))])); break; case FIELD_LOC_KIND_PHYSNAME: { diff --git a/gdb-archer-vla-tests.patch b/gdb-archer-vla-tests.patch index fa4fa0db891bcc574e909893734c08b82ceb227a..9921940e23131a1f8376b5fd080fdd34d211032c 100644 --- a/gdb-archer-vla-tests.patch +++ b/gdb-archer-vla-tests.patch @@ -8,7 +8,7 @@ Subject: gdb-archer-vla-tests.patch diff --git a/gdb/testsuite/gdb.ada/packed_array.exp b/gdb/testsuite/gdb.ada/packed_array.exp --- a/gdb/testsuite/gdb.ada/packed_array.exp +++ b/gdb/testsuite/gdb.ada/packed_array.exp -@@ -56,5 +56,11 @@ gdb_test_multiple "$test" "$test" { +@@ -53,5 +53,11 @@ gdb_test_multiple "$test" "$test" { # are. Observed with (FSF GNU Ada 4.5.3 20110124). xfail $test } @@ -2804,7 +2804,7 @@ new file mode 100644 +gdb_breakpoint [gdb_get_line_number "varx-allocated"] +gdb_continue_to_breakpoint "varx-allocated" +# $1 = (( ( 0, 0, 0, 0, 0, 0) ( 0, 0, 0, 0, 0, 0) --- , 0) ) ( ( 0, 0, ...) ...) ...) -+gdb_test "ptype varx" "type = real(\\(kind=4\\)|\\*4) \\(6,5:15,17:28\\)" "ptype varx allocated" ++gdb_test "ptype varx" "type = real(\\(kind=4\\)|\\*4), allocatable \\(6,5:15,17:28\\)" "ptype varx allocated" +# Intel Fortran Compiler 10.1.008 uses -1 there, GCC uses 1. +gdb_test "p l" "\\$\[0-9\]* = (\\.TRUE\\.|4294967295)" "p l if varx allocated" + @@ -2831,7 +2831,7 @@ new file mode 100644 +gdb_test "p varv(3, 7, 19)" "\\$\[0-9\]* = 6" "p varv(3, 7, 19) associated" +# Intel Fortran Compiler 10.1.008 uses -1 there, GCC uses 1. +gdb_test "p l" "\\$\[0-9\]* = (\\.TRUE\\.|4294967295)" "p l if varv associated" -+gdb_test "ptype varx" "type = real(\\(kind=4\\)|\\*4) \\(6,5:15,17:28\\)" "ptype varx with varv associated" ++gdb_test "ptype varx" "type = real(\\(kind=4\\)|\\*4), allocatable \\(6,5:15,17:28\\)" "ptype varx with varv associated" +# Intel Fortran Compiler 10.1.008 uses the pointer type. +gdb_test "ptype varv" "type = (PTR TO -> \\( )?real(\\(kind=4\\)|\\*4) \\(6,5:15,17:28\\)\\)?" "ptype varv associated" + @@ -2852,7 +2852,7 @@ new file mode 100644 +gdb_breakpoint [gdb_get_line_number "varx-deallocated"] +gdb_continue_to_breakpoint "varx-deallocated" +gdb_test "p varx" "\\$\[0-9\]* = " "p varx deallocated" -+gdb_test "ptype varx" {type = real\(kind=4\) \(:,:,:\)} "ptype varx deallocated" ++gdb_test "ptype varx" {type = real\(kind=4\), allocatable \(:,:,:\)} "ptype varx deallocated" +gdb_test "p l" "\\$\[0-9\]* = \\.FALSE\\." "p l if varx deallocated" +gdb_test "p varx(1,5,17)" {no such vector element \(vector not allocated\)} "p varx(1,5,17) deallocated" +gdb_test "ptype varx(1,5,17)" {no such vector element \(vector not allocated\)} "ptype varx(1,5,17) deallocated" @@ -3690,7 +3690,7 @@ diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp --- a/gdb/testsuite/lib/gdb.exp +++ b/gdb/testsuite/lib/gdb.exp @@ -170,6 +170,11 @@ proc gdb_unload {} { - send_gdb "y\n" + send_gdb "y\n" answer exp_continue } + -re "A program is being debugged already..*Are you sure you want to change the file.*y or n. $"\ @@ -3699,7 +3699,7 @@ diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp + exp_continue + } -re "Discard symbol table from .*y or n.*$" { - send_gdb "y\n" + send_gdb "y\n" answer exp_continue diff --git a/gdb/testsuite/lib/pascal.exp b/gdb/testsuite/lib/pascal.exp --- a/gdb/testsuite/lib/pascal.exp diff --git a/gdb-archer.patch b/gdb-archer.patch index dcb989c944cf201fe61e0b381d20c55cf38917a4..3d59f4f9a25cf5deae8ffc02cc531a8a2f504197 100644 --- a/gdb-archer.patch +++ b/gdb-archer.patch @@ -14,22 +14,6 @@ commit 718a1618b2f691a7f407213bb50f100ac59f91c3 tromey/python -diff --git a/gdb/Makefile.in b/gdb/Makefile.in ---- a/gdb/Makefile.in -+++ b/gdb/Makefile.in -@@ -2112,6 +2112,12 @@ stamp-h: $(srcdir)/config.in config.status - CONFIG_LINKS= \ - $(SHELL) config.status - -+.gdbinit: $(srcdir)/gdbinit.in config.status -+ CONFIG_FILES=".gdbinit:gdbinit.in" \ -+ CONFIG_COMMANDS= \ -+ CONFIG_HEADERS= \ -+ $(SHELL) config.status -+ - config.status: $(srcdir)/configure configure.nat configure.tgt configure.host ../bfd/development.sh - $(SHELL) config.status --recheck - diff --git a/gdb/data-directory/Makefile.in b/gdb/data-directory/Makefile.in --- a/gdb/data-directory/Makefile.in +++ b/gdb/data-directory/Makefile.in @@ -41,47 +25,14 @@ diff --git a/gdb/data-directory/Makefile.in b/gdb/data-directory/Makefile.in gdb/command/explore.py \ gdb/command/backtrace.py \ gdb/command/frame_filters.py \ -@@ -92,6 +93,8 @@ PYTHON_FILE_LIST = \ +@@ -92,6 +93,7 @@ PYTHON_FILE_LIST = \ gdb/function/as_string.py \ gdb/function/caller_is.py \ gdb/function/strfns.py \ -+ gdb/function/caller_is.py \ + gdb/function/in_scope.py \ gdb/printer/__init__.py \ gdb/printer/bound_registers.py -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -1245,6 +1245,16 @@ for remote debugging. - Run using @var{device} for your program's standard input and output. - @c FIXME: kingdon thinks there is more to -tty. Investigate. - -+@item -P -+@cindex @code{-P} -+@itemx --python -+@cindex @code{--python} -+Change interpretation of command line so that the argument immediately -+following this switch is taken to be the name of a Python script file. -+This option stops option processing; subsequent options are passed to -+Python as @code{sys.argv}. This option is only available if Python -+scripting support was enabled when @value{GDBN} was configured. -+ - @c resolve the situation of these eventually - @item -tui - @cindex @code{--tui} -diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi ---- a/gdb/doc/python.texi -+++ b/gdb/doc/python.texi -@@ -88,8 +88,6 @@ containing @code{end}. For example: - - @smallexample - (@value{GDBP}) python --Type python script --End with a line saying just "end". - >print 23 - >end - 23 diff --git a/gdb/gdb-gdb.gdb.in b/gdb/gdb-gdb.gdb.in --- a/gdb/gdb-gdb.gdb.in +++ b/gdb/gdb-gdb.gdb.in @@ -101,173 +52,6 @@ diff --git a/gdb/gdb-gdb.gdb.in b/gdb/gdb-gdb.gdb.in if !$gdb_init_done set variable $gdb_init_done = 1 -diff --git a/gdb/main.c b/gdb/main.c ---- a/gdb/main.c -+++ b/gdb/main.c -@@ -33,6 +33,7 @@ - - #include "interps.h" - #include "main.h" -+#include "python/python.h" - #include "source.h" - #include "cli/cli-cmds.h" - #include "objfiles.h" -@@ -479,7 +480,7 @@ exec_or_core_file_attach (const char *filename, int from_tty) - } - - static void --captured_main_1 (struct captured_main_args *context) -+captured_main_1 (struct captured_main_args *context, int &python_script) - { - int argc = context->argc; - char **argv = context->argv; -@@ -695,10 +696,14 @@ captured_main_1 (struct captured_main_args *context) - {"args", no_argument, &set_args, 1}, - {"l", required_argument, 0, 'l'}, - {"return-child-result", no_argument, &return_child_result, 1}, -+#if HAVE_PYTHON -+ {"python", no_argument, 0, 'P'}, -+ {"P", no_argument, 0, 'P'}, -+#endif - {0, no_argument, 0, 0} - }; - -- while (1) -+ while (!python_script) - { - int option_index; - -@@ -716,6 +721,9 @@ captured_main_1 (struct captured_main_args *context) - case 0: - /* Long option that just sets a flag. */ - break; -+ case 'P': -+ python_script = 1; -+ break; - case OPT_SE: - symarg = optarg; - execarg = optarg; -@@ -890,7 +898,31 @@ captured_main_1 (struct captured_main_args *context) - - /* Now that gdb_init has created the initial inferior, we're in - position to set args for that inferior. */ -- if (set_args) -+ if (python_script) -+ { -+ /* The first argument is a python script to evaluate, and -+ subsequent arguments are passed to the script for -+ processing there. */ -+ if (optind >= argc) -+ { -+ fprintf_unfiltered (gdb_stderr, -+ _("%s: Python script file name required\n"), -+ argv[0]); -+ exit (1); -+ } -+ -+ /* FIXME: should handle inferior I/O intelligently here. -+ E.g., should be possible to run gdb in pipeline and have -+ Python (and gdb) output go to stderr or file; and if a -+ prompt is needed, open the tty. */ -+ quiet = 1; -+ /* FIXME: should read .gdbinit if, and only if, a prompt is -+ requested by the script. Though... maybe this is not -+ ideal? */ -+ /* FIXME: likewise, reading in history. */ -+ inhibit_gdbinit = 1; -+ } -+ else if (set_args) - { - /* The remaining options are the command-line options for the - inferior. The first one is the sym/exec file, and the rest -@@ -1180,7 +1212,8 @@ captured_main_1 (struct captured_main_args *context) - - /* Read in the old history after all the command files have been - read. */ -- init_history (); -+ if (!python_script) -+ init_history (); - - if (batch_flag) - { -@@ -1193,24 +1226,37 @@ static void - captured_main (void *data) - { - struct captured_main_args *context = (struct captured_main_args *) data; -+ int python_script = 0; - -- captured_main_1 (context); -+ captured_main_1 (context, python_script); - -- /* NOTE: cagney/1999-11-07: There is probably no reason for not -- moving this loop and the code found in captured_command_loop() -- into the command_loop() proper. The main thing holding back that -- change - SET_TOP_LEVEL() - has been eliminated. */ -- while (1) -+#if HAVE_PYTHON -+ if (python_script) - { -- TRY -- { -- captured_command_loop (); -- } -- CATCH (ex, RETURN_MASK_ALL) -+ extern int pagination_enabled; -+ pagination_enabled = 0; -+ run_python_script (context->argc - optind, &context->argv[optind]); -+ return; -+ } -+ else -+#endif -+ { -+ /* NOTE: cagney/1999-11-07: There is probably no reason for not -+ moving this loop and the code found in captured_command_loop() -+ into the command_loop() proper. The main thing holding back that -+ change - SET_TOP_LEVEL() - has been eliminated. */ -+ while (1) - { -- exception_print (gdb_stderr, ex); -+ TRY -+ { -+ captured_command_loop (); -+ } -+ CATCH (ex, RETURN_MASK_ALL) -+ { -+ exception_print (gdb_stderr, ex); -+ } -+ END_CATCH - } -- END_CATCH - } - /* No exit -- exit is through quit_command. */ - } -@@ -1253,6 +1299,12 @@ print_gdb_help (struct ui_file *stream) - fputs_unfiltered (_("\ - This is the GNU debugger. Usage:\n\n\ - gdb [options] [executable-file [core-file or process-id]]\n\ -+ gdb [options] --args executable-file [inferior-arguments ...]\n"), stream); -+#if HAVE_PYTHON -+ fputs_unfiltered (_("\ -+ gdb [options] [--python|-P] script-file [script-arguments ...]\n"), stream); -+#endif -+ fputs_unfiltered (_("\n\ - gdb [options] --args executable-file [inferior-arguments ...]\n\n\ - "), stream); - fputs_unfiltered (_("\ -@@ -1298,6 +1350,13 @@ Output and user interface control:\n\n\ - #endif - fputs_unfiltered (_("\ - --dbx DBX compatibility mode.\n\ -+"), stream); -+#if HAVE_PYTHON -+ fputs_unfiltered (_("\ -+ --python, -P Following argument is Python script file; remaining\n\ -+ arguments are passed to script.\n"), stream); -+#endif -+ fputs_unfiltered (_("\ - -q, --quiet, --silent\n\ - Do not print version number on startup.\n\n\ - "), stream); diff --git a/gdb/python/lib/gdb/command/ignore_errors.py b/gdb/python/lib/gdb/command/ignore_errors.py new file mode 100644 --- /dev/null @@ -362,173 +146,6 @@ new file mode 100644 + return wanted == found + +InScope () -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 -@@ -644,6 +644,9 @@ class gdbpy_enter_varobj : public gdbpy_enter - - }; - -+struct cleanup *ensure_python_env (struct gdbarch *gdbarch, -+ const struct language_defn *language); -+ - extern struct gdbarch *python_gdbarch; - extern const struct language_defn *python_language; - -diff --git a/gdb/python/python.c b/gdb/python/python.c ---- a/gdb/python/python.c -+++ b/gdb/python/python.c -@@ -95,6 +95,8 @@ const struct extension_language_defn extension_language_python = - #include "linespec.h" - #include "source.h" - #include "version.h" -+#include "inferior.h" -+#include "gdbthread.h" - #include "target.h" - #include "gdbthread.h" - #include "interps.h" -@@ -237,6 +239,29 @@ gdbpy_enter::~gdbpy_enter () - restore_active_ext_lang (m_previous_active); - } - -+static void -+restore_python_env (void *p) -+{ -+ gdbpy_enter *env = (gdbpy_enter *) p; -+ -+ delete env; -+} -+ -+/* Called before entering the Python interpreter to install the -+ current language and architecture to be used for Python values. -+ Also set the active extension language for GDB so that SIGINT's -+ are directed our way, and if necessary install the right SIGINT -+ handler. */ -+ -+struct cleanup * -+ensure_python_env (struct gdbarch *gdbarch, -+ const struct language_defn *language) -+{ -+ gdbpy_enter *env = new gdbpy_enter (gdbarch, language); -+ -+ return make_cleanup (restore_python_env, env); -+} -+ - /* Set the quit flag. */ - - static void -@@ -1367,6 +1392,92 @@ gdbpy_print_stack (void) - - /* Return the current Progspace. - There always is one. */ -+/* True if 'gdb -P' was used, false otherwise. */ -+static int running_python_script; -+ -+/* True if we are currently in a call to 'gdb.cli', false otherwise. */ -+static int in_cli; -+ -+/* Enter the command loop. */ -+ -+static PyObject * -+gdbpy_cli (PyObject *unused1, PyObject *unused2) -+{ -+ if (! running_python_script || in_cli) -+ return PyErr_Format (PyExc_RuntimeError, "cannot invoke CLI recursively"); -+ -+ if (current_uiout->is_mi_like_p ()) -+ return PyErr_Format (PyExc_RuntimeError, _("Cannot invoke CLI from MI.")); -+ -+ in_cli = 1; -+ /* See captured_command_loop. */ -+ -+ /* Give the interpreter a chance to print a prompt. */ -+ interp_pre_command_loop (top_level_interpreter ()); -+ -+ /* Now it's time to start the event loop. */ -+ start_event_loop (); -+ -+ in_cli = 0; -+ -+ Py_RETURN_NONE; -+} -+ -+/* Set up the Python argument vector and evaluate a script. This is -+ used to implement 'gdb -P'. */ -+ -+void -+run_python_script (int argc, char **argv) -+{ -+ FILE *input; -+ -+ /* We never free this, since we plan to exit at the end. */ -+ ensure_python_env (get_current_arch (), current_language); -+ -+ running_python_script = 1; -+ -+#if PYTHON_ABI_VERSION < 3 -+ PySys_SetArgv (argc - 1, argv + 1); -+#else -+ { -+ wchar_t **wargv = (wchar_t **) alloca (sizeof (*wargv) * (argc + 1)); -+ int i; -+ -+ for (i = 1; i < argc; i++) -+ { -+ size_t len = mbstowcs (NULL, argv[i], 0); -+ /* Python-related GDB sources are built with -DNDEBUG -+ https://sourceware.org/bugzilla/show_bug.cgi?id=20445 */ -+ size_t len2 ATTRIBUTE_UNUSED; -+ -+ if (len == (size_t) -1) -+ { -+ fprintf (stderr, "Invalid multibyte argument #%d \"%s\"\n", -+ i, argv[i]); -+ exit (1); -+ } -+ wargv[i] = (wchar_t *) alloca (sizeof (**wargv) * (len + 1)); -+ len2 = mbstowcs (wargv[i], argv[i], len + 1); -+ assert (len2 == len); -+ } -+ wargv[argc] = NULL; -+ PySys_SetArgv (argc - 1, wargv + 1); -+ } -+#endif -+ -+ input = fopen (argv[0], "r"); -+ if (! input) -+ { -+ fprintf (stderr, "could not open %s: %s\n", argv[0], strerror (errno)); -+ exit (1); -+ } -+ PyRun_SimpleFile (input, argv[0]); -+ fclose (input); -+ exit (0); -+} -+ -+ -+ - - static PyObject * - gdbpy_get_current_progspace (PyObject *unused1, PyObject *unused2) -@@ -2057,6 +2168,8 @@ PyMethodDef python_GdbMethods[] = - Evaluate command, a string, as a gdb CLI command. Optionally returns\n\ - a Python String containing the output of the command if to_string is\n\ - set to True." }, -+ { "cli", gdbpy_cli, METH_NOARGS, -+ "Enter the gdb CLI" }, - { "parameter", gdbpy_parameter, METH_VARARGS, - "Return a gdb parameter's value" }, - -diff --git a/gdb/python/python.h b/gdb/python/python.h ---- a/gdb/python/python.h -+++ b/gdb/python/python.h -@@ -25,4 +25,6 @@ - /* This is all that python exports to gdb. */ - extern const struct extension_language_defn extension_language_python; - -+extern void run_python_script (int argc, char **argv); -+ - #endif /* GDB_PYTHON_H */ diff --git a/gdb/testsuite/gdb.python/py-frame.exp b/gdb/testsuite/gdb.python/py-frame.exp --- a/gdb/testsuite/gdb.python/py-frame.exp +++ b/gdb/testsuite/gdb.python/py-frame.exp @@ -544,7 +161,7 @@ diff --git a/gdb/testsuite/gdb.python/py-frame.exp b/gdb/testsuite/gdb.python/py diff --git a/gdb/testsuite/gdb.python/py-value.exp b/gdb/testsuite/gdb.python/py-value.exp --- a/gdb/testsuite/gdb.python/py-value.exp +++ b/gdb/testsuite/gdb.python/py-value.exp -@@ -384,6 +384,15 @@ proc test_value_after_death {} { +@@ -419,6 +419,15 @@ proc test_value_after_death {} { "print value's type" } @@ -560,41 +177,11 @@ diff --git a/gdb/testsuite/gdb.python/py-value.exp b/gdb/testsuite/gdb.python/py # Regression test for invalid subscript operations. The bug was that # the type of the value was not being checked before allowing a # subscript operation to proceed. -@@ -512,6 +521,7 @@ if ![runto_main] then { - test_value_in_inferior +@@ -606,6 +615,7 @@ test_value_in_inferior + test_value_from_buffer test_inferior_function_call test_value_after_death +test_cast_regression # Test either C or C++ values. -diff --git a/gdb/varobj.c b/gdb/varobj.c ---- a/gdb/varobj.c -+++ b/gdb/varobj.c -@@ -218,6 +218,14 @@ is_root_p (const struct varobj *var) - } - - #ifdef HAVE_PYTHON -+/* Helper function to install a Python environment suitable for -+ use during operations on VAR. */ -+struct cleanup * -+varobj_ensure_python_env (const struct varobj *var) -+{ -+ return ensure_python_env (var->root->exp->gdbarch, -+ var->root->exp->language_defn); -+} - - /* See python-internal.h. */ - gdbpy_enter_varobj::gdbpy_enter_varobj (const struct varobj *var) -diff --git a/gdb/varobj.h b/gdb/varobj.h ---- a/gdb/varobj.h -+++ b/gdb/varobj.h -@@ -328,6 +328,8 @@ extern bool varobj_has_more (const struct varobj *var, int to); - - extern bool varobj_is_dynamic_p (const struct varobj *var); - -+extern struct cleanup *varobj_ensure_python_env (const struct varobj *var); -+ - extern bool varobj_default_value_is_changeable_p (const struct varobj *var); - extern bool varobj_value_is_changeable_p (const struct varobj *var); - diff --git a/gdb-attach-fail-reasons-5of5.patch b/gdb-attach-fail-reasons-5of5.patch index c8b1267fb49673c8d039c940b205a46661c41e3c..5b3b6d33fc90fc033708b3175ad51b73ecaad1e0 100644 --- a/gdb-attach-fail-reasons-5of5.patch +++ b/gdb-attach-fail-reasons-5of5.patch @@ -45,7 +45,7 @@ gdb/gdbserver/ diff --git a/gdb/config.in b/gdb/config.in --- a/gdb/config.in +++ b/gdb/config.in -@@ -276,6 +276,9 @@ +@@ -251,6 +251,9 @@ /* Define if librpm library is being used. */ #undef HAVE_LIBRPM @@ -55,7 +55,7 @@ diff --git a/gdb/config.in b/gdb/config.in /* Define to 1 if you have the header file. */ #undef HAVE_LIBUNWIND_IA64_H -@@ -399,6 +402,9 @@ +@@ -386,6 +389,9 @@ /* Define to 1 if you have the `scm_new_smob' function. */ #undef HAVE_SCM_NEW_SMOB @@ -68,7 +68,7 @@ diff --git a/gdb/config.in b/gdb/config.in diff --git a/gdb/configure b/gdb/configure --- a/gdb/configure +++ b/gdb/configure -@@ -15854,6 +15854,64 @@ cat >>confdefs.h <<_ACEOF +@@ -16434,6 +16434,64 @@ cat >>confdefs.h <<_ACEOF _ACEOF @@ -136,7 +136,7 @@ diff --git a/gdb/configure b/gdb/configure diff --git a/gdb/configure.ac b/gdb/configure.ac --- a/gdb/configure.ac +++ b/gdb/configure.ac -@@ -2054,6 +2054,10 @@ case $host_os in +@@ -1964,6 +1964,10 @@ case $host_os in esac AC_DEFINE_UNQUOTED(GDBINIT,"$gdbinit",[The .gdbinit filename.]) @@ -150,9 +150,9 @@ diff --git a/gdb/configure.ac b/gdb/configure.ac diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in --- a/gdb/gdbserver/config.in +++ b/gdb/gdbserver/config.in -@@ -126,6 +126,9 @@ - /* Define to 1 if you have the `mcheck' library (-lmcheck). */ - #undef HAVE_LIBMCHECK +@@ -125,6 +125,9 @@ + /* Define to 1 if you have the `dl' library (-ldl). */ + #undef HAVE_LIBDL +/* Define to 1 if you have the `selinux' library (-lselinux). */ +#undef HAVE_LIBSELINUX @@ -160,7 +160,7 @@ diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in /* Define if the target supports branch tracing. */ #undef HAVE_LINUX_BTRACE -@@ -202,6 +205,9 @@ +@@ -210,6 +213,9 @@ /* Define to 1 if you have the `pwrite' function. */ #undef HAVE_PWRITE @@ -173,7 +173,7 @@ diff --git a/gdb/gdbserver/config.in b/gdb/gdbserver/config.in diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure --- a/gdb/gdbserver/configure +++ b/gdb/gdbserver/configure -@@ -8535,6 +8535,64 @@ if $want_ipa ; then +@@ -9398,6 +9398,64 @@ if $want_ipa ; then fi fi @@ -241,7 +241,7 @@ diff --git a/gdb/gdbserver/configure b/gdb/gdbserver/configure diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac --- a/gdb/gdbserver/configure.ac +++ b/gdb/gdbserver/configure.ac -@@ -486,6 +486,10 @@ if $want_ipa ; then +@@ -465,6 +465,10 @@ if $want_ipa ; then fi fi @@ -255,7 +255,7 @@ diff --git a/gdb/gdbserver/configure.ac b/gdb/gdbserver/configure.ac diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c -@@ -967,7 +967,16 @@ linux_ptrace_fun () +@@ -968,7 +968,16 @@ linux_ptrace_fun () { if (ptrace (PTRACE_TRACEME, 0, (PTRACE_TYPE_ARG3) 0, (PTRACE_TYPE_ARG4) 0) < 0) @@ -276,22 +276,21 @@ diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c -@@ -1089,7 +1089,17 @@ linux_nat_target::create_inferior (const char *exec_file, +@@ -1092,7 +1092,16 @@ linux_nat_target::create_inferior (const char *exec_file, /* Make sure we report all signals during startup. */ - pass_signals (0, NULL); + pass_signals ({}); - inf_ptrace_target::create_inferior (exec_file, allargs, env, from_tty); -+ TRY ++ try + { + inf_ptrace_target::create_inferior (exec_file, allargs, env, from_tty); + } -+ CATCH (ex, RETURN_MASK_ERROR) ++ catch (const gdb_exception_error &ex) + { + std::string result = linux_ptrace_create_warnings (); + -+ throw_error (ex.error, "%s%s", result.c_str (), ex.message); ++ throw_error (ex.error, "%s%s", result.c_str (), ex.message->c_str ()); + } -+ END_CATCH } /* Callback for linux_proc_attach_tgid_threads. Attach to PTID if not @@ -318,7 +317,7 @@ diff --git a/gdb/nat/linux-ptrace.c b/gdb/nat/linux-ptrace.c return result; } -@@ -583,6 +589,25 @@ linux_ptrace_init_warnings (void) +@@ -586,6 +592,25 @@ linux_ptrace_init_warnings (void) linux_ptrace_test_ret_to_nx (); } diff --git a/gdb-btrobust.patch b/gdb-btrobust.patch index 40d406c8e4e4fac84e91b0a7efc25ecc92db0fb5..2c7e2d360fb8a544b954abd7c33c1245ce9d7454 100644 --- a/gdb-btrobust.patch +++ b/gdb-btrobust.patch @@ -14,7 +14,7 @@ printed, but a default backtrace will occur in this case. diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c --- a/gdb/python/py-framefilter.c +++ b/gdb/python/py-framefilter.c -@@ -1151,6 +1151,7 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, +@@ -1204,6 +1204,7 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, htab_eq_pointer, NULL)); @@ -22,22 +22,22 @@ diff --git a/gdb/python/py-framefilter.c b/gdb/python/py-framefilter.c while (true) { gdbpy_ref<> item (PyIter_Next (iterable.get ())); -@@ -1159,8 +1160,8 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, +@@ -1212,8 +1213,8 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, { if (PyErr_Occurred ()) { -- throw_quit_or_print_exception (); +- gdbpy_print_stack_or_quit (); - return EXT_LANG_BT_ERROR; + gdbpy_print_stack (); + return count_printed > 0 ? EXT_LANG_BT_ERROR : EXT_LANG_BT_NO_FILTERS; } break; } -@@ -1193,7 +1194,8 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, +@@ -1245,7 +1246,8 @@ gdbpy_apply_frame_filter (const struct extension_language_defn *extlang, /* Do not exit on error printing a single frame. Print the error and continue with other frames. */ if (success == EXT_LANG_BT_ERROR) -- throw_quit_or_print_exception (); +- gdbpy_print_stack_or_quit (); + gdbpy_print_stack (); + count_printed++; } diff --git a/gdb-bz1219747-attach-kills.patch b/gdb-bz1219747-attach-kills.patch index 6ae10a22f631c4dacde8283b8b91244186fde15f..69c865848b2361e13033cc8fb1b211a631d8ec02 100644 --- a/gdb-bz1219747-attach-kills.patch +++ b/gdb-bz1219747-attach-kills.patch @@ -80,18 +80,18 @@ gdb/testsuite/ChangeLog diff --git a/gdb/main.c b/gdb/main.c --- a/gdb/main.c +++ b/gdb/main.c -@@ -1115,7 +1115,10 @@ captured_main_1 (struct captured_main_args *context) - if (isdigit (pid_or_core_arg[0])) +@@ -1148,7 +1148,10 @@ captured_main_1 (struct captured_main_args *context) { - if (catch_command_errors (attach_command, pid_or_core_arg, -- !batch_flag) == 0) -+ !batch_flag) == 0 + ret = catch_command_errors (attach_command, pid_or_core_arg, + !batch_flag); +- if (ret == 0) ++ if (ret == 0 + /* attach_command could succeed partially and core_file_command + would try to kill it. */ + && !have_inferiors ()) - catch_command_errors (core_file_command, pid_or_core_arg, - !batch_flag); - } + ret = catch_command_errors (core_file_command, + pid_or_core_arg, + !batch_flag); diff --git a/gdb/testsuite/gdb.base/attach-kills.c b/gdb/testsuite/gdb.base/attach-kills.c new file mode 100644 --- /dev/null diff --git a/gdb-bz533176-fortran-omp-step.patch b/gdb-bz533176-fortran-omp-step.patch index 8a23b3389765389683022faa909d6f39f5a9248c..ee426ce835fd744b64d355e6e0b269c1ae255081 100644 --- a/gdb-bz533176-fortran-omp-step.patch +++ b/gdb-bz533176-fortran-omp-step.patch @@ -30,7 +30,7 @@ debugging problem of GOMP outside of the scope of this Bug. diff --git a/gdb/infrun.c b/gdb/infrun.c --- a/gdb/infrun.c +++ b/gdb/infrun.c -@@ -6695,6 +6695,16 @@ process_event_stop_test (struct execution_control_state *ecs) +@@ -6453,6 +6453,16 @@ process_event_stop_test (struct execution_control_state *ecs) if (ecs->event_thread->control.step_over_calls == STEP_OVER_ALL) { @@ -38,16 +38,16 @@ diff --git a/gdb/infrun.c b/gdb/infrun.c + struct minimal_symbol *stopf = lookup_minimal_symbol_by_pc (stop_pc).minsym; + + if ((stop_fn == NULL -+ || strstr (SYMBOL_LINKAGE_NAME (stop_fn), ".omp_fn.") == NULL) ++ || strstr (stop_fn->linkage_name (), ".omp_fn.") == NULL) + /* gcc-4.7.2-9.fc19.x86_64 uses a new format. */ + && (stopf == NULL -+ || strstr (MSYMBOL_LINKAGE_NAME (stopf), "._omp_fn.") == NULL)) ++ || strstr (stopf->linkage_name (), "._omp_fn.") == NULL)) +{ /* ".omp_fn." */ + /* We're doing a "next". Normal (forward) execution: set a breakpoint at the -@@ -6728,6 +6738,7 @@ process_event_stop_test (struct execution_control_state *ecs) +@@ -6486,6 +6496,7 @@ process_event_stop_test (struct execution_control_state *ecs) keep_going (ecs); return; diff --git a/gdb-bz541866-rwatch-before-run.patch b/gdb-bz541866-rwatch-before-run.patch deleted file mode 100644 index 0ff3a93e8c845ff0b9bbde33bb00e5c2e5f21617..0000000000000000000000000000000000000000 --- a/gdb-bz541866-rwatch-before-run.patch +++ /dev/null @@ -1,175 +0,0 @@ -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-bz541866-rwatch-before-run.patch - -;; Fix i386+x86_64 rwatch+awatch before run, regression against 6.8 (BZ 541866). -;; Fix i386 rwatch+awatch before run (BZ 688788, on top of BZ 541866). -;;=push+jan: It should be fixed properly instead. - -diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c ---- a/gdb/breakpoint.c -+++ b/gdb/breakpoint.c -@@ -8807,7 +8807,7 @@ init_breakpoint_sal (struct breakpoint *b, struct gdbarch *gdbarch, - int enabled, int internal, unsigned flags, - int display_canonical) - { -- int i; -+ int i ATTRIBUTE_UNUSED; - - if (type == bp_hardware_breakpoint) - { -@@ -14356,7 +14356,7 @@ enable_breakpoint_disp (struct breakpoint *bpt, enum bpdisp disposition, - - if (bpt->type == bp_hardware_breakpoint) - { -- int i; -+ int i ATTRIBUTE_UNUSED; - i = hw_breakpoint_used_count (); - target_resources_ok = - target_can_use_hardware_watchpoint (bp_hardware_breakpoint, -diff --git a/gdb/config/i386/nm-linux.h b/gdb/config/i386/nm-linux.h -new file mode 100644 ---- /dev/null -+++ b/gdb/config/i386/nm-linux.h -@@ -0,0 +1,28 @@ -+/* Native support for GNU/Linux i386. -+ -+ 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 . */ -+ -+#ifndef NM_LINUX_H -+#define NM_LINUX_H -+ -+#include "config/nm-linux.h" -+ -+/* Red Hat backward compatibility with gdb-6.8. */ -+#define target_can_use_hardware_watchpoint(type, cnt, ot) 1 -+ -+#endif /* NM_LINUX64_H */ -diff --git a/gdb/config/i386/nm-linux64.h b/gdb/config/i386/nm-linux64.h -new file mode 100644 ---- /dev/null -+++ b/gdb/config/i386/nm-linux64.h -@@ -0,0 +1,28 @@ -+/* Native support for GNU/Linux amd64. -+ -+ 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 . */ -+ -+#ifndef NM_LINUX64_H -+#define NM_LINUX64_H -+ -+#include "config/nm-linux.h" -+ -+/* Red Hat backward compatibility with gdb-6.8. */ -+#define target_can_use_hardware_watchpoint(type, cnt, ot) 1 -+ -+#endif /* NM_LINUX64_H */ -diff --git a/gdb/configure.nat b/gdb/configure.nat ---- a/gdb/configure.nat -+++ b/gdb/configure.nat -@@ -238,6 +238,7 @@ case ${gdb_host} in - ;; - i386) - # Host: Intel 386 running GNU/Linux. -+ NAT_FILE="${srcdir}/config/${gdb_host_cpu}/nm-linux.h" - NATDEPFILES="${NATDEPFILES} x86-nat.o x86-dregs.o \ - i386-linux-nat.o x86-linux-nat.o linux-btrace.o \ - x86-linux.o x86-linux-dregs.o" -@@ -290,6 +291,7 @@ case ${gdb_host} in - case ${gdb_host_cpu} in - i386) - # Host: GNU/Linux x86-64 -+ NAT_FILE="${srcdir}/config/${gdb_host_cpu}/nm-linux64.h" - NATDEPFILES="${NATDEPFILES} x86-nat.o x86-dregs.o \ - amd64-nat.o amd64-linux-nat.o x86-linux-nat.o linux-btrace.o \ - x86-linux.o x86-linux-dregs.o amd64-linux-siginfo.o" -diff --git a/gdb/target.h b/gdb/target.h ---- a/gdb/target.h -+++ b/gdb/target.h -@@ -1953,9 +1953,11 @@ extern struct thread_info *target_thread_handle_to_thread_info - one. OTHERTYPE is the number of watchpoints of other types than - this one used so far. */ - -+#ifndef target_can_use_hardware_watchpoint - #define target_can_use_hardware_watchpoint(TYPE,CNT,OTHERTYPE) \ - (current_top_target ()->can_use_hw_breakpoint) ( \ - TYPE, CNT, OTHERTYPE) -+#endif - - /* Returns the number of debug registers needed to watch the given - memory region, or zero if not supported. */ -diff --git a/gdb/testsuite/gdb.base/watchpoint-hw-before-run.exp b/gdb/testsuite/gdb.base/watchpoint-hw-before-run.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/watchpoint-hw-before-run.exp -@@ -0,0 +1,40 @@ -+# Copyright 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 . -+ -+# Arch not supporting hw watchpoints does not imply no_hardware_watchpoints set. -+if {(![istarget "i?86-*-*"] && ![istarget "x86_64-*-*"] -+ && ![istarget "ia64-*-*"]) -+ || [target_info exists gdb,no_hardware_watchpoints]} then { -+ verbose "Skipping watchpoint-hw-before-run test." -+ return -+} -+ -+set test watchpoint-hw-before-run -+set srcfile watchpoint-hw-hit-once.c -+if { [prepare_for_testing ${test}.exp ${test} ${srcfile}] } { -+ return -1 -+} -+ -+gdb_test "rwatch watchee" "ardware read watchpoint 1: watchee" -+ -+# `runto_main' or `runto main' would delete the watchpoint created above. -+ -+if { [gdb_start_cmd] < 0 } { -+ untested start -+ return -1 -+} -+gdb_test "" "main .* at .*" "start" -+ -+gdb_test "continue" "Continuing.\r\n\r\nHardware read watchpoint \[0-9\]+: watchee\r\n\r\nValue = 0\r\n.*" diff --git a/gdb-bz568248-oom-is-error.patch b/gdb-bz568248-oom-is-error.patch deleted file mode 100644 index f3f61da4c15208ac2f922eda39662d012fb8c42a..0000000000000000000000000000000000000000 --- a/gdb-bz568248-oom-is-error.patch +++ /dev/null @@ -1,71 +0,0 @@ -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-bz568248-oom-is-error.patch - -;; Out of memory is just an error, not fatal (uninitialized VLS vars, BZ 568248). -;;=push+jan: Inferior objects should be read in parts, then this patch gets obsoleted. - -http://sourceware.org/ml/gdb-patches/2010-06/msg00005.html - -Hi, - -unfortunately I see this problem reproducible only with the -archer-jankratochvil-vla branch (VLA = Variable Length Arrays - char[var]). -OTOH this branch I hopefully submit in some form for FSF GDB later. - -In this case (a general problem but tested for example on Fedora 13 i686): - -int -main (int argc, char **argv) -{ - char a[argc]; - return a[0]; -} - -(gdb) start -(gdb) print a -../../gdb/utils.c:1251: internal-error: virtual memory exhausted: can't allocate 4294951689 bytes. - -It is apparently because boundary for the variable `a' is not initialized -there. Users notice it due to Eclipse-CDT trying to automatically display all -the local variables on each step. - -Apparentl no regressions on {x86_64,x86_64-m32,i686}-fedora13-linux-gnu. -But is anone aware of the reasons to use internal_error there? -I find simple error as a perfectly reasonable there. -(history only tracks it since the initial import) - -IIRC this idea has been discussed with Tom Tromey, not sure of its origin. - -I understand it may be offtopic for FSF GDB but from some GDB crashes I am not -sure if it can happen only due to the VLA variables. - -Thanks, -Jan - -gdb/ -2010-06-01 Jan Kratochvil - Tom Tromey - - * utils.c (nomem): Change internal_error to error. - -diff --git a/gdb/utils.c b/gdb/utils.c ---- a/gdb/utils.c -+++ b/gdb/utils.c -@@ -746,13 +746,11 @@ malloc_failure (long size) - { - if (size > 0) - { -- internal_error (__FILE__, __LINE__, -- _("virtual memory exhausted: can't allocate %ld bytes."), -- size); -+ error (_("virtual memory exhausted: can't allocate %ld bytes."), size); - } - else - { -- internal_error (__FILE__, __LINE__, _("virtual memory exhausted.")); -+ error (_("virtual memory exhausted.")); - } - } - diff --git a/gdb-config.patch b/gdb-config.patch new file mode 100644 index 0000000000000000000000000000000000000000..b26d6683bff6d2c0f619a9105c747506f1073f08 --- /dev/null +++ b/gdb-config.patch @@ -0,0 +1,56 @@ +diff -Nrup a/gnulib/import/m4/alloca.m4 b/gnulib/import/m4/alloca.m4 +--- a/gnulib/import/m4/alloca.m4 2019-11-18 18:49:20.000000000 -0700 ++++ b/gnulib/import/m4/alloca.m4 2020-01-11 01:07:36.200483085 -0700 +@@ -89,7 +89,7 @@ AC_CACHE_CHECK([stack direction for C al + [ac_cv_c_stack_direction], + [AC_RUN_IFELSE([AC_LANG_SOURCE( + [AC_INCLUDES_DEFAULT +-int ++__attribute__ (noinline,noclone)) int + find_stack_direction (int *addr, int depth) + { + int dir, dummy = 0; +diff -Nrup a/libiberty/aclocal.m4 b/libiberty/aclocal.m4 +--- a/libiberty/aclocal.m4 2019-01-19 09:01:34.000000000 -0700 ++++ b/libiberty/aclocal.m4 2020-01-09 22:00:27.183312982 -0700 +@@ -147,7 +147,7 @@ if test $ac_cv_os_cray = yes; then + fi + + AC_CACHE_CHECK(stack direction for C alloca, ac_cv_c_stack_direction, +-[AC_TRY_RUN([find_stack_direction () ++[AC_TRY_RUN([__attribute__ ((noclone,noinline)) find_stack_direction () + { + static char *addr = 0; + auto char dummy; +diff --git a/config/intdiv0.m4 b/config/intdiv0.m4 +index 55dddcf1..ba906efc 100644 +--- a/config/intdiv0.m4 ++++ b/config/intdiv0.m4 +@@ -31,10 +31,10 @@ sigfpe_handler (sig) int sig; + exit (sig != SIGFPE); + } + +-int x = 1; +-int y = 0; +-int z; +-int nan; ++volatile int x = 1; ++volatile int y = 0; ++volatile int z; ++volatile int nan; + + int main () + { +diff --git a/libiberty/configure.ac b/libiberty/configure.ac +index f1ce7601..fc20d228 100644 +--- a/libiberty/configure.ac ++++ b/libiberty/configure.ac +@@ -661,7 +661,7 @@ if test -z "${setobjs}"; then + for v in $vars; do + AC_MSG_CHECKING([for $v]) + AC_CACHE_VAL(libiberty_cv_var_$v, +- [AC_LINK_IFELSE([AC_LANG_PROGRAM([[int *p;]],[[extern int $v []; p = $v;]])], ++ [AC_LINK_IFELSE([AC_LANG_PROGRAM([[__attribute__ ((used)) int *p;]],[[extern int $v []; p = $v;]])], + [eval "libiberty_cv_var_$v=yes"], + [eval "libiberty_cv_var_$v=no"])]) + if eval "test \"`echo '$libiberty_cv_var_'$v`\" = yes"; then diff --git a/gdb-container-rh-pkg.patch b/gdb-container-rh-pkg.patch index 2defc8df0dfeb3c9315de23432428dc3b32d5d05..b095d4ba8b05c919ad6dd61bf3494a37447f1c63 100644 --- a/gdb-container-rh-pkg.patch +++ b/gdb-container-rh-pkg.patch @@ -9,7 +9,7 @@ Subject: gdb-container-rh-pkg.patch diff --git a/gdb/remote.c b/gdb/remote.c --- a/gdb/remote.c +++ b/gdb/remote.c -@@ -13909,7 +13909,17 @@ remote_target::pid_to_exec_file (int pid) +@@ -13916,7 +13916,17 @@ remote_target::pid_to_exec_file (int pid) char *annex = NULL; if (packet_support (PACKET_qXfer_exec_file) != PACKET_ENABLE) diff --git a/gdb-core-open-vdso-warning.patch b/gdb-core-open-vdso-warning.patch index b0a7311af47e9593cff79af052d7e53be570870e..f58d8be89125870d015e15ecc9d0ee715d93b4af 100644 --- a/gdb-core-open-vdso-warning.patch +++ b/gdb-core-open-vdso-warning.patch @@ -27,7 +27,7 @@ diff --git a/gdb/testsuite/gdb.base/solib-symbol.exp b/gdb/testsuite/gdb.base/so if [get_compiler_info] { return -1 -@@ -72,8 +73,26 @@ gdb_test "br foo2" \ +@@ -71,8 +72,26 @@ gdb_test "br foo2" \ "Breakpoint.*: foo2. .2 locations..*" \ "foo2 in mdlib" diff --git a/gdb-fedora-libncursesw.patch b/gdb-fedora-libncursesw.patch index 5037e293732468024550582ec045a586ffcbd78e..960193f44c7864a086a4e611dcae9ef6046ee403 100644 --- a/gdb-fedora-libncursesw.patch +++ b/gdb-fedora-libncursesw.patch @@ -12,7 +12,7 @@ https://bugzilla.redhat.com/show_bug.cgi?id=1270534 diff --git a/gdb/configure b/gdb/configure --- a/gdb/configure +++ b/gdb/configure -@@ -9393,6 +9393,7 @@ if test x"$prefer_curses" = xyes; then +@@ -9375,6 +9375,7 @@ if test x"$prefer_curses" = xyes; then # search /usr/local/include, if ncurses is installed in /usr/local. A # default installation of ncurses on alpha*-dec-osf* will lead to such # a situation. @@ -20,7 +20,7 @@ diff --git a/gdb/configure b/gdb/configure { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing waddstr" >&5 $as_echo_n "checking for library containing waddstr... " >&6; } if ${ac_cv_search_waddstr+:} false; then : -@@ -9417,7 +9418,7 @@ return waddstr (); +@@ -9399,7 +9400,7 @@ return waddstr (); return 0; } _ACEOF @@ -29,7 +29,7 @@ diff --git a/gdb/configure b/gdb/configure if test -z "$ac_lib"; then ac_res="none required" else -@@ -9491,6 +9492,7 @@ case $host_os in +@@ -9473,6 +9474,7 @@ case $host_os in esac # These are the libraries checked by Readline. @@ -37,19 +37,19 @@ diff --git a/gdb/configure b/gdb/configure { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5 $as_echo_n "checking for library containing tgetent... " >&6; } if ${ac_cv_search_tgetent+:} false; then : -@@ -9515,7 +9517,7 @@ return tgetent (); +@@ -9497,7 +9499,7 @@ return tgetent (); return 0; } _ACEOF --for ac_lib in '' termcap tinfo curses ncursesw ncurses; do -+for ac_lib in '' termcap tinfo ncursesw; do +-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 -@@ -766,7 +766,8 @@ if test x"$prefer_curses" = xyes; then +@@ -717,7 +717,8 @@ if test x"$prefer_curses" = xyes; then # search /usr/local/include, if ncurses is installed in /usr/local. A # default installation of ncurses on alpha*-dec-osf* will lead to such # a situation. @@ -59,13 +59,13 @@ diff --git a/gdb/configure.ac b/gdb/configure.ac if test "$ac_cv_search_waddstr" != no; then curses_found=yes -@@ -808,7 +809,8 @@ case $host_os in +@@ -759,7 +760,8 @@ case $host_os in esac # These are the libraries checked by Readline. --AC_SEARCH_LIBS(tgetent, [termcap tinfo curses ncursesw ncurses]) +-AC_SEARCH_LIBS(tgetent, [termcap tinfow tinfo curses ncursesw ncurses]) +# Fedora: Force libncursesw over libncurses to match the includes. -+AC_SEARCH_LIBS(tgetent, [termcap tinfo ncursesw]) ++AC_SEARCH_LIBS(tgetent, [ncursesw]) if test "$ac_cv_search_tgetent" = no; then CONFIG_OBS="$CONFIG_OBS stub-termcap.o" diff --git a/gdb-follow-child-stale-parent.patch b/gdb-follow-child-stale-parent.patch deleted file mode 100644 index ab3a76507d5283ad179c052480d32fe287526ab8..0000000000000000000000000000000000000000 --- a/gdb-follow-child-stale-parent.patch +++ /dev/null @@ -1,36 +0,0 @@ -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-follow-child-stale-parent.patch - -;; Fix regression by python on ia64 due to stale current frame. -;;=push+jan - -Problem occurs with python and its get_current_arch () as it selects -selected_frame and current_frame while still inferior_ptid is valid for the -original parent. But since this place it is already attached and later -unwinders try to access it, breaking: - -PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the first fork - -PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the first fork - -PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the second fork - -PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the second fork - -PASS: gdb.threads/watchpoint-fork.exp: child: singlethreaded: finish - +FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the first fork - +FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the first fork - +FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: breakpoint after the second fork - +FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: watchpoint after the second fork - +FAIL: gdb.threads/watchpoint-fork.exp: child: singlethreaded: finish - -diff --git a/gdb/infrun.c b/gdb/infrun.c ---- a/gdb/infrun.c -+++ b/gdb/infrun.c -@@ -752,6 +752,9 @@ follow_fork (void) - } - else - { -+ /* Possibly referenced PARENT is no longer valid. */ -+ reinit_frame_cache (); -+ - /* This pending follow fork event is now handled, one way - or another. The previous selected thread may be gone - from the lists by now, but if it is still around, need diff --git a/gdb-glibc-strstr-workaround.patch b/gdb-glibc-strstr-workaround.patch index 85c9621a169785e62cf7752ff7de84d10ac236a9..190e2da61a55eb86113e0d1eddf6154b0f7e3cbd 100644 --- a/gdb-glibc-strstr-workaround.patch +++ b/gdb-glibc-strstr-workaround.patch @@ -4,43 +4,13 @@ Date: Fri, 27 Oct 2017 21:07:50 +0200 Subject: gdb-glibc-strstr-workaround.patch ;; Workaround PR libc/14166 for inferior calls of strstr. -;;=fedora: Compatibility with RHELs (unchecked which ones). +;;=fedoratest: Compatibility with RHELs (unchecked which ones). -diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c ---- a/gdb/dwarf2read.c -+++ b/gdb/dwarf2read.c -@@ -21286,6 +21286,26 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, - /* Cache this symbol's name and the name's demangled form (if any). */ - SYMBOL_SET_LANGUAGE (sym, cu->language, &objfile->objfile_obstack); - linkagename = dwarf2_physname (name, die, cu); -+ -+ /* Workaround for: -+ * invalid IFUNC DW_AT_linkage_name: memmove strstr time -+ * http://sourceware.org/bugzilla/show_bug.cgi?id=14166 */ -+ if (strcmp (linkagename, "strstr") == 0 -+ && strstr (objfile_name (objfile), "/libc") != NULL) -+ { -+ struct objfile *objfile_msym; -+ struct bound_minimal_symbol bmsym; -+ -+ if (objfile->separate_debug_objfile_backlink) -+ objfile_msym = objfile->separate_debug_objfile_backlink; -+ else -+ objfile_msym = objfile; -+ bmsym = lookup_minimal_symbol ("strstr", NULL, objfile_msym); -+ if (bmsym.minsym != NULL -+ && MSYMBOL_TYPE (bmsym.minsym) == mst_text_gnu_ifunc) -+ linkagename = "__strstr"; -+ } -+ - SYMBOL_SET_NAMES (sym, linkagename, strlen (linkagename), 0, objfile); - - /* Fortran does not have mangling standard and the mangling does differ 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,108 @@ +@@ -0,0 +1,115 @@ +# Copyright (C) 2012 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify @@ -103,6 +73,10 @@ new file mode 100644 + 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 @@ -142,6 +116,9 @@ new file mode 100644 + -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 + } diff --git a/gdb-gnat-dwarf-crash-3of3.patch b/gdb-gnat-dwarf-crash-3of3.patch index a20da466409a440b8bba85d07ebe78b091da5d7a..52892e4f405715ab07ee16612b85b0c3a358469c 100644 --- a/gdb-gnat-dwarf-crash-3of3.patch +++ b/gdb-gnat-dwarf-crash-3of3.patch @@ -42,7 +42,7 @@ gdb/ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c --- a/gdb/dwarf2read.c +++ b/gdb/dwarf2read.c -@@ -10499,6 +10499,13 @@ private: +@@ -10657,6 +10657,13 @@ private: static void process_die (struct die_info *die, struct dwarf2_cu *cu) { @@ -59,8 +59,8 @@ diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c diff --git a/gdb/infrun.c b/gdb/infrun.c --- a/gdb/infrun.c +++ b/gdb/infrun.c -@@ -607,6 +607,13 @@ holding the child stopped. Try \"set detach-on-fork\" or \ - target_pid_to_str (process_ptid)); +@@ -601,6 +601,13 @@ holding the child stopped. Try \"set detach-on-fork\" or \ + target_pid_to_str (process_ptid).c_str ()); } +#ifdef NEED_DETACH_SIGSTOP @@ -76,7 +76,7 @@ diff --git a/gdb/infrun.c b/gdb/infrun.c diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c --- a/gdb/linux-nat.c +++ b/gdb/linux-nat.c -@@ -191,6 +191,12 @@ struct linux_nat_target *linux_target; +@@ -189,6 +189,12 @@ struct linux_nat_target *linux_target; /* Does the current host support PTRACE_GETREGSET? */ enum tribool have_ptrace_getregset = TRIBOOL_UNKNOWN; @@ -86,10 +86,10 @@ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c + +#endif + - /* The saved to_close method, inherited from inf-ptrace.c. - Called by our to_close. */ - static void (*super_close) (struct target_ops *); -@@ -1027,6 +1033,9 @@ linux_nat_post_attach_wait (ptid_t ptid, int *signalled) + static unsigned int debug_linux_nat; + static void + show_debug_linux_nat (struct ui_file *file, int from_tty, +@@ -1030,6 +1036,9 @@ linux_nat_post_attach_wait (ptid_t ptid, int *signalled) if (debug_linux_nat) fprintf_unfiltered (gdb_stdlog, "LNPAW: Attaching to a stopped process\n"); @@ -99,7 +99,7 @@ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c /* The process is definitely stopped. It is in a job control stop, unless the kernel predates the TASK_STOPPED / -@@ -1359,6 +1368,25 @@ get_detach_signal (struct lwp_info *lp) +@@ -1361,6 +1370,25 @@ get_detach_signal (struct lwp_info *lp) return gdb_signal_to_host (signo); } @@ -125,7 +125,7 @@ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c return 0; } -@@ -1507,6 +1535,10 @@ linux_nat_target::detach (inferior *inf, int from_tty) +@@ -1509,6 +1537,10 @@ linux_nat_target::detach (inferior *inf, int from_tty) detach_one_lwp (main_lwp, &signo); detach_success (inf); @@ -136,7 +136,7 @@ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c } } -@@ -1765,6 +1797,16 @@ linux_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signo) +@@ -1766,6 +1798,16 @@ linux_nat_target::resume (ptid_t ptid, int step, enum gdb_signal signo) return; } @@ -151,9 +151,9 @@ diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c + +#endif if (resume_many) - iterate_over_lwps (ptid, linux_nat_resume_callback, lp); - -@@ -3761,6 +3803,10 @@ linux_nat_target::mourn_inferior () + iterate_over_lwps (ptid, [=] (struct lwp_info *info) + { +@@ -3770,6 +3812,10 @@ linux_nat_target::mourn_inferior () /* Let the arch-specific native code know this process is gone. */ linux_target->low_forget_process (pid); diff --git a/gdb-jit-reader-multilib.patch b/gdb-jit-reader-multilib.patch index 2aa41c22f60056fd16ce590cdcd3ff1bed2490ed..ec41f1317b0b9f7c65e54459f929e67e34da9efb 100644 --- a/gdb-jit-reader-multilib.patch +++ b/gdb-jit-reader-multilib.patch @@ -9,7 +9,7 @@ Subject: gdb-jit-reader-multilib.patch diff --git a/gdb/configure b/gdb/configure --- a/gdb/configure +++ b/gdb/configure -@@ -9680,10 +9680,12 @@ _ACEOF +@@ -9694,10 +9694,12 @@ _ACEOF @@ -28,7 +28,7 @@ diff --git a/gdb/configure b/gdb/configure diff --git a/gdb/configure.ac b/gdb/configure.ac --- a/gdb/configure.ac +++ b/gdb/configure.ac -@@ -843,10 +843,12 @@ AC_CHECK_SIZEOF(unsigned long long) +@@ -808,10 +808,12 @@ AC_CHECK_SIZEOF(unsigned long long) AC_CHECK_SIZEOF(unsigned long) AC_CHECK_SIZEOF(unsigned __int128) diff --git a/gdb-libexec-add-index.patch b/gdb-libexec-add-index.patch index 7856866c5ec164078d1e627f85016d5def997f3f..19f6b5489a21ab67a96acdbaf0b9b25326a5400c 100644 --- a/gdb-libexec-add-index.patch +++ b/gdb-libexec-add-index.patch @@ -4,19 +4,33 @@ Date: Fri, 27 Oct 2017 21:07:50 +0200 Subject: gdb-libexec-add-index.patch ;; Fix gdb-headless /usr/bin/ executables (BZ 1390251). +;; +;; Also, make /usr/bin/gdb.minimal be the default GDB used, if it's +;; present. For rationale, see: +;; +;; https://fedoraproject.org/wiki/Changes/Minimal_GDB_in_buildroot ;;=fedora diff --git a/gdb/contrib/gdb-add-index.sh b/gdb/contrib/gdb-add-index.sh --- a/gdb/contrib/gdb-add-index.sh +++ b/gdb/contrib/gdb-add-index.sh -@@ -21,6 +21,11 @@ - GDB=${GDB:=gdb} +@@ -22,6 +22,20 @@ GDB=${GDB:=gdb} OBJCOPY=${OBJCOPY:=objcopy} + READELF=${READELF:=readelf} +GDB2=/usr/libexec/gdb +if test -x $GDB2 && ! which $GDB &>/dev/null; then + GDB=$GDB2 +fi ++ ++# We default to using /usr/bin/gdb.minimal if it's present. See ++# https://bugzilla.redhat.com/show_bug.cgi?id=1695015 and ++# https://fedoraproject.org/wiki/Changes/Minimal_GDB_in_buildroot for ++# explanations. ++GDB3=/usr/bin/gdb.minimal ++if test -x $GDB3; then ++ GDB=$GDB3 ++fi + myname="${0##*/}" diff --git a/gdb-linux_perf-bundle.patch b/gdb-linux_perf-bundle.patch index c7533f7c224af64a630a2def6d0fd8182260a4f6..db9e7c87ab95c024bfb48f324a402f57c6775392 100644 --- a/gdb-linux_perf-bundle.patch +++ b/gdb-linux_perf-bundle.patch @@ -9,7 +9,7 @@ Subject: gdb-linux_perf-bundle.patch diff --git a/gdb/configure b/gdb/configure --- a/gdb/configure +++ b/gdb/configure -@@ -12059,7 +12059,7 @@ else +@@ -11905,7 +11905,7 @@ else #include #ifndef PERF_ATTR_SIZE_VER5 @@ -21,7 +21,7 @@ diff --git a/gdb/configure b/gdb/configure diff --git a/gdb/configure.ac b/gdb/configure.ac --- a/gdb/configure.ac +++ b/gdb/configure.ac -@@ -1477,7 +1477,7 @@ else +@@ -1414,7 +1414,7 @@ else AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ #include #ifndef PERF_ATTR_SIZE_VER5 @@ -56,7 +56,7 @@ diff --git a/gdb/gdb.c b/gdb/gdb.c 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 @@ +@@ -27,6 +27,177 @@ # include #endif diff --git a/gdb-ltofix.patch b/gdb-ltofix.patch new file mode 100644 index 0000000000000000000000000000000000000000..e30f6f8fecfa3527cdca4ccd12bc1dc7bff71cb0 --- /dev/null +++ b/gdb-ltofix.patch @@ -0,0 +1,12 @@ +diff -Nrup a/gdb/gdbserver/ax.c b/gdb/gdbserver/ax.c +--- a/gdb/gdbserver/ax.c 2019-11-18 18:49:19.000000000 -0700 ++++ b/gdb/gdbserver/ax.c 2019-12-19 21:30:19.512505411 -0700 +@@ -25,7 +25,7 @@ + static void ax_vdebug (const char *, ...) ATTRIBUTE_PRINTF (1, 2); + + #ifdef IN_PROCESS_AGENT +-int debug_agent = 0; ++bool debug_agent = 0; + #endif + + static void diff --git a/gdb-moribund-utrace-workaround.patch b/gdb-moribund-utrace-workaround.patch index f41e4fbdf4d09df35ef7eb11a50d835d08f48f73..f2da8725f3b55ef281ef03b4c4c0b7df1026c1b2 100644 --- a/gdb-moribund-utrace-workaround.patch +++ b/gdb-moribund-utrace-workaround.patch @@ -14,7 +14,7 @@ Bug in FSF GDB exploited by the ptrace-on-utrace interaction. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c -@@ -12016,6 +12016,8 @@ update_global_location_list (enum ugll_insert_mode insert_mode) +@@ -11904,6 +11904,8 @@ update_global_location_list (enum ugll_insert_mode insert_mode) traps we can no longer explain. */ old_loc->events_till_retirement = 3 * (thread_count () + 1); @@ -22,4 +22,4 @@ diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c + old_loc->events_till_retirement *= 10; old_loc->owner = NULL; - VEC_safe_push (bp_location_p, moribund_locations, old_loc); + moribund_locations.push_back (old_loc); diff --git a/gdb-python-gil.patch b/gdb-python-gil.patch deleted file mode 100644 index 9ff2e45c7ca5bb400aec1abd413dd0f2dc5474e8..0000000000000000000000000000000000000000 --- a/gdb-python-gil.patch +++ /dev/null @@ -1,241 +0,0 @@ -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-python-gil.patch - -;; Fix Python GIL with gdb.execute("continue") (Phil Muldoon, BZ 1116957). -;;=push - -diff --git a/gdb/doc/python.texi b/gdb/doc/python.texi ---- a/gdb/doc/python.texi -+++ b/gdb/doc/python.texi -@@ -232,6 +232,14 @@ returned as a string. The default is @code{False}, in which case the - return value is @code{None}. If @var{to_string} is @code{True}, the - @value{GDBN} virtual terminal will be temporarily set to unlimited width - and height, and its pagination will be disabled; @pxref{Screen Size}. -+ -+The @var{release_gil} flag specifies whether @value{GDBN} ought to -+release the Python GIL before executing the command. This is useful -+in multi-threaded Python programs where by default the Python -+interpreter will acquire the GIL and lock other threads from -+executing. After the command has completed executing in @value{GDBN} -+the Python GIL is reacquired. This flag must be a boolean value. If -+omitted, it defaults to @code{False}. - @end defun - - @findex gdb.breakpoints -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 -@@ -148,6 +148,8 @@ typedef int Py_ssize_t; - #define PyGILState_Release(ARG) ((void)(ARG)) - #define PyEval_InitThreads() - #define PyThreadState_Swap(ARG) ((void)(ARG)) -+#define PyEval_SaveThread() ((void)(ARG)) -+#define PyEval_RestoreThread(ARG) ((void)(ARG)) - #define PyEval_ReleaseLock() - #endif - -diff --git a/gdb/python/python.c b/gdb/python/python.c ---- a/gdb/python/python.c -+++ b/gdb/python/python.c -@@ -556,12 +556,16 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) - { - const char *arg; - PyObject *from_tty_obj = NULL, *to_string_obj = NULL; -- int from_tty, to_string; -- static const char *keywords[] = { "command", "from_tty", "to_string", NULL }; -+ int from_tty, to_string, release_gil; -+ static const char *keywords[] = {"command", "from_tty", "to_string", "release_gil", NULL }; -+ PyObject *release_gil_obj = NULL; -+ /* Initialize it just to avoid a GCC false warning. */ -+ PyThreadState *state = NULL; - -- if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|O!O!", keywords, &arg, -+ if (!gdb_PyArg_ParseTupleAndKeywords (args, kw, "s|O!O!O!", keywords, &arg, - &PyBool_Type, &from_tty_obj, -- &PyBool_Type, &to_string_obj)) -+ &PyBool_Type, &to_string_obj, -+ &PyBool_Type, &release_gil_obj)) - return NULL; - - from_tty = 0; -@@ -582,6 +586,15 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) - to_string = cmp; - } - -+ release_gil = 0; -+ if (release_gil_obj) -+ { -+ int cmp = PyObject_IsTrue (release_gil_obj); -+ if (cmp < 0) -+ return NULL; -+ release_gil = cmp; -+ } -+ - std::string to_string_res; - - TRY -@@ -602,6 +615,13 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) - - counted_command_line lines = read_command_lines_1 (reader, 1, nullptr); - -+ /* In the case of long running GDB commands, allow the user to -+ release the Python GIL acquired by Python. Restore the GIL -+ after the command has completed before handing back to -+ Python. */ -+ if (release_gil) -+ state = PyEval_SaveThread(); -+ - scoped_restore save_async = make_scoped_restore (¤t_ui->async, 0); - - scoped_restore save_uiout = make_scoped_restore (¤t_uiout); -@@ -617,10 +637,22 @@ execute_gdb_command (PyObject *self, PyObject *args, PyObject *kw) - from_tty); - else - execute_control_commands (lines.get (), from_tty); -+ -+ /* Reacquire the GIL if it was released earlier. */ -+ if (release_gil) -+ PyEval_RestoreThread (state); - } - CATCH (except, RETURN_MASK_ALL) - { -- GDB_PY_HANDLE_EXCEPTION (except); -+ if (except.reason < 0) -+ { -+ /* Reacquire the GIL if it was released earlier. */ -+ if (release_gil) -+ PyEval_RestoreThread (state); -+ -+ gdbpy_convert_exception (except); -+ return NULL; -+ } - } - END_CATCH - -diff --git a/gdb/testsuite/gdb.python/py-gil-mthread.c b/gdb/testsuite/gdb.python/py-gil-mthread.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.python/py-gil-mthread.c -@@ -0,0 +1,13 @@ -+#include -+#include -+ -+int -+main (void) -+{ -+ int i; -+ for (i = 0; i < 10; i++) -+ { -+ sleep (1); /* break-here */ -+ printf ("Sleeping %d\n", i); -+ } -+} -diff --git a/gdb/testsuite/gdb.python/py-gil-mthread.exp b/gdb/testsuite/gdb.python/py-gil-mthread.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.python/py-gil-mthread.exp -@@ -0,0 +1,69 @@ -+# 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 . -+ -+standard_testfile .c .py -+set executable $testfile -+ -+if { [prepare_for_testing $testfile.exp $executable $srcfile] } { -+ return -1 -+} -+ -+# Skip all tests if Python scripting is not enabled. -+if { [skip_python_tests] } { continue } -+ -+if ![runto_main] { -+ return -1 -+} -+ -+gdb_breakpoint $srcfile:[gdb_get_line_number "break-here"] temporary -+gdb_continue_to_breakpoint "break-here" ".* break-here .*" -+ -+set test "response" -+set timeout 60 -+set sleeping_last -1 -+set hello_last 0 -+set minimal 5 -+gdb_test_multiple "python exec (open ('$srcdir/$subdir/$srcfile2').read ())" $test { -+ -re "Error: unable to start thread\r\n" { -+ fail $test -+ # Not $gdb_prompt-synced! -+ } -+ -re "Sleeping (\[0-9\]+)\r\n" { -+ set n $expect_out(1,string) -+ if { $sleeping_last + 1 != $n } { -+ fail $test -+ } else { -+ set sleeping_last $n -+ if { $sleeping_last >= $minimal && $hello_last >= $minimal } { -+ pass $test -+ } else { -+ exp_continue -+ } -+ } -+ } -+ -re "Hello \\( (\[0-9\]+) \\)\r\n" { -+ set n $expect_out(1,string) -+ if { $hello_last + 1 != $n } { -+ fail $test -+ } else { -+ set hello_last $n -+ if { $sleeping_last >= $minimal && $hello_last >= $minimal } { -+ pass $test -+ } else { -+ exp_continue -+ } -+ } -+ } -+} -diff --git a/gdb/testsuite/gdb.python/py-gil-mthread.py b/gdb/testsuite/gdb.python/py-gil-mthread.py -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.python/py-gil-mthread.py -@@ -0,0 +1,28 @@ -+try: -+ import thread -+except: -+ import _thread -+import time -+import gdb -+ -+# Define a function for the thread -+def print_thread_hello(): -+ count = 0 -+ while count < 10: -+ time.sleep(1) -+ count += 1 -+ print ("Hello ( %d )" % count) -+ -+# Create a threads a continue -+try: -+ thread.start_new_thread (print_thread_hello, ()) -+ gdb.execute ("continue", release_gil=True) -+except: -+ try: -+ _thread.start_new_thread (print_thread_hello, ()) -+ gdb.execute ("continue", release_gil=True) -+ except: -+ print ("Error: unable to start thread") -+ -+while 1: -+ pass diff --git a/gdb-readline62-ask-more-rh.patch b/gdb-readline62-ask-more-rh.patch deleted file mode 100644 index a1f1171dcde59f159e8c045e3fe4bb6991ec0041..0000000000000000000000000000000000000000 --- a/gdb-readline62-ask-more-rh.patch +++ /dev/null @@ -1,25 +0,0 @@ -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-readline62-ask-more-rh.patch - -;; Work around readline-6.2 incompatibility not asking for --more-- (BZ 701131). -;;=fedora - -diff --git a/gdb/event-top.c b/gdb/event-top.c ---- a/gdb/event-top.c -+++ b/gdb/event-top.c -@@ -1183,6 +1183,13 @@ gdb_setup_readline (int editing) - { - struct ui *ui = current_ui; - -+#ifdef NEED_RL_STATE_FEDORA_GDB -+ /* 6.2 regression: no longed asks for --more-- -+ gdb.base/readline-ask.exp -+ https://bugzilla.redhat.com/show_bug.cgi?id=701131 */ -+ RL_SETSTATE (RL_STATE_FEDORA_GDB); -+#endif -+ - /* This function is a noop for the sync case. The assumption is - that the sync setup is ALL done in gdb_init, and we would only - mess it up here. The sync stuff should really go away over diff --git a/gdb-rhbz1187581-power8-regs-1of7.patch b/gdb-rhbz1187581-power8-regs-1of7.patch deleted file mode 100644 index 29bd7985d01bc3321a58d3fb728e9a463e0791b2..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-1of7.patch +++ /dev/null @@ -1,65 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jan Kratochvil -Date: Thu, 9 Aug 2018 17:09:48 +0200 -Subject: gdb-rhbz1187581-power8-regs-1of7.patch - -;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). - -commit 05abfc39c719e740530000059bb963ad33462479 -Author: Pedro Franco de Carvalho -Date: Mon Aug 6 16:24:55 2018 -0300 - - Fix indentation in remote_target::download_tracepoint - - gdb/ChangeLog: - 2018-08-06 Pedro Franco de Carvalho - - * remote.c (remote_target::download_tracepoint): Fix indentation - in for block. - -diff --git a/gdb/remote.c b/gdb/remote.c ---- a/gdb/remote.c -+++ b/gdb/remote.c -@@ -12912,24 +12912,24 @@ remote_target::download_tracepoint (struct bp_location *loc) - error (_("Error on target while setting tracepoints.")); - } - -- for (auto action_it = stepping_actions.begin (); -- action_it != stepping_actions.end (); action_it++) -- { -- QUIT; /* Allow user to bail out with ^C. */ -- -- bool is_first = action_it == stepping_actions.begin (); -- bool has_more = action_it != stepping_actions.end (); -- -- xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%s%s", -- b->number, addrbuf, /* address */ -- is_first ? "S" : "", -- action_it->c_str (), -- has_more ? "-" : ""); -- putpkt (buf); -- remote_get_noisy_reply (); -- if (strcmp (rs->buf, "OK")) -- error (_("Error on target while setting tracepoints.")); -- } -+ for (auto action_it = stepping_actions.begin (); -+ action_it != stepping_actions.end (); action_it++) -+ { -+ QUIT; /* Allow user to bail out with ^C. */ -+ -+ bool is_first = action_it == stepping_actions.begin (); -+ bool has_more = action_it != stepping_actions.end (); -+ -+ xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%s%s", -+ b->number, addrbuf, /* address */ -+ is_first ? "S" : "", -+ action_it->c_str (), -+ has_more ? "-" : ""); -+ putpkt (buf); -+ remote_get_noisy_reply (); -+ if (strcmp (rs->buf, "OK")) -+ error (_("Error on target while setting tracepoints.")); -+ } - - if (packet_support (PACKET_TracepointSource) == PACKET_ENABLE) - { diff --git a/gdb-rhbz1187581-power8-regs-2of7.patch b/gdb-rhbz1187581-power8-regs-2of7.patch deleted file mode 100644 index b0d42cd7fbfa7b85ea777bcbd3fc0af98d24dc63..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-2of7.patch +++ /dev/null @@ -1,45 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jan Kratochvil -Date: Thu, 9 Aug 2018 17:10:46 +0200 -Subject: gdb-rhbz1187581-power8-regs-2of7.patch - -;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). - -commit aa6f3694ce867884e43d1c0406c64df08ea24bd3 -Author: Pedro Franco de Carvalho -Date: Mon Aug 6 16:24:55 2018 -0300 - - Remove trailing '-' from the last QTDP action packet - - The has_more predicate in remote_target::download_tracepoint always - evaluates to true, so the last action packet will be sent with a - trailing '-'. This patch changes the predicate to remove the last - trailing '-'. - - gdb/ChangeLog: - 2018-08-06 Pedro Franco de Carvalho - - * remote.c (remote_target::download_tracepoint): Fix the has_more - predicate in the QTDP action list iteration. - -diff --git a/gdb/remote.c b/gdb/remote.c ---- a/gdb/remote.c -+++ b/gdb/remote.c -@@ -12899,7 +12899,7 @@ remote_target::download_tracepoint (struct bp_location *loc) - { - QUIT; /* Allow user to bail out with ^C. */ - -- bool has_more = (action_it != tdp_actions.end () -+ bool has_more = ((action_it + 1) != tdp_actions.end () - || !stepping_actions.empty ()); - - xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%c", -@@ -12918,7 +12918,7 @@ remote_target::download_tracepoint (struct bp_location *loc) - QUIT; /* Allow user to bail out with ^C. */ - - bool is_first = action_it == stepping_actions.begin (); -- bool has_more = action_it != stepping_actions.end (); -+ bool has_more = (action_it + 1) != stepping_actions.end (); - - xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%s%s", - b->number, addrbuf, /* address */ diff --git a/gdb-rhbz1187581-power8-regs-3of7.patch b/gdb-rhbz1187581-power8-regs-3of7.patch deleted file mode 100644 index 5546f2b963297c9eb8937ea10dbbd2c789c4dcc7..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-3of7.patch +++ /dev/null @@ -1,258 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jan Kratochvil -Date: Thu, 9 Aug 2018 17:11:09 +0200 -Subject: gdb-rhbz1187581-power8-regs-3of7.patch - -;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). - -commit 3df3a985a475db004706d64f83d9085f99053611 -Author: Pedro Franco de Carvalho -Date: Mon Aug 6 16:24:55 2018 -0300 - - Use get_remote_packet_size in download_tracepoint - - This patch changes the remote target to use the remote packet size to - build QTDP packets, and to check if there is enough room for the - packet. - - I changed the function to raise an error if the packet is too small, - instead of aborting gdb (through xsnprintf). It isn't clear if gdb - will be in a consistent state with respect to the stub after this, - since it's possible that some packets will be sent but not others, and - there could be an incomplete tracepoint on the stub. - - The char array used to build the packets is changed to a - gdb::char_vector and sized with the result from - get_remote_packet_size. - - When checking if the buffer is large enough to hold the tracepoint - condition agent expression, the length of the expression is multiplied - by two, since it is encoded with two hex digits per expression - byte. For simplicity, I assume that the result won't overflow, which - can happen for very long condition expressions. - - gdb/ChangeLog: - 2018-08-06 Pedro Franco de Carvalho - - * remote.c (remote_target::download_tracepoint): Remove BUF_SIZE. - Replace array buf with gdb::char_vector buf, of size - get_remote_packet_size (). Replace references to buf and - BUF_SIZE to buf.data () and buf.size (). Replace strcpy, strcat - and xsnprintf with snprintf. Raise errors if the buffer is too - small. - -diff --git a/gdb/remote.c b/gdb/remote.c ---- a/gdb/remote.c -+++ b/gdb/remote.c -@@ -12799,26 +12799,35 @@ remote_target::remote_download_command_source (int num, ULONGEST addr, - void - remote_target::download_tracepoint (struct bp_location *loc) - { --#define BUF_SIZE 2048 -- - CORE_ADDR tpaddr; - char addrbuf[40]; -- char buf[BUF_SIZE]; - std::vector tdp_actions; - std::vector stepping_actions; - char *pkt; - struct breakpoint *b = loc->owner; - struct tracepoint *t = (struct tracepoint *) b; - struct remote_state *rs = get_remote_state (); -+ int ret; -+ char *err_msg = _("Tracepoint packet too large for target."); -+ size_t size_left; -+ -+ /* We use a buffer other than rs->buf because we'll build strings -+ across multiple statements, and other statements in between could -+ modify rs->buf. */ -+ gdb::char_vector buf (get_remote_packet_size ()); - - encode_actions_rsp (loc, &tdp_actions, &stepping_actions); - - tpaddr = loc->address; - sprintf_vma (addrbuf, tpaddr); -- xsnprintf (buf, BUF_SIZE, "QTDP:%x:%s:%c:%lx:%x", b->number, -- addrbuf, /* address */ -- (b->enable_state == bp_enabled ? 'E' : 'D'), -- t->step_count, t->pass_count); -+ ret = snprintf (buf.data (), buf.size (), "QTDP:%x:%s:%c:%lx:%x", -+ b->number, addrbuf, /* address */ -+ (b->enable_state == bp_enabled ? 'E' : 'D'), -+ t->step_count, t->pass_count); -+ -+ if (ret < 0 || ret >= buf.size ()) -+ error (err_msg); -+ - /* Fast tracepoints are mostly handled by the target, but we can - tell the target how big of an instruction block should be moved - around. */ -@@ -12830,8 +12839,15 @@ remote_target::download_tracepoint (struct bp_location *loc) - { - if (gdbarch_fast_tracepoint_valid_at (loc->gdbarch, tpaddr, - NULL)) -- xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":F%x", -- gdb_insn_length (loc->gdbarch, tpaddr)); -+ { -+ size_left = buf.size () - strlen (buf.data ()); -+ ret = snprintf (buf.data () + strlen (buf.data ()), -+ size_left, ":F%x", -+ gdb_insn_length (loc->gdbarch, tpaddr)); -+ -+ if (ret < 0 || ret >= size_left) -+ error (err_msg); -+ } - else - /* If it passed validation at definition but fails now, - something is very wrong. */ -@@ -12855,7 +12871,14 @@ remote_target::download_tracepoint (struct bp_location *loc) - struct static_tracepoint_marker marker; - - if (target_static_tracepoint_marker_at (tpaddr, &marker)) -- strcat (buf, ":S"); -+ { -+ size_left = buf.size () - strlen (buf.data ()); -+ ret = snprintf (buf.data () + strlen (buf.data ()), -+ size_left, ":S"); -+ -+ if (ret < 0 || ret >= size_left) -+ error (err_msg); -+ } - else - error (_("Static tracepoint not valid during download")); - } -@@ -12873,10 +12896,26 @@ remote_target::download_tracepoint (struct bp_location *loc) - capabilities at definition time. */ - if (remote_supports_cond_tracepoints ()) - { -- agent_expr_up aexpr = gen_eval_for_expr (tpaddr, loc->cond.get ()); -- xsnprintf (buf + strlen (buf), BUF_SIZE - strlen (buf), ":X%x,", -- aexpr->len); -- pkt = buf + strlen (buf); -+ agent_expr_up aexpr = gen_eval_for_expr (tpaddr, -+ loc->cond.get ()); -+ -+ size_left = buf.size () - strlen (buf.data ()); -+ -+ ret = snprintf (buf.data () + strlen (buf.data ()), -+ size_left, ":X%x,", aexpr->len); -+ -+ if (ret < 0 || ret >= size_left) -+ error (err_msg); -+ -+ size_left = buf.size () - strlen (buf.data ()); -+ -+ /* Two bytes to encode each aexpr byte, plus the terminating -+ null byte. */ -+ if (aexpr->len * 2 + 1 > size_left) -+ error (err_msg); -+ -+ pkt = buf.data () + strlen (buf.data ()); -+ - for (int ndx = 0; ndx < aexpr->len; ++ndx) - pkt = pack_hex_byte (pkt, aexpr->buf[ndx]); - *pkt = '\0'; -@@ -12887,8 +12926,17 @@ remote_target::download_tracepoint (struct bp_location *loc) - } - - if (b->commands || *default_collect) -- strcat (buf, "-"); -- putpkt (buf); -+ { -+ size_left = buf.size () - strlen (buf.data ()); -+ -+ ret = snprintf (buf.data () + strlen (buf.data ()), -+ size_left, "-"); -+ -+ if (ret < 0 || ret >= size_left) -+ error (err_msg); -+ } -+ -+ putpkt (buf.data ()); - remote_get_noisy_reply (); - if (strcmp (rs->buf, "OK")) - error (_("Target does not support tracepoints.")); -@@ -12902,11 +12950,15 @@ remote_target::download_tracepoint (struct bp_location *loc) - bool has_more = ((action_it + 1) != tdp_actions.end () - || !stepping_actions.empty ()); - -- xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%c", -- b->number, addrbuf, /* address */ -- action_it->c_str (), -- has_more ? '-' : 0); -- putpkt (buf); -+ ret = snprintf (buf.data (), buf.size (), "QTDP:-%x:%s:%s%c", -+ b->number, addrbuf, /* address */ -+ action_it->c_str (), -+ has_more ? '-' : 0); -+ -+ if (ret < 0 || ret >= buf.size ()) -+ error (err_msg); -+ -+ putpkt (buf.data ()); - remote_get_noisy_reply (); - if (strcmp (rs->buf, "OK")) - error (_("Error on target while setting tracepoints.")); -@@ -12920,12 +12972,16 @@ remote_target::download_tracepoint (struct bp_location *loc) - bool is_first = action_it == stepping_actions.begin (); - bool has_more = (action_it + 1) != stepping_actions.end (); - -- xsnprintf (buf, BUF_SIZE, "QTDP:-%x:%s:%s%s%s", -- b->number, addrbuf, /* address */ -- is_first ? "S" : "", -- action_it->c_str (), -- has_more ? "-" : ""); -- putpkt (buf); -+ ret = snprintf (buf.data (), buf.size (), "QTDP:-%x:%s:%s%s%s", -+ b->number, addrbuf, /* address */ -+ is_first ? "S" : "", -+ action_it->c_str (), -+ has_more ? "-" : ""); -+ -+ if (ret < 0 || ret >= buf.size ()) -+ error (err_msg); -+ -+ putpkt (buf.data ()); - remote_get_noisy_reply (); - if (strcmp (rs->buf, "OK")) - error (_("Error on target while setting tracepoints.")); -@@ -12935,22 +12991,32 @@ remote_target::download_tracepoint (struct bp_location *loc) - { - if (b->location != NULL) - { -- strcpy (buf, "QTDPsrc:"); -+ ret = snprintf (buf.data (), buf.size (), "QTDPsrc:"); -+ -+ if (ret < 0 || ret >= buf.size ()) -+ error (err_msg); -+ - encode_source_string (b->number, loc->address, "at", - event_location_to_string (b->location.get ()), -- buf + strlen (buf), 2048 - strlen (buf)); -- putpkt (buf); -+ buf.data () + strlen (buf.data ()), -+ buf.size () - strlen (buf.data ())); -+ putpkt (buf.data ()); - remote_get_noisy_reply (); - if (strcmp (rs->buf, "OK")) - warning (_("Target does not support source download.")); - } - if (b->cond_string) - { -- strcpy (buf, "QTDPsrc:"); -+ ret = snprintf (buf.data (), buf.size (), "QTDPsrc:"); -+ -+ if (ret < 0 || ret >= buf.size ()) -+ error (err_msg); -+ - encode_source_string (b->number, loc->address, -- "cond", b->cond_string, buf + strlen (buf), -- 2048 - strlen (buf)); -- putpkt (buf); -+ "cond", b->cond_string, -+ buf.data () + strlen (buf.data ()), -+ buf.size () - strlen (buf.data ())); -+ putpkt (buf.data ()); - remote_get_noisy_reply (); - if (strcmp (rs->buf, "OK")) - warning (_("Target does not support source download.")); diff --git a/gdb-rhbz1187581-power8-regs-4of7.patch b/gdb-rhbz1187581-power8-regs-4of7.patch deleted file mode 100644 index 8c553a864f737ff25d5631fefe9397bdefa0e19a..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-4of7.patch +++ /dev/null @@ -1,449 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jan Kratochvil -Date: Thu, 9 Aug 2018 17:17:16 +0200 -Subject: gdb-rhbz1187581-power8-regs-4of7.patch - -;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). - -commit 4277c4b87addb5354cc47b98d7a73e44cfaf22c2 -Author: Pedro Franco de Carvalho -Date: Mon Aug 6 16:24:55 2018 -0300 - - Use remote register numbers in tracepoint mask - - Currently, tracepoint register masks in the QTDP packets include both - internal and remote register numbers, as well as pseudo-register - numbers. - - This patch changes this so that the mask only includes remote register - numbers. - - Register numbers from agent expressions are already set in the mask - using remote numbers. Other tracepoint actions used internal numbers, - e.g. "collect $regs" or "collect $". To handle pseudoreg - numbers, an empty agent expression is created and ax_reg_mask is - called for this expression and the pseudoreg. This will cause the ax - to set its mask with the corresponding remote raw register - numbers (using ax_regs_mask, which calls - gdbarch_ax_pseudo_register_collect). - - If ax_regs_mask and gdbarch_ax_pseudo_register_collect also generate - more ax bytecode, the ax is also appended to the collection list. It - isn't clear that this was the original intent for - gdbarch_ax_pseudo_register_collect, and none of the arches seem to do - this, but if this changes in the future, it should work. - - The patch also refactors the code used by validate_action line to - validate axs into a function that is now called from every place that - generates axs. Previously, some parts of tracepoint.c that generated - axs didn't check if the ax length was greater than MAX_AGENT_EXPR_LEN. - - gdb/ChangeLog: - 2018-08-06 Pedro Franco de Carvalho - - * tracepoint.h (class collection_list) : Remove. - : - Declare. - : Add scope parameter. - * tracepoint.c (encode_actions_1): Likewise. - (collection_list::add_register): Rename to ... - (collection_list::add_remote_register): ... this. Update - comment. - (collection_list::add_ax_registers, add_local_register): New - methods. - (collection_list::add_memrange): Add scope parameter. Call - add_local_register instead of add_register. - (finalize_tracepoint_aexpr): New function. - (collection_list::collect_symbol): Update calls to add_memrange. - Call add_local_register instead of add_register. Call - add_ax_registers. Call finalize_tracepoint_aexpr. - (encode_actions_1): Get remote regnos for $reg action. Call - add_remote_register, add_ax_registers, and add_local_register. - Update call to add_memrange. Call finalize_tracepoint_aexpr. - (validate_actionline): Call finalize_tracepoint_aexpr. - -+2018-08-06 Pedro Franco de Carvalho -+ -+ * tracepoint.h (class collection_list) : Remove. -+ : -+ Declare. -+ : Add scope parameter. -+ * tracepoint.c (encode_actions_1): Likewise. -+ (collection_list::add_register): Rename to ... -+ (collection_list::add_remote_register): ... this. Update -+ comment. -+ (collection_list::add_ax_registers, add_local_register): New -+ methods. -+ (collection_list::add_memrange): Add scope parameter. Call -+ add_local_register instead of add_register. -+ (finalize_tracepoint_aexpr): New function. -+ (collection_list::collect_symbol): Update calls to add_memrange. -+ Call add_local_register instead of add_register. Call -+ add_ax_registers. Call finalize_tracepoint_aexpr. -+ (encode_actions_1): Get remote regnos for $reg action. Call -+ add_remote_register, add_ax_registers, and add_local_register. -+ Update call to add_memrange. Call finalize_tracepoint_aexpr. -+ (validate_actionline): Call finalize_tracepoint_aexpr. -+ - 2018-08-06 Pedro Franco de Carvalho - - * remote.c (remote_target::download_tracepoint): Remove BUF_SIZE. - -diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c ---- a/gdb/tracepoint.c -+++ b/gdb/tracepoint.c -@@ -615,6 +615,19 @@ report_agent_reqs_errors (struct agent_expr *aexpr) - error (_("Expression is too complicated.")); - } - -+/* Call ax_reqs on AEXPR and raise an error if something is wrong. */ -+ -+static void -+finalize_tracepoint_aexpr (struct agent_expr *aexpr) -+{ -+ ax_reqs (aexpr); -+ -+ if (aexpr->len > MAX_AGENT_EXPR_LEN) -+ error (_("Expression is too complicated.")); -+ -+ report_agent_reqs_errors (aexpr); -+} -+ - /* worker function */ - void - validate_actionline (const char *line, struct breakpoint *b) -@@ -699,12 +712,7 @@ validate_actionline (const char *line, struct breakpoint *b) - exp.get (), - trace_string); - -- if (aexpr->len > MAX_AGENT_EXPR_LEN) -- error (_("Expression is too complicated.")); -- -- ax_reqs (aexpr.get ()); -- -- report_agent_reqs_errors (aexpr.get ()); -+ finalize_tracepoint_aexpr (aexpr.get ()); - } - } - while (p && *p++ == ','); -@@ -731,11 +739,7 @@ validate_actionline (const char *line, struct breakpoint *b) - long. */ - agent_expr_up aexpr = gen_eval_for_expr (loc->address, exp.get ()); - -- if (aexpr->len > MAX_AGENT_EXPR_LEN) -- error (_("Expression is too complicated.")); -- -- ax_reqs (aexpr.get ()); -- report_agent_reqs_errors (aexpr.get ()); -+ finalize_tracepoint_aexpr (aexpr.get ()); - } - } - while (p && *p++ == ','); -@@ -811,10 +815,10 @@ memrange_sortmerge (std::vector &memranges) - } - } - --/* Add a register to a collection list. */ -+/* Add remote register number REGNO to the collection list mask. */ - - void --collection_list::add_register (unsigned int regno) -+collection_list::add_remote_register (unsigned int regno) - { - if (info_verbose) - printf_filtered ("collect register %d\n", regno); -@@ -824,12 +828,74 @@ collection_list::add_register (unsigned int regno) - m_regs_mask[regno / 8] |= 1 << (regno % 8); - } - -+/* Add all the registers from the mask in AEXPR to the mask in the -+ collection list. Registers in the AEXPR mask are already remote -+ register numbers. */ -+ -+void -+collection_list::add_ax_registers (struct agent_expr *aexpr) -+{ -+ if (aexpr->reg_mask_len > 0) -+ { -+ for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++) -+ { -+ QUIT; /* Allow user to bail out with ^C. */ -+ if (aexpr->reg_mask[ndx1] != 0) -+ { -+ /* Assume chars have 8 bits. */ -+ for (int ndx2 = 0; ndx2 < 8; ndx2++) -+ if (aexpr->reg_mask[ndx1] & (1 << ndx2)) -+ /* It's used -- record it. */ -+ add_remote_register (ndx1 * 8 + ndx2); -+ } -+ } -+ } -+} -+ -+/* If REGNO is raw, add its corresponding remote register number to -+ the mask. If REGNO is a pseudo-register, figure out the necessary -+ registers using a temporary agent expression, and add it to the -+ list if it needs more than just a mask. */ -+ -+void -+collection_list::add_local_register (struct gdbarch *gdbarch, -+ unsigned int regno, -+ CORE_ADDR scope) -+{ -+ if (regno < gdbarch_num_regs (gdbarch)) -+ { -+ int remote_regno = gdbarch_remote_register_number (gdbarch, regno); -+ -+ if (remote_regno < 0) -+ error (_("Can't collect register %d"), regno); -+ -+ add_remote_register (remote_regno); -+ } -+ else -+ { -+ agent_expr_up aexpr (new agent_expr (gdbarch, scope)); -+ -+ ax_reg_mask (aexpr.get (), regno); -+ -+ finalize_tracepoint_aexpr (aexpr.get ()); -+ -+ add_ax_registers (aexpr.get ()); -+ -+ /* Usually ax_reg_mask for a pseudo-regiser only sets the -+ corresponding raw registers in the ax mask, but if this isn't -+ the case add the expression that is generated to the -+ collection list. */ -+ if (aexpr->len > 0) -+ add_aexpr (std::move (aexpr)); -+ } -+} -+ - /* Add a memrange to a collection list. */ - - void - collection_list::add_memrange (struct gdbarch *gdbarch, - int type, bfd_signed_vma base, -- ULONGEST len) -+ ULONGEST len, CORE_ADDR scope) - { - if (info_verbose) - printf_filtered ("(%d,%s,%s)\n", type, paddress (gdbarch, base), pulongest (len)); -@@ -840,7 +906,7 @@ collection_list::add_memrange (struct gdbarch *gdbarch, - m_memranges.emplace_back (type, base, base + len); - - if (type != memrange_absolute) /* Better collect the base register! */ -- add_register (type); -+ add_local_register (gdbarch, type, scope); - } - - /* Add a symbol to a collection list. */ -@@ -882,19 +948,19 @@ collection_list::collect_symbol (struct symbol *sym, - if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT) - treat_as_expr = 1; - else -- add_memrange (gdbarch, memrange_absolute, offset, len); -+ add_memrange (gdbarch, memrange_absolute, offset, len, scope); - break; - case LOC_REGISTER: - reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch); - if (info_verbose) - printf_filtered ("LOC_REG[parm] %s: ", - SYMBOL_PRINT_NAME (sym)); -- add_register (reg); -+ add_local_register (gdbarch, reg, scope); - /* Check for doubles stored in two registers. */ - /* FIXME: how about larger types stored in 3 or more regs? */ - if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT && - len > register_size (gdbarch, reg)) -- add_register (reg + 1); -+ add_local_register (gdbarch, reg + 1, scope); - break; - case LOC_REF_ARG: - printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n"); -@@ -911,7 +977,7 @@ collection_list::collect_symbol (struct symbol *sym, - SYMBOL_PRINT_NAME (sym), pulongest (len), - paddress (gdbarch, offset), reg); - } -- add_memrange (gdbarch, reg, offset, len); -+ add_memrange (gdbarch, reg, offset, len, scope); - break; - case LOC_REGPARM_ADDR: - reg = SYMBOL_VALUE (sym); -@@ -923,7 +989,7 @@ collection_list::collect_symbol (struct symbol *sym, - SYMBOL_PRINT_NAME (sym), pulongest (len), - paddress (gdbarch, offset), reg); - } -- add_memrange (gdbarch, reg, offset, len); -+ add_memrange (gdbarch, reg, offset, len, scope); - break; - case LOC_LOCAL: - reg = frame_regno; -@@ -935,7 +1001,7 @@ collection_list::collect_symbol (struct symbol *sym, - SYMBOL_PRINT_NAME (sym), pulongest (len), - paddress (gdbarch, offset), reg); - } -- add_memrange (gdbarch, reg, offset, len); -+ add_memrange (gdbarch, reg, offset, len, scope); - break; - - case LOC_UNRESOLVED: -@@ -968,26 +1034,10 @@ collection_list::collect_symbol (struct symbol *sym, - return; - } - -- ax_reqs (aexpr.get ()); -- -- report_agent_reqs_errors (aexpr.get ()); -+ finalize_tracepoint_aexpr (aexpr.get ()); - - /* Take care of the registers. */ -- if (aexpr->reg_mask_len > 0) -- { -- for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++) -- { -- QUIT; /* Allow user to bail out with ^C. */ -- if (aexpr->reg_mask[ndx1] != 0) -- { -- /* Assume chars have 8 bits. */ -- for (int ndx2 = 0; ndx2 < 8; ndx2++) -- if (aexpr->reg_mask[ndx1] & (1 << ndx2)) -- /* It's used -- record it. */ -- add_register (ndx1 * 8 + ndx2); -- } -- } -- } -+ add_ax_registers (aexpr.get ()); - - add_aexpr (std::move (aexpr)); - } -@@ -1257,8 +1307,18 @@ encode_actions_1 (struct command_line *action, - - if (0 == strncasecmp ("$reg", action_exp, 4)) - { -- for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++) -- collect->add_register (i); -+ for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); -+ i++) -+ { -+ int remote_regno = (gdbarch_remote_register_number -+ (target_gdbarch (), i)); -+ -+ /* Ignore arch regnos without a corresponding -+ remote regno. This can happen for regnos not -+ in the tdesc. */ -+ if (remote_regno >= 0) -+ collect->add_remote_register (remote_regno); -+ } - action_exp = strchr (action_exp, ','); /* more? */ - } - else if (0 == strncasecmp ("$arg", action_exp, 4)) -@@ -1288,27 +1348,10 @@ encode_actions_1 (struct command_line *action, - target_gdbarch (), - trace_string); - -- ax_reqs (aexpr.get ()); -- report_agent_reqs_errors (aexpr.get ()); -+ finalize_tracepoint_aexpr (aexpr.get ()); - - /* take care of the registers */ -- if (aexpr->reg_mask_len > 0) -- { -- for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++) -- { -- QUIT; /* allow user to bail out with ^C */ -- if (aexpr->reg_mask[ndx1] != 0) -- { -- /* assume chars have 8 bits */ -- for (int ndx2 = 0; ndx2 < 8; ndx2++) -- if (aexpr->reg_mask[ndx1] & (1 << ndx2)) -- { -- /* It's used -- record it. */ -- collect->add_register (ndx1 * 8 + ndx2); -- } -- } -- } -- } -+ collect->add_ax_registers (aexpr.get ()); - - collect->add_aexpr (std::move (aexpr)); - action_exp = strchr (action_exp, ','); /* more? */ -@@ -1340,7 +1383,8 @@ encode_actions_1 (struct command_line *action, - name); - if (info_verbose) - printf_filtered ("OP_REGISTER: "); -- collect->add_register (i); -+ collect->add_local_register (target_gdbarch (), -+ i, tloc->address); - break; - } - -@@ -1352,7 +1396,8 @@ encode_actions_1 (struct command_line *action, - check_typedef (exp->elts[1].type); - collect->add_memrange (target_gdbarch (), - memrange_absolute, addr, -- TYPE_LENGTH (exp->elts[1].type)); -+ TYPE_LENGTH (exp->elts[1].type), -+ tloc->address); - collect->append_exp (exp.get ()); - break; - -@@ -1376,28 +1421,10 @@ encode_actions_1 (struct command_line *action, - exp.get (), - trace_string); - -- ax_reqs (aexpr.get ()); -- -- report_agent_reqs_errors (aexpr.get ()); -+ finalize_tracepoint_aexpr (aexpr.get ()); - - /* Take care of the registers. */ -- if (aexpr->reg_mask_len > 0) -- { -- for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++) -- { -- QUIT; /* Allow user to bail out with ^C. */ -- if (aexpr->reg_mask[ndx1] != 0) -- { -- /* Assume chars have 8 bits. */ -- for (int ndx2 = 0; ndx2 < 8; ndx2++) -- if (aexpr->reg_mask[ndx1] & (1 << ndx2)) -- { -- /* It's used -- record it. */ -- collect->add_register (ndx1 * 8 + ndx2); -- } -- } -- } -- } -+ collect->add_ax_registers (aexpr.get ()); - - collect->add_aexpr (std::move (aexpr)); - collect->append_exp (exp.get ()); -@@ -1422,8 +1449,7 @@ encode_actions_1 (struct command_line *action, - agent_expr_up aexpr = gen_eval_for_expr (tloc->address, - exp.get ()); - -- ax_reqs (aexpr.get ()); -- report_agent_reqs_errors (aexpr.get ()); -+ finalize_tracepoint_aexpr (aexpr.get ()); - - /* Even though we're not officially collecting, add - to the collect list anyway. */ -diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h ---- a/gdb/tracepoint.h -+++ b/gdb/tracepoint.h -@@ -263,9 +263,14 @@ public: - void add_aexpr (agent_expr_up aexpr); - - void add_register (unsigned int regno); -+ void add_remote_register (unsigned int regno); -+ void add_ax_registers (struct agent_expr *aexpr); -+ void add_local_register (struct gdbarch *gdbarch, -+ unsigned int regno, -+ CORE_ADDR scope); - void add_memrange (struct gdbarch *gdbarch, - int type, bfd_signed_vma base, -- ULONGEST len); -+ ULONGEST len, CORE_ADDR scope); - void collect_symbol (struct symbol *sym, - struct gdbarch *gdbarch, - long frame_regno, long frame_offset, diff --git a/gdb-rhbz1187581-power8-regs-5of7.patch b/gdb-rhbz1187581-power8-regs-5of7.patch deleted file mode 100644 index eaca52f7351a1257268562f9262f28687a9e25ac..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-5of7.patch +++ /dev/null @@ -1,215 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jan Kratochvil -Date: Thu, 9 Aug 2018 17:17:46 +0200 -Subject: gdb-rhbz1187581-power8-regs-5of7.patch - -;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). - -commit a04b9d62a234923826e431a209d396a628661548 -Author: Pedro Franco de Carvalho -Date: Mon Aug 6 16:24:55 2018 -0300 - - Variable size for regs mask in collection list - - This patch changes collection_list to allow larger register masks. - - The mask is changed from an array to a vector and is initialized to - hold the maximum possible remote register number. The stringify - method is updated to resize temp_buf if needed. - - gdb/ChangeLog: - 2018-08-06 Pedro Franco de Carvalho - - * tracepoint.h (collection_list) : Change type to - std::vector. - * tracepoint.c (collection_list::collection_list): Remove - m_regs_mask initializer from initializer list. Resize - m_regs_mask using the largest remote register number. - (collection_list::add_remote_register): Remove size check on - m_regs_mask. Use at to access element. - (collection_list::stringify): Change type of temp_buf to - gdb::char_vector. Update uses of temp_buf. Resize if needed to - stringify the register mask. Use pack_hex_byte for the register - mask. - -+2018-08-06 Pedro Franco de Carvalho -+ -+ * tracepoint.h (collection_list) : Change type to -+ std::vector. -+ * tracepoint.c (collection_list::collection_list): Remove -+ m_regs_mask initializer from initializer list. Resize -+ m_regs_mask using the largest remote register number. -+ (collection_list::add_remote_register): Remove size check on -+ m_regs_mask. Use at to access element. -+ (collection_list::stringify): Change type of temp_buf to -+ gdb::char_vector. Update uses of temp_buf. Resize if needed to -+ stringify the register mask. Use pack_hex_byte for the register -+ mask. -+ - 2018-08-06 Pedro Franco de Carvalho - - * tracepoint.h (class collection_list) : Remove. - -diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c ---- a/gdb/tracepoint.c -+++ b/gdb/tracepoint.c -@@ -822,10 +822,8 @@ collection_list::add_remote_register (unsigned int regno) - { - if (info_verbose) - printf_filtered ("collect register %d\n", regno); -- if (regno >= (8 * sizeof (m_regs_mask))) -- error (_("Internal: register number %d too large for tracepoint"), -- regno); -- m_regs_mask[regno / 8] |= 1 << (regno % 8); -+ -+ m_regs_mask.at (regno / 8) |= 1 << (regno % 8); - } - - /* Add all the registers from the mask in AEXPR to the mask in the -@@ -1136,9 +1134,20 @@ collection_list::add_static_trace_data () - } - - collection_list::collection_list () -- : m_regs_mask (), -- m_strace_data (false) -+ : m_strace_data (false) - { -+ int max_remote_regno = 0; -+ for (int i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++) -+ { -+ int remote_regno = (gdbarch_remote_register_number -+ (target_gdbarch (), i)); -+ -+ if (remote_regno >= 0 && remote_regno > max_remote_regno) -+ max_remote_regno = remote_regno; -+ } -+ -+ m_regs_mask.resize ((max_remote_regno / 8) + 1); -+ - m_memranges.reserve (128); - m_aexprs.reserve (128); - } -@@ -1148,7 +1157,8 @@ collection_list::collection_list () - std::vector - collection_list::stringify () - { -- char temp_buf[2048]; -+ gdb::char_vector temp_buf (2048); -+ - int count; - char *end; - long i; -@@ -1158,35 +1168,45 @@ collection_list::stringify () - { - if (info_verbose) - printf_filtered ("\nCollecting static trace data\n"); -- end = temp_buf; -+ end = temp_buf.data (); - *end++ = 'L'; -- str_list.emplace_back (temp_buf, end - temp_buf); -+ str_list.emplace_back (temp_buf.data (), end - temp_buf.data ()); - } - -- for (i = sizeof (m_regs_mask) - 1; i > 0; i--) -+ for (i = m_regs_mask.size () - 1; i > 0; i--) - if (m_regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */ - break; - if (m_regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */ - { - if (info_verbose) - printf_filtered ("\nCollecting registers (mask): 0x"); -- end = temp_buf; -+ -+ /* One char for 'R', one for the null terminator and two per -+ mask byte. */ -+ std::size_t new_size = (i + 1) * 2 + 2; -+ if (new_size > temp_buf.size ()) -+ temp_buf.resize (new_size); -+ -+ end = temp_buf.data (); - *end++ = 'R'; - for (; i >= 0; i--) - { - QUIT; /* Allow user to bail out with ^C. */ - if (info_verbose) - printf_filtered ("%02X", m_regs_mask[i]); -- sprintf (end, "%02X", m_regs_mask[i]); -- end += 2; -+ -+ end = pack_hex_byte (end, m_regs_mask[i]); - } -- str_list.emplace_back (temp_buf); -+ *end = '\0'; -+ -+ str_list.emplace_back (temp_buf.data ()); - } - if (info_verbose) - printf_filtered ("\n"); - if (!m_memranges.empty () && info_verbose) - printf_filtered ("Collecting memranges: \n"); -- for (i = 0, count = 0, end = temp_buf; i < m_memranges.size (); i++) -+ for (i = 0, count = 0, end = temp_buf.data (); -+ i < m_memranges.size (); i++) - { - QUIT; /* Allow user to bail out with ^C. */ - if (info_verbose) -@@ -1200,9 +1220,9 @@ collection_list::stringify () - } - if (count + 27 > MAX_AGENT_EXPR_LEN) - { -- str_list.emplace_back (temp_buf, count); -+ str_list.emplace_back (temp_buf.data (), count); - count = 0; -- end = temp_buf; -+ end = temp_buf.data (); - } - - { -@@ -1222,7 +1242,7 @@ collection_list::stringify () - } - - count += strlen (end); -- end = temp_buf + count; -+ end = temp_buf.data () + count; - } - - for (i = 0; i < m_aexprs.size (); i++) -@@ -1230,9 +1250,9 @@ collection_list::stringify () - QUIT; /* Allow user to bail out with ^C. */ - if ((count + 10 + 2 * m_aexprs[i]->len) > MAX_AGENT_EXPR_LEN) - { -- str_list.emplace_back (temp_buf, count); -+ str_list.emplace_back (temp_buf.data (), count); - count = 0; -- end = temp_buf; -+ end = temp_buf.data (); - } - sprintf (end, "X%08X,", m_aexprs[i]->len); - end += 10; /* 'X' + 8 hex digits + ',' */ -@@ -1244,9 +1264,9 @@ collection_list::stringify () - - if (count != 0) - { -- str_list.emplace_back (temp_buf, count); -+ str_list.emplace_back (temp_buf.data (), count); - count = 0; -- end = temp_buf; -+ end = temp_buf.data (); - } - - return str_list; -diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h ---- a/gdb/tracepoint.h -+++ b/gdb/tracepoint.h -@@ -293,8 +293,9 @@ public: - { return m_computed; } - - private: -- /* room for up to 256 regs */ -- unsigned char m_regs_mask[32]; -+ /* We need the allocator zero-initialize the mask, so we don't use -+ gdb::byte_vector. */ -+ std::vector m_regs_mask; - - std::vector m_memranges; - diff --git a/gdb-rhbz1187581-power8-regs-6of7.patch b/gdb-rhbz1187581-power8-regs-6of7.patch deleted file mode 100644 index b0a5e1fe981b8854ce5488b9556c72167babfbdf..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-6of7.patch +++ /dev/null @@ -1,187 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jan Kratochvil -Date: Thu, 9 Aug 2018 17:18:15 +0200 -Subject: gdb-rhbz1187581-power8-regs-6of7.patch - -;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). - -commit 296956befef3711ed458c7cba8041fde0dab9c50 -Author: Pedro Franco de Carvalho -Date: Mon Aug 6 16:24:55 2018 -0300 - - Allow larger regblock sizes when saving tracefiles - - The tracefile.c:trace_save function assumes trace_regblock_size won't - be larger than the MAX_TRACE_UPLOAD constant, used to size the buffer - which holds trace data. This can cause buffer overruns when this is - not the case. This patch changes this function so that the larger - size is used to size the buffer. - - gdb/ChangeLog: - 2018-08-06 Pedro Franco de Carvalho - - * tracefile.c: Include common/byte-vector.h. - (trace_save): Change type of buf to gdb::byte_vector. Initialize - with trace_regblock_size if needed. Update uses of buf. - -+2018-08-06 Pedro Franco de Carvalho -+ -+ * tracefile.c: Include common/byte-vector.h. -+ (trace_save): Change type of buf to gdb::byte_vector. Initialize -+ with trace_regblock_size if needed. Update uses of buf. -+ - 2018-08-06 Pedro Franco de Carvalho - - * tracepoint.h (collection_list) : Change type to - -diff --git a/gdb/tracefile.c b/gdb/tracefile.c ---- a/gdb/tracefile.c -+++ b/gdb/tracefile.c -@@ -22,6 +22,7 @@ - #include "ctf.h" - #include "exec.h" - #include "regcache.h" -+#include "common/byte-vector.h" - - /* Helper macros. */ - -@@ -67,7 +68,7 @@ trace_save (const char *filename, struct trace_file_writer *writer, - - ULONGEST offset = 0; - #define MAX_TRACE_UPLOAD 2000 -- gdb_byte buf[MAX_TRACE_UPLOAD]; -+ gdb::byte_vector buf (std::max (MAX_TRACE_UPLOAD, trace_regblock_size)); - enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ()); - - /* If the target is to save the data to a file on its own, then just -@@ -144,7 +145,7 @@ trace_save (const char *filename, struct trace_file_writer *writer, - /* We ask for big blocks, in the hopes of efficiency, but - will take less if the target has packet size limitations - or some such. */ -- gotten = target_get_raw_trace_data (buf, offset, -+ gotten = target_get_raw_trace_data (buf.data (), offset, - MAX_TRACE_UPLOAD); - if (gotten < 0) - error (_("Failure to get requested trace buffer data")); -@@ -152,7 +153,7 @@ trace_save (const char *filename, struct trace_file_writer *writer, - if (gotten == 0) - break; - -- writer->ops->write_trace_buffer (writer, buf, gotten); -+ writer->ops->write_trace_buffer (writer, buf.data (), gotten); - - offset += gotten; - } -@@ -163,7 +164,7 @@ trace_save (const char *filename, struct trace_file_writer *writer, - /* Parse the trace buffers according to how data are stored - in trace buffer in GDBserver. */ - -- gotten = target_get_raw_trace_data (buf, offset, 6); -+ gotten = target_get_raw_trace_data (buf.data (), offset, 6); - - if (gotten == 0) - break; -@@ -171,10 +172,10 @@ trace_save (const char *filename, struct trace_file_writer *writer, - /* Read the first six bytes in, which is the tracepoint - number and trace frame size. */ - tp_num = (uint16_t) -- extract_unsigned_integer (&buf[0], 2, byte_order); -+ extract_unsigned_integer (&((buf.data ())[0]), 2, byte_order); - - tf_size = (uint32_t) -- extract_unsigned_integer (&buf[2], 4, byte_order); -+ extract_unsigned_integer (&((buf.data ())[2]), 4, byte_order); - - writer->ops->frame_ops->start (writer, tp_num); - gotten = 6; -@@ -192,7 +193,8 @@ trace_save (const char *filename, struct trace_file_writer *writer, - /* We'll fetch one block each time, in order to - handle the extremely large 'M' block. We first - fetch one byte to get the type of the block. */ -- gotten = target_get_raw_trace_data (buf, offset, 1); -+ gotten = target_get_raw_trace_data (buf.data (), -+ offset, 1); - if (gotten < 1) - error (_("Failure to get requested trace buffer data")); - -@@ -205,13 +207,13 @@ trace_save (const char *filename, struct trace_file_writer *writer, - { - case 'R': - gotten -- = target_get_raw_trace_data (buf, offset, -+ = target_get_raw_trace_data (buf.data (), offset, - trace_regblock_size); - if (gotten < trace_regblock_size) - error (_("Failure to get requested trace" - " buffer data")); - -- TRACE_WRITE_R_BLOCK (writer, buf, -+ TRACE_WRITE_R_BLOCK (writer, buf.data (), - trace_regblock_size); - break; - case 'M': -@@ -221,7 +223,8 @@ trace_save (const char *filename, struct trace_file_writer *writer, - LONGEST t; - int j; - -- t = target_get_raw_trace_data (buf,offset, 10); -+ t = target_get_raw_trace_data (buf.data (), -+ offset, 10); - if (t < 10) - error (_("Failure to get requested trace" - " buffer data")); -@@ -231,10 +234,10 @@ trace_save (const char *filename, struct trace_file_writer *writer, - - gotten = 0; - addr = (ULONGEST) -- extract_unsigned_integer (buf, 8, -+ extract_unsigned_integer (buf.data (), 8, - byte_order); - mlen = (unsigned short) -- extract_unsigned_integer (&buf[8], 2, -+ extract_unsigned_integer (&((buf.data ())[8]), 2, - byte_order); - - TRACE_WRITE_M_BLOCK_HEADER (writer, addr, -@@ -252,14 +255,15 @@ trace_save (const char *filename, struct trace_file_writer *writer, - else - read_length = mlen - j; - -- t = target_get_raw_trace_data (buf, -+ t = target_get_raw_trace_data (buf.data (), - offset + j, - read_length); - if (t < read_length) - error (_("Failure to get requested" - " trace buffer data")); - -- TRACE_WRITE_M_BLOCK_MEMORY (writer, buf, -+ TRACE_WRITE_M_BLOCK_MEMORY (writer, -+ buf.data (), - read_length); - - j += read_length; -@@ -274,18 +278,18 @@ trace_save (const char *filename, struct trace_file_writer *writer, - LONGEST val; - - gotten -- = target_get_raw_trace_data (buf, offset, -- 12); -+ = target_get_raw_trace_data (buf.data (), -+ offset, 12); - if (gotten < 12) - error (_("Failure to get requested" - " trace buffer data")); - -- vnum = (int) extract_signed_integer (buf, -+ vnum = (int) extract_signed_integer (buf.data (), - 4, - byte_order); - val -- = extract_signed_integer (&buf[4], 8, -- byte_order); -+ = extract_signed_integer (&((buf.data ())[4]), -+ 8, byte_order); - - TRACE_WRITE_V_BLOCK (writer, vnum, val); - } diff --git a/gdb-rhbz1187581-power8-regs-7of7.patch b/gdb-rhbz1187581-power8-regs-7of7.patch deleted file mode 100644 index ee82673b88e32893d827872355e61f9ecc38e0ba..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-7of7.patch +++ /dev/null @@ -1,129 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jan Kratochvil -Date: Thu, 9 Aug 2018 17:18:49 +0200 -Subject: gdb-rhbz1187581-power8-regs-7of7.patch - -;; Add GDB support to access/display POWER8 registers (IBM, RH BZ 1187581). - -commit a7f25a84f4cc1df5248c46346337f19a2a66af5a -Author: Simon Marchi -Date: Mon Aug 6 16:54:47 2018 -0400 - - Fix compilation failure in remote.c - - A recent patch introduced a few of these: - - /home/emaisin/src/binutils-gdb/gdb/remote.c:12862:19: error: format not a string literal and no format arguments [-Werror=format-security] - error (err_msg); - ^ - - Fix them by replacing the call to error with - - error ("%s", err_msg); - - gdb/ChangeLog: - - * remote.c (remote_target::download_tracepoint): Fix format - string errors. - -+2018-08-06 Simon Marchi -+ -+ * remote.c (remote_target::download_tracepoint): Fix format -+ string errors. -+ - 2018-08-06 Pedro Franco de Carvalho - - * tracefile.c: Include common/byte-vector.h. - -diff --git a/gdb/remote.c b/gdb/remote.c ---- a/gdb/remote.c -+++ b/gdb/remote.c -@@ -12826,7 +12826,7 @@ remote_target::download_tracepoint (struct bp_location *loc) - t->step_count, t->pass_count); - - if (ret < 0 || ret >= buf.size ()) -- error (err_msg); -+ error ("%s", err_msg); - - /* Fast tracepoints are mostly handled by the target, but we can - tell the target how big of an instruction block should be moved -@@ -12846,7 +12846,7 @@ remote_target::download_tracepoint (struct bp_location *loc) - gdb_insn_length (loc->gdbarch, tpaddr)); - - if (ret < 0 || ret >= size_left) -- error (err_msg); -+ error ("%s", err_msg); - } - else - /* If it passed validation at definition but fails now, -@@ -12877,7 +12877,7 @@ remote_target::download_tracepoint (struct bp_location *loc) - size_left, ":S"); - - if (ret < 0 || ret >= size_left) -- error (err_msg); -+ error ("%s", err_msg); - } - else - error (_("Static tracepoint not valid during download")); -@@ -12905,14 +12905,14 @@ remote_target::download_tracepoint (struct bp_location *loc) - size_left, ":X%x,", aexpr->len); - - if (ret < 0 || ret >= size_left) -- error (err_msg); -+ error ("%s", err_msg); - - size_left = buf.size () - strlen (buf.data ()); - - /* Two bytes to encode each aexpr byte, plus the terminating - null byte. */ - if (aexpr->len * 2 + 1 > size_left) -- error (err_msg); -+ error ("%s", err_msg); - - pkt = buf.data () + strlen (buf.data ()); - -@@ -12933,7 +12933,7 @@ remote_target::download_tracepoint (struct bp_location *loc) - size_left, "-"); - - if (ret < 0 || ret >= size_left) -- error (err_msg); -+ error ("%s", err_msg); - } - - putpkt (buf.data ()); -@@ -12956,7 +12956,7 @@ remote_target::download_tracepoint (struct bp_location *loc) - has_more ? '-' : 0); - - if (ret < 0 || ret >= buf.size ()) -- error (err_msg); -+ error ("%s", err_msg); - - putpkt (buf.data ()); - remote_get_noisy_reply (); -@@ -12979,7 +12979,7 @@ remote_target::download_tracepoint (struct bp_location *loc) - has_more ? "-" : ""); - - if (ret < 0 || ret >= buf.size ()) -- error (err_msg); -+ error ("%s", err_msg); - - putpkt (buf.data ()); - remote_get_noisy_reply (); -@@ -12994,7 +12994,7 @@ remote_target::download_tracepoint (struct bp_location *loc) - ret = snprintf (buf.data (), buf.size (), "QTDPsrc:"); - - if (ret < 0 || ret >= buf.size ()) -- error (err_msg); -+ error ("%s", err_msg); - - encode_source_string (b->number, loc->address, "at", - event_location_to_string (b->location.get ()), -@@ -13010,7 +13010,7 @@ remote_target::download_tracepoint (struct bp_location *loc) - ret = snprintf (buf.data (), buf.size (), "QTDPsrc:"); - - if (ret < 0 || ret >= buf.size ()) -- error (err_msg); -+ error ("%s", err_msg); - - encode_source_string (b->number, loc->address, - "cond", b->cond_string, diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-01of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-01of15.patch deleted file mode 100644 index 4c9dd934431c557ac7f154daef11f8217f0d819a..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-01of15.patch +++ /dev/null @@ -1,35 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:12 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-01of15.patch - -;; Fix remote.c build failure -;; Szabolcs Nagy, RH BZ 1187581 - -Fix gdb/remote.c build failure - -Add const qualifier to fix - -/S/gdb/common/gdb_locale.h:35:27: error: deprecated conversion from string c - # define _(String) (String) - ^ -/S/gdb/remote.c:12844:19: note: in expansion of macro '_' - char *err_msg = _("Tracepoint packet too large for target."); - ^ -gdb/ChangeLog: - - * remote.c (remote_target::download_tracepoint): Change char* to - const char*. - -diff --git a/gdb/remote.c b/gdb/remote.c ---- a/gdb/remote.c -+++ b/gdb/remote.c -@@ -12808,7 +12808,7 @@ remote_target::download_tracepoint (struct bp_location *loc) - struct tracepoint *t = (struct tracepoint *) b; - struct remote_state *rs = get_remote_state (); - int ret; -- char *err_msg = _("Tracepoint packet too large for target."); -+ const char *err_msg = _("Tracepoint packet too large for target."); - size_t size_left; - - /* We use a buffer other than rs->buf because we'll build strings diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-02of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-02of15.patch deleted file mode 100644 index 93b3900c61144bd461e1f49b651d770f499400a6..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-02of15.patch +++ /dev/null @@ -1,479 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:12 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-02of15.patch - -;; Add grok/write functions for new ppc core note sections -;; Edjunior Barbosa Machado, RH BZ 1187581 - -Add grok/write functions for new ppc core note sections - -This patch adds functions for grokking and writing more register core -note sections (NT_PPC_TAR, NT_PPC_PPR, NT_PPC_DSCR, NT_PPC_EBB, -NT_PPC_PMU, NT_PPC_TM_CGPR, NT_PPC_TM_CFPR, NT_PPC_TM_CVMX, -NT_PPC_TM_CVSX, NT_PPC_TM_SPR, NT_PPC_TM_CTAR, NT_PPC_TM_CPPR, -NT_PPC_TM_CDSCR). - -2018-07-16 Edjunior Barbosa Machado - -bfd/ - * elf-bfd.h (elfcore_write_ppc_tar): Add prototype. - (elfcore_write_ppc_ppr): Likewise. - (elfcore_write_ppc_dscr): Likewise. - (elfcore_write_ppc_ebb): Likewise. - (elfcore_write_ppc_pmu): Likewise. - (elfcore_write_ppc_tm_cgpr): Likewise. - (elfcore_write_ppc_tm_cfpr): Likewise. - (elfcore_write_ppc_tm_cvmx): Likewise. - (elfcore_write_ppc_tm_cvsx): Likewise. - (elfcore_write_ppc_tm_spr): Likewise. - (elfcore_write_ppc_tm_ctar): Likewise. - (elfcore_write_ppc_tm_cppr): Likewise. - (elfcore_write_ppc_tm_cdscr): Likewise. - * elf.c (elfcore_write_ppc_tar): New function. - (elfcore_write_ppc_ppr): Likewise. - (elfcore_write_ppc_dscr): Likewise. - (elfcore_write_ppc_ebb): Likewise. - (elfcore_write_ppc_pmu): Likewise. - (elfcore_write_ppc_tm_cgpr): Likewise. - (elfcore_write_ppc_tm_cfpr): Likewise. - (elfcore_write_ppc_tm_cvmx): Likewise. - (elfcore_write_ppc_tm_cvsx): Likewise. - (elfcore_write_ppc_tm_spr): Likewise. - (elfcore_write_ppc_tm_ctar): Likewise. - (elfcore_write_ppc_tm_cppr): Likewise. - (elfcore_write_ppc_tm_cdscr): Likewise. - (elfcore_write_register_note): Call them. - (elfcore_grok_ppc_tar): New function. - (elfcore_grok_ppc_ppr): Likewise. - (elfcore_grok_ppc_dscr): Likewise. - (elfcore_grok_ppc_ebb): Likewise. - (elfcore_grok_ppc_pmu): Likewise. - (elfcore_grok_ppc_tm_cgpr): Likewise. - (elfcore_grok_ppc_tm_cfpr): Likewise. - (elfcore_grok_ppc_tm_cvmx): Likewise. - (elfcore_grok_ppc_tm_cvsx): Likewise. - (elfcore_grok_ppc_tm_spr): Likewise. - (elfcore_grok_ppc_tm_ctar): Likewise. - (elfcore_grok_ppc_tm_cppr): Likewise. - (elfcore_grok_ppc_tm_cdscr): Likewise. - (elfcore_grok_note): Call them. - -diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h ---- a/bfd/elf-bfd.h -+++ b/bfd/elf-bfd.h -@@ -2569,6 +2569,32 @@ extern char *elfcore_write_ppc_vmx - (bfd *, char *, int *, const void *, int); - extern char *elfcore_write_ppc_vsx - (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_tar -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_ppr -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_dscr -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_ebb -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_pmu -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_tm_cgpr -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_tm_cfpr -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_tm_cvmx -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_tm_cvsx -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_tm_spr -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_tm_ctar -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_tm_cppr -+ (bfd *, char *, int *, const void *, int); -+extern char *elfcore_write_ppc_tm_cdscr -+ (bfd *, char *, int *, const void *, int); - extern char *elfcore_write_s390_timer - (bfd *, char *, int *, const void *, int); - extern char *elfcore_write_s390_todcmp -diff --git a/bfd/elf.c b/bfd/elf.c ---- a/bfd/elf.c -+++ b/bfd/elf.c -@@ -9238,6 +9238,84 @@ elfcore_grok_ppc_vsx (bfd *abfd, Elf_Internal_Note *note) - return elfcore_make_note_pseudosection (abfd, ".reg-ppc-vsx", note); - } - -+static bfd_boolean -+elfcore_grok_ppc_tar (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tar", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_ppr (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-ppr", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_dscr (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-dscr", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_ebb (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-ebb", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_pmu (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-pmu", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_tm_cgpr (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cgpr", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_tm_cfpr (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cfpr", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_tm_cvmx (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cvmx", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_tm_cvsx (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cvsx", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_tm_spr (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-spr", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_tm_ctar (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-ctar", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_tm_cppr (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cppr", note); -+} -+ -+static bfd_boolean -+elfcore_grok_ppc_tm_cdscr (bfd *abfd, Elf_Internal_Note *note) -+{ -+ return elfcore_make_note_pseudosection (abfd, ".reg-ppc-tm-cdscr", note); -+} -+ - static bfd_boolean - elfcore_grok_s390_high_gprs (bfd *abfd, Elf_Internal_Note *note) - { -@@ -9723,6 +9801,97 @@ elfcore_grok_note (bfd *abfd, Elf_Internal_Note *note) - else - return TRUE; - -+ case NT_PPC_TAR: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_tar (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_PPR: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_ppr (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_DSCR: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_dscr (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_EBB: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_ebb (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_PMU: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_pmu (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_TM_CGPR: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_tm_cgpr (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_TM_CFPR: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_tm_cfpr (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_TM_CVMX: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_tm_cvmx (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_TM_CVSX: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_tm_cvsx (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_TM_SPR: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_tm_spr (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_TM_CTAR: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_tm_ctar (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_TM_CPPR: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_tm_cppr (abfd, note); -+ else -+ return TRUE; -+ -+ case NT_PPC_TM_CDSCR: -+ if (note->namesz == 6 -+ && strcmp (note->namedata, "LINUX") == 0) -+ return elfcore_grok_ppc_tm_cdscr (abfd, note); -+ else -+ return TRUE; -+ - case NT_S390_HIGH_GPRS: - if (note->namesz == 6 - && strcmp (note->namedata, "LINUX") == 0) -@@ -10830,6 +10999,162 @@ elfcore_write_ppc_vsx (bfd *abfd, - note_name, NT_PPC_VSX, ppc_vsx, size); - } - -+char * -+elfcore_write_ppc_tar (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_tar, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_TAR, ppc_tar, size); -+} -+ -+char * -+elfcore_write_ppc_ppr (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_ppr, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_PPR, ppc_ppr, size); -+} -+ -+char * -+elfcore_write_ppc_dscr (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_dscr, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_DSCR, ppc_dscr, size); -+} -+ -+char * -+elfcore_write_ppc_ebb (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_ebb, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_EBB, ppc_ebb, size); -+} -+ -+char * -+elfcore_write_ppc_pmu (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_pmu, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_PMU, ppc_pmu, size); -+} -+ -+char * -+elfcore_write_ppc_tm_cgpr (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_tm_cgpr, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_TM_CGPR, ppc_tm_cgpr, size); -+} -+ -+char * -+elfcore_write_ppc_tm_cfpr (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_tm_cfpr, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_TM_CFPR, ppc_tm_cfpr, size); -+} -+ -+char * -+elfcore_write_ppc_tm_cvmx (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_tm_cvmx, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_TM_CVMX, ppc_tm_cvmx, size); -+} -+ -+char * -+elfcore_write_ppc_tm_cvsx (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_tm_cvsx, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_TM_CVSX, ppc_tm_cvsx, size); -+} -+ -+char * -+elfcore_write_ppc_tm_spr (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_tm_spr, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_TM_SPR, ppc_tm_spr, size); -+} -+ -+char * -+elfcore_write_ppc_tm_ctar (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_tm_ctar, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_TM_CTAR, ppc_tm_ctar, size); -+} -+ -+char * -+elfcore_write_ppc_tm_cppr (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_tm_cppr, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_TM_CPPR, ppc_tm_cppr, size); -+} -+ -+char * -+elfcore_write_ppc_tm_cdscr (bfd *abfd, -+ char *buf, -+ int *bufsiz, -+ const void *ppc_tm_cdscr, -+ int size) -+{ -+ char *note_name = "LINUX"; -+ return elfcore_write_note (abfd, buf, bufsiz, -+ note_name, NT_PPC_TM_CDSCR, ppc_tm_cdscr, size); -+} -+ - static char * - elfcore_write_s390_high_gprs (bfd *abfd, - char *buf, -@@ -11070,6 +11395,32 @@ elfcore_write_register_note (bfd *abfd, - return elfcore_write_ppc_vmx (abfd, buf, bufsiz, data, size); - if (strcmp (section, ".reg-ppc-vsx") == 0) - return elfcore_write_ppc_vsx (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-tar") == 0) -+ return elfcore_write_ppc_tar (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-ppr") == 0) -+ return elfcore_write_ppc_ppr (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-dscr") == 0) -+ return elfcore_write_ppc_dscr (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-ebb") == 0) -+ return elfcore_write_ppc_ebb (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-pmu") == 0) -+ return elfcore_write_ppc_pmu (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-tm-cgpr") == 0) -+ return elfcore_write_ppc_tm_cgpr (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-tm-cfpr") == 0) -+ return elfcore_write_ppc_tm_cfpr (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-tm-cvmx") == 0) -+ return elfcore_write_ppc_tm_cvmx (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-tm-cvsx") == 0) -+ return elfcore_write_ppc_tm_cvsx (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-tm-spr") == 0) -+ return elfcore_write_ppc_tm_spr (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-tm-ctar") == 0) -+ return elfcore_write_ppc_tm_ctar (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-tm-cppr") == 0) -+ return elfcore_write_ppc_tm_cppr (abfd, buf, bufsiz, data, size); -+ if (strcmp (section, ".reg-ppc-tm-cdscr") == 0) -+ return elfcore_write_ppc_tm_cdscr (abfd, buf, bufsiz, data, size); - if (strcmp (section, ".reg-s390-high-gprs") == 0) - return elfcore_write_s390_high_gprs (abfd, buf, bufsiz, data, size); - if (strcmp (section, ".reg-s390-timer") == 0) diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-03of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-03of15.patch deleted file mode 100644 index 0e9c2c301d662741345ada2071e28ea8229f0a7e..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-03of15.patch +++ /dev/null @@ -1,61 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:13 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-03of15.patch - -;; Zero-initialize linux note sections -;; Pedro Franco de Carvalho, RH BZ 1187581 - -Zero-initialize linux note sections - -This patches changes linux-tdep.c so that the buffer used to write -note sections when generating a core file is zero-initialized. This -way, bytes that are not collected won't contain random -data (e.g. padding bytes). - -gdb/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * linux-tdep.c (linux_collect_regset_section_cb): Use - std::vector instead of char * and malloc for buf. - Remove xfree. - -diff --git a/gdb/linux-tdep.c b/gdb/linux-tdep.c ---- a/gdb/linux-tdep.c -+++ b/gdb/linux-tdep.c -@@ -1584,7 +1584,6 @@ linux_collect_regset_section_cb (const char *sect_name, int supply_size, - int collect_size, const struct regset *regset, - const char *human_name, void *cb_data) - { -- char *buf; - struct linux_collect_regset_section_cb_data *data - = (struct linux_collect_regset_section_cb_data *) cb_data; - bool variable_size_section = (regset != NULL -@@ -1598,19 +1597,22 @@ linux_collect_regset_section_cb (const char *sect_name, int supply_size, - - gdb_assert (regset && regset->collect_regset); - -- buf = (char *) xmalloc (collect_size); -- regset->collect_regset (regset, data->regcache, -1, buf, collect_size); -+ /* This is intentionally zero-initialized by using std::vector, so -+ that any padding bytes in the core file will show as 0. */ -+ std::vector buf (collect_size); -+ -+ regset->collect_regset (regset, data->regcache, -1, buf.data (), -+ collect_size); - - /* PRSTATUS still needs to be treated specially. */ - if (strcmp (sect_name, ".reg") == 0) - data->note_data = (char *) elfcore_write_prstatus - (data->obfd, data->note_data, data->note_size, data->lwp, -- gdb_signal_to_host (data->stop_signal), buf); -+ gdb_signal_to_host (data->stop_signal), buf.data ()); - else - data->note_data = (char *) elfcore_write_register_note - (data->obfd, data->note_data, data->note_size, -- sect_name, buf, collect_size); -- xfree (buf); -+ sect_name, buf.data (), collect_size); - - if (data->note_data == NULL) - data->abort_iteration = 1; diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-04of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-04of15.patch deleted file mode 100644 index 0fdac459dd39c3bf96518c76261cfb6e4ca90f0a..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-04of15.patch +++ /dev/null @@ -1,88 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:13 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-04of15.patch - -;; [PowerPC] Don't zero-initialize vector register buffers -;; Pedro Franco de Carvalho, RH BZ 1187581 - -[PowerPC] Don't zero-initialize vector register buffers - -Now that linux-tdep.c already zero-initializes the buffer used for -generating core file notes, there is no need to do this in the linux -collect functions for the vector regset. The memsets in gdbserver were -not useful to begin with. - -gdb/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * ppc-linux-tdep.c (ppc_linux_collect_vrregset): Remove. - (ppc32_le_linux_vrregset, ppc32_be_linux_vrregset): Replace - ppc_linux_collect_vrregset by regcache_collect_regset. - -gdb/gdbserver/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * linux-ppc-low.c (ppc_fill_vrregset): Remove memset calls. - -diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c ---- a/gdb/gdbserver/linux-ppc-low.c -+++ b/gdb/gdbserver/linux-ppc-low.c -@@ -495,13 +495,9 @@ ppc_fill_vrregset (struct regcache *regcache, void *buf) - if (__BYTE_ORDER == __BIG_ENDIAN) - vscr_offset = 12; - -- /* Zero-pad the unused bytes in the fields for vscr and vrsave in -- case they get displayed somewhere. */ -- memset (®set[32 * 16], 0, 16); - collect_register_by_name (regcache, "vscr", - ®set[32 * 16 + vscr_offset]); - -- memset (®set[33 * 16], 0, 16); - collect_register_by_name (regcache, "vrsave", ®set[33 * 16]); - } - -diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c ---- a/gdb/ppc-linux-tdep.c -+++ b/gdb/ppc-linux-tdep.c -@@ -444,24 +444,6 @@ ppc_linux_collect_gregset (const struct regset *regset, - } - } - --static void --ppc_linux_collect_vrregset (const struct regset *regset, -- const struct regcache *regcache, -- int regnum, void *buf, size_t len) --{ -- gdb_byte *vrregs = (gdb_byte *) buf; -- -- /* Zero-pad the unused bytes in the fields for vscr and vrsave -- in case they get displayed somewhere (e.g. in core files). */ -- if (regnum == PPC_VSCR_REGNUM || regnum == -1) -- memset (&vrregs[32 * 16], 0, 16); -- -- if (regnum == PPC_VRSAVE_REGNUM || regnum == -1) -- memset (&vrregs[33 * 16], 0, 16); -- -- regcache_collect_regset (regset, regcache, regnum, buf, len); --} -- - /* Regset descriptions. */ - static const struct ppc_reg_offsets ppc32_linux_reg_offsets = - { -@@ -544,13 +526,13 @@ static const struct regcache_map_entry ppc32_be_linux_vrregmap[] = - static const struct regset ppc32_le_linux_vrregset = { - ppc32_le_linux_vrregmap, - regcache_supply_regset, -- ppc_linux_collect_vrregset -+ regcache_collect_regset - }; - - static const struct regset ppc32_be_linux_vrregset = { - ppc32_be_linux_vrregmap, - regcache_supply_regset, -- ppc_linux_collect_vrregset -+ regcache_collect_regset - }; - - static const struct regcache_map_entry ppc32_linux_vsxregmap[] = diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-05of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-05of15.patch deleted file mode 100644 index 6ee44a0f2e950204016c96bdabf87bc2a3418582..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-05of15.patch +++ /dev/null @@ -1,34 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:14 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-05of15.patch - -;; Add decfloat registers to float reggroup -;; Pedro Franco de Carvalho, RH BZ 1187581 - -Add decfloat registers to float reggroup - -This patch changes default_register_reggroup_p to return true when the -register type is decimal floating point and the reggroup is -float_reggroup. - -gdb/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * reggroups.c (default_register_reggroup_p): Return true for - decfloat registers and float_reggroup. - -diff --git a/gdb/reggroups.c b/gdb/reggroups.c ---- a/gdb/reggroups.c -+++ b/gdb/reggroups.c -@@ -202,7 +202,9 @@ default_register_reggroup_p (struct gdbarch *gdbarch, int regnum, - if (group == all_reggroup) - return 1; - vector_p = TYPE_VECTOR (register_type (gdbarch, regnum)); -- float_p = TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT; -+ float_p = (TYPE_CODE (register_type (gdbarch, regnum)) == TYPE_CODE_FLT -+ || (TYPE_CODE (register_type (gdbarch, regnum)) -+ == TYPE_CODE_DECFLOAT)); - raw_p = regnum < gdbarch_num_regs (gdbarch); - if (group == float_reggroup) - return float_p; diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-06of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-06of15.patch deleted file mode 100644 index 0b61c358bed14a154f83d2d03070291e41a36ede..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-06of15.patch +++ /dev/null @@ -1,72 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:14 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-06of15.patch - -;; [PowerPC] Remove rs6000_pseudo_register_reggroup_p -;; Pedro Franco de Carvalho, RH BZ 1187581 - -[PowerPC] Remove rs6000_pseudo_register_reggroup_p - -This patch removes rs6000_pseudo_register_reggroup_p. - -Group membership for the pseudoregisters can be detected through their -types in default_register_reggroup_p through -tdesc_register_reggroup_p. - -gdb/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * rs6000-tdep.c: Remove reggroups.h include. - (rs6000_pseudo_register_reggroup_p): Remove. - (rs6000_gdbarch_init): Remove call to - set_tdesc_pseudo_register_reggroup_p. - -diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c ---- a/gdb/rs6000-tdep.c -+++ b/gdb/rs6000-tdep.c -@@ -36,7 +36,6 @@ - #include "infcall.h" - #include "sim-regno.h" - #include "gdb/sim-ppc.h" --#include "reggroups.h" - #include "dwarf2-frame.h" - #include "target-descriptions.h" - #include "user-regs.h" -@@ -2461,27 +2460,6 @@ rs6000_pseudo_register_type (struct gdbarch *gdbarch, int regnum) - return builtin_type (gdbarch)->builtin_double; - } - --/* Is REGNUM a member of REGGROUP? */ --static int --rs6000_pseudo_register_reggroup_p (struct gdbarch *gdbarch, int regnum, -- struct reggroup *group) --{ -- struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -- -- /* These are the only pseudo-registers we support. */ -- gdb_assert (IS_SPE_PSEUDOREG (tdep, regnum) -- || IS_DFP_PSEUDOREG (tdep, regnum) -- || IS_VSX_PSEUDOREG (tdep, regnum) -- || IS_EFP_PSEUDOREG (tdep, regnum)); -- -- /* These are the e500 pseudo-registers or the POWER7 VSX registers. */ -- if (IS_SPE_PSEUDOREG (tdep, regnum) || IS_VSX_PSEUDOREG (tdep, regnum)) -- return group == all_reggroup || group == vector_reggroup; -- else -- /* PPC decimal128 or Extended FP pseudo-registers. */ -- return group == all_reggroup || group == float_reggroup; --} -- - /* The register format for RS/6000 floating point registers is always - double, we need a conversion if the memory format is float. */ - -@@ -6493,8 +6471,6 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - } - - set_tdesc_pseudo_register_type (gdbarch, rs6000_pseudo_register_type); -- set_tdesc_pseudo_register_reggroup_p (gdbarch, -- rs6000_pseudo_register_reggroup_p); - tdesc_use_registers (gdbarch, tdesc, tdesc_data); - - /* Override the normal target description method to make the SPE upper diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-07of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-07of15.patch deleted file mode 100644 index 9b6da0c81c75b05d9c64dc87125452cc000e1a06..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-07of15.patch +++ /dev/null @@ -1,41 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:15 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-07of15.patch - -;; [PowerPC] Fix two if statements in gdb/ppc-linux-nat.c -;; Pedro Franco de Carvalho, RH BZ 1187581 - -[PowerPC] Fix two if statements in gdb/ppc-linux-nat.c - -This patch changes two if statements to else if statements in -ppc-linux-nat.c:fetch_register for clarity. - -gdb/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * ppc-linux-nat.c (fetch_register): Change if statement to else - if. - (store_register): Likewise. - -diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c ---- a/gdb/ppc-linux-nat.c -+++ b/gdb/ppc-linux-nat.c -@@ -554,7 +554,7 @@ fetch_register (struct regcache *regcache, int tid, int regno) - AltiVec registers, fall through and return zeroes, because - regaddr will be -1 in this case. */ - } -- if (vsx_register_p (gdbarch, regno)) -+ else if (vsx_register_p (gdbarch, regno)) - { - if (have_ptrace_getsetvsxregs) - { -@@ -933,7 +933,7 @@ store_register (const struct regcache *regcache, int tid, int regno) - store_altivec_registers (regcache, tid, regno); - return; - } -- if (vsx_register_p (gdbarch, regno)) -+ else if (vsx_register_p (gdbarch, regno)) - { - store_vsx_registers (regcache, tid, regno); - return; diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-08of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-08of15.patch deleted file mode 100644 index 5e04ffc71aedf64843da4344e05d1e86e9085379..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-08of15.patch +++ /dev/null @@ -1,64 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:15 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-08of15.patch - -;; [PowerPC] Fix indentation in arch/ppc-linux-common.c -;; Pedro Franco de Carvalho, RH BZ 1187581 - -[PowerPC] Fix indentation in arch/ppc-linux-common.c - -This patch parenthesizes the tdesc selection expressions in -arch/ppc-linux-common.c so that they can be tab-indented. - -gdb/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * arch/ppc-linux-common.c (ppc_linux_match_description): - Parenthesize tdesc assignements and indent them properly. - -diff --git a/gdb/arch/ppc-linux-common.c b/gdb/arch/ppc-linux-common.c ---- a/gdb/arch/ppc-linux-common.c -+++ b/gdb/arch/ppc-linux-common.c -@@ -53,14 +53,14 @@ ppc_linux_match_description (struct ppc_linux_features features) - if (features.cell) - tdesc = tdesc_powerpc_cell64l; - else if (features.vsx) -- tdesc = features.isa205 -- ? tdesc_powerpc_isa205_vsx64l : tdesc_powerpc_vsx64l; -+ tdesc = (features.isa205? tdesc_powerpc_isa205_vsx64l -+ : tdesc_powerpc_vsx64l); - else if (features.altivec) -- tdesc = features.isa205 -- ? tdesc_powerpc_isa205_altivec64l : tdesc_powerpc_altivec64l; -+ tdesc = (features.isa205? tdesc_powerpc_isa205_altivec64l -+ : tdesc_powerpc_altivec64l); - else -- tdesc = features.isa205? -- tdesc_powerpc_isa205_64l : tdesc_powerpc_64l; -+ tdesc = (features.isa205? tdesc_powerpc_isa205_64l -+ : tdesc_powerpc_64l); - } - else - { -@@ -69,14 +69,14 @@ ppc_linux_match_description (struct ppc_linux_features features) - if (features.cell) - tdesc = tdesc_powerpc_cell32l; - else if (features.vsx) -- tdesc = features.isa205 -- ? tdesc_powerpc_isa205_vsx32l : tdesc_powerpc_vsx32l; -+ tdesc = (features.isa205? tdesc_powerpc_isa205_vsx32l -+ : tdesc_powerpc_vsx32l); - else if (features.altivec) -- tdesc = features.isa205 -- ? tdesc_powerpc_isa205_altivec32l : tdesc_powerpc_altivec32l; -+ tdesc = (features.isa205? tdesc_powerpc_isa205_altivec32l -+ : tdesc_powerpc_altivec32l); - else -- tdesc = features.isa205 -- ? tdesc_powerpc_isa205_32l : tdesc_powerpc_32l; -+ tdesc = (features.isa205? tdesc_powerpc_isa205_32l -+ : tdesc_powerpc_32l); - } - - gdb_assert (tdesc != NULL); diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-09of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-09of15.patch deleted file mode 100644 index e95c1adb12fb15e97e703330cdadfcef3bcdd941..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-09of15.patch +++ /dev/null @@ -1,36 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:16 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-09of15.patch - -;; [PowerPC] Refactor have_ initializers in rs6000-tdep.c -;; Pedro Franco de Carvalho, RH BZ 1187581 - -[PowerPC] Refactor have_ initializers in rs6000-tdep.c - -This patch refactors a series of initializers in rs6000_gdbarch_init -for clarity. The have_fpu initializer is also changed to set the -variable to 0, like the other similar variables. This doesn't affect -program behavior. - -gdb/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * rs6000-tdep.c (rs6000_gdbarch_init): Replace line wrapping by a - second initializer line for the have_* variables. Initialize - have_fpu to 0 instead of 1. - -diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c ---- a/gdb/rs6000-tdep.c -+++ b/gdb/rs6000-tdep.c -@@ -5845,8 +5845,8 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - enum powerpc_long_double_abi long_double_abi = POWERPC_LONG_DOUBLE_AUTO; - enum powerpc_vector_abi vector_abi = powerpc_vector_abi_global; - enum powerpc_elf_abi elf_abi = POWERPC_ELF_AUTO; -- int have_fpu = 1, have_spe = 0, have_mq = 0, have_altivec = 0, have_dfp = 0, -- have_vsx = 0; -+ int have_fpu = 0, have_spe = 0, have_mq = 0, have_altivec = 0; -+ int have_dfp = 0, have_vsx = 0; - int tdesc_wordsize = -1; - const struct target_desc *tdesc = info.target_desc; - struct tdesc_arch_data *tdesc_data = NULL; diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-10of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-10of15.patch deleted file mode 100644 index 0b3646473322195932f69e3573c52f0c2b41de64..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-10of15.patch +++ /dev/null @@ -1,1987 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:16 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-10of15.patch - -;; [PowerPC] Add support for PPR and DSCR -;; Edjunior Barbosa Machado and Pedro Franco de Carvalho, RH BZ 1187581 - -[PowerPC] Add support for PPR and DSCR - -This patch adds gdb support for the Program Priorty Register and the -Data Stream Control Register, for the powerpc linux native and core -file targets, and for the powerpc linux server stub. - -gdb/ChangeLog: -2018-10-26 Edjunior Barbosa Machado - Pedro Franco de Carvalho - - * arch/ppc-linux-tdesc.h (tdesc_powerpc_isa205_ppr_dscr_vsx32l) - (tdesc_powerpc_isa205_ppr_dscr_vsx64l): Declare. - * arch/ppc-linux-common.h (PPC_LINUX_SIZEOF_PPRREGSET) - (PPC_LINUX_SIZEOF_DSCRREGSET): Define. - (struct ppc_linux_features) : New field. - (ppc_linux_no_features): Add initializer for ppr_dscr field. - * arch/ppc-linux-common.c (ppc_linux_match_description): Return - new tdescs. - * nat/ppc-linux.h (PPC_FEATURE2_DSCR, NT_PPC_PPR, NT_PPC_DSCR): - Define if not already defined. - * features/Makefile (WHICH): Add - rs6000/powerpc-isa205-ppr-dscr-vsx32l and - rs6000/powerpc-isa205-ppr-dscr-vsx64l. - (XMLTOC): Add rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml and - rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml. - * features/rs6000/power-dscr.xml: New file. - * features/rs6000/power-ppr.xml: New file. - * features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml: New file. - * features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml: New file. - * features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c: Generate. - * features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c: Generate. - * regformats/rs6000/powerpc-isa205-ppr-dscr-vsx32l.dat: Generate. - * regformats/rs6000/powerpc-isa205-ppr-dscr-vsx64l.dat: Generate. - * ppc-linux-nat.c: Include . - (fetch_regset, store_regset, check_regset): New functions. - (fetch_register, fetch_ppc_registers): Call fetch_regset with - DSCR and PPR regsets. - (store_register, store_ppc_registers): Call store_regset with - DSCR and PPR regsets. - (ppc_linux_get_hwcap2): New function. - (ppc_linux_nat_target::read_description): Call - ppc_linux_get_hwcap2 and check_regset, set ppr_dscr field in the - features struct if needed. - * ppc-linux-tdep.c: Include - features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c and - features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c. - (ppc32_regmap_ppr, ppc32_regmap_dscr, ppc32_linux_pprregset) - (ppc32_linux_dscrregset): New globals. - (ppc_linux_iterate_over_regset_sections): Call back with the ppr - and dscr regsets. - (ppc_linux_core_read_description): Check if the ppr and dscr - sections are present and set ppr_dscr in the features struct. - (_initialize_ppc_linux_tdep): Call - initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l and - initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l. - * ppc-linux-tdep.h (ppc32_linux_pprregset) - (ppc32_linux_dscrregset): Declare. - * ppc-tdep.h (struct gdbarch_tdep) : New field. - : New field. - (enum) : New enum values. - * rs6000-tdep.c (rs6000_gdbarch_init): Look for and validate ppr - and dscr features. - (ppc_process_record_op31): Record changes to PPR and DSCR. - -gdb/gdbserver/ChangeLog: -2018-10-26 Edjunior Barbosa Machado - Pedro Franco de Carvalho - - * configure.srv (ipa_ppc_linux_regobj): Add - powerpc-isa205-ppr-dscr-vsx32l-ipa.o and - powerpc-isa205-ppr-dscr-vsx64l-ipa.o. - (powerpc*-*-linux*): Add powerpc-isa205-ppr-dscr-vsx32l.o and - powerpc-isa205-ppr-dscr-vsx64l.o to srv_regobj, add - rs6000/power-dscr.xml, rs6000/power-ppr.xml, - rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml and - rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml to srv_xmlfiles. - * linux-ppc-tdesc-init.h (enum ppc_linux_tdesc) - : New enum value. - (init_registers_powerpc_isa205_ppr_dscr_vsx32l) - (init_registers_powerpc_isa205_ppr_dscr_vsx64l): Declare. - * linux-ppc-low.c: Include "elf/common.h" and . - (ppc_hwcap): Add comment. - (ppc_hwcap2): New global. - (ppc_check_regset, ppc_fill_pprregset, ppc_store_pprregset) - (ppc_fill_dscrregset, ppc_store_dscrregset): New functions. - (ppc_regsets): Add entries for the DSCR and PPR regsets. - (ppc_arch_setup): Get AT_HWCAP2. Set ppr_dscr in features struct - when needed. Set sizes for the the DSCR and PPR regsets. - (ppc_get_ipa_tdesc_idx): Return PPC_TDESC_ISA205_PPR_DSCR_VSX. - (initialize_low_arch): Call - init_registers_powerpc_isa205_ppr_dscr_vsx32l and - init_registers_powerpc_isa205_ppr_dscr_vsx64l. - * linux-ppc-ipa.c (get_ipa_tdesc): Handle - PPC_TDESC_ISA205_PPR_DSCR_VSX. - (initialize_low_tracepoint): Call - init_registers_powerpc_isa205_ppr_dscr_vsx32l and - init_registers_powerpc_isa205_ppr_dscr_vsx64l. - -gdb/testsuite/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * gdb.arch/powerpc-ppr-dscr.c: New file. - * gdb.arch/powerpc-ppr-dscr.exp: New file. - -gdb/doc/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * gdb.texinfo (PowerPC Features): Describe new features - "org.gnu.gdb.power.ppr" and "org.gnu.gdb.power.dscr". - -diff --git a/gdb/arch/ppc-linux-common.c b/gdb/arch/ppc-linux-common.c ---- a/gdb/arch/ppc-linux-common.c -+++ b/gdb/arch/ppc-linux-common.c -@@ -53,7 +53,8 @@ ppc_linux_match_description (struct ppc_linux_features features) - if (features.cell) - tdesc = tdesc_powerpc_cell64l; - else if (features.vsx) -- tdesc = (features.isa205? tdesc_powerpc_isa205_vsx64l -+ tdesc = (features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx64l -+ : features.isa205? tdesc_powerpc_isa205_vsx64l - : tdesc_powerpc_vsx64l); - else if (features.altivec) - tdesc = (features.isa205? tdesc_powerpc_isa205_altivec64l -@@ -69,7 +70,8 @@ ppc_linux_match_description (struct ppc_linux_features features) - if (features.cell) - tdesc = tdesc_powerpc_cell32l; - else if (features.vsx) -- tdesc = (features.isa205? tdesc_powerpc_isa205_vsx32l -+ tdesc = (features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx32l -+ : features.isa205? tdesc_powerpc_isa205_vsx32l - : tdesc_powerpc_vsx32l); - else if (features.altivec) - tdesc = (features.isa205? tdesc_powerpc_isa205_altivec32l -diff --git a/gdb/arch/ppc-linux-common.h b/gdb/arch/ppc-linux-common.h ---- a/gdb/arch/ppc-linux-common.h -+++ b/gdb/arch/ppc-linux-common.h -@@ -30,6 +30,8 @@ struct target_desc; - #define PPC_LINUX_SIZEOF_VRREGSET 544 - - #define PPC_LINUX_SIZEOF_VSXREGSET 256 -+#define PPC_LINUX_SIZEOF_PPRREGSET 8 -+#define PPC_LINUX_SIZEOF_DSCRREGSET 8 - - /* Check if the hwcap auxv entry indicates that isa205 is supported. */ - bool ppc_linux_has_isa205 (CORE_ADDR hwcap); -@@ -41,6 +43,7 @@ struct ppc_linux_features - bool altivec; - bool vsx; - bool isa205; -+ bool ppr_dscr; - bool cell; - }; - -@@ -51,6 +54,7 @@ const struct ppc_linux_features ppc_linux_no_features = { - false, - false, - false, -+ false, - }; - - /* Return a target description that matches FEATURES. */ -diff --git a/gdb/arch/ppc-linux-tdesc.h b/gdb/arch/ppc-linux-tdesc.h ---- a/gdb/arch/ppc-linux-tdesc.h -+++ b/gdb/arch/ppc-linux-tdesc.h -@@ -29,6 +29,7 @@ extern struct target_desc *tdesc_powerpc_vsx32l; - extern struct target_desc *tdesc_powerpc_isa205_32l; - extern struct target_desc *tdesc_powerpc_isa205_altivec32l; - extern struct target_desc *tdesc_powerpc_isa205_vsx32l; -+extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx32l; - extern struct target_desc *tdesc_powerpc_e500l; - - extern struct target_desc *tdesc_powerpc_64l; -@@ -38,5 +39,6 @@ extern struct target_desc *tdesc_powerpc_vsx64l; - extern struct target_desc *tdesc_powerpc_isa205_64l; - extern struct target_desc *tdesc_powerpc_isa205_altivec64l; - extern struct target_desc *tdesc_powerpc_isa205_vsx64l; -+extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx64l; - - #endif /* ARCH_PPC_LINUX_TDESC_H */ -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -42555,6 +42555,12 @@ contain registers @samp{ev0h} through @samp{ev31h}, @samp{acc}, and - these to present registers @samp{ev0} through @samp{ev31} to the - user. - -+The @samp{org.gnu.gdb.power.ppr} feature is optional. It should -+contain the 64-bit register @samp{ppr}. -+ -+The @samp{org.gnu.gdb.power.dscr} feature is optional. It should -+contain the 64-bit register @samp{dscr}. -+ - @node S/390 and System z Features - @subsection S/390 and System z Features - @cindex target descriptions, S/390 features -diff --git a/gdb/features/Makefile b/gdb/features/Makefile ---- a/gdb/features/Makefile -+++ b/gdb/features/Makefile -@@ -73,6 +73,8 @@ WHICH = aarch64 \ - rs6000/powerpc-isa205-32l rs6000/powerpc-isa205-64l \ - rs6000/powerpc-isa205-altivec32l rs6000/powerpc-isa205-altivec64l \ - rs6000/powerpc-isa205-vsx32l rs6000/powerpc-isa205-vsx64l \ -+ rs6000/powerpc-isa205-ppr-dscr-vsx32l \ -+ rs6000/powerpc-isa205-ppr-dscr-vsx64l \ - s390-linux32 s390-linux64 s390x-linux64 \ - s390-linux32v1 s390-linux64v1 s390x-linux64v1 \ - s390-linux32v2 s390-linux64v2 s390x-linux64v2 \ -@@ -167,6 +169,8 @@ XMLTOC = \ - rs6000/powerpc-isa205-altivec64l.xml \ - rs6000/powerpc-isa205-vsx32l.xml \ - rs6000/powerpc-isa205-vsx64l.xml \ -+ rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml \ -+ rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml \ - rs6000/powerpc-vsx32.xml \ - rs6000/powerpc-vsx32l.xml \ - rs6000/powerpc-vsx64.xml \ -diff --git a/gdb/features/rs6000/power-dscr.xml b/gdb/features/rs6000/power-dscr.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-dscr.xml -@@ -0,0 +1,12 @@ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/power-ppr.xml b/gdb/features/rs6000/power-ppr.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-ppr.xml -@@ -0,0 +1,12 @@ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c -@@ -0,0 +1,200 @@ -+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: -+ Original: powerpc-isa205-ppr-dscr-vsx32l.xml */ -+ -+#include "defs.h" -+#include "osabi.h" -+#include "target-descriptions.h" -+ -+struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx32l; -+static void -+initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (void) -+{ -+ struct target_desc *result = allocate_target_description (); -+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common")); -+ -+ struct tdesc_feature *feature; -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core"); -+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr"); -+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr"); -+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu"); -+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux"); -+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int"); -+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec"); -+ tdesc_type *element_type; -+ element_type = tdesc_named_type (feature, "ieee_single"); -+ tdesc_create_vector (feature, "v4f", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int32"); -+ tdesc_create_vector (feature, "v4i32", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int16"); -+ tdesc_create_vector (feature, "v8i16", element_type, 8); -+ -+ element_type = tdesc_named_type (feature, "int8"); -+ tdesc_create_vector (feature, "v16i8", element_type, 16); -+ -+ tdesc_type_with_fields *type_with_fields; -+ type_with_fields = tdesc_create_union (feature, "vec128"); -+ tdesc_type *field_type; -+ field_type = tdesc_named_type (feature, "uint128"); -+ tdesc_add_field (type_with_fields, "uint128", field_type); -+ field_type = tdesc_named_type (feature, "v4f"); -+ tdesc_add_field (type_with_fields, "v4_float", field_type); -+ field_type = tdesc_named_type (feature, "v4i32"); -+ tdesc_add_field (type_with_fields, "v4_int32", field_type); -+ field_type = tdesc_named_type (feature, "v8i16"); -+ tdesc_add_field (type_with_fields, "v8_int16", field_type); -+ field_type = tdesc_named_type (feature, "v16i8"); -+ tdesc_add_field (type_with_fields, "v16_int8", field_type); -+ -+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int"); -+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx"); -+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr"); -+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr"); -+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64"); -+ -+ tdesc_powerpc_isa205_ppr_dscr_vsx32l = result; -+} -diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml -@@ -0,0 +1,18 @@ -+ -+ -+ -+ -+ -+ powerpc:common -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c -@@ -0,0 +1,200 @@ -+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: -+ Original: powerpc-isa205-ppr-dscr-vsx64l.xml */ -+ -+#include "defs.h" -+#include "osabi.h" -+#include "target-descriptions.h" -+ -+struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx64l; -+static void -+initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (void) -+{ -+ struct target_desc *result = allocate_target_description (); -+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64")); -+ -+ struct tdesc_feature *feature; -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core"); -+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr"); -+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr"); -+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu"); -+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux"); -+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int"); -+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec"); -+ tdesc_type *element_type; -+ element_type = tdesc_named_type (feature, "ieee_single"); -+ tdesc_create_vector (feature, "v4f", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int32"); -+ tdesc_create_vector (feature, "v4i32", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int16"); -+ tdesc_create_vector (feature, "v8i16", element_type, 8); -+ -+ element_type = tdesc_named_type (feature, "int8"); -+ tdesc_create_vector (feature, "v16i8", element_type, 16); -+ -+ tdesc_type_with_fields *type_with_fields; -+ type_with_fields = tdesc_create_union (feature, "vec128"); -+ tdesc_type *field_type; -+ field_type = tdesc_named_type (feature, "uint128"); -+ tdesc_add_field (type_with_fields, "uint128", field_type); -+ field_type = tdesc_named_type (feature, "v4f"); -+ tdesc_add_field (type_with_fields, "v4_float", field_type); -+ field_type = tdesc_named_type (feature, "v4i32"); -+ tdesc_add_field (type_with_fields, "v4_int32", field_type); -+ field_type = tdesc_named_type (feature, "v8i16"); -+ tdesc_add_field (type_with_fields, "v8_int16", field_type); -+ field_type = tdesc_named_type (feature, "v16i8"); -+ tdesc_add_field (type_with_fields, "v16_int8", field_type); -+ -+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int"); -+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx"); -+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr"); -+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr"); -+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64"); -+ -+ tdesc_powerpc_isa205_ppr_dscr_vsx64l = result; -+} -diff --git a/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml -@@ -0,0 +1,18 @@ -+ -+ -+ -+ -+ -+ powerpc:common64 -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv ---- a/gdb/gdbserver/configure.srv -+++ b/gdb/gdbserver/configure.srv -@@ -32,7 +32,7 @@ else - srv_amd64_linux_regobj="" - fi - --ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o" -+ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-isa205-ppr-dscr-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o powerpc-isa205-ppr-dscr-vsx64l-ipa.o" - - # Linux object files. This is so we don't have to repeat - # these files over and over again. -@@ -217,6 +217,7 @@ case "${target}" in - srv_regobj="${srv_regobj} powerpc-isa205-32l.o" - srv_regobj="${srv_regobj} powerpc-isa205-altivec32l.o" - srv_regobj="${srv_regobj} powerpc-isa205-vsx32l.o" -+ srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx32l.o" - srv_regobj="${srv_regobj} powerpc-e500l.o" - srv_regobj="${srv_regobj} powerpc-64l.o" - srv_regobj="${srv_regobj} powerpc-altivec64l.o" -@@ -225,6 +226,7 @@ case "${target}" in - srv_regobj="${srv_regobj} powerpc-isa205-64l.o" - srv_regobj="${srv_regobj} powerpc-isa205-altivec64l.o" - srv_regobj="${srv_regobj} powerpc-isa205-vsx64l.o" -+ srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx64l.o" - srv_tgtobj="$srv_linux_obj linux-ppc-low.o ppc-linux.o" - srv_tgtobj="${srv_tgtobj} arch/ppc-linux-common.o" - srv_xmlfiles="rs6000/powerpc-32l.xml" -@@ -234,12 +236,15 @@ case "${target}" in - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-32l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec32l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx32l.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-altivec.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-vsx.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-core.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-linux.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu-isa205.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-dscr.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-ppr.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-e500l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-spe.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-64l.xml" -@@ -249,6 +254,7 @@ case "${target}" in - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-64l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec64l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx64l.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power64-core.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power64-linux.xml" - srv_linux_usrregs=yes -diff --git a/gdb/gdbserver/linux-ppc-ipa.c b/gdb/gdbserver/linux-ppc-ipa.c ---- a/gdb/gdbserver/linux-ppc-ipa.c -+++ b/gdb/gdbserver/linux-ppc-ipa.c -@@ -191,6 +191,8 @@ get_ipa_tdesc (int idx) - return tdesc_powerpc_isa205_altivec64l; - case PPC_TDESC_ISA205_VSX: - return tdesc_powerpc_isa205_vsx64l; -+ case PPC_TDESC_ISA205_PPR_DSCR_VSX: -+ return tdesc_powerpc_isa205_ppr_dscr_vsx64l; - #else - case PPC_TDESC_BASE: - return tdesc_powerpc_32l; -@@ -206,6 +208,8 @@ get_ipa_tdesc (int idx) - return tdesc_powerpc_isa205_altivec32l; - case PPC_TDESC_ISA205_VSX: - return tdesc_powerpc_isa205_vsx32l; -+ case PPC_TDESC_ISA205_PPR_DSCR_VSX: -+ return tdesc_powerpc_isa205_ppr_dscr_vsx32l; - case PPC_TDESC_E500: - return tdesc_powerpc_e500l; - #endif -@@ -234,6 +238,7 @@ initialize_low_tracepoint (void) - init_registers_powerpc_isa205_64l (); - init_registers_powerpc_isa205_altivec64l (); - init_registers_powerpc_isa205_vsx64l (); -+ init_registers_powerpc_isa205_ppr_dscr_vsx64l (); - #else - init_registers_powerpc_32l (); - init_registers_powerpc_altivec32l (); -@@ -242,6 +247,7 @@ initialize_low_tracepoint (void) - init_registers_powerpc_isa205_32l (); - init_registers_powerpc_isa205_altivec32l (); - init_registers_powerpc_isa205_vsx32l (); -+ init_registers_powerpc_isa205_ppr_dscr_vsx32l (); - init_registers_powerpc_e500l (); - #endif - } -diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c ---- a/gdb/gdbserver/linux-ppc-low.c -+++ b/gdb/gdbserver/linux-ppc-low.c -@@ -20,6 +20,8 @@ - #include "server.h" - #include "linux-low.h" - -+#include "elf/common.h" -+#include - #include - #include - -@@ -41,8 +43,14 @@ - #define PPC_LI(insn) (PPC_SEXT (PPC_FIELD (insn, 6, 24), 24) << 2) - #define PPC_BD(insn) (PPC_SEXT (PPC_FIELD (insn, 16, 14), 14) << 2) - -+/* Holds the AT_HWCAP auxv entry. */ -+ - static unsigned long ppc_hwcap; - -+/* Holds the AT_HWCAP2 auxv entry. */ -+ -+static unsigned long ppc_hwcap2; -+ - - #define ppc_num_regs 73 - -@@ -116,6 +124,24 @@ static int ppc_regmap_e500[] = - }; - #endif - -+/* Check whether the kernel provides a register set with number -+ REGSET_ID of size REGSETSIZE for process/thread TID. */ -+ -+static int -+ppc_check_regset (int tid, int regset_id, int regsetsize) -+{ -+ void *buf = alloca (regsetsize); -+ struct iovec iov; -+ -+ iov.iov_base = buf; -+ iov.iov_len = regsetsize; -+ -+ if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) >= 0 -+ || errno == ENODATA) -+ return 1; -+ return 0; -+} -+ - static int - ppc_cannot_store_register (int regno) - { -@@ -459,6 +485,46 @@ static void ppc_fill_gregset (struct regcache *regcache, void *buf) - ppc_collect_ptrace_register (regcache, i, (char *) buf + ppc_regmap[i]); - } - -+/* Program Priority Register regset fill function. */ -+ -+static void -+ppc_fill_pprregset (struct regcache *regcache, void *buf) -+{ -+ char *ppr = (char *) buf; -+ -+ collect_register_by_name (regcache, "ppr", ppr); -+} -+ -+/* Program Priority Register regset store function. */ -+ -+static void -+ppc_store_pprregset (struct regcache *regcache, const void *buf) -+{ -+ const char *ppr = (const char *) buf; -+ -+ supply_register_by_name (regcache, "ppr", ppr); -+} -+ -+/* Data Stream Control Register regset fill function. */ -+ -+static void -+ppc_fill_dscrregset (struct regcache *regcache, void *buf) -+{ -+ char *dscr = (char *) buf; -+ -+ collect_register_by_name (regcache, "dscr", dscr); -+} -+ -+/* Data Stream Control Register regset store function. */ -+ -+static void -+ppc_store_dscrregset (struct regcache *regcache, const void *buf) -+{ -+ const char *dscr = (const char *) buf; -+ -+ supply_register_by_name (regcache, "dscr", dscr); -+} -+ - static void - ppc_fill_vsxregset (struct regcache *regcache, void *buf) - { -@@ -568,6 +634,10 @@ static struct regset_info ppc_regsets[] = { - fetch them every time, but still fall back to PTRACE_PEEKUSER for the - general registers. Some kernels support these, but not the newer - PPC_PTRACE_GETREGS. */ -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_PPR, 0, EXTENDED_REGS, -+ ppc_fill_pprregset, ppc_store_pprregset }, -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_DSCR, 0, EXTENDED_REGS, -+ ppc_fill_dscrregset, ppc_store_dscrregset }, - { PTRACE_GETVSXREGS, PTRACE_SETVSXREGS, 0, 0, EXTENDED_REGS, - ppc_fill_vsxregset, ppc_store_vsxregset }, - { PTRACE_GETVRREGS, PTRACE_SETVRREGS, 0, 0, EXTENDED_REGS, -@@ -625,6 +695,7 @@ ppc_arch_setup (void) - /* The value of current_process ()->tdesc needs to be set for this - call. */ - ppc_get_auxv (AT_HWCAP, &ppc_hwcap); -+ ppc_get_auxv (AT_HWCAP2, &ppc_hwcap2); - - features.isa205 = ppc_linux_has_isa205 (ppc_hwcap); - -@@ -634,6 +705,11 @@ ppc_arch_setup (void) - if (ppc_hwcap & PPC_FEATURE_HAS_ALTIVEC) - features.altivec = true; - -+ if ((ppc_hwcap2 & PPC_FEATURE2_DSCR) -+ && ppc_check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET) -+ && ppc_check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET)) -+ features.ppr_dscr = true; -+ - if (ppc_hwcap & PPC_FEATURE_CELL) - features.cell = true; - -@@ -678,6 +754,21 @@ ppc_arch_setup (void) - else - regset->size = 0; - break; -+ case PTRACE_GETREGSET: -+ switch (regset->nt_type) -+ { -+ case NT_PPC_PPR: -+ regset->size = (features.ppr_dscr ? -+ PPC_LINUX_SIZEOF_PPRREGSET : 0); -+ break; -+ case NT_PPC_DSCR: -+ regset->size = (features.ppr_dscr ? -+ PPC_LINUX_SIZEOF_DSCRREGSET : 0); -+ break; -+ default: -+ break; -+ } -+ break; - default: - break; - } -@@ -3053,6 +3144,8 @@ ppc_get_ipa_tdesc_idx (void) - return PPC_TDESC_ISA205_ALTIVEC; - if (tdesc == tdesc_powerpc_isa205_vsx64l) - return PPC_TDESC_ISA205_VSX; -+ if (tdesc == tdesc_powerpc_isa205_ppr_dscr_vsx64l) -+ return PPC_TDESC_ISA205_PPR_DSCR_VSX; - #endif - - if (tdesc == tdesc_powerpc_32l) -@@ -3069,6 +3162,8 @@ ppc_get_ipa_tdesc_idx (void) - return PPC_TDESC_ISA205_ALTIVEC; - if (tdesc == tdesc_powerpc_isa205_vsx32l) - return PPC_TDESC_ISA205_VSX; -+ if (tdesc == tdesc_powerpc_isa205_ppr_dscr_vsx32l) -+ return PPC_TDESC_ISA205_PPR_DSCR_VSX; - if (tdesc == tdesc_powerpc_e500l) - return PPC_TDESC_E500; - -@@ -3127,6 +3222,7 @@ initialize_low_arch (void) - init_registers_powerpc_isa205_32l (); - init_registers_powerpc_isa205_altivec32l (); - init_registers_powerpc_isa205_vsx32l (); -+ init_registers_powerpc_isa205_ppr_dscr_vsx32l (); - init_registers_powerpc_e500l (); - #if __powerpc64__ - init_registers_powerpc_64l (); -@@ -3136,6 +3232,7 @@ initialize_low_arch (void) - init_registers_powerpc_isa205_64l (); - init_registers_powerpc_isa205_altivec64l (); - init_registers_powerpc_isa205_vsx64l (); -+ init_registers_powerpc_isa205_ppr_dscr_vsx64l (); - #endif - - initialize_regsets_info (&ppc_regsets_info); -diff --git a/gdb/gdbserver/linux-ppc-tdesc-init.h b/gdb/gdbserver/linux-ppc-tdesc-init.h ---- a/gdb/gdbserver/linux-ppc-tdesc-init.h -+++ b/gdb/gdbserver/linux-ppc-tdesc-init.h -@@ -29,6 +29,7 @@ enum ppc_linux_tdesc { - PPC_TDESC_ISA205, - PPC_TDESC_ISA205_ALTIVEC, - PPC_TDESC_ISA205_VSX, -+ PPC_TDESC_ISA205_PPR_DSCR_VSX, - PPC_TDESC_E500, - }; - -@@ -55,6 +56,9 @@ void init_registers_powerpc_isa205_altivec32l (void); - /* Defined in auto-generated file powerpc-isa205-vsx32l.c. */ - void init_registers_powerpc_isa205_vsx32l (void); - -+/* Defined in auto-generated file powerpc-isa205-ppr-dscr-vsx32l.c. */ -+void init_registers_powerpc_isa205_ppr_dscr_vsx32l (void); -+ - /* Defined in auto-generated file powerpc-e500l.c. */ - void init_registers_powerpc_e500l (void); - -@@ -83,4 +87,7 @@ void init_registers_powerpc_isa205_altivec64l (void); - /* Defined in auto-generated file powerpc-isa205-vsx64l.c. */ - void init_registers_powerpc_isa205_vsx64l (void); - -+/* Defined in auto-generated file powerpc-isa205-ppr-dscr-vsx64l.c. */ -+void init_registers_powerpc_isa205_ppr_dscr_vsx64l (void); -+ - #endif -diff --git a/gdb/nat/ppc-linux.h b/gdb/nat/ppc-linux.h ---- a/gdb/nat/ppc-linux.h -+++ b/gdb/nat/ppc-linux.h -@@ -51,6 +51,9 @@ - #ifndef PPC_FEATURE_HAS_SPE - #define PPC_FEATURE_HAS_SPE 0x00800000 - #endif -+#ifndef PPC_FEATURE2_DSCR -+#define PPC_FEATURE2_DSCR 0x20000000 -+#endif - - /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a - configure time check. Some older glibc's (for instance 2.2.1) -@@ -82,6 +85,16 @@ - #define PTRACE_SETEVRREGS 21 - #endif - -+/* Program Priority Register. */ -+#ifndef NT_PPC_PPR -+#define NT_PPC_PPR 0x104 -+#endif -+ -+/* Data Stream Control Register. */ -+#ifndef NT_PPC_DSCR -+#define NT_PPC_DSCR 0x105 -+#endif -+ - /* Return the wordsize of the target, either 4 or 8 bytes. */ - int ppc_linux_target_wordsize (int tid); - -diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c ---- a/gdb/ppc-linux-nat.c -+++ b/gdb/ppc-linux-nat.c -@@ -31,6 +31,7 @@ - #include - #include - #include -+#include - #include "gdb_wait.h" - #include - #include -@@ -528,6 +529,78 @@ fetch_spe_register (struct regcache *regcache, int tid, int regno) - regcache->raw_supply (tdep->ppc_spefscr_regnum, &evrregs.spefscr); - } - -+/* Use ptrace to fetch all registers from the register set with note -+ type REGSET_ID, size REGSIZE, and layout described by REGSET, from -+ process/thread TID and supply their values to REGCACHE. If ptrace -+ returns ENODATA to indicate the regset is unavailable, mark the -+ registers as unavailable in REGCACHE. */ -+ -+static void -+fetch_regset (struct regcache *regcache, int tid, -+ int regset_id, int regsetsize, const struct regset *regset) -+{ -+ void *buf = alloca (regsetsize); -+ struct iovec iov; -+ -+ iov.iov_base = buf; -+ iov.iov_len = regsetsize; -+ -+ if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) < 0) -+ { -+ if (errno == ENODATA) -+ regset->supply_regset (regset, regcache, -1, NULL, regsetsize); -+ else -+ perror_with_name (_("Couldn't get register set")); -+ } -+ else -+ regset->supply_regset (regset, regcache, -1, buf, regsetsize); -+} -+ -+/* Use ptrace to store register REGNUM of the regset with note type -+ REGSET_ID, size REGSETSIZE, and layout described by REGSET, from -+ REGCACHE back to process/thread TID. If REGNUM is -1 all registers -+ in the set are collected and stored. */ -+ -+static void -+store_regset (const struct regcache *regcache, int tid, int regnum, -+ int regset_id, int regsetsize, const struct regset *regset) -+{ -+ void *buf = alloca (regsetsize); -+ struct iovec iov; -+ -+ iov.iov_base = buf; -+ iov.iov_len = regsetsize; -+ -+ /* Make sure that the buffer that will be stored has up to date values -+ for the registers that won't be collected. */ -+ if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) < 0) -+ perror_with_name (_("Couldn't get register set")); -+ -+ regset->collect_regset (regset, regcache, regnum, buf, regsetsize); -+ -+ if (ptrace (PTRACE_SETREGSET, tid, regset_id, &iov) < 0) -+ perror_with_name (_("Couldn't set register set")); -+} -+ -+/* Check whether the kernel provides a register set with number -+ REGSET_ID of size REGSETSIZE for process/thread TID. */ -+ -+static bool -+check_regset (int tid, int regset_id, int regsetsize) -+{ -+ void *buf = alloca (regsetsize); -+ struct iovec iov; -+ -+ iov.iov_base = buf; -+ iov.iov_len = regsetsize; -+ -+ if (ptrace (PTRACE_GETREGSET, tid, regset_id, &iov) >= 0 -+ || errno == ENODATA) -+ return true; -+ else -+ return false; -+} -+ - static void - fetch_register (struct regcache *regcache, int tid, int regno) - { -@@ -567,6 +640,24 @@ fetch_register (struct regcache *regcache, int tid, int regno) - fetch_spe_register (regcache, tid, regno); - return; - } -+ else if (regno == PPC_DSCR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_dscr_regnum != -1); -+ -+ fetch_regset (regcache, tid, NT_PPC_DSCR, -+ PPC_LINUX_SIZEOF_DSCRREGSET, -+ &ppc32_linux_dscrregset); -+ return; -+ } -+ else if (regno == PPC_PPR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_ppr_regnum != -1); -+ -+ fetch_regset (regcache, tid, NT_PPC_PPR, -+ PPC_LINUX_SIZEOF_PPRREGSET, -+ &ppc32_linux_pprregset); -+ return; -+ } - - if (regaddr == -1) - { -@@ -763,6 +854,14 @@ fetch_ppc_registers (struct regcache *regcache, int tid) - fetch_vsx_registers (regcache, tid, -1); - if (tdep->ppc_ev0_upper_regnum >= 0) - fetch_spe_register (regcache, tid, -1); -+ if (tdep->ppc_ppr_regnum != -1) -+ fetch_regset (regcache, tid, NT_PPC_PPR, -+ PPC_LINUX_SIZEOF_PPRREGSET, -+ &ppc32_linux_pprregset); -+ if (tdep->ppc_dscr_regnum != -1) -+ fetch_regset (regcache, tid, NT_PPC_DSCR, -+ PPC_LINUX_SIZEOF_DSCRREGSET, -+ &ppc32_linux_dscrregset); - } - - /* Fetch registers from the child process. Fetch all registers if -@@ -943,6 +1042,24 @@ store_register (const struct regcache *regcache, int tid, int regno) - store_spe_register (regcache, tid, regno); - return; - } -+ else if (regno == PPC_DSCR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_dscr_regnum != -1); -+ -+ store_regset (regcache, tid, regno, NT_PPC_DSCR, -+ PPC_LINUX_SIZEOF_DSCRREGSET, -+ &ppc32_linux_dscrregset); -+ return; -+ } -+ else if (regno == PPC_PPR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_ppr_regnum != -1); -+ -+ store_regset (regcache, tid, regno, NT_PPC_PPR, -+ PPC_LINUX_SIZEOF_PPRREGSET, -+ &ppc32_linux_pprregset); -+ return; -+ } - - if (regaddr == -1) - return; -@@ -1157,6 +1274,14 @@ store_ppc_registers (const struct regcache *regcache, int tid) - store_vsx_registers (regcache, tid, -1); - if (tdep->ppc_ev0_upper_regnum >= 0) - store_spe_register (regcache, tid, -1); -+ if (tdep->ppc_ppr_regnum != -1) -+ store_regset (regcache, tid, -1, NT_PPC_PPR, -+ PPC_LINUX_SIZEOF_PPRREGSET, -+ &ppc32_linux_pprregset); -+ if (tdep->ppc_dscr_regnum != -1) -+ store_regset (regcache, tid, -1, NT_PPC_DSCR, -+ PPC_LINUX_SIZEOF_DSCRREGSET, -+ &ppc32_linux_dscrregset); - } - - /* Fetch the AT_HWCAP entry from the aux vector. */ -@@ -1171,6 +1296,19 @@ ppc_linux_get_hwcap (void) - return field; - } - -+/* Fetch the AT_HWCAP2 entry from the aux vector. */ -+ -+static CORE_ADDR -+ppc_linux_get_hwcap2 (void) -+{ -+ CORE_ADDR field; -+ -+ if (target_auxv_search (current_top_target (), AT_HWCAP2, &field) != 1) -+ return 0; -+ -+ return field; -+} -+ - /* The cached DABR value, to install in new threads. - This variable is used when the PowerPC HWDEBUG ptrace - interface is not available. */ -@@ -2233,6 +2371,7 @@ ppc_linux_nat_target::read_description () - features.wordsize = ppc_linux_target_wordsize (tid); - - CORE_ADDR hwcap = ppc_linux_get_hwcap (); -+ CORE_ADDR hwcap2 = ppc_linux_get_hwcap2 (); - - if (have_ptrace_getsetvsxregs - && (hwcap & PPC_FEATURE_HAS_VSX)) -@@ -2267,6 +2406,11 @@ ppc_linux_nat_target::read_description () - - features.isa205 = ppc_linux_has_isa205 (hwcap); - -+ if ((hwcap2 & PPC_FEATURE2_DSCR) -+ && check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET) -+ && check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET)) -+ features.ppr_dscr = true; -+ - return ppc_linux_match_description (features); - } - -diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c ---- a/gdb/ppc-linux-tdep.c -+++ b/gdb/ppc-linux-tdep.c -@@ -71,6 +71,7 @@ - #include "features/rs6000/powerpc-isa205-32l.c" - #include "features/rs6000/powerpc-isa205-altivec32l.c" - #include "features/rs6000/powerpc-isa205-vsx32l.c" -+#include "features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c" - #include "features/rs6000/powerpc-64l.c" - #include "features/rs6000/powerpc-altivec64l.c" - #include "features/rs6000/powerpc-cell64l.c" -@@ -78,6 +79,7 @@ - #include "features/rs6000/powerpc-isa205-64l.c" - #include "features/rs6000/powerpc-isa205-altivec64l.c" - #include "features/rs6000/powerpc-isa205-vsx64l.c" -+#include "features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c" - #include "features/rs6000/powerpc-e500l.c" - - /* Shared library operations for PowerPC-Linux. */ -@@ -547,6 +549,38 @@ static const struct regset ppc32_linux_vsxregset = { - regcache_collect_regset - }; - -+/* Program Priorty Register regmap. */ -+ -+static const struct regcache_map_entry ppc32_regmap_ppr[] = -+ { -+ { 1, PPC_PPR_REGNUM, 8 }, -+ { 0 } -+ }; -+ -+/* Program Priorty Register regset. */ -+ -+const struct regset ppc32_linux_pprregset = { -+ ppc32_regmap_ppr, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ -+/* Data Stream Control Register regmap. */ -+ -+static const struct regcache_map_entry ppc32_regmap_dscr[] = -+ { -+ { 1, PPC_DSCR_REGNUM, 8 }, -+ { 0 } -+ }; -+ -+/* Data Stream Control Register regset. */ -+ -+const struct regset ppc32_linux_dscrregset = { -+ ppc32_regmap_dscr, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ - const struct regset * - ppc_linux_gregset (int wordsize) - { -@@ -585,6 +619,8 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - int have_altivec = tdep->ppc_vr0_regnum != -1; - int have_vsx = tdep->ppc_vsr0_upper_regnum != -1; -+ int have_ppr = tdep->ppc_ppr_regnum != -1; -+ int have_dscr = tdep->ppc_dscr_regnum != -1; - - if (tdep->wordsize == 4) - cb (".reg", 48 * 4, 48 * 4, &ppc32_linux_gregset, NULL, cb_data); -@@ -603,6 +639,17 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, - if (have_vsx) - cb (".reg-ppc-vsx", PPC_LINUX_SIZEOF_VSXREGSET, PPC_LINUX_SIZEOF_VSXREGSET, - &ppc32_linux_vsxregset, "POWER7 VSX", cb_data); -+ -+ if (have_ppr) -+ cb (".reg-ppc-ppr", PPC_LINUX_SIZEOF_PPRREGSET, -+ PPC_LINUX_SIZEOF_PPRREGSET, -+ &ppc32_linux_pprregset, "Priority Program Register", cb_data); -+ -+ if (have_dscr) -+ cb (".reg-ppc-dscr", PPC_LINUX_SIZEOF_DSCRREGSET, -+ PPC_LINUX_SIZEOF_DSCRREGSET, -+ &ppc32_linux_dscrregset, "Data Stream Control Register", -+ cb_data); - } - - static void -@@ -1015,6 +1062,8 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch, - asection *altivec = bfd_get_section_by_name (abfd, ".reg-ppc-vmx"); - asection *vsx = bfd_get_section_by_name (abfd, ".reg-ppc-vsx"); - asection *section = bfd_get_section_by_name (abfd, ".reg"); -+ asection *ppr = bfd_get_section_by_name (abfd, ".reg-ppc-ppr"); -+ asection *dscr = bfd_get_section_by_name (abfd, ".reg-ppc-dscr"); - - if (! section) - return NULL; -@@ -1047,6 +1096,9 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch, - - features.isa205 = ppc_linux_has_isa205 (hwcap); - -+ if (ppr && dscr) -+ features.ppr_dscr = true; -+ - return ppc_linux_match_description (features); - } - -@@ -1920,6 +1972,7 @@ _initialize_ppc_linux_tdep (void) - initialize_tdesc_powerpc_isa205_32l (); - initialize_tdesc_powerpc_isa205_altivec32l (); - initialize_tdesc_powerpc_isa205_vsx32l (); -+ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (); - initialize_tdesc_powerpc_64l (); - initialize_tdesc_powerpc_altivec64l (); - initialize_tdesc_powerpc_cell64l (); -@@ -1927,5 +1980,6 @@ _initialize_ppc_linux_tdep (void) - initialize_tdesc_powerpc_isa205_64l (); - initialize_tdesc_powerpc_isa205_altivec64l (); - initialize_tdesc_powerpc_isa205_vsx64l (); -+ initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (); - initialize_tdesc_powerpc_e500l (); - } -diff --git a/gdb/ppc-linux-tdep.h b/gdb/ppc-linux-tdep.h ---- a/gdb/ppc-linux-tdep.h -+++ b/gdb/ppc-linux-tdep.h -@@ -44,4 +44,8 @@ enum { - /* Return 1 if PPC_ORIG_R3_REGNUM and PPC_TRAP_REGNUM are usable. */ - int ppc_linux_trap_reg_p (struct gdbarch *gdbarch); - -+/* Additional register sets, defined in ppc-linux-tdep.c. */ -+extern const struct regset ppc32_linux_pprregset; -+extern const struct regset ppc32_linux_dscrregset; -+ - #endif /* PPC_LINUX_TDEP_H */ -diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h ---- a/gdb/ppc-tdep.h -+++ b/gdb/ppc-tdep.h -@@ -253,6 +253,12 @@ struct gdbarch_tdep - int ppc_acc_regnum; /* SPE 'acc' register. */ - int ppc_spefscr_regnum; /* SPE 'spefscr' register. */ - -+ /* Program Priority Register. */ -+ int ppc_ppr_regnum; -+ -+ /* Data Stream Control Register. */ -+ int ppc_dscr_regnum; -+ - /* Decimal 128 registers. */ - int ppc_dl0_regnum; /* First Decimal128 argument register pair. */ - -@@ -309,6 +315,8 @@ enum { - PPC_VRSAVE_REGNUM = 139, - PPC_VSR0_UPPER_REGNUM = 140, - PPC_VSR31_UPPER_REGNUM = 171, -+ PPC_PPR_REGNUM = 172, -+ PPC_DSCR_REGNUM = 173, - PPC_NUM_REGS - }; - -diff --git a/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx32l.dat b/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx32l.dat -new file mode 100644 ---- /dev/null -+++ b/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx32l.dat -@@ -0,0 +1,146 @@ -+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro: -+# Generated from: rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml -+name:powerpc_isa205_ppr_dscr_vsx32l -+xmltarget:powerpc-isa205-ppr-dscr-vsx32l.xml -+expedite:r1,pc -+32:r0 -+32:r1 -+32:r2 -+32:r3 -+32:r4 -+32:r5 -+32:r6 -+32:r7 -+32:r8 -+32:r9 -+32:r10 -+32:r11 -+32:r12 -+32:r13 -+32:r14 -+32:r15 -+32:r16 -+32:r17 -+32:r18 -+32:r19 -+32:r20 -+32:r21 -+32:r22 -+32:r23 -+32:r24 -+32:r25 -+32:r26 -+32:r27 -+32:r28 -+32:r29 -+32:r30 -+32:r31 -+64:f0 -+64:f1 -+64:f2 -+64:f3 -+64:f4 -+64:f5 -+64:f6 -+64:f7 -+64:f8 -+64:f9 -+64:f10 -+64:f11 -+64:f12 -+64:f13 -+64:f14 -+64:f15 -+64:f16 -+64:f17 -+64:f18 -+64:f19 -+64:f20 -+64:f21 -+64:f22 -+64:f23 -+64:f24 -+64:f25 -+64:f26 -+64:f27 -+64:f28 -+64:f29 -+64:f30 -+64:f31 -+32:pc -+32:msr -+32:cr -+32:lr -+32:ctr -+32:xer -+64:fpscr -+32:orig_r3 -+32:trap -+128:vr0 -+128:vr1 -+128:vr2 -+128:vr3 -+128:vr4 -+128:vr5 -+128:vr6 -+128:vr7 -+128:vr8 -+128:vr9 -+128:vr10 -+128:vr11 -+128:vr12 -+128:vr13 -+128:vr14 -+128:vr15 -+128:vr16 -+128:vr17 -+128:vr18 -+128:vr19 -+128:vr20 -+128:vr21 -+128:vr22 -+128:vr23 -+128:vr24 -+128:vr25 -+128:vr26 -+128:vr27 -+128:vr28 -+128:vr29 -+128:vr30 -+128:vr31 -+32:vscr -+32:vrsave -+64:vs0h -+64:vs1h -+64:vs2h -+64:vs3h -+64:vs4h -+64:vs5h -+64:vs6h -+64:vs7h -+64:vs8h -+64:vs9h -+64:vs10h -+64:vs11h -+64:vs12h -+64:vs13h -+64:vs14h -+64:vs15h -+64:vs16h -+64:vs17h -+64:vs18h -+64:vs19h -+64:vs20h -+64:vs21h -+64:vs22h -+64:vs23h -+64:vs24h -+64:vs25h -+64:vs26h -+64:vs27h -+64:vs28h -+64:vs29h -+64:vs30h -+64:vs31h -+64:ppr -+64:dscr -diff --git a/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx64l.dat b/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx64l.dat -new file mode 100644 ---- /dev/null -+++ b/gdb/regformats/rs6000/powerpc-isa205-ppr-dscr-vsx64l.dat -@@ -0,0 +1,146 @@ -+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro: -+# Generated from: rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml -+name:powerpc_isa205_ppr_dscr_vsx64l -+xmltarget:powerpc-isa205-ppr-dscr-vsx64l.xml -+expedite:r1,pc -+64:r0 -+64:r1 -+64:r2 -+64:r3 -+64:r4 -+64:r5 -+64:r6 -+64:r7 -+64:r8 -+64:r9 -+64:r10 -+64:r11 -+64:r12 -+64:r13 -+64:r14 -+64:r15 -+64:r16 -+64:r17 -+64:r18 -+64:r19 -+64:r20 -+64:r21 -+64:r22 -+64:r23 -+64:r24 -+64:r25 -+64:r26 -+64:r27 -+64:r28 -+64:r29 -+64:r30 -+64:r31 -+64:f0 -+64:f1 -+64:f2 -+64:f3 -+64:f4 -+64:f5 -+64:f6 -+64:f7 -+64:f8 -+64:f9 -+64:f10 -+64:f11 -+64:f12 -+64:f13 -+64:f14 -+64:f15 -+64:f16 -+64:f17 -+64:f18 -+64:f19 -+64:f20 -+64:f21 -+64:f22 -+64:f23 -+64:f24 -+64:f25 -+64:f26 -+64:f27 -+64:f28 -+64:f29 -+64:f30 -+64:f31 -+64:pc -+64:msr -+32:cr -+64:lr -+64:ctr -+32:xer -+64:fpscr -+64:orig_r3 -+64:trap -+128:vr0 -+128:vr1 -+128:vr2 -+128:vr3 -+128:vr4 -+128:vr5 -+128:vr6 -+128:vr7 -+128:vr8 -+128:vr9 -+128:vr10 -+128:vr11 -+128:vr12 -+128:vr13 -+128:vr14 -+128:vr15 -+128:vr16 -+128:vr17 -+128:vr18 -+128:vr19 -+128:vr20 -+128:vr21 -+128:vr22 -+128:vr23 -+128:vr24 -+128:vr25 -+128:vr26 -+128:vr27 -+128:vr28 -+128:vr29 -+128:vr30 -+128:vr31 -+32:vscr -+32:vrsave -+64:vs0h -+64:vs1h -+64:vs2h -+64:vs3h -+64:vs4h -+64:vs5h -+64:vs6h -+64:vs7h -+64:vs8h -+64:vs9h -+64:vs10h -+64:vs11h -+64:vs12h -+64:vs13h -+64:vs14h -+64:vs15h -+64:vs16h -+64:vs17h -+64:vs18h -+64:vs19h -+64:vs20h -+64:vs21h -+64:vs22h -+64:vs23h -+64:vs24h -+64:vs25h -+64:vs26h -+64:vs27h -+64:vs28h -+64:vs29h -+64:vs30h -+64:vs31h -+64:ppr -+64:dscr -diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c ---- a/gdb/rs6000-tdep.c -+++ b/gdb/rs6000-tdep.c -@@ -4466,6 +4466,17 @@ ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache, - case 570: /* Count Trailing Zeros Doubleword */ - case 890: /* Extend-Sign Word and Shift Left Immediate (445) */ - case 890 | 1: /* Extend-Sign Word and Shift Left Immediate (445) */ -+ -+ if (ext == 444 && tdep->ppc_ppr_regnum >= 0 -+ && (PPC_RS (insn) == PPC_RA (insn)) -+ && (PPC_RA (insn) == PPC_RB (insn)) -+ && !PPC_RC (insn)) -+ { -+ /* or Rx,Rx,Rx alters PRI in PPR. */ -+ record_full_arch_list_add_reg (regcache, tdep->ppc_ppr_regnum); -+ return 0; -+ } -+ - if (PPC_RC (insn)) - record_full_arch_list_add_reg (regcache, tdep->ppc_cr_regnum); - record_full_arch_list_add_reg (regcache, -@@ -4675,6 +4686,10 @@ ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache, - case 1: /* XER */ - record_full_arch_list_add_reg (regcache, tdep->ppc_xer_regnum); - return 0; -+ case 3: /* DSCR */ -+ if (tdep->ppc_dscr_regnum >= 0) -+ record_full_arch_list_add_reg (regcache, tdep->ppc_dscr_regnum); -+ return 0; - case 8: /* LR */ - record_full_arch_list_add_reg (regcache, tdep->ppc_lr_regnum); - return 0; -@@ -4684,6 +4699,11 @@ ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache, - case 256: /* VRSAVE */ - record_full_arch_list_add_reg (regcache, tdep->ppc_vrsave_regnum); - return 0; -+ case 896: -+ case 898: /* PPR */ -+ if (tdep->ppc_ppr_regnum >= 0) -+ record_full_arch_list_add_reg (regcache, tdep->ppc_ppr_regnum); -+ return 0; - } - - goto UNKNOWN_OP; -@@ -5846,7 +5866,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - enum powerpc_vector_abi vector_abi = powerpc_vector_abi_global; - enum powerpc_elf_abi elf_abi = POWERPC_ELF_AUTO; - int have_fpu = 0, have_spe = 0, have_mq = 0, have_altivec = 0; -- int have_dfp = 0, have_vsx = 0; -+ int have_dfp = 0, have_vsx = 0, have_ppr = 0, have_dscr = 0; - int tdesc_wordsize = -1; - const struct target_desc *tdesc = info.target_desc; - struct tdesc_arch_data *tdesc_data = NULL; -@@ -6129,6 +6149,44 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - } - else - have_spe = 0; -+ -+ /* Program Priority Register. */ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.ppr"); -+ if (feature != NULL) -+ { -+ valid_p = 1; -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_PPR_REGNUM, "ppr"); -+ -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ have_ppr = 1; -+ } -+ else -+ have_ppr = 0; -+ -+ /* Data Stream Control Register. */ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.dscr"); -+ if (feature != NULL) -+ { -+ valid_p = 1; -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_DSCR_REGNUM, "dscr"); -+ -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ have_dscr = 1; -+ } -+ else -+ have_dscr = 0; - } - - /* If we have a 64-bit binary on a 32-bit target, complain. Also -@@ -6323,6 +6381,8 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - tdep->ppc_ev0_upper_regnum = have_spe ? PPC_SPE_UPPER_GP0_REGNUM : -1; - tdep->ppc_acc_regnum = have_spe ? PPC_SPE_ACC_REGNUM : -1; - tdep->ppc_spefscr_regnum = have_spe ? PPC_SPE_FSCR_REGNUM : -1; -+ tdep->ppc_ppr_regnum = have_ppr ? PPC_PPR_REGNUM : -1; -+ tdep->ppc_dscr_regnum = have_dscr ? PPC_DSCR_REGNUM : -1; - - set_gdbarch_pc_regnum (gdbarch, PPC_PC_REGNUM); - set_gdbarch_sp_regnum (gdbarch, PPC_R0_REGNUM + 1); -diff --git a/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.c b/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.c -@@ -0,0 +1,34 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright (C) 2018 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 . */ -+ -+int main (void) -+{ -+ /* Set Load Stream Disable bit in DSCR. */ -+ unsigned long dscr = 0x20; -+ -+ /* This is the non-privileged SPR number to access DSCR, -+ available since isa 207. */ -+ asm volatile ("mtspr 3,%0" : : "r" (dscr)); -+ -+ /* Set PPR to low priority (010 in bits 11:13, or -+ 0x0008000000000000). */ -+ asm volatile ("or 1,1,1"); -+ asm volatile ("nop"); // marker -+ asm volatile ("nop"); -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.exp b/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/powerpc-ppr-dscr.exp -@@ -0,0 +1,120 @@ -+# Copyright (C) 2018 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 . -+ -+# This file is part of the gdb testsuite. -+ -+# Test access to special purpose registers PPR and DSCR. The test -+# inferior writes to these registers, we check that GDB reads the same -+# values, then write to the registers trough GDB, step once, and check -+# again if we read back the same values. -+ -+if {![istarget "powerpc*-*-linux*"]} then { -+ verbose "Skipping PowerPC test for PPR and DSCR registers." -+ return -+} -+ -+standard_testfile .c -+ -+if {[build_executable "compile" $binfile $srcfile {debug}] == -1} { -+ return -+} -+ -+proc check_register_access { regname } { -+ global gdb_prompt -+ -+ set test "$regname register access" -+ gdb_test_multiple "info reg $regname" "$test" { -+ -re "Invalid register.*\r\n$gdb_prompt $" { -+ unsupported "$test" -+ return 0 -+ } -+ -re "\r\n$regname.*\r\n$gdb_prompt $" { -+ pass "$test" -+ return 1 -+ } -+ } -+ return 0 -+} -+ -+# Do one pass to check if the instructions in our test programs are -+# available to this processor (e.g. mtspr 3, RS for accessing DSCR). -+proc ppr_dscr_available {} { -+ global gdb_prompt -+ global inferior_exited_re -+ -+ set test "PPR/DSCR available to inferior" -+ gdb_test_multiple "continue" "" { -+ -re "Illegal instruction.*\r\n$gdb_prompt $" { -+ unsupported "$test" -+ return 0 -+ } -+ -re "$inferior_exited_re normally.*$gdb_prompt $" { -+ pass "$test" -+ return 1 -+ } -+ } -+ return 0 -+} -+ -+with_test_prefix "check PPR/DSCR access" { -+ clean_restart $binfile -+ -+ if ![runto_main] { -+ return -+ } -+ -+ if {![check_register_access "ppr"]} { -+ return -+ } -+ -+ if {![check_register_access "dscr"]} { -+ return -+ } -+ -+ if {![ppr_dscr_available]} { -+ return -+ } -+} -+ -+# Now do the actual test -+clean_restart $binfile -+ -+if ![runto_main] { -+ return -+} -+ -+gdb_breakpoint [gdb_get_line_number "marker"] -+ -+gdb_continue_to_breakpoint "continue to marker" -+ -+# At the breakpoint the inferior should have set the -+# registers to these expected values. -+ -+with_test_prefix "before write" { -+ gdb_test "info reg dscr" "dscr.*0x0*20\[ \t\]+.*" -+ gdb_test "info reg ppr" "ppr.*0x0*8000000000000\[ \t\]+.*" -+} -+ -+# Set Store Stream Enable in DSCR and set PPR to the medium-low -+# priority. -+gdb_test_no_output "set \$dscr = 0x8" -+gdb_test_no_output "set \$ppr = 0xC000000000000" -+ -+gdb_test "stepi" "asm.*" -+ -+with_test_prefix "after write" { -+ gdb_test "info reg dscr" "dscr.*0x0*8+\[ \t\]+.*" -+ gdb_test "info reg ppr" "ppr.*0x0*\[cC\]000000000000\[ \t\]+.*" -+} diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-11of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-11of15.patch deleted file mode 100644 index 475dea311e12ff8e06f0557360da9131818ec8c1..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-11of15.patch +++ /dev/null @@ -1,1654 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:17 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-11of15.patch - -;; [PowerPC] Add support for TAR -;; Edjunior Barbosa Machado and Pedro Franco de Carvalho, RH BZ 1187581 - -[PowerPC] Add support for TAR - -This patch adds support for the Target Address Register for powerpc -linux native and core file targets, and in the powerpc linux server -stub. - -gdb/ChangeLog: -2018-10-26 Edjunior Barbosa Machado - Pedro Franco de Carvalho - - * arch/ppc-linux-tdesc.h (tdesc_powerpc_isa207_vsx32l) - (tdesc_powerpc_isa207_vsx64l): Declare. - * arch/ppc-linux-common.h (PPC_LINUX_SIZEOF_TARREGSET): Define. - (struct ppc_linux_features) : New field. - (ppc_linux_no_features): Add initializer for isa207 field. - * arch/ppc-linux-common.c (ppc_linux_match_description): Return - new tdescs. - * nat/ppc-linux.h (PPC_FEATURE2_ARCH_2_07, PPC_FEATURE2_TAR) - (NT_PPC_TAR): Define if not already defined. - * features/Makefile (WHICH): Add rs6000/powerpc-isa207-vsx32l and - rs6000/powerpc-isa207-vsx64l. - (XMLTOC): Add rs6000/powerpc-isa207-vsx32l.xml and - rs6000/powerpc-isa207-vsx64l.xml. - * features/rs6000/power-tar.xml: New file. - * features/rs6000/powerpc-isa207-vsx32l.xml: New file. - * features/rs6000/powerpc-isa207-vsx64l.xml: New file. - * features/rs6000/powerpc-isa207-vsx32l.c: Generate. - * features/rs6000/powerpc-isa207-vsx64l.c: Generate. - * regformats/rs6000/powerpc-isa207-vsx32l.dat: Generate. - * regformats/rs6000/powerpc-isa207-vsx64l.dat: Generate. - * ppc-linux-nat.c (fetch_register, fetch_ppc_registers): Call - fetch_regset with the TAR regset. - (store_register, store_ppc_registers): Call store_regset with the - TAR regset. - (ppc_linux_nat_target::read_description): Set isa207 field in the - features struct if needed. - * ppc-linux-tdep.c: Include - features/rs6000/powerpc-isa207-vsx32l.c and - features/rs6000/powerpc-isa207-vsx64l.c. - (ppc32_regmap_tar, ppc32_linux_tarregset): New globals. - (ppc_linux_iterate_over_regset_sections): Call back with the tar - regset. - (ppc_linux_core_read_description): Check if the tar section is - present and set isa207 in the features struct. - (_initialize_ppc_linux_tdep): Call - initialize_tdesc_powerpc_isa207_vsx32l and - initialize_tdesc_powerpc_isa207_vsx64l. - * ppc-linux-tdep.h (ppc32_linux_tarregset): Declare. - * ppc-tdep.h (gdbarch_tdep) : New field. - (enum) : New enum value. - * rs6000-tdep.c (rs6000_gdbarch_init): Look for and validate tar - feature. - (ppc_process_record_op31): Record changes to TAR. - -gdb/gdbserver/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * configure.srv (ipa_ppc_linux_regobj): Add - powerpc-isa207-vsx64l-ipa.o and powerpc-isa207-vsx32l-ipa.o. - (powerpc*-*-linux*): Add powerpc-isa207-vsx32l.o and - powerpc-isa207-vsx64l.o to srv_regobj, add rs6000/power-tar.xml, - rs6000/powerpc-isa207-vsx32l.xml, and - rs6000/powerpc-isa207-vsx64l.xml to srv_xmlfiles. - * linux-ppc-tdesc-init.h (enum ppc_linux_tdesc) - : New enum value. - (init_registers_powerpc_isa207_vsx32l): Declare. - (init_registers_powerpc_isa207_vsx64l): Declare. - * linux-ppc-low.c (ppc_fill_tarregset): New function. - (ppc_store_tarregset): New function. - (ppc_regsets): Add entry for the TAR regset. - (ppc_arch_setup): Set isa207 in features struct when needed. Set - size for the TAR regsets. - (ppc_get_ipa_tdesc_idx): Return PPC_TDESC_ISA207_VSX. - (initialize_low_arch): Call init_registers_powerpc_isa207_vsx32l - and init_registers_powerpc_isa207_vsx64l. - * linux-ppc-ipa.c (get_ipa_tdesc): Handle PPC_TDESC_ISA207_VSX. - (initialize_low_tracepoint): Call - init_registers_powerpc_isa207_vsx32l and - init_registers_powerpc_isa207_vsx64l. - -gdb/testsuite/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * gdb.arch/powerpc-tar.c: New file. - * gdb.arch/powerpc-tar.exp: New file. - -gdb/doc/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * gdb.texinfo (PowerPC Features): Describe new feature - "org.gnu.gdb.power.tar". - -diff --git a/gdb/arch/ppc-linux-common.c b/gdb/arch/ppc-linux-common.c ---- a/gdb/arch/ppc-linux-common.c -+++ b/gdb/arch/ppc-linux-common.c -@@ -53,7 +53,8 @@ ppc_linux_match_description (struct ppc_linux_features features) - if (features.cell) - tdesc = tdesc_powerpc_cell64l; - else if (features.vsx) -- tdesc = (features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx64l -+ tdesc = (features.isa207? tdesc_powerpc_isa207_vsx64l -+ : features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx64l - : features.isa205? tdesc_powerpc_isa205_vsx64l - : tdesc_powerpc_vsx64l); - else if (features.altivec) -@@ -70,7 +71,8 @@ ppc_linux_match_description (struct ppc_linux_features features) - if (features.cell) - tdesc = tdesc_powerpc_cell32l; - else if (features.vsx) -- tdesc = (features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx32l -+ tdesc = (features.isa207? tdesc_powerpc_isa207_vsx32l -+ : features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx32l - : features.isa205? tdesc_powerpc_isa205_vsx32l - : tdesc_powerpc_vsx32l); - else if (features.altivec) -diff --git a/gdb/arch/ppc-linux-common.h b/gdb/arch/ppc-linux-common.h ---- a/gdb/arch/ppc-linux-common.h -+++ b/gdb/arch/ppc-linux-common.h -@@ -32,6 +32,7 @@ struct target_desc; - #define PPC_LINUX_SIZEOF_VSXREGSET 256 - #define PPC_LINUX_SIZEOF_PPRREGSET 8 - #define PPC_LINUX_SIZEOF_DSCRREGSET 8 -+#define PPC_LINUX_SIZEOF_TARREGSET 8 - - /* Check if the hwcap auxv entry indicates that isa205 is supported. */ - bool ppc_linux_has_isa205 (CORE_ADDR hwcap); -@@ -44,6 +45,7 @@ struct ppc_linux_features - bool vsx; - bool isa205; - bool ppr_dscr; -+ bool isa207; - bool cell; - }; - -@@ -55,6 +57,7 @@ const struct ppc_linux_features ppc_linux_no_features = { - false, - false, - false, -+ false, - }; - - /* Return a target description that matches FEATURES. */ -diff --git a/gdb/arch/ppc-linux-tdesc.h b/gdb/arch/ppc-linux-tdesc.h ---- a/gdb/arch/ppc-linux-tdesc.h -+++ b/gdb/arch/ppc-linux-tdesc.h -@@ -30,6 +30,7 @@ extern struct target_desc *tdesc_powerpc_isa205_32l; - extern struct target_desc *tdesc_powerpc_isa205_altivec32l; - extern struct target_desc *tdesc_powerpc_isa205_vsx32l; - extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx32l; -+extern struct target_desc *tdesc_powerpc_isa207_vsx32l; - extern struct target_desc *tdesc_powerpc_e500l; - - extern struct target_desc *tdesc_powerpc_64l; -@@ -40,5 +41,6 @@ extern struct target_desc *tdesc_powerpc_isa205_64l; - extern struct target_desc *tdesc_powerpc_isa205_altivec64l; - extern struct target_desc *tdesc_powerpc_isa205_vsx64l; - extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx64l; -+extern struct target_desc *tdesc_powerpc_isa207_vsx64l; - - #endif /* ARCH_PPC_LINUX_TDESC_H */ -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -42561,6 +42561,9 @@ contain the 64-bit register @samp{ppr}. - The @samp{org.gnu.gdb.power.dscr} feature is optional. It should - contain the 64-bit register @samp{dscr}. - -+The @samp{org.gnu.gdb.power.tar} feature is optional. It should -+contain the 64-bit register @samp{tar}. -+ - @node S/390 and System z Features - @subsection S/390 and System z Features - @cindex target descriptions, S/390 features -diff --git a/gdb/features/Makefile b/gdb/features/Makefile ---- a/gdb/features/Makefile -+++ b/gdb/features/Makefile -@@ -75,6 +75,7 @@ WHICH = aarch64 \ - rs6000/powerpc-isa205-vsx32l rs6000/powerpc-isa205-vsx64l \ - rs6000/powerpc-isa205-ppr-dscr-vsx32l \ - rs6000/powerpc-isa205-ppr-dscr-vsx64l \ -+ rs6000/powerpc-isa207-vsx32l rs6000/powerpc-isa207-vsx64l \ - s390-linux32 s390-linux64 s390x-linux64 \ - s390-linux32v1 s390-linux64v1 s390x-linux64v1 \ - s390-linux32v2 s390-linux64v2 s390x-linux64v2 \ -@@ -171,6 +172,8 @@ XMLTOC = \ - rs6000/powerpc-isa205-vsx64l.xml \ - rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml \ - rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml \ -+ rs6000/powerpc-isa207-vsx32l.xml \ -+ rs6000/powerpc-isa207-vsx64l.xml \ - rs6000/powerpc-vsx32.xml \ - rs6000/powerpc-vsx32l.xml \ - rs6000/powerpc-vsx64.xml \ -diff --git a/gdb/features/rs6000/power-tar.xml b/gdb/features/rs6000/power-tar.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-tar.xml -@@ -0,0 +1,12 @@ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/powerpc-isa207-vsx32l.c b/gdb/features/rs6000/powerpc-isa207-vsx32l.c -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa207-vsx32l.c -@@ -0,0 +1,203 @@ -+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: -+ Original: powerpc-isa207-vsx32l.xml */ -+ -+#include "defs.h" -+#include "osabi.h" -+#include "target-descriptions.h" -+ -+struct target_desc *tdesc_powerpc_isa207_vsx32l; -+static void -+initialize_tdesc_powerpc_isa207_vsx32l (void) -+{ -+ struct target_desc *result = allocate_target_description (); -+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common")); -+ -+ struct tdesc_feature *feature; -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core"); -+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr"); -+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr"); -+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu"); -+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux"); -+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int"); -+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec"); -+ tdesc_type *element_type; -+ element_type = tdesc_named_type (feature, "ieee_single"); -+ tdesc_create_vector (feature, "v4f", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int32"); -+ tdesc_create_vector (feature, "v4i32", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int16"); -+ tdesc_create_vector (feature, "v8i16", element_type, 8); -+ -+ element_type = tdesc_named_type (feature, "int8"); -+ tdesc_create_vector (feature, "v16i8", element_type, 16); -+ -+ tdesc_type_with_fields *type_with_fields; -+ type_with_fields = tdesc_create_union (feature, "vec128"); -+ tdesc_type *field_type; -+ field_type = tdesc_named_type (feature, "uint128"); -+ tdesc_add_field (type_with_fields, "uint128", field_type); -+ field_type = tdesc_named_type (feature, "v4f"); -+ tdesc_add_field (type_with_fields, "v4_float", field_type); -+ field_type = tdesc_named_type (feature, "v4i32"); -+ tdesc_add_field (type_with_fields, "v4_int32", field_type); -+ field_type = tdesc_named_type (feature, "v8i16"); -+ tdesc_add_field (type_with_fields, "v8_int16", field_type); -+ field_type = tdesc_named_type (feature, "v16i8"); -+ tdesc_add_field (type_with_fields, "v16_int8", field_type); -+ -+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int"); -+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx"); -+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr"); -+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr"); -+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar"); -+ tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64"); -+ -+ tdesc_powerpc_isa207_vsx32l = result; -+} -diff --git a/gdb/features/rs6000/powerpc-isa207-vsx32l.xml b/gdb/features/rs6000/powerpc-isa207-vsx32l.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa207-vsx32l.xml -@@ -0,0 +1,19 @@ -+ -+ -+ -+ -+ -+ powerpc:common -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/powerpc-isa207-vsx64l.c b/gdb/features/rs6000/powerpc-isa207-vsx64l.c -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa207-vsx64l.c -@@ -0,0 +1,203 @@ -+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: -+ Original: powerpc-isa207-vsx64l.xml */ -+ -+#include "defs.h" -+#include "osabi.h" -+#include "target-descriptions.h" -+ -+struct target_desc *tdesc_powerpc_isa207_vsx64l; -+static void -+initialize_tdesc_powerpc_isa207_vsx64l (void) -+{ -+ struct target_desc *result = allocate_target_description (); -+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64")); -+ -+ struct tdesc_feature *feature; -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core"); -+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr"); -+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr"); -+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu"); -+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux"); -+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int"); -+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec"); -+ tdesc_type *element_type; -+ element_type = tdesc_named_type (feature, "ieee_single"); -+ tdesc_create_vector (feature, "v4f", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int32"); -+ tdesc_create_vector (feature, "v4i32", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int16"); -+ tdesc_create_vector (feature, "v8i16", element_type, 8); -+ -+ element_type = tdesc_named_type (feature, "int8"); -+ tdesc_create_vector (feature, "v16i8", element_type, 16); -+ -+ tdesc_type_with_fields *type_with_fields; -+ type_with_fields = tdesc_create_union (feature, "vec128"); -+ tdesc_type *field_type; -+ field_type = tdesc_named_type (feature, "uint128"); -+ tdesc_add_field (type_with_fields, "uint128", field_type); -+ field_type = tdesc_named_type (feature, "v4f"); -+ tdesc_add_field (type_with_fields, "v4_float", field_type); -+ field_type = tdesc_named_type (feature, "v4i32"); -+ tdesc_add_field (type_with_fields, "v4_int32", field_type); -+ field_type = tdesc_named_type (feature, "v8i16"); -+ tdesc_add_field (type_with_fields, "v8_int16", field_type); -+ field_type = tdesc_named_type (feature, "v16i8"); -+ tdesc_add_field (type_with_fields, "v16_int8", field_type); -+ -+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int"); -+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx"); -+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr"); -+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr"); -+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar"); -+ tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64"); -+ -+ tdesc_powerpc_isa207_vsx64l = result; -+} -diff --git a/gdb/features/rs6000/powerpc-isa207-vsx64l.xml b/gdb/features/rs6000/powerpc-isa207-vsx64l.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa207-vsx64l.xml -@@ -0,0 +1,19 @@ -+ -+ -+ -+ -+ -+ powerpc:common64 -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv ---- a/gdb/gdbserver/configure.srv -+++ b/gdb/gdbserver/configure.srv -@@ -32,7 +32,7 @@ else - srv_amd64_linux_regobj="" - fi - --ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-isa205-ppr-dscr-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o powerpc-isa205-ppr-dscr-vsx64l-ipa.o" -+ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-isa205-ppr-dscr-vsx32l-ipa.o powerpc-isa207-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o powerpc-isa205-ppr-dscr-vsx64l-ipa.o powerpc-isa207-vsx64l-ipa.o" - - # Linux object files. This is so we don't have to repeat - # these files over and over again. -@@ -218,6 +218,7 @@ case "${target}" in - srv_regobj="${srv_regobj} powerpc-isa205-altivec32l.o" - srv_regobj="${srv_regobj} powerpc-isa205-vsx32l.o" - srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx32l.o" -+ srv_regobj="${srv_regobj} powerpc-isa207-vsx32l.o" - srv_regobj="${srv_regobj} powerpc-e500l.o" - srv_regobj="${srv_regobj} powerpc-64l.o" - srv_regobj="${srv_regobj} powerpc-altivec64l.o" -@@ -227,6 +228,7 @@ case "${target}" in - srv_regobj="${srv_regobj} powerpc-isa205-altivec64l.o" - srv_regobj="${srv_regobj} powerpc-isa205-vsx64l.o" - srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx64l.o" -+ srv_regobj="${srv_regobj} powerpc-isa207-vsx64l.o" - srv_tgtobj="$srv_linux_obj linux-ppc-low.o ppc-linux.o" - srv_tgtobj="${srv_tgtobj} arch/ppc-linux-common.o" - srv_xmlfiles="rs6000/powerpc-32l.xml" -@@ -237,6 +239,7 @@ case "${target}" in - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec32l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx32l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx32l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-altivec.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-vsx.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-core.xml" -@@ -245,6 +248,7 @@ case "${target}" in - srv_xmlfiles="${srv_xmlfiles} rs6000/power-fpu-isa205.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-dscr.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-ppr.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-tar.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-e500l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-spe.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-64l.xml" -@@ -255,6 +259,7 @@ case "${target}" in - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-altivec64l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx64l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx64l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power64-core.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power64-linux.xml" - srv_linux_usrregs=yes -diff --git a/gdb/gdbserver/linux-ppc-ipa.c b/gdb/gdbserver/linux-ppc-ipa.c ---- a/gdb/gdbserver/linux-ppc-ipa.c -+++ b/gdb/gdbserver/linux-ppc-ipa.c -@@ -193,6 +193,8 @@ get_ipa_tdesc (int idx) - return tdesc_powerpc_isa205_vsx64l; - case PPC_TDESC_ISA205_PPR_DSCR_VSX: - return tdesc_powerpc_isa205_ppr_dscr_vsx64l; -+ case PPC_TDESC_ISA207_VSX: -+ return tdesc_powerpc_isa207_vsx64l; - #else - case PPC_TDESC_BASE: - return tdesc_powerpc_32l; -@@ -210,6 +212,8 @@ get_ipa_tdesc (int idx) - return tdesc_powerpc_isa205_vsx32l; - case PPC_TDESC_ISA205_PPR_DSCR_VSX: - return tdesc_powerpc_isa205_ppr_dscr_vsx32l; -+ case PPC_TDESC_ISA207_VSX: -+ return tdesc_powerpc_isa207_vsx32l; - case PPC_TDESC_E500: - return tdesc_powerpc_e500l; - #endif -@@ -239,6 +243,7 @@ initialize_low_tracepoint (void) - init_registers_powerpc_isa205_altivec64l (); - init_registers_powerpc_isa205_vsx64l (); - init_registers_powerpc_isa205_ppr_dscr_vsx64l (); -+ init_registers_powerpc_isa207_vsx64l (); - #else - init_registers_powerpc_32l (); - init_registers_powerpc_altivec32l (); -@@ -248,6 +253,7 @@ initialize_low_tracepoint (void) - init_registers_powerpc_isa205_altivec32l (); - init_registers_powerpc_isa205_vsx32l (); - init_registers_powerpc_isa205_ppr_dscr_vsx32l (); -+ init_registers_powerpc_isa207_vsx32l (); - init_registers_powerpc_e500l (); - #endif - } -diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c ---- a/gdb/gdbserver/linux-ppc-low.c -+++ b/gdb/gdbserver/linux-ppc-low.c -@@ -525,6 +525,26 @@ ppc_store_dscrregset (struct regcache *regcache, const void *buf) - supply_register_by_name (regcache, "dscr", dscr); - } - -+/* Target Address Register regset fill function. */ -+ -+static void -+ppc_fill_tarregset (struct regcache *regcache, void *buf) -+{ -+ char *tar = (char *) buf; -+ -+ collect_register_by_name (regcache, "tar", tar); -+} -+ -+/* Target Address Register regset store function. */ -+ -+static void -+ppc_store_tarregset (struct regcache *regcache, const void *buf) -+{ -+ const char *tar = (const char *) buf; -+ -+ supply_register_by_name (regcache, "tar", tar); -+} -+ - static void - ppc_fill_vsxregset (struct regcache *regcache, void *buf) - { -@@ -634,6 +654,8 @@ static struct regset_info ppc_regsets[] = { - fetch them every time, but still fall back to PTRACE_PEEKUSER for the - general registers. Some kernels support these, but not the newer - PPC_PTRACE_GETREGS. */ -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TAR, 0, EXTENDED_REGS, -+ ppc_fill_tarregset, ppc_store_tarregset }, - { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_PPR, 0, EXTENDED_REGS, - ppc_fill_pprregset, ppc_store_pprregset }, - { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_DSCR, 0, EXTENDED_REGS, -@@ -708,7 +730,14 @@ ppc_arch_setup (void) - if ((ppc_hwcap2 & PPC_FEATURE2_DSCR) - && ppc_check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET) - && ppc_check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET)) -- features.ppr_dscr = true; -+ { -+ features.ppr_dscr = true; -+ if ((ppc_hwcap2 & PPC_FEATURE2_ARCH_2_07) -+ && (ppc_hwcap2 & PPC_FEATURE2_TAR) -+ && ppc_check_regset (tid, NT_PPC_TAR, -+ PPC_LINUX_SIZEOF_TARREGSET)) -+ features.isa207 = true; -+ } - - if (ppc_hwcap & PPC_FEATURE_CELL) - features.cell = true; -@@ -765,6 +794,10 @@ ppc_arch_setup (void) - regset->size = (features.ppr_dscr ? - PPC_LINUX_SIZEOF_DSCRREGSET : 0); - break; -+ case NT_PPC_TAR: -+ regset->size = (features.isa207 ? -+ PPC_LINUX_SIZEOF_TARREGSET : 0); -+ break; - default: - break; - } -@@ -3146,6 +3179,8 @@ ppc_get_ipa_tdesc_idx (void) - return PPC_TDESC_ISA205_VSX; - if (tdesc == tdesc_powerpc_isa205_ppr_dscr_vsx64l) - return PPC_TDESC_ISA205_PPR_DSCR_VSX; -+ if (tdesc == tdesc_powerpc_isa207_vsx64l) -+ return PPC_TDESC_ISA207_VSX; - #endif - - if (tdesc == tdesc_powerpc_32l) -@@ -3164,6 +3199,8 @@ ppc_get_ipa_tdesc_idx (void) - return PPC_TDESC_ISA205_VSX; - if (tdesc == tdesc_powerpc_isa205_ppr_dscr_vsx32l) - return PPC_TDESC_ISA205_PPR_DSCR_VSX; -+ if (tdesc == tdesc_powerpc_isa207_vsx32l) -+ return PPC_TDESC_ISA207_VSX; - if (tdesc == tdesc_powerpc_e500l) - return PPC_TDESC_E500; - -@@ -3223,6 +3260,7 @@ initialize_low_arch (void) - init_registers_powerpc_isa205_altivec32l (); - init_registers_powerpc_isa205_vsx32l (); - init_registers_powerpc_isa205_ppr_dscr_vsx32l (); -+ init_registers_powerpc_isa207_vsx32l (); - init_registers_powerpc_e500l (); - #if __powerpc64__ - init_registers_powerpc_64l (); -@@ -3233,6 +3271,7 @@ initialize_low_arch (void) - init_registers_powerpc_isa205_altivec64l (); - init_registers_powerpc_isa205_vsx64l (); - init_registers_powerpc_isa205_ppr_dscr_vsx64l (); -+ init_registers_powerpc_isa207_vsx64l (); - #endif - - initialize_regsets_info (&ppc_regsets_info); -diff --git a/gdb/gdbserver/linux-ppc-tdesc-init.h b/gdb/gdbserver/linux-ppc-tdesc-init.h ---- a/gdb/gdbserver/linux-ppc-tdesc-init.h -+++ b/gdb/gdbserver/linux-ppc-tdesc-init.h -@@ -30,6 +30,7 @@ enum ppc_linux_tdesc { - PPC_TDESC_ISA205_ALTIVEC, - PPC_TDESC_ISA205_VSX, - PPC_TDESC_ISA205_PPR_DSCR_VSX, -+ PPC_TDESC_ISA207_VSX, - PPC_TDESC_E500, - }; - -@@ -59,6 +60,9 @@ void init_registers_powerpc_isa205_vsx32l (void); - /* Defined in auto-generated file powerpc-isa205-ppr-dscr-vsx32l.c. */ - void init_registers_powerpc_isa205_ppr_dscr_vsx32l (void); - -+/* Defined in auto-generated file powerpc-isa207-vsx32l.c. */ -+void init_registers_powerpc_isa207_vsx32l (void); -+ - /* Defined in auto-generated file powerpc-e500l.c. */ - void init_registers_powerpc_e500l (void); - -@@ -90,4 +94,7 @@ void init_registers_powerpc_isa205_vsx64l (void); - /* Defined in auto-generated file powerpc-isa205-ppr-dscr-vsx64l.c. */ - void init_registers_powerpc_isa205_ppr_dscr_vsx64l (void); - -+/* Defined in auto-generated file powerpc-isa207-vsx64l.c. */ -+void init_registers_powerpc_isa207_vsx64l (void); -+ - #endif -diff --git a/gdb/nat/ppc-linux.h b/gdb/nat/ppc-linux.h ---- a/gdb/nat/ppc-linux.h -+++ b/gdb/nat/ppc-linux.h -@@ -54,6 +54,12 @@ - #ifndef PPC_FEATURE2_DSCR - #define PPC_FEATURE2_DSCR 0x20000000 - #endif -+#ifndef PPC_FEATURE2_ARCH_2_07 -+#define PPC_FEATURE2_ARCH_2_07 0x80000000 -+#endif -+#ifndef PPC_FEATURE2_TAR -+#define PPC_FEATURE2_TAR 0x04000000 -+#endif - - /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a - configure time check. Some older glibc's (for instance 2.2.1) -@@ -85,6 +91,11 @@ - #define PTRACE_SETEVRREGS 21 - #endif - -+/* Target Address Register. */ -+#ifndef NT_PPC_TAR -+#define NT_PPC_TAR 0x103 -+#endif -+ - /* Program Priority Register. */ - #ifndef NT_PPC_PPR - #define NT_PPC_PPR 0x104 -diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c ---- a/gdb/ppc-linux-nat.c -+++ b/gdb/ppc-linux-nat.c -@@ -658,6 +658,15 @@ fetch_register (struct regcache *regcache, int tid, int regno) - &ppc32_linux_pprregset); - return; - } -+ else if (regno == PPC_TAR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_tar_regnum != -1); -+ -+ fetch_regset (regcache, tid, NT_PPC_TAR, -+ PPC_LINUX_SIZEOF_TARREGSET, -+ &ppc32_linux_tarregset); -+ return; -+ } - - if (regaddr == -1) - { -@@ -862,6 +871,10 @@ fetch_ppc_registers (struct regcache *regcache, int tid) - fetch_regset (regcache, tid, NT_PPC_DSCR, - PPC_LINUX_SIZEOF_DSCRREGSET, - &ppc32_linux_dscrregset); -+ if (tdep->ppc_tar_regnum != -1) -+ fetch_regset (regcache, tid, NT_PPC_TAR, -+ PPC_LINUX_SIZEOF_TARREGSET, -+ &ppc32_linux_tarregset); - } - - /* Fetch registers from the child process. Fetch all registers if -@@ -1060,6 +1073,15 @@ store_register (const struct regcache *regcache, int tid, int regno) - &ppc32_linux_pprregset); - return; - } -+ else if (regno == PPC_TAR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_tar_regnum != -1); -+ -+ store_regset (regcache, tid, regno, NT_PPC_TAR, -+ PPC_LINUX_SIZEOF_TARREGSET, -+ &ppc32_linux_tarregset); -+ return; -+ } - - if (regaddr == -1) - return; -@@ -1282,6 +1304,10 @@ store_ppc_registers (const struct regcache *regcache, int tid) - store_regset (regcache, tid, -1, NT_PPC_DSCR, - PPC_LINUX_SIZEOF_DSCRREGSET, - &ppc32_linux_dscrregset); -+ if (tdep->ppc_tar_regnum != -1) -+ store_regset (regcache, tid, -1, NT_PPC_TAR, -+ PPC_LINUX_SIZEOF_TARREGSET, -+ &ppc32_linux_tarregset); - } - - /* Fetch the AT_HWCAP entry from the aux vector. */ -@@ -2409,7 +2435,13 @@ ppc_linux_nat_target::read_description () - if ((hwcap2 & PPC_FEATURE2_DSCR) - && check_regset (tid, NT_PPC_PPR, PPC_LINUX_SIZEOF_PPRREGSET) - && check_regset (tid, NT_PPC_DSCR, PPC_LINUX_SIZEOF_DSCRREGSET)) -- features.ppr_dscr = true; -+ { -+ features.ppr_dscr = true; -+ if ((hwcap2 & PPC_FEATURE2_ARCH_2_07) -+ && (hwcap2 & PPC_FEATURE2_TAR) -+ && check_regset (tid, NT_PPC_TAR, PPC_LINUX_SIZEOF_TARREGSET)) -+ features.isa207 = true; -+ } - - return ppc_linux_match_description (features); - } -diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c ---- a/gdb/ppc-linux-tdep.c -+++ b/gdb/ppc-linux-tdep.c -@@ -72,6 +72,7 @@ - #include "features/rs6000/powerpc-isa205-altivec32l.c" - #include "features/rs6000/powerpc-isa205-vsx32l.c" - #include "features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c" -+#include "features/rs6000/powerpc-isa207-vsx32l.c" - #include "features/rs6000/powerpc-64l.c" - #include "features/rs6000/powerpc-altivec64l.c" - #include "features/rs6000/powerpc-cell64l.c" -@@ -80,6 +81,7 @@ - #include "features/rs6000/powerpc-isa205-altivec64l.c" - #include "features/rs6000/powerpc-isa205-vsx64l.c" - #include "features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c" -+#include "features/rs6000/powerpc-isa207-vsx64l.c" - #include "features/rs6000/powerpc-e500l.c" - - /* Shared library operations for PowerPC-Linux. */ -@@ -581,6 +583,22 @@ const struct regset ppc32_linux_dscrregset = { - regcache_collect_regset - }; - -+/* Target Address Register regmap. */ -+ -+static const struct regcache_map_entry ppc32_regmap_tar[] = -+ { -+ { 1, PPC_TAR_REGNUM, 8 }, -+ { 0 } -+ }; -+ -+/* Target Address Register regset. */ -+ -+const struct regset ppc32_linux_tarregset = { -+ ppc32_regmap_tar, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ - const struct regset * - ppc_linux_gregset (int wordsize) - { -@@ -621,6 +639,7 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, - int have_vsx = tdep->ppc_vsr0_upper_regnum != -1; - int have_ppr = tdep->ppc_ppr_regnum != -1; - int have_dscr = tdep->ppc_dscr_regnum != -1; -+ int have_tar = tdep->ppc_tar_regnum != -1; - - if (tdep->wordsize == 4) - cb (".reg", 48 * 4, 48 * 4, &ppc32_linux_gregset, NULL, cb_data); -@@ -650,6 +669,11 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, - PPC_LINUX_SIZEOF_DSCRREGSET, - &ppc32_linux_dscrregset, "Data Stream Control Register", - cb_data); -+ -+ if (have_tar) -+ cb (".reg-ppc-tar", PPC_LINUX_SIZEOF_TARREGSET, -+ PPC_LINUX_SIZEOF_TARREGSET, -+ &ppc32_linux_tarregset, "Target Address Register", cb_data); - } - - static void -@@ -1064,6 +1088,7 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch, - asection *section = bfd_get_section_by_name (abfd, ".reg"); - asection *ppr = bfd_get_section_by_name (abfd, ".reg-ppc-ppr"); - asection *dscr = bfd_get_section_by_name (abfd, ".reg-ppc-dscr"); -+ asection *tar = bfd_get_section_by_name (abfd, ".reg-ppc-tar"); - - if (! section) - return NULL; -@@ -1097,7 +1122,11 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch, - features.isa205 = ppc_linux_has_isa205 (hwcap); - - if (ppr && dscr) -- features.ppr_dscr = true; -+ { -+ features.ppr_dscr = true; -+ if (tar) -+ features.isa207 = true; -+ } - - return ppc_linux_match_description (features); - } -@@ -1973,6 +2002,7 @@ _initialize_ppc_linux_tdep (void) - initialize_tdesc_powerpc_isa205_altivec32l (); - initialize_tdesc_powerpc_isa205_vsx32l (); - initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (); -+ initialize_tdesc_powerpc_isa207_vsx32l (); - initialize_tdesc_powerpc_64l (); - initialize_tdesc_powerpc_altivec64l (); - initialize_tdesc_powerpc_cell64l (); -@@ -1981,5 +2011,6 @@ _initialize_ppc_linux_tdep (void) - initialize_tdesc_powerpc_isa205_altivec64l (); - initialize_tdesc_powerpc_isa205_vsx64l (); - initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (); -+ initialize_tdesc_powerpc_isa207_vsx64l (); - initialize_tdesc_powerpc_e500l (); - } -diff --git a/gdb/ppc-linux-tdep.h b/gdb/ppc-linux-tdep.h ---- a/gdb/ppc-linux-tdep.h -+++ b/gdb/ppc-linux-tdep.h -@@ -47,5 +47,6 @@ int ppc_linux_trap_reg_p (struct gdbarch *gdbarch); - /* Additional register sets, defined in ppc-linux-tdep.c. */ - extern const struct regset ppc32_linux_pprregset; - extern const struct regset ppc32_linux_dscrregset; -+extern const struct regset ppc32_linux_tarregset; - - #endif /* PPC_LINUX_TDEP_H */ -diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h ---- a/gdb/ppc-tdep.h -+++ b/gdb/ppc-tdep.h -@@ -259,6 +259,9 @@ struct gdbarch_tdep - /* Data Stream Control Register. */ - int ppc_dscr_regnum; - -+ /* Target Address Register. */ -+ int ppc_tar_regnum; -+ - /* Decimal 128 registers. */ - int ppc_dl0_regnum; /* First Decimal128 argument register pair. */ - -@@ -317,6 +320,7 @@ enum { - PPC_VSR31_UPPER_REGNUM = 171, - PPC_PPR_REGNUM = 172, - PPC_DSCR_REGNUM = 173, -+ PPC_TAR_REGNUM = 174, - PPC_NUM_REGS - }; - -diff --git a/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat b/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat -new file mode 100644 ---- /dev/null -+++ b/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat -@@ -0,0 +1,147 @@ -+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro: -+# Generated from: rs6000/powerpc-isa207-vsx32l.xml -+name:powerpc_isa207_vsx32l -+xmltarget:powerpc-isa207-vsx32l.xml -+expedite:r1,pc -+32:r0 -+32:r1 -+32:r2 -+32:r3 -+32:r4 -+32:r5 -+32:r6 -+32:r7 -+32:r8 -+32:r9 -+32:r10 -+32:r11 -+32:r12 -+32:r13 -+32:r14 -+32:r15 -+32:r16 -+32:r17 -+32:r18 -+32:r19 -+32:r20 -+32:r21 -+32:r22 -+32:r23 -+32:r24 -+32:r25 -+32:r26 -+32:r27 -+32:r28 -+32:r29 -+32:r30 -+32:r31 -+64:f0 -+64:f1 -+64:f2 -+64:f3 -+64:f4 -+64:f5 -+64:f6 -+64:f7 -+64:f8 -+64:f9 -+64:f10 -+64:f11 -+64:f12 -+64:f13 -+64:f14 -+64:f15 -+64:f16 -+64:f17 -+64:f18 -+64:f19 -+64:f20 -+64:f21 -+64:f22 -+64:f23 -+64:f24 -+64:f25 -+64:f26 -+64:f27 -+64:f28 -+64:f29 -+64:f30 -+64:f31 -+32:pc -+32:msr -+32:cr -+32:lr -+32:ctr -+32:xer -+64:fpscr -+32:orig_r3 -+32:trap -+128:vr0 -+128:vr1 -+128:vr2 -+128:vr3 -+128:vr4 -+128:vr5 -+128:vr6 -+128:vr7 -+128:vr8 -+128:vr9 -+128:vr10 -+128:vr11 -+128:vr12 -+128:vr13 -+128:vr14 -+128:vr15 -+128:vr16 -+128:vr17 -+128:vr18 -+128:vr19 -+128:vr20 -+128:vr21 -+128:vr22 -+128:vr23 -+128:vr24 -+128:vr25 -+128:vr26 -+128:vr27 -+128:vr28 -+128:vr29 -+128:vr30 -+128:vr31 -+32:vscr -+32:vrsave -+64:vs0h -+64:vs1h -+64:vs2h -+64:vs3h -+64:vs4h -+64:vs5h -+64:vs6h -+64:vs7h -+64:vs8h -+64:vs9h -+64:vs10h -+64:vs11h -+64:vs12h -+64:vs13h -+64:vs14h -+64:vs15h -+64:vs16h -+64:vs17h -+64:vs18h -+64:vs19h -+64:vs20h -+64:vs21h -+64:vs22h -+64:vs23h -+64:vs24h -+64:vs25h -+64:vs26h -+64:vs27h -+64:vs28h -+64:vs29h -+64:vs30h -+64:vs31h -+64:ppr -+64:dscr -+64:tar -diff --git a/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat b/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat -new file mode 100644 ---- /dev/null -+++ b/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat -@@ -0,0 +1,147 @@ -+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro: -+# Generated from: rs6000/powerpc-isa207-vsx64l.xml -+name:powerpc_isa207_vsx64l -+xmltarget:powerpc-isa207-vsx64l.xml -+expedite:r1,pc -+64:r0 -+64:r1 -+64:r2 -+64:r3 -+64:r4 -+64:r5 -+64:r6 -+64:r7 -+64:r8 -+64:r9 -+64:r10 -+64:r11 -+64:r12 -+64:r13 -+64:r14 -+64:r15 -+64:r16 -+64:r17 -+64:r18 -+64:r19 -+64:r20 -+64:r21 -+64:r22 -+64:r23 -+64:r24 -+64:r25 -+64:r26 -+64:r27 -+64:r28 -+64:r29 -+64:r30 -+64:r31 -+64:f0 -+64:f1 -+64:f2 -+64:f3 -+64:f4 -+64:f5 -+64:f6 -+64:f7 -+64:f8 -+64:f9 -+64:f10 -+64:f11 -+64:f12 -+64:f13 -+64:f14 -+64:f15 -+64:f16 -+64:f17 -+64:f18 -+64:f19 -+64:f20 -+64:f21 -+64:f22 -+64:f23 -+64:f24 -+64:f25 -+64:f26 -+64:f27 -+64:f28 -+64:f29 -+64:f30 -+64:f31 -+64:pc -+64:msr -+32:cr -+64:lr -+64:ctr -+32:xer -+64:fpscr -+64:orig_r3 -+64:trap -+128:vr0 -+128:vr1 -+128:vr2 -+128:vr3 -+128:vr4 -+128:vr5 -+128:vr6 -+128:vr7 -+128:vr8 -+128:vr9 -+128:vr10 -+128:vr11 -+128:vr12 -+128:vr13 -+128:vr14 -+128:vr15 -+128:vr16 -+128:vr17 -+128:vr18 -+128:vr19 -+128:vr20 -+128:vr21 -+128:vr22 -+128:vr23 -+128:vr24 -+128:vr25 -+128:vr26 -+128:vr27 -+128:vr28 -+128:vr29 -+128:vr30 -+128:vr31 -+32:vscr -+32:vrsave -+64:vs0h -+64:vs1h -+64:vs2h -+64:vs3h -+64:vs4h -+64:vs5h -+64:vs6h -+64:vs7h -+64:vs8h -+64:vs9h -+64:vs10h -+64:vs11h -+64:vs12h -+64:vs13h -+64:vs14h -+64:vs15h -+64:vs16h -+64:vs17h -+64:vs18h -+64:vs19h -+64:vs20h -+64:vs21h -+64:vs22h -+64:vs23h -+64:vs24h -+64:vs25h -+64:vs26h -+64:vs27h -+64:vs28h -+64:vs29h -+64:vs30h -+64:vs31h -+64:ppr -+64:dscr -+64:tar -diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c ---- a/gdb/rs6000-tdep.c -+++ b/gdb/rs6000-tdep.c -@@ -4699,6 +4699,10 @@ ppc_process_record_op31 (struct gdbarch *gdbarch, struct regcache *regcache, - case 256: /* VRSAVE */ - record_full_arch_list_add_reg (regcache, tdep->ppc_vrsave_regnum); - return 0; -+ case 815: /* TAR */ -+ if (tdep->ppc_tar_regnum >= 0) -+ record_full_arch_list_add_reg (regcache, tdep->ppc_tar_regnum); -+ return 0; - case 896: - case 898: /* PPR */ - if (tdep->ppc_ppr_regnum >= 0) -@@ -5867,6 +5871,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - enum powerpc_elf_abi elf_abi = POWERPC_ELF_AUTO; - int have_fpu = 0, have_spe = 0, have_mq = 0, have_altivec = 0; - int have_dfp = 0, have_vsx = 0, have_ppr = 0, have_dscr = 0; -+ int have_tar = 0; - int tdesc_wordsize = -1; - const struct target_desc *tdesc = info.target_desc; - struct tdesc_arch_data *tdesc_data = NULL; -@@ -6187,6 +6192,25 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - } - else - have_dscr = 0; -+ -+ /* Target Address Register. */ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.tar"); -+ if (feature != NULL) -+ { -+ valid_p = 1; -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_TAR_REGNUM, "tar"); -+ -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ have_tar = 1; -+ } -+ else -+ have_tar = 0; - } - - /* If we have a 64-bit binary on a 32-bit target, complain. Also -@@ -6383,6 +6407,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - tdep->ppc_spefscr_regnum = have_spe ? PPC_SPE_FSCR_REGNUM : -1; - tdep->ppc_ppr_regnum = have_ppr ? PPC_PPR_REGNUM : -1; - tdep->ppc_dscr_regnum = have_dscr ? PPC_DSCR_REGNUM : -1; -+ tdep->ppc_tar_regnum = have_tar ? PPC_TAR_REGNUM : -1; - - set_gdbarch_pc_regnum (gdbarch, PPC_PC_REGNUM); - set_gdbarch_sp_regnum (gdbarch, PPC_R0_REGNUM + 1); -diff --git a/gdb/testsuite/gdb.arch/powerpc-tar.c b/gdb/testsuite/gdb.arch/powerpc-tar.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/powerpc-tar.c -@@ -0,0 +1,33 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright (C) 2018 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 . */ -+ -+int main (void) -+{ -+ void * target1 = &&target1_l; -+ void * target2 = &&target2_l; -+ asm volatile ("mtspr 815,%0" : : "r" (target1) : ); -+ -+ /* Branch always to TAR. */ -+ asm volatile ("bctar 20,0,0"); // marker -+ -+ target2_l: -+ asm volatile ("nop"); // marker 2 -+ target1_l: -+ asm volatile ("nop"); -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.arch/powerpc-tar.exp b/gdb/testsuite/gdb.arch/powerpc-tar.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/powerpc-tar.exp -@@ -0,0 +1,122 @@ -+# Copyright (C) 2018 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 . -+ -+# This file is part of the gdb testsuite. -+ -+# Test access to special purpose register TAR (the Target Address -+# Register). The test inferior writes to this register, we check that -+# GDB reads the same value, then write to the register the address of -+# another label. We then let the inferior continue and execute a -+# branch to TAR and check that we stop at the address that we wrote to -+# register. -+ -+if {![istarget "powerpc*-*-linux*"]} then { -+ verbose "Skipping PowerPC test for the TAR register." -+ return -+} -+ -+standard_testfile .c -+ -+if {[build_executable "compile" $binfile $srcfile {debug}] == -1} { -+ return -1 -+} -+ -+proc check_register_access { regname } { -+ global gdb_prompt -+ -+ set test "$regname register access" -+ gdb_test_multiple "info reg $regname" "$test" { -+ -re "Invalid register.*\r\n$gdb_prompt $" { -+ unsupported "$test" -+ return 0 -+ } -+ -re "\r\n$regname.*\r\n$gdb_prompt $" { -+ pass "$test" -+ return 1 -+ } -+ } -+ return 0 -+} -+ -+proc tar_available {} { -+ global gdb_prompt -+ global inferior_exited_re -+ -+ set test "TAR available to inferior" -+ gdb_test_multiple "continue" "" { -+ -re "Illegal instruction.*\r\n$gdb_prompt $" { -+ unsupported "$test" -+ return 0 -+ } -+ -re "$inferior_exited_re normally.*$gdb_prompt $" { -+ pass "$test" -+ return 1 -+ } -+ } -+ return 0 -+} -+ -+# Do one pass to check if TAR is usable, system -+# software can prevent it from being used. -+with_test_prefix "check TAR access" { -+ clean_restart $binfile -+ -+ if ![runto_main] { -+ return -+ } -+ -+ if {![check_register_access "tar"]} { -+ return -+ } -+ -+ if {![tar_available]} { -+ return -+ } -+} -+ -+# Now do the actual test -+clean_restart $binfile -+ -+if ![runto_main] { -+ return -+} -+ -+gdb_breakpoint [gdb_get_line_number "marker"] -+ -+gdb_continue_to_breakpoint "continue to marker" -+ -+set target1 [get_hexadecimal_valueof "target1" -1] -+set tar [get_hexadecimal_valueof "\$tar" -2] -+ -+set test "TAR value from mtspr" -+ -+if {${target1} == ${tar}} { -+ pass $test -+} else { -+ fail $test -+} -+ -+set target2 [get_hexadecimal_valueof "target2" -1] -+ -+if {$target2 == -1} { -+ fail "Could not get value of target2" -+ return -+} -+ -+gdb_test_no_output "set \$tar = $target2" "set tar" -+ -+gdb_breakpoint [gdb_get_line_number "marker 2"] -+ -+gdb_continue_to_breakpoint "continue to new target address" ".*marker 2.*" diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-12of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-12of15.patch deleted file mode 100644 index b93af8656e5def84002c0afb8b9f7593417efa6c..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-12of15.patch +++ /dev/null @@ -1,779 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:17 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-12of15.patch - -;; [PowerPC] Add support for EBB and PMU registers -;; Edjunior Barbosa Machado and Pedro Franco de Carvalho, RH BZ 1187581m - -[PowerPC] Add support for EBB and PMU registers - -This patch adds support for registers of the Event Based Branching and -Performance Monitoring Units for the powerpc linux native and core -file targets, and for the powerpc linux server stub. - -All three EBB registers are accessible. Only a subset of the PMU -registers can be accessed through ptrace. Because of this, the PMU -registers are enumerated individually in gdbarch_tdep, as opposed to -having a single "have_pmu" flag. This is intended to make it easier -to add additional PMU registers in the future, since checking a -"have_pmu" flag elsewhere in the code would no longer be correct. The -tdesc feature is named org.gnu.gdb.power.linux.pmu because of this. - -It's unclear if it makes sense to save and restore these registers -across function calls, since some of them can be modified -asynchronously. They are also not tracked in record-replay mode. - -The kernel can return ENODATA when ptrace is used to get the EBB -registers, unless a linux performance event that uses EBB is open in -the inferior. For this reason, the "fill" functions in the server -stub for the ebb register sets is not implemented. - -Since gdbserver writes all registers in one go before resuming the -inferior, this error would not be detected at the time the user tries -to write to one of the registers on the client side, and gdbserver -would print out warnings every time it resumes the inferior when no -ebb performance event is opened, so there is currently no -straightforward way to handle this case. This means the ebb registers -in the client-side regcache can become dirty when the user tries to -write to them, until the inferior is resumed and stopped again. - -A related issue is that 'G' packets used to write to unrelated -registers will include bad data for the EBB registers if they are -unavailable, since no register status information is included in the -'G' packet. This data won't be written to the inferior by the -gdbserver stub because the "fill" functions are not implemented, and -currently the gdbserver stub doesn't change the status of the -registers in its own regcache in response to 'G' packets. - -Another limitation for the ebb registers is that traceframes don't -record if registers are available or not, so if these registers are -collected when a tracepoint is hit and the inferior has no ebb event -opened, the user will see zero values for all of them, instead of the -usual . - -Because these registers are often unavailable, trying to store them -with target_store_registers with -1 for the regno argument (all -registers) would almost always fail, so they are ignored in this case. - -gdb/ChangeLog: -2018-10-26 Edjunior Barbosa Machado - Pedro Franco de Carvalho - - * arch/ppc-linux-common.h (PPC_LINUX_SIZEOF_EBBREGSET) - (PPC_LINUX_SIZEOF_PMUREGSET): Declare. - * nat/ppc-linux.h (PPC_FEATURE2_EBB, NT_PPC_EBB, NT_PPC_PMU): - Define if not already defined. - * features/rs6000/power-ebb.xml: New file. - * features/rs6000/power-linux-pmu.xml: New file. - * features/rs6000/powerpc-isa207-vsx32l.xml: Include ebb and pmu - features. - * features/rs6000/powerpc-isa207-vsx64l.xml: Likewise. - * features/rs6000/powerpc-isa207-vsx32l.c: Re-generate. - * features/rs6000/powerpc-isa207-vsx64l.c: Re-generate. - * regformats/rs6000/powerpc-isa207-vsx32l.dat: Re-generate. - * regformats/rs6000/powerpc-isa207-vsx64l.dat: Re-generate. - * ppc-linux-nat.c (fetch_register, fetch_ppc_registers): Call - fetch_regset with ebb and pmu regsets. - (store_register, store_ppc_registers): Call store_regset with ebb - and pmu regsets. - (ppc_linux_nat_target::read_description): Set isa207 field in the - features struct if ebb and pmu are avaiable. - * ppc-linux-tdep.c (ppc32_regmap_ebb, ppc32_regmap_pmu) - (ppc32_linux_ebbregset, ppc32_linux_pmuregset): New globals. - (ppc_linux_iterate_over_regset_sections): Call back with the ebb - and pmu regsets. - (ppc_linux_core_read_description): Check if the pmu section is - present and set isa207 in the features struct. - * ppc-linux-tdep.h (ppc32_linux_ebbregset) - (ppc32_linux_pmuregset): Declare. - * ppc-tdep.h (struct gdbarch_tdep) : New field. - : New fields. - : New field. - (enum): : - New enum values. - : New enum - values. - : New enum values. - (PPC_IS_EBB_REGNUM, PPC_IS_PMU_REGNUM): Define. - * rs6000-tdep.c (rs6000_gdbarch_init): Look for and validate the - ebb and pmu features. - -gdb/gdbserver/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * configure.srv (powerpc*-*-linux*): Add rs6000/power-ebb.xml and - rs6000/power-linux-pmu.xml to srv_xmlfiles. - * linux-ppc-low.c (ppc_store_ebbregset, ppc_fill_pmuregset) - (ppc_store_pmuregset): New functions. - (ppc_regsets): Add entries for ebb and pmu regsets. - (ppc_arch_setup): Set isa207 in features struct if the ebb and - pmu regsets are available. Set sizes for these regsets. - -gdb/doc/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * gdb.texinfo (PowerPC Features): Describe new features - "org.gnu.gdb.power.ebb" and "org.gnu.gdb.power.linux.pmu". - -diff --git a/gdb/arch/ppc-linux-common.h b/gdb/arch/ppc-linux-common.h ---- a/gdb/arch/ppc-linux-common.h -+++ b/gdb/arch/ppc-linux-common.h -@@ -33,6 +33,8 @@ struct target_desc; - #define PPC_LINUX_SIZEOF_PPRREGSET 8 - #define PPC_LINUX_SIZEOF_DSCRREGSET 8 - #define PPC_LINUX_SIZEOF_TARREGSET 8 -+#define PPC_LINUX_SIZEOF_EBBREGSET (3*8) -+#define PPC_LINUX_SIZEOF_PMUREGSET (5*8) - - /* Check if the hwcap auxv entry indicates that isa205 is supported. */ - bool ppc_linux_has_isa205 (CORE_ADDR hwcap); -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -42564,6 +42564,15 @@ contain the 64-bit register @samp{dscr}. - The @samp{org.gnu.gdb.power.tar} feature is optional. It should - contain the 64-bit register @samp{tar}. - -+The @samp{org.gnu.gdb.power.ebb} feature is optional. It should -+contain registers @samp{bescr}, @samp{ebbhr} and @samp{ebbrr}, all -+64-bit wide. -+ -+The @samp{org.gnu.gdb.power.linux.pmu} feature is optional. It should -+contain registers @samp{mmcr0}, @samp{mmcr2}, @samp{siar}, @samp{sdar} -+and @samp{sier}, all 64-bit wide. This is the subset of the isa 2.07 -+server PMU registers provided by @sc{gnu}/Linux. -+ - @node S/390 and System z Features - @subsection S/390 and System z Features - @cindex target descriptions, S/390 features -diff --git a/gdb/features/rs6000/power-ebb.xml b/gdb/features/rs6000/power-ebb.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-ebb.xml -@@ -0,0 +1,14 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/power-linux-pmu.xml b/gdb/features/rs6000/power-linux-pmu.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-linux-pmu.xml -@@ -0,0 +1,17 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/powerpc-isa207-vsx32l.c b/gdb/features/rs6000/powerpc-isa207-vsx32l.c ---- a/gdb/features/rs6000/powerpc-isa207-vsx32l.c -+++ b/gdb/features/rs6000/powerpc-isa207-vsx32l.c -@@ -199,5 +199,17 @@ initialize_tdesc_powerpc_isa207_vsx32l (void) - feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar"); - tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64"); - -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb"); -+ tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu"); -+ tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64"); -+ - tdesc_powerpc_isa207_vsx32l = result; - } -diff --git a/gdb/features/rs6000/powerpc-isa207-vsx32l.xml b/gdb/features/rs6000/powerpc-isa207-vsx32l.xml ---- a/gdb/features/rs6000/powerpc-isa207-vsx32l.xml -+++ b/gdb/features/rs6000/powerpc-isa207-vsx32l.xml -@@ -16,4 +16,6 @@ - - - -+ -+ - -diff --git a/gdb/features/rs6000/powerpc-isa207-vsx64l.c b/gdb/features/rs6000/powerpc-isa207-vsx64l.c ---- a/gdb/features/rs6000/powerpc-isa207-vsx64l.c -+++ b/gdb/features/rs6000/powerpc-isa207-vsx64l.c -@@ -199,5 +199,17 @@ initialize_tdesc_powerpc_isa207_vsx64l (void) - feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar"); - tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64"); - -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb"); -+ tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu"); -+ tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64"); -+ - tdesc_powerpc_isa207_vsx64l = result; - } -diff --git a/gdb/features/rs6000/powerpc-isa207-vsx64l.xml b/gdb/features/rs6000/powerpc-isa207-vsx64l.xml ---- a/gdb/features/rs6000/powerpc-isa207-vsx64l.xml -+++ b/gdb/features/rs6000/powerpc-isa207-vsx64l.xml -@@ -16,4 +16,6 @@ - - - -+ -+ - -diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv ---- a/gdb/gdbserver/configure.srv -+++ b/gdb/gdbserver/configure.srv -@@ -249,6 +249,8 @@ case "${target}" in - srv_xmlfiles="${srv_xmlfiles} rs6000/power-dscr.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-ppr.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-tar.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-ebb.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-linux-pmu.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-e500l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-spe.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-64l.xml" -diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c ---- a/gdb/gdbserver/linux-ppc-low.c -+++ b/gdb/gdbserver/linux-ppc-low.c -@@ -545,6 +545,61 @@ ppc_store_tarregset (struct regcache *regcache, const void *buf) - supply_register_by_name (regcache, "tar", tar); - } - -+/* Event-Based Branching regset store function. Unless the inferior -+ has a perf event open, ptrace can return in error when reading and -+ writing to the regset, with ENODATA. For reading, the registers -+ will correctly show as unavailable. For writing, gdbserver -+ currently only caches any register writes from P and G packets and -+ the stub always tries to write all the regsets when resuming the -+ inferior, which would result in frequent warnings. For this -+ reason, we don't define a fill function. This also means that the -+ client-side regcache will be dirty if the user tries to write to -+ the EBB registers. G packets that the client sends to write to -+ unrelated registers will also include data for EBB registers, even -+ if they are unavailable. */ -+ -+static void -+ppc_store_ebbregset (struct regcache *regcache, const void *buf) -+{ -+ const char *regset = (const char *) buf; -+ -+ /* The order in the kernel regset is: EBBRR, EBBHR, BESCR. In the -+ .dat file is BESCR, EBBHR, EBBRR. */ -+ supply_register_by_name (regcache, "ebbrr", ®set[0]); -+ supply_register_by_name (regcache, "ebbhr", ®set[8]); -+ supply_register_by_name (regcache, "bescr", ®set[16]); -+} -+ -+/* Performance Monitoring Unit regset fill function. */ -+ -+static void -+ppc_fill_pmuregset (struct regcache *regcache, void *buf) -+{ -+ char *regset = (char *) buf; -+ -+ /* The order in the kernel regset is SIAR, SDAR, SIER, MMCR2, MMCR0. -+ In the .dat file is MMCR0, MMCR2, SIAR, SDAR, SIER. */ -+ collect_register_by_name (regcache, "siar", ®set[0]); -+ collect_register_by_name (regcache, "sdar", ®set[8]); -+ collect_register_by_name (regcache, "sier", ®set[16]); -+ collect_register_by_name (regcache, "mmcr2", ®set[24]); -+ collect_register_by_name (regcache, "mmcr0", ®set[32]); -+} -+ -+/* Performance Monitoring Unit regset store function. */ -+ -+static void -+ppc_store_pmuregset (struct regcache *regcache, const void *buf) -+{ -+ const char *regset = (const char *) buf; -+ -+ supply_register_by_name (regcache, "siar", ®set[0]); -+ supply_register_by_name (regcache, "sdar", ®set[8]); -+ supply_register_by_name (regcache, "sier", ®set[16]); -+ supply_register_by_name (regcache, "mmcr2", ®set[24]); -+ supply_register_by_name (regcache, "mmcr0", ®set[32]); -+} -+ - static void - ppc_fill_vsxregset (struct regcache *regcache, void *buf) - { -@@ -654,6 +709,10 @@ static struct regset_info ppc_regsets[] = { - fetch them every time, but still fall back to PTRACE_PEEKUSER for the - general registers. Some kernels support these, but not the newer - PPC_PTRACE_GETREGS. */ -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_EBB, 0, EXTENDED_REGS, -+ NULL, ppc_store_ebbregset }, -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_PMU, 0, EXTENDED_REGS, -+ ppc_fill_pmuregset, ppc_store_pmuregset }, - { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TAR, 0, EXTENDED_REGS, - ppc_fill_tarregset, ppc_store_tarregset }, - { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_PPR, 0, EXTENDED_REGS, -@@ -734,8 +793,13 @@ ppc_arch_setup (void) - features.ppr_dscr = true; - if ((ppc_hwcap2 & PPC_FEATURE2_ARCH_2_07) - && (ppc_hwcap2 & PPC_FEATURE2_TAR) -+ && (ppc_hwcap2 & PPC_FEATURE2_EBB) - && ppc_check_regset (tid, NT_PPC_TAR, -- PPC_LINUX_SIZEOF_TARREGSET)) -+ PPC_LINUX_SIZEOF_TARREGSET) -+ && ppc_check_regset (tid, NT_PPC_EBB, -+ PPC_LINUX_SIZEOF_EBBREGSET) -+ && ppc_check_regset (tid, NT_PPC_PMU, -+ PPC_LINUX_SIZEOF_PMUREGSET)) - features.isa207 = true; - } - -@@ -798,6 +862,14 @@ ppc_arch_setup (void) - regset->size = (features.isa207 ? - PPC_LINUX_SIZEOF_TARREGSET : 0); - break; -+ case NT_PPC_EBB: -+ regset->size = (features.isa207 ? -+ PPC_LINUX_SIZEOF_EBBREGSET : 0); -+ break; -+ case NT_PPC_PMU: -+ regset->size = (features.isa207 ? -+ PPC_LINUX_SIZEOF_PMUREGSET : 0); -+ break; - default: - break; - } -diff --git a/gdb/nat/ppc-linux.h b/gdb/nat/ppc-linux.h ---- a/gdb/nat/ppc-linux.h -+++ b/gdb/nat/ppc-linux.h -@@ -60,6 +60,9 @@ - #ifndef PPC_FEATURE2_TAR - #define PPC_FEATURE2_TAR 0x04000000 - #endif -+#ifndef PPC_FEATURE2_EBB -+#define PPC_FEATURE2_EBB 0x10000000 -+#endif - - /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a - configure time check. Some older glibc's (for instance 2.2.1) -@@ -106,6 +109,16 @@ - #define NT_PPC_DSCR 0x105 - #endif - -+/* Event Based Branch Registers. */ -+#ifndef NT_PPC_EBB -+#define NT_PPC_EBB 0x106 -+#endif -+ -+/* Performance Monitor Registers. */ -+#ifndef NT_PPC_PMU -+#define NT_PPC_PMU 0x107 -+#endif -+ - /* Return the wordsize of the target, either 4 or 8 bytes. */ - int ppc_linux_target_wordsize (int tid); - -diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c ---- a/gdb/ppc-linux-nat.c -+++ b/gdb/ppc-linux-nat.c -@@ -667,6 +667,24 @@ fetch_register (struct regcache *regcache, int tid, int regno) - &ppc32_linux_tarregset); - return; - } -+ else if (PPC_IS_EBB_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_ebb); -+ -+ fetch_regset (regcache, tid, NT_PPC_EBB, -+ PPC_LINUX_SIZEOF_EBBREGSET, -+ &ppc32_linux_ebbregset); -+ return; -+ } -+ else if (PPC_IS_PMU_REGNUM (regno)) -+ { -+ gdb_assert (tdep->ppc_mmcr0_regnum != -1); -+ -+ fetch_regset (regcache, tid, NT_PPC_PMU, -+ PPC_LINUX_SIZEOF_PMUREGSET, -+ &ppc32_linux_pmuregset); -+ return; -+ } - - if (regaddr == -1) - { -@@ -875,6 +893,14 @@ fetch_ppc_registers (struct regcache *regcache, int tid) - fetch_regset (regcache, tid, NT_PPC_TAR, - PPC_LINUX_SIZEOF_TARREGSET, - &ppc32_linux_tarregset); -+ if (tdep->have_ebb) -+ fetch_regset (regcache, tid, NT_PPC_EBB, -+ PPC_LINUX_SIZEOF_EBBREGSET, -+ &ppc32_linux_ebbregset); -+ if (tdep->ppc_mmcr0_regnum != -1) -+ fetch_regset (regcache, tid, NT_PPC_PMU, -+ PPC_LINUX_SIZEOF_PMUREGSET, -+ &ppc32_linux_pmuregset); - } - - /* Fetch registers from the child process. Fetch all registers if -@@ -1082,6 +1108,24 @@ store_register (const struct regcache *regcache, int tid, int regno) - &ppc32_linux_tarregset); - return; - } -+ else if (PPC_IS_EBB_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_ebb); -+ -+ store_regset (regcache, tid, regno, NT_PPC_EBB, -+ PPC_LINUX_SIZEOF_EBBREGSET, -+ &ppc32_linux_ebbregset); -+ return; -+ } -+ else if (PPC_IS_PMU_REGNUM (regno)) -+ { -+ gdb_assert (tdep->ppc_mmcr0_regnum != -1); -+ -+ store_regset (regcache, tid, regno, NT_PPC_PMU, -+ PPC_LINUX_SIZEOF_PMUREGSET, -+ &ppc32_linux_pmuregset); -+ return; -+ } - - if (regaddr == -1) - return; -@@ -1308,6 +1352,15 @@ store_ppc_registers (const struct regcache *regcache, int tid) - store_regset (regcache, tid, -1, NT_PPC_TAR, - PPC_LINUX_SIZEOF_TARREGSET, - &ppc32_linux_tarregset); -+ -+ if (tdep->ppc_mmcr0_regnum != -1) -+ store_regset (regcache, tid, -1, NT_PPC_PMU, -+ PPC_LINUX_SIZEOF_PMUREGSET, -+ &ppc32_linux_pmuregset); -+ -+ /* Because the EBB registers can be unavailable, attempts to store -+ them here would cause this function to fail most of the time, so -+ we ignore them. */ - } - - /* Fetch the AT_HWCAP entry from the aux vector. */ -@@ -2439,7 +2492,10 @@ ppc_linux_nat_target::read_description () - features.ppr_dscr = true; - if ((hwcap2 & PPC_FEATURE2_ARCH_2_07) - && (hwcap2 & PPC_FEATURE2_TAR) -- && check_regset (tid, NT_PPC_TAR, PPC_LINUX_SIZEOF_TARREGSET)) -+ && (hwcap2 & PPC_FEATURE2_EBB) -+ && check_regset (tid, NT_PPC_TAR, PPC_LINUX_SIZEOF_TARREGSET) -+ && check_regset (tid, NT_PPC_EBB, PPC_LINUX_SIZEOF_EBBREGSET) -+ && check_regset (tid, NT_PPC_PMU, PPC_LINUX_SIZEOF_PMUREGSET)) - features.isa207 = true; - } - -diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c ---- a/gdb/ppc-linux-tdep.c -+++ b/gdb/ppc-linux-tdep.c -@@ -599,6 +599,44 @@ const struct regset ppc32_linux_tarregset = { - regcache_collect_regset - }; - -+/* Event-Based Branching regmap. */ -+ -+static const struct regcache_map_entry ppc32_regmap_ebb[] = -+ { -+ { 1, PPC_EBBRR_REGNUM, 8 }, -+ { 1, PPC_EBBHR_REGNUM, 8 }, -+ { 1, PPC_BESCR_REGNUM, 8 }, -+ { 0 } -+ }; -+ -+/* Event-Based Branching regset. */ -+ -+const struct regset ppc32_linux_ebbregset = { -+ ppc32_regmap_ebb, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ -+/* Performance Monitoring Unit regmap. */ -+ -+static const struct regcache_map_entry ppc32_regmap_pmu[] = -+ { -+ { 1, PPC_SIAR_REGNUM, 8 }, -+ { 1, PPC_SDAR_REGNUM, 8 }, -+ { 1, PPC_SIER_REGNUM, 8 }, -+ { 1, PPC_MMCR2_REGNUM, 8 }, -+ { 1, PPC_MMCR0_REGNUM, 8 }, -+ { 0 } -+ }; -+ -+/* Performance Monitoring Unit regset. */ -+ -+const struct regset ppc32_linux_pmuregset = { -+ ppc32_regmap_pmu, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ - const struct regset * - ppc_linux_gregset (int wordsize) - { -@@ -674,6 +712,22 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, - cb (".reg-ppc-tar", PPC_LINUX_SIZEOF_TARREGSET, - PPC_LINUX_SIZEOF_TARREGSET, - &ppc32_linux_tarregset, "Target Address Register", cb_data); -+ -+ /* EBB registers are unavailable when ptrace returns ENODATA. Check -+ availability when generating a core file (regcache != NULL). */ -+ if (tdep->have_ebb) -+ if (regcache == NULL -+ || REG_VALID == regcache->get_register_status (PPC_BESCR_REGNUM)) -+ cb (".reg-ppc-ebb", PPC_LINUX_SIZEOF_EBBREGSET, -+ PPC_LINUX_SIZEOF_EBBREGSET, -+ &ppc32_linux_ebbregset, "Event-based Branching Registers", -+ cb_data); -+ -+ if (tdep->ppc_mmcr0_regnum != -1) -+ cb (".reg-ppc-pmu", PPC_LINUX_SIZEOF_PMUREGSET, -+ PPC_LINUX_SIZEOF_PMUREGSET, -+ &ppc32_linux_pmuregset, "Performance Monitor Registers", -+ cb_data); - } - - static void -@@ -1089,6 +1143,7 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch, - asection *ppr = bfd_get_section_by_name (abfd, ".reg-ppc-ppr"); - asection *dscr = bfd_get_section_by_name (abfd, ".reg-ppc-dscr"); - asection *tar = bfd_get_section_by_name (abfd, ".reg-ppc-tar"); -+ asection *pmu = bfd_get_section_by_name (abfd, ".reg-ppc-pmu"); - - if (! section) - return NULL; -@@ -1124,7 +1179,12 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch, - if (ppr && dscr) - { - features.ppr_dscr = true; -- if (tar) -+ -+ /* We don't require the EBB note section to be present in the -+ core file to select isa207 because these registers could have -+ been unavailable when the core file was created. They will -+ be in the tdep but will show as unavailable. */ -+ if (tar && pmu) - features.isa207 = true; - } - -diff --git a/gdb/ppc-linux-tdep.h b/gdb/ppc-linux-tdep.h ---- a/gdb/ppc-linux-tdep.h -+++ b/gdb/ppc-linux-tdep.h -@@ -48,5 +48,7 @@ int ppc_linux_trap_reg_p (struct gdbarch *gdbarch); - extern const struct regset ppc32_linux_pprregset; - extern const struct regset ppc32_linux_dscrregset; - extern const struct regset ppc32_linux_tarregset; -+extern const struct regset ppc32_linux_ebbregset; -+extern const struct regset ppc32_linux_pmuregset; - - #endif /* PPC_LINUX_TDEP_H */ -diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h ---- a/gdb/ppc-tdep.h -+++ b/gdb/ppc-tdep.h -@@ -265,6 +265,15 @@ struct gdbarch_tdep - /* Decimal 128 registers. */ - int ppc_dl0_regnum; /* First Decimal128 argument register pair. */ - -+ int have_ebb; -+ -+ /* PMU registers. */ -+ int ppc_mmcr0_regnum; -+ int ppc_mmcr2_regnum; -+ int ppc_siar_regnum; -+ int ppc_sdar_regnum; -+ int ppc_sier_regnum; -+ - /* Offset to ABI specific location where link register is saved. */ - int lr_frame_offset; - -@@ -321,12 +330,31 @@ enum { - PPC_PPR_REGNUM = 172, - PPC_DSCR_REGNUM = 173, - PPC_TAR_REGNUM = 174, -+ -+ /* EBB registers. */ -+ PPC_BESCR_REGNUM = 175, -+ PPC_EBBHR_REGNUM = 176, -+ PPC_EBBRR_REGNUM = 177, -+ -+ /* PMU registers. */ -+ PPC_MMCR0_REGNUM = 178, -+ PPC_MMCR2_REGNUM = 179, -+ PPC_SIAR_REGNUM = 180, -+ PPC_SDAR_REGNUM = 181, -+ PPC_SIER_REGNUM = 182, -+ - PPC_NUM_REGS - }; - - /* Big enough to hold the size of the largest register in bytes. */ - #define PPC_MAX_REGISTER_SIZE 64 - -+#define PPC_IS_EBB_REGNUM(i) \ -+ ((i) >= PPC_BESCR_REGNUM && (i) <= PPC_EBBRR_REGNUM) -+ -+#define PPC_IS_PMU_REGNUM(i) \ -+ ((i) >= PPC_MMCR0_REGNUM && (i) <= PPC_SIER_REGNUM) -+ - /* An instruction to match. */ - - struct ppc_insn_pattern -diff --git a/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat b/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat ---- a/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat -+++ b/gdb/regformats/rs6000/powerpc-isa207-vsx32l.dat -@@ -145,3 +145,11 @@ expedite:r1,pc - 64:ppr - 64:dscr - 64:tar -+64:bescr -+64:ebbhr -+64:ebbrr -+64:mmcr0 -+64:mmcr2 -+64:siar -+64:sdar -+64:sier -diff --git a/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat b/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat ---- a/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat -+++ b/gdb/regformats/rs6000/powerpc-isa207-vsx64l.dat -@@ -145,3 +145,11 @@ expedite:r1,pc - 64:ppr - 64:dscr - 64:tar -+64:bescr -+64:ebbhr -+64:ebbrr -+64:mmcr0 -+64:mmcr2 -+64:siar -+64:sdar -+64:sier -diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c ---- a/gdb/rs6000-tdep.c -+++ b/gdb/rs6000-tdep.c -@@ -5871,7 +5871,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - enum powerpc_elf_abi elf_abi = POWERPC_ELF_AUTO; - int have_fpu = 0, have_spe = 0, have_mq = 0, have_altivec = 0; - int have_dfp = 0, have_vsx = 0, have_ppr = 0, have_dscr = 0; -- int have_tar = 0; -+ int have_tar = 0, have_ebb = 0, have_pmu = 0; - int tdesc_wordsize = -1; - const struct target_desc *tdesc = info.target_desc; - struct tdesc_arch_data *tdesc_data = NULL; -@@ -6211,6 +6211,64 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - } - else - have_tar = 0; -+ -+ /* Event-based Branching Registers. */ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.ebb"); -+ if (feature != NULL) -+ { -+ static const char *const ebb_regs[] = { -+ "bescr", "ebbhr", "ebbrr" -+ }; -+ -+ valid_p = 1; -+ for (i = 0; i < ARRAY_SIZE (ebb_regs); i++) -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_BESCR_REGNUM + i, -+ ebb_regs[i]); -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ have_ebb = 1; -+ } -+ else -+ have_ebb = 0; -+ -+ /* Subset of the ISA 2.07 Performance Monitor Registers provided -+ by Linux. */ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.linux.pmu"); -+ if (feature != NULL) -+ { -+ valid_p = 1; -+ -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_MMCR0_REGNUM, -+ "mmcr0"); -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_MMCR2_REGNUM, -+ "mmcr2"); -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_SIAR_REGNUM, -+ "siar"); -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_SDAR_REGNUM, -+ "sdar"); -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_SIER_REGNUM, -+ "sier"); -+ -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ have_pmu = 1; -+ } -+ else -+ have_pmu = 0; - } - - /* If we have a 64-bit binary on a 32-bit target, complain. Also -@@ -6408,6 +6466,20 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - tdep->ppc_ppr_regnum = have_ppr ? PPC_PPR_REGNUM : -1; - tdep->ppc_dscr_regnum = have_dscr ? PPC_DSCR_REGNUM : -1; - tdep->ppc_tar_regnum = have_tar ? PPC_TAR_REGNUM : -1; -+ tdep->have_ebb = have_ebb; -+ -+ /* If additional pmu registers are added, care must be taken when -+ setting new fields in the tdep below, to maintain compatibility -+ with features that only provide some of the registers. Currently -+ gdb access to the pmu registers is only supported in linux, and -+ linux only provides a subset of the pmu registers defined in the -+ architecture. */ -+ -+ tdep->ppc_mmcr0_regnum = have_pmu ? PPC_MMCR0_REGNUM : -1; -+ tdep->ppc_mmcr2_regnum = have_pmu ? PPC_MMCR2_REGNUM : -1; -+ tdep->ppc_siar_regnum = have_pmu ? PPC_SIAR_REGNUM : -1; -+ tdep->ppc_sdar_regnum = have_pmu ? PPC_SDAR_REGNUM : -1; -+ tdep->ppc_sier_regnum = have_pmu ? PPC_SIER_REGNUM : -1; - - set_gdbarch_pc_regnum (gdbarch, PPC_PC_REGNUM); - set_gdbarch_sp_regnum (gdbarch, PPC_R0_REGNUM + 1); diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-13of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-13of15.patch deleted file mode 100644 index e82c15ba76ef5c4edd1aadaa6f8dcf3c2625fd0b..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-13of15.patch +++ /dev/null @@ -1,38 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:18 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-13of15.patch - -;; [PowerPC] Reject tdescs with VSX and no FPU or Altivec -;; Pedro Franco de Carvalho, RH BZ 1187581 - -[PowerPC] Reject tdescs with VSX and no FPU or Altivec - -Currently rs6000_gdbarch_init will accept a tdesc with the -"org.gnu.gdb.power.vsx" feature but without the -"org.gnu.gdb.power.altivec" or "org.gnu.gdb.power.fpu". - -It isn't clear from the standard features documentation that these are -requirements. However, these tdescs would cause trouble in the VSX -pseudo-register functions, so this patch will cause them to be -rejected. - -gdb/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * rs6000-tdep.c (rs6000_gdbarch_init): Reject tdescs with vsx but - without altivec or fpu. - -diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c ---- a/gdb/rs6000-tdep.c -+++ b/gdb/rs6000-tdep.c -@@ -6096,7 +6096,8 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - valid_p &= tdesc_numbered_register (feature, tdesc_data, - PPC_VSR0_UPPER_REGNUM + i, - vsx_regs[i]); -- if (!valid_p) -+ -+ if (!valid_p || !have_fpu || !have_altivec) - { - tdesc_data_cleanup (tdesc_data); - return NULL; diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-14of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-14of15.patch deleted file mode 100644 index 77c0abad8f2d3c29ae1238d99900d885abce3cca..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-14of15.patch +++ /dev/null @@ -1,4787 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:18 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-14of15.patch - -;; [PowerPC] Add support for HTM registers -;; Edjunior Barbosa Machado and Pedro Franco de Carvalho, RH BZ 1187581 - -[PowerPC] Add support for HTM registers - -This patch adds support for Hardware Transactional Memory registers -for the powerpc linux native and core file targets, and for the -pwoerpc linux server stub. - -These registers include both the HTM special-purpose registers (TFHAR, -TEXASR and TFIAR) as well as the set of registers that are -checkpointed (saved) when a transaction is initiated, which the -processor restores in the event of a transaction failure. - -The set of checkpointed general-purpose registers is returned by the -linux kernel in the same format as the regular general-purpose -registers, defined in struct pt_regs. However, the architecture -specifies that only some of the registers present in pt_regs are -checkpointed (GPRs 0-31, CR, XER, LR and CTR). The kernel fills the -slots for MSR and NIP with other info. The other fields usually don't -have meaningful values. GDB doesn't define registers that are not -checkpointed in the architecture, but when generating a core file, GDB -fills the slot for the checkpointed MSR with the regular MSR. These -are usually similar, although some bits might be different, and in -some cases the checkpointed MSR will have a value of 0 in a -kernel-generated core-file. The checkpointed NIP is filled with TFHAR -by GDB in the core-file, which is what the kernel does. The other -fields are set to 0 by GDB. - -Core files generated by the kernel have a note section for -checkpointed GPRs with the same size for both 32-bit and 64-bit -threads, and the values for the registers of a 32-bit thread are -squeezed in the first half, with no useful data in the second half. -GDB generates a smaller note section for 32-bit threads, but can read -both sizes. - -The checkpointed XER is required to be 32-bit in the target -description documentation, even though the more recent ISAs define it -as 64-bit wide, since the high-order 32-bits are reserved, and because -in Linux there is no way to get a 64-bit checkpointed XER for 32-bit -threads. If this changes in the future, the target description -feature requirement can be relaxed to allow for a 64-bit checkpointed -XER. - -Access to the checkpointed CR (condition register) can be confusing. -The architecture only specifies that CR fields 1 to 7 (the 24 least -significant bits) are checkpointed, but the kernel provides all 8 -fields (32 bits). The value of field 0 is not masked by ptrace, so it -will sometimes show the result of some kernel operation, probably -treclaim., which sets this field. - -The checkpointed registers are marked not to be saved and restored. -Inferior function calls during an active transaction don't work well, -and it's unclear what should be done in this case. TEXASR and TFIAR -can be altered asynchronously, during transaction failure recording, -so they are also not saved and restored. For consistency neither is -TFHAR. - -Record and replay also doesn't work well when transactions are -involved. This patch doesn't address this, so the values of the HTM -SPRs will sometimes be innacurate when the record/relay target is -enabled. For instance, executing a "tbegin." alters TFHAR and TEXASR, -but these changes are not currently recorded. - -Because the checkpointed registers are only available when a -transaction is active (or suspended), ptrace can return ENODATA when -gdb tries to read these registers and the inferior is not in a -transactional state. The registers are set to the unavailable state -when this happens. When gbd tries to write to one of these registers, -and it is unavailable, an error is raised. - -The "fill" functions for checkpointed register sets in the server stub -are not implemented for the same reason as for the EBB register set, -since ptrace can also return ENODATA for checkpointed regsets. The -same issues with 'G' packets apply here. - -Just like for the EBB registers, tracepoints will not mark the -checkpointed registers as unavailable if the inferior was not in a -transaction, so their content will also show 0 instead of - when inspecting trace data. - -The new tests record the values of the regular registers before -stepping the inferior through a "tbegin." instruction to start a -transaction, then the checkpointed registers are checked against the -recorded pre-transactional values. New values are written to the -checkpointed registers and recorded, the inferior continues until the -transaction aborts (which is usually immediately when it is resumed), -and the regular registers are checked against the recorded values, -because the abort should have reverted the registers to these values. - -Like for the EBB registers, target_store_registers will ignore the -checkpointed registers when called with -1 as the regno -argument (store all registers in one go). - -gdb/ChangeLog: -2018-10-26 Edjunior Barbosa Machado - Pedro Franco de Carvalho - - * arch/ppc-linux-tdesc.h (tdesc_powerpc_isa207_htm_vsx32l) - (tdesc_powerpc_isa207_htm_vsx64l): Declare. - * arch/ppc-linux-common.h (PPC_LINUX_SIZEOF_TM_SPRREGSET) - (PPC32_LINUX_SIZEOF_CGPRREGSET, PPC64_LINUX_SIZEOF_CGPRREGSET) - (PPC_LINUX_SIZEOF_CFPRREGSET, PPC_LINUX_SIZEOF_CVMXREGSET) - (PPC_LINUX_SIZEOF_CVSXREGSET, PPC_LINUX_SIZEOF_CPPRREGSET) - (PPC_LINUX_SIZEOF_CDSCRREGSET, PPC_LINUX_SIZEOF_CTARREGSET): - Define. - (struct ppc_linux_features) : New field. - (ppc_linux_no_features): Add initializer for htm field. - * arch/ppc-linux-common.c (ppc_linux_match_description): Return - new tdescs. - * nat/ppc-linux.h (PPC_FEATURE2_HTM, NT_PPC_TM_CGPR) - (NT_PPC_TM_CFPR, NT_PPC_TM_CVMX, NT_PPC_TM_CVSX) - (NT_PPC_TM_SPR, NT_PPC_TM_CTAR, NT_PPC_TM_CPPR, NT_PPC_TM_CDSCR): - Define if not already defined. - * features/Makefile (WHICH): Add rs6000/powerpc-isa207-htm-vsx32l - and rs6000/powerpc-isa207-htm-vsx64l. - (XMLTOC): Add rs6000/powerpc-isa207-htm-vsx32l.xml and - rs6000/powerpc-isa207-htm-vsx64l.xml. - * features/rs6000/power-htm-spr.xml: New file. - * features/rs6000/power-htm-core.xml: New file. - * features/rs6000/power64-htm-core.xml: New file. - * features/rs6000/power-htm-fpu.xml: New file. - * features/rs6000/power-htm-altivec.xml: New file. - * features/rs6000/power-htm-vsx.xml: New file. - * features/rs6000/power-htm-ppr.xml: New file. - * features/rs6000/power-htm-dscr.xml: New file. - * features/rs6000/power-htm-tar.xml: New file. - * features/rs6000/powerpc-isa207-htm-vsx32l.xml: New file. - * features/rs6000/powerpc-isa207-htm-vsx64l.xml: New file. - * features/rs6000/powerpc-isa207-htm-vsx32l.c: Generate. - * features/rs6000/powerpc-isa207-htm-vsx64l.c: Generate. - * regformats/rs6000/powerpc-isa207-htm-vsx32l.dat: Generate. - * regformats/rs6000/powerpc-isa207-htm-vsx64l.dat: Generate. - * ppc-linux-nat.c (fetch_register, fetch_ppc_registers): Call - fetch_regset with HTM regsets. - (store_register, store_ppc_registers): Call store_regset with HTM - regsets. - (ppc_linux_nat_target::read_description): Set htm field in the - features struct if needed. - * ppc-linux-tdep.c: Include - features/rs6000/powerpc-isa207-htm-vsx32l.c and - features/rs6000/powerpc-isa207-htm-vsx64l.c. - (ppc32_regmap_tm_spr, ppc32_regmap_cgpr, ppc64_le_regmap_cgpr) - (ppc64_be_regmap_cgpr, ppc32_regmap_cfpr, ppc32_le_regmap_cvmx) - (ppc32_be_regmap_cvmx, ppc32_regmap_cvsx, ppc32_regmap_cppr) - (ppc32_regmap_cdscr, ppc32_regmap_ctar): New globals. - (ppc32_linux_tm_sprregset, ppc32_linux_cgprregset) - (ppc64_be_linux_cgprregset, ppc64_le_linux_cgprregset) - (ppc32_linux_cfprregset, ppc32_le_linux_cvmxregset) - (ppc32_be_linux_cvmxregset, ppc32_linux_cvsxregset) - (ppc32_linux_cpprregset, ppc32_linux_cdscrregset) - (ppc32_linux_ctarregset): New globals. - (ppc_linux_cgprregset, ppc_linux_cvmxregset): New functions. - (ppc_linux_collect_core_cpgrregset): New function. - (ppc_linux_iterate_over_regset_sections): Call back with the htm - regsets. - (ppc_linux_core_read_description): Check if the tm spr section is - present and set htm in the features struct. - (_initialize_ppc_linux_tdep): Call - initialize_tdesc_powerpc_isa207_htm_vsx32l and - initialize_tdesc_powerpc_isa207_htm_vsx64l. - * ppc-linux-tdep.h (ppc_linux_cgprregset, ppc_linux_cvmxregset): - Declare. - (ppc32_linux_tm_sprregset, ppc32_linux_cfprregset) - (ppc32_linux_cvsxregset, ppc32_linux_cpprregset) - (ppc32_linux_cdscrregset, ppc32_linux_ctarregset): Declare. - * ppc-tdep.h (struct gdbarch_tdep) : - New fields. - : - Likewise. - : Likewise. - : Likewise. - (enum) : - New enum fields. - : Likewise. - : Likewise. - : Likewise. - : Likewise. - : Likewise. - : Likewise. - (PPC_IS_TMSPR_REGNUM, PPC_IS_CKPTGP_REGNUM, PPC_IS_CKPTFP_REGNUM) - (PPC_IS_CKPTVMX_REGNUM, PPC_IS_CKPTVSX_REGNUM): Define. - * rs6000-tdep.c (IS_CDFP_PSEUDOREG, IS_CVSX_PSEUDOREG) - (IS_CEFP_PSEUDOREG): Define. - (rs6000_register_name): Hide the upper halves of checkpointed VSX - registers. Return names for the checkpointed DFP, VSX, and EFP - pseudo registers. - (rs6000_pseudo_register_type): Remove initial assert and raise an - internal error in the else clause instead. Return types for the - checkpointed DFP, VSX, and EFP pseudo registers. - (dfp_pseudo_register_read, dfp_pseudo_register_write): Handle - checkpointed DFP pseudo registers. - (vsx_pseudo_register_read, vsx_pseudo_register_write): Handle - checkpointed VSX pseudo registers. - (efp_pseudo_register_read, efp_pseudo_register_write): Rename - from efpr_pseudo_register_read and - efpr_pseudo_register_write. Handle checkpointed EFP pseudo - registers. - (rs6000_pseudo_register_read, rs6000_pseudo_register_write): - Handle checkpointed DFP, VSX, and EFP registers. - (dfp_ax_pseudo_register_collect, vsx_ax_pseudo_register_collect) - (efp_ax_pseudo_register_collect): New functions. - (rs6000_ax_pseudo_register_collect): Move DFP, VSX and EFP pseudo - register logic to new functions. Handle checkpointed DFP, VSX, - and EFP pseudo registers. - (rs6000_gdbarch_init): Look for and validate the htm features. - Include checkpointed DFP, VSX and EFP pseudo-registers. - * NEWS: Mention access to PPR, DSCR, TAR, EBB/PMU registers and - HTM registers. - -gdb/gdbserver/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * configure.srv (ipa_ppc_linux_regobj): Add - powerpc-isa207-htm-vsx32l-ipa.o and - powerpc-isa207-htm-vsx64l-ipa.o. - (powerpc*-*-linux*): Add powerpc-isa207-htm-vsx32l.o and - powerpc-isa207-htm-vsx64l.o to srv_regobj. Add - rs6000/power-htm-spr.xml, rs6000/power-htm-core.xml, - rs6000/power64-htm-core.xml, rs6000/power-htm-fpu.xml, - rs6000/power-htm-altivec.xml, rs6000/power-htm-vsx.xml, - rs6000/power-htm-ppr.xml, rs6000/power-htm-dscr.xml, - rs6000/power-htm-tar.xml, rs6000/powerpc-isa207-htm-vsx32l.xml, - and rs6000/powerpc-isa207-htm-vsx64l.xml to srv_xmlfiles. - * linux-ppc-tdesc-init.h (enum ppc_linux_tdesc) - : New enum value. - (init_registers_powerpc_isa207_htm_vsx32l) - (init_registers_powerpc_isa207_htm_vsx64l): Declare. - * linux-ppc-low.c (ppc_fill_tm_sprregset, ppc_store_tm_sprregset) - (ppc_store_tm_cgprregset, ppc_store_tm_cfprregset) - (ppc_store_tm_cvrregset, ppc_store_tm_cvsxregset) - (ppc_store_tm_cpprregset, ppc_store_tm_cdscrregset) - (ppc_store_tm_ctarregset): New functions. - (ppc_regsets): Add entries for HTM regsets. - (ppc_arch_setup): Set htm in features struct when needed. Set - sizes for the HTM regsets. - (ppc_get_ipa_tdesc_idx): Return PPC_TDESC_ISA207_HTM_VSX. - (initialize_low_arch): Call - init_registers_powerpc_isa207_htm_vsx32l and - init_registers_powerpc_isa207_htm_vsx64l. - * linux-ppc-ipa.c (get_ipa_tdesc): Handle - PPC_TDESC_ISA207_HTM_VSX. - (initialize_low_tracepoint): Call - init_registers_powerpc_isa207_htm_vsx32l and - init_registers_powerpc_isa207_htm_vsx64l. - -gdb/testsuite/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * gdb.arch/powerpc-htm-regs.c: New file. - * gdb.arch/powerpc-htm-regs.exp: New file. - -gdb/doc/ChangeLog: -2018-10-26 Pedro Franco de Carvalho - - * gdb.texinfo (PowerPC Features): Describe new features - "org.gnu.gdb.power.htm.spr", "org.gnu.gdb.power.htm.core", - "org.gnu.gdb.power.htm.fpu", "org.gnu.gdb.power.htm.altivec", - "org.gnu.gdb.power.htm.vsx", "org.gnu.gdb.power.htm.ppr", - "org.gnu.gdb.power.htm.dscr", "org.gnu.gdb.power.htm.tar". - -diff --git a/gdb/NEWS b/gdb/NEWS ---- a/gdb/NEWS -+++ b/gdb/NEWS -@@ -12,6 +12,10 @@ - - *** Changes in GDB 8.2 - -+* GDB and GDBserver now support access to additional registers on -+ PowerPC GNU/Linux targets: PPR, DSCR, TAR, EBB/PMU registers, and -+ HTM registers. -+ - * The 'set disassembler-options' command now supports specifying options - for the MIPS target. - -diff --git a/gdb/arch/ppc-linux-common.c b/gdb/arch/ppc-linux-common.c ---- a/gdb/arch/ppc-linux-common.c -+++ b/gdb/arch/ppc-linux-common.c -@@ -53,7 +53,8 @@ ppc_linux_match_description (struct ppc_linux_features features) - if (features.cell) - tdesc = tdesc_powerpc_cell64l; - else if (features.vsx) -- tdesc = (features.isa207? tdesc_powerpc_isa207_vsx64l -+ tdesc = (features.htm? tdesc_powerpc_isa207_htm_vsx64l -+ : features.isa207? tdesc_powerpc_isa207_vsx64l - : features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx64l - : features.isa205? tdesc_powerpc_isa205_vsx64l - : tdesc_powerpc_vsx64l); -@@ -71,7 +72,8 @@ ppc_linux_match_description (struct ppc_linux_features features) - if (features.cell) - tdesc = tdesc_powerpc_cell32l; - else if (features.vsx) -- tdesc = (features.isa207? tdesc_powerpc_isa207_vsx32l -+ tdesc = (features.htm? tdesc_powerpc_isa207_htm_vsx32l -+ : features.isa207? tdesc_powerpc_isa207_vsx32l - : features.ppr_dscr? tdesc_powerpc_isa205_ppr_dscr_vsx32l - : features.isa205? tdesc_powerpc_isa205_vsx32l - : tdesc_powerpc_vsx32l); -diff --git a/gdb/arch/ppc-linux-common.h b/gdb/arch/ppc-linux-common.h ---- a/gdb/arch/ppc-linux-common.h -+++ b/gdb/arch/ppc-linux-common.h -@@ -35,6 +35,15 @@ struct target_desc; - #define PPC_LINUX_SIZEOF_TARREGSET 8 - #define PPC_LINUX_SIZEOF_EBBREGSET (3*8) - #define PPC_LINUX_SIZEOF_PMUREGSET (5*8) -+#define PPC_LINUX_SIZEOF_TM_SPRREGSET (3*8) -+#define PPC32_LINUX_SIZEOF_CGPRREGSET (48*4) -+#define PPC64_LINUX_SIZEOF_CGPRREGSET (48*8) -+#define PPC_LINUX_SIZEOF_CFPRREGSET (32*8+8) -+#define PPC_LINUX_SIZEOF_CVMXREGSET (34*16) -+#define PPC_LINUX_SIZEOF_CVSXREGSET (32*8) -+#define PPC_LINUX_SIZEOF_CPPRREGSET 8 -+#define PPC_LINUX_SIZEOF_CDSCRREGSET 8 -+#define PPC_LINUX_SIZEOF_CTARREGSET 8 - - /* Check if the hwcap auxv entry indicates that isa205 is supported. */ - bool ppc_linux_has_isa205 (CORE_ADDR hwcap); -@@ -48,6 +57,7 @@ struct ppc_linux_features - bool isa205; - bool ppr_dscr; - bool isa207; -+ bool htm; - bool cell; - }; - -@@ -60,6 +70,7 @@ const struct ppc_linux_features ppc_linux_no_features = { - false, - false, - false, -+ false, - }; - - /* Return a target description that matches FEATURES. */ -diff --git a/gdb/arch/ppc-linux-tdesc.h b/gdb/arch/ppc-linux-tdesc.h ---- a/gdb/arch/ppc-linux-tdesc.h -+++ b/gdb/arch/ppc-linux-tdesc.h -@@ -31,6 +31,7 @@ extern struct target_desc *tdesc_powerpc_isa205_altivec32l; - extern struct target_desc *tdesc_powerpc_isa205_vsx32l; - extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx32l; - extern struct target_desc *tdesc_powerpc_isa207_vsx32l; -+extern struct target_desc *tdesc_powerpc_isa207_htm_vsx32l; - extern struct target_desc *tdesc_powerpc_e500l; - - extern struct target_desc *tdesc_powerpc_64l; -@@ -42,5 +43,6 @@ extern struct target_desc *tdesc_powerpc_isa205_altivec64l; - extern struct target_desc *tdesc_powerpc_isa205_vsx64l; - extern struct target_desc *tdesc_powerpc_isa205_ppr_dscr_vsx64l; - extern struct target_desc *tdesc_powerpc_isa207_vsx64l; -+extern struct target_desc *tdesc_powerpc_isa207_htm_vsx64l; - - #endif /* ARCH_PPC_LINUX_TDESC_H */ -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -42573,6 +42573,48 @@ contain registers @samp{mmcr0}, @samp{mmcr2}, @samp{siar}, @samp{sdar} - and @samp{sier}, all 64-bit wide. This is the subset of the isa 2.07 - server PMU registers provided by @sc{gnu}/Linux. - -+The @samp{org.gnu.gdb.power.htm.spr} feature is optional. It should -+contain registers @samp{tfhar}, @samp{texasr} and @samp{tfiar}, all -+64-bit wide. -+ -+The @samp{org.gnu.gdb.power.htm.core} feature is optional. It should -+contain the checkpointed general-purpose registers @samp{cr0} through -+@samp{cr31}, as well as the checkpointed registers @samp{clr} and -+@samp{cctr}. These registers may all be either 32-bit or 64-bit -+depending on the target. It should also contain the checkpointed -+registers @samp{ccr} and @samp{cxer}, which should both be 32-bit -+wide. -+ -+The @samp{org.gnu.gdb.power.htm.fpu} feature is optional. It should -+contain the checkpointed 64-bit floating-point registers @samp{cf0} -+through @samp{cf31}, as well as the checkpointed 64-bit register -+@samp{cfpscr}. -+ -+The @samp{org.gnu.gdb.power.htm.altivec} feature is optional. It -+should contain the checkpointed altivec registers @samp{cvr0} through -+@samp{cvr31}, all 128-bit wide. It should also contain the -+checkpointed registers @samp{cvscr} and @samp{cvrsave}, both 32-bit -+wide. -+ -+The @samp{org.gnu.gdb.power.htm.vsx} feature is optional. It should -+contain registers @samp{cvs0h} through @samp{cvs31h}. @value{GDBN} -+will combine these registers with the checkpointed floating point -+registers (@samp{cf0} through @samp{cf31}) and the checkpointed -+altivec registers (@samp{cvr0} through @samp{cvr31}) to present the -+128-bit wide checkpointed vector-scalar registers @samp{cvs0} through -+@samp{cvs63}. Therefore, this feature requires both -+@samp{org.gnu.gdb.power.htm.altivec} and -+@samp{org.gnu.gdb.power.htm.fpu}. -+ -+The @samp{org.gnu.gdb.power.htm.ppr} feature is optional. It should -+contain the 64-bit checkpointed register @samp{cppr}. -+ -+The @samp{org.gnu.gdb.power.htm.dscr} feature is optional. It should -+contain the 64-bit checkpointed register @samp{cdscr}. -+ -+The @samp{org.gnu.gdb.power.htm.tar} feature is optional. It should -+contain the 64-bit checkpointed register @samp{ctar}. -+ - @node S/390 and System z Features - @subsection S/390 and System z Features - @cindex target descriptions, S/390 features -diff --git a/gdb/features/Makefile b/gdb/features/Makefile ---- a/gdb/features/Makefile -+++ b/gdb/features/Makefile -@@ -76,6 +76,8 @@ WHICH = aarch64 \ - rs6000/powerpc-isa205-ppr-dscr-vsx32l \ - rs6000/powerpc-isa205-ppr-dscr-vsx64l \ - rs6000/powerpc-isa207-vsx32l rs6000/powerpc-isa207-vsx64l \ -+ rs6000/powerpc-isa207-htm-vsx32l \ -+ rs6000/powerpc-isa207-htm-vsx64l \ - s390-linux32 s390-linux64 s390x-linux64 \ - s390-linux32v1 s390-linux64v1 s390x-linux64v1 \ - s390-linux32v2 s390-linux64v2 s390x-linux64v2 \ -@@ -174,6 +176,8 @@ XMLTOC = \ - rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml \ - rs6000/powerpc-isa207-vsx32l.xml \ - rs6000/powerpc-isa207-vsx64l.xml \ -+ rs6000/powerpc-isa207-htm-vsx32l.xml \ -+ rs6000/powerpc-isa207-htm-vsx64l.xml \ - rs6000/powerpc-vsx32.xml \ - rs6000/powerpc-vsx32l.xml \ - rs6000/powerpc-vsx64.xml \ -diff --git a/gdb/features/rs6000/power-htm-altivec.xml b/gdb/features/rs6000/power-htm-altivec.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-htm-altivec.xml -@@ -0,0 +1,58 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/power-htm-core.xml b/gdb/features/rs6000/power-htm-core.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-htm-core.xml -@@ -0,0 +1,48 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/power-htm-dscr.xml b/gdb/features/rs6000/power-htm-dscr.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-htm-dscr.xml -@@ -0,0 +1,12 @@ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/power-htm-fpu.xml b/gdb/features/rs6000/power-htm-fpu.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-htm-fpu.xml -@@ -0,0 +1,45 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/power-htm-ppr.xml b/gdb/features/rs6000/power-htm-ppr.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-htm-ppr.xml -@@ -0,0 +1,12 @@ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/power-htm-spr.xml b/gdb/features/rs6000/power-htm-spr.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-htm-spr.xml -@@ -0,0 +1,14 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/power-htm-tar.xml b/gdb/features/rs6000/power-htm-tar.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-htm-tar.xml -@@ -0,0 +1,12 @@ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/power-htm-vsx.xml b/gdb/features/rs6000/power-htm-vsx.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power-htm-vsx.xml -@@ -0,0 +1,43 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/power64-htm-core.xml b/gdb/features/rs6000/power64-htm-core.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/power64-htm-core.xml -@@ -0,0 +1,48 @@ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c b/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.c -@@ -0,0 +1,396 @@ -+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: -+ Original: powerpc-isa207-htm-vsx32l.xml */ -+ -+#include "defs.h" -+#include "osabi.h" -+#include "target-descriptions.h" -+ -+struct target_desc *tdesc_powerpc_isa207_htm_vsx32l; -+static void -+initialize_tdesc_powerpc_isa207_htm_vsx32l (void) -+{ -+ struct target_desc *result = allocate_target_description (); -+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common")); -+ -+ struct tdesc_feature *feature; -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core"); -+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 32, "code_ptr"); -+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 32, "code_ptr"); -+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu"); -+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux"); -+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 32, "int"); -+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 32, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec"); -+ tdesc_type *element_type; -+ element_type = tdesc_named_type (feature, "ieee_single"); -+ tdesc_create_vector (feature, "v4f", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int32"); -+ tdesc_create_vector (feature, "v4i32", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int16"); -+ tdesc_create_vector (feature, "v8i16", element_type, 8); -+ -+ element_type = tdesc_named_type (feature, "int8"); -+ tdesc_create_vector (feature, "v16i8", element_type, 16); -+ -+ tdesc_type_with_fields *type_with_fields; -+ type_with_fields = tdesc_create_union (feature, "vec128"); -+ tdesc_type *field_type; -+ field_type = tdesc_named_type (feature, "uint128"); -+ tdesc_add_field (type_with_fields, "uint128", field_type); -+ field_type = tdesc_named_type (feature, "v4f"); -+ tdesc_add_field (type_with_fields, "v4_float", field_type); -+ field_type = tdesc_named_type (feature, "v4i32"); -+ tdesc_add_field (type_with_fields, "v4_int32", field_type); -+ field_type = tdesc_named_type (feature, "v8i16"); -+ tdesc_add_field (type_with_fields, "v8_int16", field_type); -+ field_type = tdesc_named_type (feature, "v16i8"); -+ tdesc_add_field (type_with_fields, "v16_int8", field_type); -+ -+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int"); -+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx"); -+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr"); -+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr"); -+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar"); -+ tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb"); -+ tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu"); -+ tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.spr"); -+ tdesc_create_reg (feature, "tfhar", 150, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "texasr", 151, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "tfiar", 152, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.core"); -+ tdesc_create_reg (feature, "cr0", 153, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr1", 154, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr2", 155, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr3", 156, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr4", 157, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr5", 158, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr6", 159, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr7", 160, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr8", 161, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr9", 162, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr10", 163, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr11", 164, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr12", 165, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr13", 166, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr14", 167, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr15", 168, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr16", 169, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr17", 170, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr18", 171, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr19", 172, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr20", 173, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr21", 174, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr22", 175, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr23", 176, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr24", 177, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr25", 178, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr26", 179, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr27", 180, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr28", 181, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr29", 182, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr30", 183, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cr31", 184, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "ccr", 185, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cxer", 186, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "clr", 187, 0, NULL, 32, "code_ptr"); -+ tdesc_create_reg (feature, "cctr", 188, 0, NULL, 32, "uint32"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.fpu"); -+ tdesc_create_reg (feature, "cf0", 189, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf1", 190, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf2", 191, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf3", 192, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf4", 193, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf5", 194, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf6", 195, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf7", 196, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf8", 197, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf9", 198, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf10", 199, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf11", 200, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf12", 201, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf13", 202, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf14", 203, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf15", 204, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf16", 205, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf17", 206, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf18", 207, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf19", 208, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf20", 209, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf21", 210, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf22", 211, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf23", 212, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf24", 213, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf25", 214, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf26", 215, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf27", 216, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf28", 217, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf29", 218, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf30", 219, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf31", 220, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cfpscr", 221, 0, "float", 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.altivec"); -+ element_type = tdesc_named_type (feature, "ieee_single"); -+ tdesc_create_vector (feature, "v4f", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int32"); -+ tdesc_create_vector (feature, "v4i32", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int16"); -+ tdesc_create_vector (feature, "v8i16", element_type, 8); -+ -+ element_type = tdesc_named_type (feature, "int8"); -+ tdesc_create_vector (feature, "v16i8", element_type, 16); -+ -+ type_with_fields = tdesc_create_union (feature, "vec128"); -+ field_type = tdesc_named_type (feature, "uint128"); -+ tdesc_add_field (type_with_fields, "uint128", field_type); -+ field_type = tdesc_named_type (feature, "v4f"); -+ tdesc_add_field (type_with_fields, "v4_float", field_type); -+ field_type = tdesc_named_type (feature, "v4i32"); -+ tdesc_add_field (type_with_fields, "v4_int32", field_type); -+ field_type = tdesc_named_type (feature, "v8i16"); -+ tdesc_add_field (type_with_fields, "v8_int16", field_type); -+ field_type = tdesc_named_type (feature, "v16i8"); -+ tdesc_add_field (type_with_fields, "v16_int8", field_type); -+ -+ tdesc_create_reg (feature, "cvr0", 222, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr1", 223, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr2", 224, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr3", 225, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr4", 226, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr5", 227, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr6", 228, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr7", 229, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr8", 230, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr9", 231, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr10", 232, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr11", 233, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr12", 234, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr13", 235, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr14", 236, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr15", 237, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr16", 238, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr17", 239, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr18", 240, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr19", 241, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr20", 242, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr21", 243, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr22", 244, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr23", 245, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr24", 246, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr25", 247, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr26", 248, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr27", 249, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr28", 250, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr29", 251, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr30", 252, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr31", 253, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvscr", 254, 0, "vector", 32, "int"); -+ tdesc_create_reg (feature, "cvrsave", 255, 0, "vector", 32, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.vsx"); -+ tdesc_create_reg (feature, "cvs0h", 256, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs1h", 257, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs2h", 258, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs3h", 259, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs4h", 260, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs5h", 261, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs6h", 262, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs7h", 263, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs8h", 264, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs9h", 265, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs10h", 266, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs11h", 267, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs12h", 268, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs13h", 269, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs14h", 270, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs15h", 271, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs16h", 272, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs17h", 273, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs18h", 274, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs19h", 275, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs20h", 276, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs21h", 277, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs22h", 278, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs23h", 279, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs24h", 280, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs25h", 281, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs26h", 282, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs27h", 283, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs28h", 284, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs29h", 285, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs30h", 286, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs31h", 287, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.ppr"); -+ tdesc_create_reg (feature, "cppr", 288, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.dscr"); -+ tdesc_create_reg (feature, "cdscr", 289, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.tar"); -+ tdesc_create_reg (feature, "ctar", 290, 0, NULL, 64, "uint64"); -+ -+ tdesc_powerpc_isa207_htm_vsx32l = result; -+} -diff --git a/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.xml b/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa207-htm-vsx32l.xml -@@ -0,0 +1,29 @@ -+ -+ -+ -+ -+ -+ powerpc:common -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c b/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.c -@@ -0,0 +1,396 @@ -+/* THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi:set ro: -+ Original: powerpc-isa207-htm-vsx64l.xml */ -+ -+#include "defs.h" -+#include "osabi.h" -+#include "target-descriptions.h" -+ -+struct target_desc *tdesc_powerpc_isa207_htm_vsx64l; -+static void -+initialize_tdesc_powerpc_isa207_htm_vsx64l (void) -+{ -+ struct target_desc *result = allocate_target_description (); -+ set_tdesc_architecture (result, bfd_scan_arch ("powerpc:common64")); -+ -+ struct tdesc_feature *feature; -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.core"); -+ tdesc_create_reg (feature, "r0", 0, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r1", 1, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r2", 2, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r3", 3, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r4", 4, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r5", 5, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r6", 6, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r7", 7, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r8", 8, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r9", 9, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r10", 10, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r11", 11, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r12", 12, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r13", 13, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r14", 14, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r15", 15, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r16", 16, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r17", 17, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r18", 18, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r19", 19, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r20", 20, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r21", 21, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r22", 22, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r23", 23, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r24", 24, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r25", 25, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r26", 26, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r27", 27, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r28", 28, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r29", 29, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r30", 30, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "r31", 31, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "pc", 64, 1, NULL, 64, "code_ptr"); -+ tdesc_create_reg (feature, "msr", 65, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr", 66, 1, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "lr", 67, 1, NULL, 64, "code_ptr"); -+ tdesc_create_reg (feature, "ctr", 68, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "xer", 69, 1, NULL, 32, "uint32"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.fpu"); -+ tdesc_create_reg (feature, "f0", 32, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f1", 33, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f2", 34, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f3", 35, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f4", 36, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f5", 37, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f6", 38, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f7", 39, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f8", 40, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f9", 41, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f10", 42, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f11", 43, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f12", 44, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f13", 45, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f14", 46, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f15", 47, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f16", 48, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f17", 49, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f18", 50, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f19", 51, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f20", 52, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f21", 53, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f22", 54, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f23", 55, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f24", 56, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f25", 57, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f26", 58, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f27", 59, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f28", 60, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f29", 61, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f30", 62, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "f31", 63, 1, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "fpscr", 70, 1, "float", 64, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux"); -+ tdesc_create_reg (feature, "orig_r3", 71, 1, NULL, 64, "int"); -+ tdesc_create_reg (feature, "trap", 72, 1, NULL, 64, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.altivec"); -+ tdesc_type *element_type; -+ element_type = tdesc_named_type (feature, "ieee_single"); -+ tdesc_create_vector (feature, "v4f", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int32"); -+ tdesc_create_vector (feature, "v4i32", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int16"); -+ tdesc_create_vector (feature, "v8i16", element_type, 8); -+ -+ element_type = tdesc_named_type (feature, "int8"); -+ tdesc_create_vector (feature, "v16i8", element_type, 16); -+ -+ tdesc_type_with_fields *type_with_fields; -+ type_with_fields = tdesc_create_union (feature, "vec128"); -+ tdesc_type *field_type; -+ field_type = tdesc_named_type (feature, "uint128"); -+ tdesc_add_field (type_with_fields, "uint128", field_type); -+ field_type = tdesc_named_type (feature, "v4f"); -+ tdesc_add_field (type_with_fields, "v4_float", field_type); -+ field_type = tdesc_named_type (feature, "v4i32"); -+ tdesc_add_field (type_with_fields, "v4_int32", field_type); -+ field_type = tdesc_named_type (feature, "v8i16"); -+ tdesc_add_field (type_with_fields, "v8_int16", field_type); -+ field_type = tdesc_named_type (feature, "v16i8"); -+ tdesc_add_field (type_with_fields, "v16_int8", field_type); -+ -+ tdesc_create_reg (feature, "vr0", 73, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr1", 74, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr2", 75, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr3", 76, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr4", 77, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr5", 78, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr6", 79, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr7", 80, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr8", 81, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr9", 82, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr10", 83, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr11", 84, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr12", 85, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr13", 86, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr14", 87, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr15", 88, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr16", 89, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr17", 90, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr18", 91, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr19", 92, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr20", 93, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr21", 94, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr22", 95, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr23", 96, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr24", 97, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr25", 98, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr26", 99, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr27", 100, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr28", 101, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr29", 102, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr30", 103, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vr31", 104, 1, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "vscr", 105, 1, "vector", 32, "int"); -+ tdesc_create_reg (feature, "vrsave", 106, 1, "vector", 32, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.vsx"); -+ tdesc_create_reg (feature, "vs0h", 107, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs1h", 108, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs2h", 109, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs3h", 110, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs4h", 111, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs5h", 112, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs6h", 113, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs7h", 114, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs8h", 115, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs9h", 116, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs10h", 117, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs11h", 118, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs12h", 119, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs13h", 120, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs14h", 121, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs15h", 122, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs16h", 123, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs17h", 124, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs18h", 125, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs19h", 126, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs20h", 127, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs21h", 128, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs22h", 129, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs23h", 130, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs24h", 131, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs25h", 132, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs26h", 133, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs27h", 134, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs28h", 135, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs29h", 136, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs30h", 137, 1, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "vs31h", 138, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ppr"); -+ tdesc_create_reg (feature, "ppr", 139, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.dscr"); -+ tdesc_create_reg (feature, "dscr", 140, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.tar"); -+ tdesc_create_reg (feature, "tar", 141, 1, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.ebb"); -+ tdesc_create_reg (feature, "bescr", 142, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "ebbhr", 143, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "ebbrr", 144, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.linux.pmu"); -+ tdesc_create_reg (feature, "mmcr0", 145, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "mmcr2", 146, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "siar", 147, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "sdar", 148, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "sier", 149, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.spr"); -+ tdesc_create_reg (feature, "tfhar", 150, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "texasr", 151, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "tfiar", 152, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.core"); -+ tdesc_create_reg (feature, "cr0", 153, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr1", 154, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr2", 155, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr3", 156, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr4", 157, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr5", 158, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr6", 159, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr7", 160, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr8", 161, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr9", 162, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr10", 163, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr11", 164, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr12", 165, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr13", 166, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr14", 167, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr15", 168, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr16", 169, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr17", 170, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr18", 171, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr19", 172, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr20", 173, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr21", 174, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr22", 175, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr23", 176, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr24", 177, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr25", 178, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr26", 179, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr27", 180, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr28", 181, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr29", 182, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr30", 183, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cr31", 184, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "ccr", 185, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "cxer", 186, 0, NULL, 32, "uint32"); -+ tdesc_create_reg (feature, "clr", 187, 0, NULL, 64, "code_ptr"); -+ tdesc_create_reg (feature, "cctr", 188, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.fpu"); -+ tdesc_create_reg (feature, "cf0", 189, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf1", 190, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf2", 191, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf3", 192, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf4", 193, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf5", 194, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf6", 195, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf7", 196, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf8", 197, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf9", 198, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf10", 199, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf11", 200, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf12", 201, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf13", 202, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf14", 203, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf15", 204, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf16", 205, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf17", 206, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf18", 207, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf19", 208, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf20", 209, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf21", 210, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf22", 211, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf23", 212, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf24", 213, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf25", 214, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf26", 215, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf27", 216, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf28", 217, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf29", 218, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf30", 219, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cf31", 220, 0, NULL, 64, "ieee_double"); -+ tdesc_create_reg (feature, "cfpscr", 221, 0, "float", 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.altivec"); -+ element_type = tdesc_named_type (feature, "ieee_single"); -+ tdesc_create_vector (feature, "v4f", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int32"); -+ tdesc_create_vector (feature, "v4i32", element_type, 4); -+ -+ element_type = tdesc_named_type (feature, "int16"); -+ tdesc_create_vector (feature, "v8i16", element_type, 8); -+ -+ element_type = tdesc_named_type (feature, "int8"); -+ tdesc_create_vector (feature, "v16i8", element_type, 16); -+ -+ type_with_fields = tdesc_create_union (feature, "vec128"); -+ field_type = tdesc_named_type (feature, "uint128"); -+ tdesc_add_field (type_with_fields, "uint128", field_type); -+ field_type = tdesc_named_type (feature, "v4f"); -+ tdesc_add_field (type_with_fields, "v4_float", field_type); -+ field_type = tdesc_named_type (feature, "v4i32"); -+ tdesc_add_field (type_with_fields, "v4_int32", field_type); -+ field_type = tdesc_named_type (feature, "v8i16"); -+ tdesc_add_field (type_with_fields, "v8_int16", field_type); -+ field_type = tdesc_named_type (feature, "v16i8"); -+ tdesc_add_field (type_with_fields, "v16_int8", field_type); -+ -+ tdesc_create_reg (feature, "cvr0", 222, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr1", 223, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr2", 224, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr3", 225, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr4", 226, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr5", 227, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr6", 228, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr7", 229, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr8", 230, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr9", 231, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr10", 232, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr11", 233, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr12", 234, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr13", 235, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr14", 236, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr15", 237, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr16", 238, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr17", 239, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr18", 240, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr19", 241, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr20", 242, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr21", 243, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr22", 244, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr23", 245, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr24", 246, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr25", 247, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr26", 248, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr27", 249, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr28", 250, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr29", 251, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr30", 252, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvr31", 253, 0, NULL, 128, "vec128"); -+ tdesc_create_reg (feature, "cvscr", 254, 0, "vector", 32, "int"); -+ tdesc_create_reg (feature, "cvrsave", 255, 0, "vector", 32, "int"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.vsx"); -+ tdesc_create_reg (feature, "cvs0h", 256, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs1h", 257, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs2h", 258, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs3h", 259, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs4h", 260, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs5h", 261, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs6h", 262, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs7h", 263, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs8h", 264, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs9h", 265, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs10h", 266, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs11h", 267, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs12h", 268, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs13h", 269, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs14h", 270, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs15h", 271, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs16h", 272, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs17h", 273, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs18h", 274, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs19h", 275, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs20h", 276, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs21h", 277, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs22h", 278, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs23h", 279, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs24h", 280, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs25h", 281, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs26h", 282, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs27h", 283, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs28h", 284, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs29h", 285, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs30h", 286, 0, NULL, 64, "uint64"); -+ tdesc_create_reg (feature, "cvs31h", 287, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.ppr"); -+ tdesc_create_reg (feature, "cppr", 288, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.dscr"); -+ tdesc_create_reg (feature, "cdscr", 289, 0, NULL, 64, "uint64"); -+ -+ feature = tdesc_create_feature (result, "org.gnu.gdb.power.htm.tar"); -+ tdesc_create_reg (feature, "ctar", 290, 0, NULL, 64, "uint64"); -+ -+ tdesc_powerpc_isa207_htm_vsx64l = result; -+} -diff --git a/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.xml b/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.xml -new file mode 100644 ---- /dev/null -+++ b/gdb/features/rs6000/powerpc-isa207-htm-vsx64l.xml -@@ -0,0 +1,29 @@ -+ -+ -+ -+ -+ -+ powerpc:common64 -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --git a/gdb/gdbserver/configure.srv b/gdb/gdbserver/configure.srv ---- a/gdb/gdbserver/configure.srv -+++ b/gdb/gdbserver/configure.srv -@@ -32,7 +32,7 @@ else - srv_amd64_linux_regobj="" - fi - --ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-isa205-ppr-dscr-vsx32l-ipa.o powerpc-isa207-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o powerpc-isa205-ppr-dscr-vsx64l-ipa.o powerpc-isa207-vsx64l-ipa.o" -+ipa_ppc_linux_regobj="powerpc-32l-ipa.o powerpc-altivec32l-ipa.o powerpc-cell32l-ipa.o powerpc-vsx32l-ipa.o powerpc-isa205-32l-ipa.o powerpc-isa205-altivec32l-ipa.o powerpc-isa205-vsx32l-ipa.o powerpc-isa205-ppr-dscr-vsx32l-ipa.o powerpc-isa207-vsx32l-ipa.o powerpc-isa207-htm-vsx32l-ipa.o powerpc-e500l-ipa.o powerpc-64l-ipa.o powerpc-altivec64l-ipa.o powerpc-cell64l-ipa.o powerpc-vsx64l-ipa.o powerpc-isa205-64l-ipa.o powerpc-isa205-altivec64l-ipa.o powerpc-isa205-vsx64l-ipa.o powerpc-isa205-ppr-dscr-vsx64l-ipa.o powerpc-isa207-vsx64l-ipa.o powerpc-isa207-htm-vsx64l-ipa.o" - - # Linux object files. This is so we don't have to repeat - # these files over and over again. -@@ -219,6 +219,7 @@ case "${target}" in - srv_regobj="${srv_regobj} powerpc-isa205-vsx32l.o" - srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx32l.o" - srv_regobj="${srv_regobj} powerpc-isa207-vsx32l.o" -+ srv_regobj="${srv_regobj} powerpc-isa207-htm-vsx32l.o" - srv_regobj="${srv_regobj} powerpc-e500l.o" - srv_regobj="${srv_regobj} powerpc-64l.o" - srv_regobj="${srv_regobj} powerpc-altivec64l.o" -@@ -229,6 +230,7 @@ case "${target}" in - srv_regobj="${srv_regobj} powerpc-isa205-vsx64l.o" - srv_regobj="${srv_regobj} powerpc-isa205-ppr-dscr-vsx64l.o" - srv_regobj="${srv_regobj} powerpc-isa207-vsx64l.o" -+ srv_regobj="${srv_regobj} powerpc-isa207-htm-vsx64l.o" - srv_tgtobj="$srv_linux_obj linux-ppc-low.o ppc-linux.o" - srv_tgtobj="${srv_tgtobj} arch/ppc-linux-common.o" - srv_xmlfiles="rs6000/powerpc-32l.xml" -@@ -240,6 +242,7 @@ case "${target}" in - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx32l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx32l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx32l.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-htm-vsx32l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-altivec.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-vsx.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-core.xml" -@@ -251,6 +254,14 @@ case "${target}" in - srv_xmlfiles="${srv_xmlfiles} rs6000/power-tar.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-ebb.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-linux-pmu.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-spr.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-core.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-fpu.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-altivec.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-vsx.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-ppr.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-dscr.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power-htm-tar.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-e500l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power-spe.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-64l.xml" -@@ -262,8 +273,10 @@ case "${target}" in - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-vsx64l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa205-ppr-dscr-vsx64l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-vsx64l.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/powerpc-isa207-htm-vsx64l.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power64-core.xml" - srv_xmlfiles="${srv_xmlfiles} rs6000/power64-linux.xml" -+ srv_xmlfiles="${srv_xmlfiles} rs6000/power64-htm-core.xml" - srv_linux_usrregs=yes - srv_linux_regsets=yes - srv_linux_thread_db=yes -diff --git a/gdb/gdbserver/linux-ppc-ipa.c b/gdb/gdbserver/linux-ppc-ipa.c ---- a/gdb/gdbserver/linux-ppc-ipa.c -+++ b/gdb/gdbserver/linux-ppc-ipa.c -@@ -195,6 +195,8 @@ get_ipa_tdesc (int idx) - return tdesc_powerpc_isa205_ppr_dscr_vsx64l; - case PPC_TDESC_ISA207_VSX: - return tdesc_powerpc_isa207_vsx64l; -+ case PPC_TDESC_ISA207_HTM_VSX: -+ return tdesc_powerpc_isa207_htm_vsx64l; - #else - case PPC_TDESC_BASE: - return tdesc_powerpc_32l; -@@ -214,6 +216,8 @@ get_ipa_tdesc (int idx) - return tdesc_powerpc_isa205_ppr_dscr_vsx32l; - case PPC_TDESC_ISA207_VSX: - return tdesc_powerpc_isa207_vsx32l; -+ case PPC_TDESC_ISA207_HTM_VSX: -+ return tdesc_powerpc_isa207_htm_vsx32l; - case PPC_TDESC_E500: - return tdesc_powerpc_e500l; - #endif -@@ -244,6 +248,7 @@ initialize_low_tracepoint (void) - init_registers_powerpc_isa205_vsx64l (); - init_registers_powerpc_isa205_ppr_dscr_vsx64l (); - init_registers_powerpc_isa207_vsx64l (); -+ init_registers_powerpc_isa207_htm_vsx64l (); - #else - init_registers_powerpc_32l (); - init_registers_powerpc_altivec32l (); -@@ -254,6 +259,7 @@ initialize_low_tracepoint (void) - init_registers_powerpc_isa205_vsx32l (); - init_registers_powerpc_isa205_ppr_dscr_vsx32l (); - init_registers_powerpc_isa207_vsx32l (); -+ init_registers_powerpc_isa207_htm_vsx32l (); - init_registers_powerpc_e500l (); - #endif - } -diff --git a/gdb/gdbserver/linux-ppc-low.c b/gdb/gdbserver/linux-ppc-low.c ---- a/gdb/gdbserver/linux-ppc-low.c -+++ b/gdb/gdbserver/linux-ppc-low.c -@@ -600,6 +600,158 @@ ppc_store_pmuregset (struct regcache *regcache, const void *buf) - supply_register_by_name (regcache, "mmcr0", ®set[32]); - } - -+/* Hardware Transactional Memory special-purpose register regset fill -+ function. */ -+ -+static void -+ppc_fill_tm_sprregset (struct regcache *regcache, void *buf) -+{ -+ int i, base; -+ char *regset = (char *) buf; -+ -+ base = find_regno (regcache->tdesc, "tfhar"); -+ for (i = 0; i < 3; i++) -+ collect_register (regcache, base + i, ®set[i * 8]); -+} -+ -+/* Hardware Transactional Memory special-purpose register regset store -+ function. */ -+ -+static void -+ppc_store_tm_sprregset (struct regcache *regcache, const void *buf) -+{ -+ int i, base; -+ const char *regset = (const char *) buf; -+ -+ base = find_regno (regcache->tdesc, "tfhar"); -+ for (i = 0; i < 3; i++) -+ supply_register (regcache, base + i, ®set[i * 8]); -+} -+ -+/* For the same reasons as the EBB regset, none of the HTM -+ checkpointed regsets have a fill function. These registers are -+ only available if the inferior is in a transaction. */ -+ -+/* Hardware Transactional Memory checkpointed general-purpose regset -+ store function. */ -+ -+static void -+ppc_store_tm_cgprregset (struct regcache *regcache, const void *buf) -+{ -+ int i, base, size, endian_offset; -+ const char *regset = (const char *) buf; -+ -+ base = find_regno (regcache->tdesc, "cr0"); -+ size = register_size (regcache->tdesc, base); -+ -+ gdb_assert (size == 4 || size == 8); -+ -+ for (i = 0; i < 32; i++) -+ supply_register (regcache, base + i, ®set[i * size]); -+ -+ endian_offset = 0; -+ -+ if ((size == 8) && (__BYTE_ORDER == __BIG_ENDIAN)) -+ endian_offset = 4; -+ -+ supply_register_by_name (regcache, "ccr", -+ ®set[PT_CCR * size + endian_offset]); -+ -+ supply_register_by_name (regcache, "cxer", -+ ®set[PT_XER * size + endian_offset]); -+ -+ supply_register_by_name (regcache, "clr", ®set[PT_LNK * size]); -+ supply_register_by_name (regcache, "cctr", ®set[PT_CTR * size]); -+} -+ -+/* Hardware Transactional Memory checkpointed floating-point regset -+ store function. */ -+ -+static void -+ppc_store_tm_cfprregset (struct regcache *regcache, const void *buf) -+{ -+ int i, base; -+ const char *regset = (const char *) buf; -+ -+ base = find_regno (regcache->tdesc, "cf0"); -+ -+ for (i = 0; i < 32; i++) -+ supply_register (regcache, base + i, ®set[i * 8]); -+ -+ supply_register_by_name (regcache, "cfpscr", ®set[32 * 8]); -+} -+ -+/* Hardware Transactional Memory checkpointed vector regset store -+ function. */ -+ -+static void -+ppc_store_tm_cvrregset (struct regcache *regcache, const void *buf) -+{ -+ int i, base; -+ const char *regset = (const char *) buf; -+ int vscr_offset = 0; -+ -+ base = find_regno (regcache->tdesc, "cvr0"); -+ -+ for (i = 0; i < 32; i++) -+ supply_register (regcache, base + i, ®set[i * 16]); -+ -+ if (__BYTE_ORDER == __BIG_ENDIAN) -+ vscr_offset = 12; -+ -+ supply_register_by_name (regcache, "cvscr", -+ ®set[32 * 16 + vscr_offset]); -+ -+ supply_register_by_name (regcache, "cvrsave", ®set[33 * 16]); -+} -+ -+/* Hardware Transactional Memory checkpointed vector-scalar regset -+ store function. */ -+ -+static void -+ppc_store_tm_cvsxregset (struct regcache *regcache, const void *buf) -+{ -+ int i, base; -+ const char *regset = (const char *) buf; -+ -+ base = find_regno (regcache->tdesc, "cvs0h"); -+ for (i = 0; i < 32; i++) -+ supply_register (regcache, base + i, ®set[i * 8]); -+} -+ -+/* Hardware Transactional Memory checkpointed Program Priority -+ Register regset store function. */ -+ -+static void -+ppc_store_tm_cpprregset (struct regcache *regcache, const void *buf) -+{ -+ const char *cppr = (const char *) buf; -+ -+ supply_register_by_name (regcache, "cppr", cppr); -+} -+ -+/* Hardware Transactional Memory checkpointed Data Stream Control -+ Register regset store function. */ -+ -+static void -+ppc_store_tm_cdscrregset (struct regcache *regcache, const void *buf) -+{ -+ const char *cdscr = (const char *) buf; -+ -+ supply_register_by_name (regcache, "cdscr", cdscr); -+} -+ -+/* Hardware Transactional Memory checkpointed Target Address Register -+ regset store function. */ -+ -+static void -+ppc_store_tm_ctarregset (struct regcache *regcache, const void *buf) -+{ -+ const char *ctar = (const char *) buf; -+ -+ supply_register_by_name (regcache, "ctar", ctar); -+} -+ - static void - ppc_fill_vsxregset (struct regcache *regcache, void *buf) - { -@@ -709,6 +861,22 @@ static struct regset_info ppc_regsets[] = { - fetch them every time, but still fall back to PTRACE_PEEKUSER for the - general registers. Some kernels support these, but not the newer - PPC_PTRACE_GETREGS. */ -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CTAR, 0, EXTENDED_REGS, -+ NULL, ppc_store_tm_ctarregset }, -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CDSCR, 0, EXTENDED_REGS, -+ NULL, ppc_store_tm_cdscrregset }, -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CPPR, 0, EXTENDED_REGS, -+ NULL, ppc_store_tm_cpprregset }, -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CVSX, 0, EXTENDED_REGS, -+ NULL, ppc_store_tm_cvsxregset }, -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CVMX, 0, EXTENDED_REGS, -+ NULL, ppc_store_tm_cvrregset }, -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CFPR, 0, EXTENDED_REGS, -+ NULL, ppc_store_tm_cfprregset }, -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_CGPR, 0, EXTENDED_REGS, -+ NULL, ppc_store_tm_cgprregset }, -+ { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_TM_SPR, 0, EXTENDED_REGS, -+ ppc_fill_tm_sprregset, ppc_store_tm_sprregset }, - { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_EBB, 0, EXTENDED_REGS, - NULL, ppc_store_ebbregset }, - { PTRACE_GETREGSET, PTRACE_SETREGSET, NT_PPC_PMU, 0, EXTENDED_REGS, -@@ -800,7 +968,13 @@ ppc_arch_setup (void) - PPC_LINUX_SIZEOF_EBBREGSET) - && ppc_check_regset (tid, NT_PPC_PMU, - PPC_LINUX_SIZEOF_PMUREGSET)) -- features.isa207 = true; -+ { -+ features.isa207 = true; -+ if ((ppc_hwcap2 & PPC_FEATURE2_HTM) -+ && ppc_check_regset (tid, NT_PPC_TM_SPR, -+ PPC_LINUX_SIZEOF_TM_SPRREGSET)) -+ features.htm = true; -+ } - } - - if (ppc_hwcap & PPC_FEATURE_CELL) -@@ -870,6 +1044,42 @@ ppc_arch_setup (void) - regset->size = (features.isa207 ? - PPC_LINUX_SIZEOF_PMUREGSET : 0); - break; -+ case NT_PPC_TM_SPR: -+ regset->size = (features.htm ? -+ PPC_LINUX_SIZEOF_TM_SPRREGSET : 0); -+ break; -+ case NT_PPC_TM_CGPR: -+ if (features.wordsize == 4) -+ regset->size = (features.htm ? -+ PPC32_LINUX_SIZEOF_CGPRREGSET : 0); -+ else -+ regset->size = (features.htm ? -+ PPC64_LINUX_SIZEOF_CGPRREGSET : 0); -+ break; -+ case NT_PPC_TM_CFPR: -+ regset->size = (features.htm ? -+ PPC_LINUX_SIZEOF_CFPRREGSET : 0); -+ break; -+ case NT_PPC_TM_CVMX: -+ regset->size = (features.htm ? -+ PPC_LINUX_SIZEOF_CVMXREGSET : 0); -+ break; -+ case NT_PPC_TM_CVSX: -+ regset->size = (features.htm ? -+ PPC_LINUX_SIZEOF_CVSXREGSET : 0); -+ break; -+ case NT_PPC_TM_CPPR: -+ regset->size = (features.htm ? -+ PPC_LINUX_SIZEOF_CPPRREGSET : 0); -+ break; -+ case NT_PPC_TM_CDSCR: -+ regset->size = (features.htm ? -+ PPC_LINUX_SIZEOF_CDSCRREGSET : 0); -+ break; -+ case NT_PPC_TM_CTAR: -+ regset->size = (features.htm ? -+ PPC_LINUX_SIZEOF_CTARREGSET : 0); -+ break; - default: - break; - } -@@ -3253,6 +3463,8 @@ ppc_get_ipa_tdesc_idx (void) - return PPC_TDESC_ISA205_PPR_DSCR_VSX; - if (tdesc == tdesc_powerpc_isa207_vsx64l) - return PPC_TDESC_ISA207_VSX; -+ if (tdesc == tdesc_powerpc_isa207_htm_vsx64l) -+ return PPC_TDESC_ISA207_HTM_VSX; - #endif - - if (tdesc == tdesc_powerpc_32l) -@@ -3273,6 +3485,8 @@ ppc_get_ipa_tdesc_idx (void) - return PPC_TDESC_ISA205_PPR_DSCR_VSX; - if (tdesc == tdesc_powerpc_isa207_vsx32l) - return PPC_TDESC_ISA207_VSX; -+ if (tdesc == tdesc_powerpc_isa207_htm_vsx32l) -+ return PPC_TDESC_ISA207_HTM_VSX; - if (tdesc == tdesc_powerpc_e500l) - return PPC_TDESC_E500; - -@@ -3333,6 +3547,7 @@ initialize_low_arch (void) - init_registers_powerpc_isa205_vsx32l (); - init_registers_powerpc_isa205_ppr_dscr_vsx32l (); - init_registers_powerpc_isa207_vsx32l (); -+ init_registers_powerpc_isa207_htm_vsx32l (); - init_registers_powerpc_e500l (); - #if __powerpc64__ - init_registers_powerpc_64l (); -@@ -3344,6 +3559,7 @@ initialize_low_arch (void) - init_registers_powerpc_isa205_vsx64l (); - init_registers_powerpc_isa205_ppr_dscr_vsx64l (); - init_registers_powerpc_isa207_vsx64l (); -+ init_registers_powerpc_isa207_htm_vsx64l (); - #endif - - initialize_regsets_info (&ppc_regsets_info); -diff --git a/gdb/gdbserver/linux-ppc-tdesc-init.h b/gdb/gdbserver/linux-ppc-tdesc-init.h ---- a/gdb/gdbserver/linux-ppc-tdesc-init.h -+++ b/gdb/gdbserver/linux-ppc-tdesc-init.h -@@ -31,6 +31,7 @@ enum ppc_linux_tdesc { - PPC_TDESC_ISA205_VSX, - PPC_TDESC_ISA205_PPR_DSCR_VSX, - PPC_TDESC_ISA207_VSX, -+ PPC_TDESC_ISA207_HTM_VSX, - PPC_TDESC_E500, - }; - -@@ -63,6 +64,9 @@ void init_registers_powerpc_isa205_ppr_dscr_vsx32l (void); - /* Defined in auto-generated file powerpc-isa207-vsx32l.c. */ - void init_registers_powerpc_isa207_vsx32l (void); - -+/* Defined in auto-generated file powerpc-isa207-htm-vsx32l.c. */ -+void init_registers_powerpc_isa207_htm_vsx32l (void); -+ - /* Defined in auto-generated file powerpc-e500l.c. */ - void init_registers_powerpc_e500l (void); - -@@ -97,4 +101,7 @@ void init_registers_powerpc_isa205_ppr_dscr_vsx64l (void); - /* Defined in auto-generated file powerpc-isa207-vsx64l.c. */ - void init_registers_powerpc_isa207_vsx64l (void); - -+/* Defined in auto-generated file powerpc-isa207-htm-vsx64l.c. */ -+void init_registers_powerpc_isa207_htm_vsx64l (void); -+ - #endif -diff --git a/gdb/nat/ppc-linux.h b/gdb/nat/ppc-linux.h ---- a/gdb/nat/ppc-linux.h -+++ b/gdb/nat/ppc-linux.h -@@ -63,6 +63,9 @@ - #ifndef PPC_FEATURE2_EBB - #define PPC_FEATURE2_EBB 0x10000000 - #endif -+#ifndef PPC_FEATURE2_HTM -+#define PPC_FEATURE2_HTM 0x40000000 -+#endif - - /* Glibc's headers don't define PTRACE_GETVRREGS so we cannot use a - configure time check. Some older glibc's (for instance 2.2.1) -@@ -119,6 +122,46 @@ - #define NT_PPC_PMU 0x107 - #endif - -+/* TM checkpointed GPR Registers. */ -+#ifndef NT_PPC_TM_CGPR -+#define NT_PPC_TM_CGPR 0x108 -+#endif -+ -+/* TM checkpointed FPR Registers. */ -+#ifndef NT_PPC_TM_CFPR -+#define NT_PPC_TM_CFPR 0x109 -+#endif -+ -+/* TM checkpointed VMX Registers. */ -+#ifndef NT_PPC_TM_CVMX -+#define NT_PPC_TM_CVMX 0x10a -+#endif -+ -+/* TM checkpointed VSX Registers. */ -+#ifndef NT_PPC_TM_CVSX -+#define NT_PPC_TM_CVSX 0x10b -+#endif -+ -+/* TM Special Purpose Registers. */ -+#ifndef NT_PPC_TM_SPR -+#define NT_PPC_TM_SPR 0x10c -+#endif -+ -+/* TM checkpointed Target Address Register. */ -+#ifndef NT_PPC_TM_CTAR -+#define NT_PPC_TM_CTAR 0x10d -+#endif -+ -+/* TM checkpointed Program Priority Register. */ -+#ifndef NT_PPC_TM_CPPR -+#define NT_PPC_TM_CPPR 0x10e -+#endif -+ -+/* TM checkpointed Data Stream Control Register. */ -+#ifndef NT_PPC_TM_CDSCR -+#define NT_PPC_TM_CDSCR 0x10f -+#endif -+ - /* Return the wordsize of the target, either 4 or 8 bytes. */ - int ppc_linux_target_wordsize (int tid); - -diff --git a/gdb/ppc-linux-nat.c b/gdb/ppc-linux-nat.c ---- a/gdb/ppc-linux-nat.c -+++ b/gdb/ppc-linux-nat.c -@@ -685,6 +685,82 @@ fetch_register (struct regcache *regcache, int tid, int regno) - &ppc32_linux_pmuregset); - return; - } -+ else if (PPC_IS_TMSPR_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_htm_spr); -+ -+ fetch_regset (regcache, tid, NT_PPC_TM_SPR, -+ PPC_LINUX_SIZEOF_TM_SPRREGSET, -+ &ppc32_linux_tm_sprregset); -+ return; -+ } -+ else if (PPC_IS_CKPTGP_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_htm_core); -+ -+ const struct regset *cgprregset = ppc_linux_cgprregset (gdbarch); -+ fetch_regset (regcache, tid, NT_PPC_TM_CGPR, -+ (tdep->wordsize == 4? -+ PPC32_LINUX_SIZEOF_CGPRREGSET -+ : PPC64_LINUX_SIZEOF_CGPRREGSET), -+ cgprregset); -+ return; -+ } -+ else if (PPC_IS_CKPTFP_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_htm_fpu); -+ -+ fetch_regset (regcache, tid, NT_PPC_TM_CFPR, -+ PPC_LINUX_SIZEOF_CFPRREGSET, -+ &ppc32_linux_cfprregset); -+ return; -+ } -+ else if (PPC_IS_CKPTVMX_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_htm_altivec); -+ -+ const struct regset *cvmxregset = ppc_linux_cvmxregset (gdbarch); -+ fetch_regset (regcache, tid, NT_PPC_TM_CVMX, -+ PPC_LINUX_SIZEOF_CVMXREGSET, -+ cvmxregset); -+ return; -+ } -+ else if (PPC_IS_CKPTVSX_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_htm_vsx); -+ -+ fetch_regset (regcache, tid, NT_PPC_TM_CVSX, -+ PPC_LINUX_SIZEOF_CVSXREGSET, -+ &ppc32_linux_cvsxregset); -+ return; -+ } -+ else if (regno == PPC_CPPR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_cppr_regnum != -1); -+ -+ fetch_regset (regcache, tid, NT_PPC_TM_CPPR, -+ PPC_LINUX_SIZEOF_CPPRREGSET, -+ &ppc32_linux_cpprregset); -+ return; -+ } -+ else if (regno == PPC_CDSCR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_cdscr_regnum != -1); -+ -+ fetch_regset (regcache, tid, NT_PPC_TM_CDSCR, -+ PPC_LINUX_SIZEOF_CDSCRREGSET, -+ &ppc32_linux_cdscrregset); -+ return; -+ } -+ else if (regno == PPC_CTAR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_ctar_regnum != -1); -+ -+ fetch_regset (regcache, tid, NT_PPC_TM_CTAR, -+ PPC_LINUX_SIZEOF_CTARREGSET, -+ &ppc32_linux_ctarregset); -+ return; -+ } - - if (regaddr == -1) - { -@@ -901,6 +977,46 @@ fetch_ppc_registers (struct regcache *regcache, int tid) - fetch_regset (regcache, tid, NT_PPC_PMU, - PPC_LINUX_SIZEOF_PMUREGSET, - &ppc32_linux_pmuregset); -+ if (tdep->have_htm_spr) -+ fetch_regset (regcache, tid, NT_PPC_TM_SPR, -+ PPC_LINUX_SIZEOF_TM_SPRREGSET, -+ &ppc32_linux_tm_sprregset); -+ if (tdep->have_htm_core) -+ { -+ const struct regset *cgprregset = ppc_linux_cgprregset (gdbarch); -+ fetch_regset (regcache, tid, NT_PPC_TM_CGPR, -+ (tdep->wordsize == 4? -+ PPC32_LINUX_SIZEOF_CGPRREGSET -+ : PPC64_LINUX_SIZEOF_CGPRREGSET), -+ cgprregset); -+ } -+ if (tdep->have_htm_fpu) -+ fetch_regset (regcache, tid, NT_PPC_TM_CFPR, -+ PPC_LINUX_SIZEOF_CFPRREGSET, -+ &ppc32_linux_cfprregset); -+ if (tdep->have_htm_altivec) -+ { -+ const struct regset *cvmxregset = ppc_linux_cvmxregset (gdbarch); -+ fetch_regset (regcache, tid, NT_PPC_TM_CVMX, -+ PPC_LINUX_SIZEOF_CVMXREGSET, -+ cvmxregset); -+ } -+ if (tdep->have_htm_vsx) -+ fetch_regset (regcache, tid, NT_PPC_TM_CVSX, -+ PPC_LINUX_SIZEOF_CVSXREGSET, -+ &ppc32_linux_cvsxregset); -+ if (tdep->ppc_cppr_regnum != -1) -+ fetch_regset (regcache, tid, NT_PPC_TM_CPPR, -+ PPC_LINUX_SIZEOF_CPPRREGSET, -+ &ppc32_linux_cpprregset); -+ if (tdep->ppc_cdscr_regnum != -1) -+ fetch_regset (regcache, tid, NT_PPC_TM_CDSCR, -+ PPC_LINUX_SIZEOF_CDSCRREGSET, -+ &ppc32_linux_cdscrregset); -+ if (tdep->ppc_ctar_regnum != -1) -+ fetch_regset (regcache, tid, NT_PPC_TM_CTAR, -+ PPC_LINUX_SIZEOF_CTARREGSET, -+ &ppc32_linux_ctarregset); - } - - /* Fetch registers from the child process. Fetch all registers if -@@ -1126,6 +1242,82 @@ store_register (const struct regcache *regcache, int tid, int regno) - &ppc32_linux_pmuregset); - return; - } -+ else if (PPC_IS_TMSPR_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_htm_spr); -+ -+ store_regset (regcache, tid, regno, NT_PPC_TM_SPR, -+ PPC_LINUX_SIZEOF_TM_SPRREGSET, -+ &ppc32_linux_tm_sprregset); -+ return; -+ } -+ else if (PPC_IS_CKPTGP_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_htm_core); -+ -+ const struct regset *cgprregset = ppc_linux_cgprregset (gdbarch); -+ store_regset (regcache, tid, regno, NT_PPC_TM_CGPR, -+ (tdep->wordsize == 4? -+ PPC32_LINUX_SIZEOF_CGPRREGSET -+ : PPC64_LINUX_SIZEOF_CGPRREGSET), -+ cgprregset); -+ return; -+ } -+ else if (PPC_IS_CKPTFP_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_htm_fpu); -+ -+ store_regset (regcache, tid, regno, NT_PPC_TM_CFPR, -+ PPC_LINUX_SIZEOF_CFPRREGSET, -+ &ppc32_linux_cfprregset); -+ return; -+ } -+ else if (PPC_IS_CKPTVMX_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_htm_altivec); -+ -+ const struct regset *cvmxregset = ppc_linux_cvmxregset (gdbarch); -+ store_regset (regcache, tid, regno, NT_PPC_TM_CVMX, -+ PPC_LINUX_SIZEOF_CVMXREGSET, -+ cvmxregset); -+ return; -+ } -+ else if (PPC_IS_CKPTVSX_REGNUM (regno)) -+ { -+ gdb_assert (tdep->have_htm_vsx); -+ -+ store_regset (regcache, tid, regno, NT_PPC_TM_CVSX, -+ PPC_LINUX_SIZEOF_CVSXREGSET, -+ &ppc32_linux_cvsxregset); -+ return; -+ } -+ else if (regno == PPC_CPPR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_cppr_regnum != -1); -+ -+ store_regset (regcache, tid, regno, NT_PPC_TM_CPPR, -+ PPC_LINUX_SIZEOF_CPPRREGSET, -+ &ppc32_linux_cpprregset); -+ return; -+ } -+ else if (regno == PPC_CDSCR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_cdscr_regnum != -1); -+ -+ store_regset (regcache, tid, regno, NT_PPC_TM_CDSCR, -+ PPC_LINUX_SIZEOF_CDSCRREGSET, -+ &ppc32_linux_cdscrregset); -+ return; -+ } -+ else if (regno == PPC_CTAR_REGNUM) -+ { -+ gdb_assert (tdep->ppc_ctar_regnum != -1); -+ -+ store_regset (regcache, tid, regno, NT_PPC_TM_CTAR, -+ PPC_LINUX_SIZEOF_CTARREGSET, -+ &ppc32_linux_ctarregset); -+ return; -+ } - - if (regaddr == -1) - return; -@@ -1358,9 +1550,14 @@ store_ppc_registers (const struct regcache *regcache, int tid) - PPC_LINUX_SIZEOF_PMUREGSET, - &ppc32_linux_pmuregset); - -- /* Because the EBB registers can be unavailable, attempts to store -- them here would cause this function to fail most of the time, so -- we ignore them. */ -+ if (tdep->have_htm_spr) -+ store_regset (regcache, tid, -1, NT_PPC_TM_SPR, -+ PPC_LINUX_SIZEOF_TM_SPRREGSET, -+ &ppc32_linux_tm_sprregset); -+ -+ /* Because the EBB and checkpointed HTM registers can be -+ unavailable, attempts to store them here would cause this -+ function to fail most of the time, so we ignore them. */ - } - - /* Fetch the AT_HWCAP entry from the aux vector. */ -@@ -2496,7 +2693,13 @@ ppc_linux_nat_target::read_description () - && check_regset (tid, NT_PPC_TAR, PPC_LINUX_SIZEOF_TARREGSET) - && check_regset (tid, NT_PPC_EBB, PPC_LINUX_SIZEOF_EBBREGSET) - && check_regset (tid, NT_PPC_PMU, PPC_LINUX_SIZEOF_PMUREGSET)) -- features.isa207 = true; -+ { -+ features.isa207 = true; -+ if ((hwcap2 & PPC_FEATURE2_HTM) -+ && check_regset (tid, NT_PPC_TM_SPR, -+ PPC_LINUX_SIZEOF_TM_SPRREGSET)) -+ features.htm = true; -+ } - } - - return ppc_linux_match_description (features); -diff --git a/gdb/ppc-linux-tdep.c b/gdb/ppc-linux-tdep.c ---- a/gdb/ppc-linux-tdep.c -+++ b/gdb/ppc-linux-tdep.c -@@ -73,6 +73,7 @@ - #include "features/rs6000/powerpc-isa205-vsx32l.c" - #include "features/rs6000/powerpc-isa205-ppr-dscr-vsx32l.c" - #include "features/rs6000/powerpc-isa207-vsx32l.c" -+#include "features/rs6000/powerpc-isa207-htm-vsx32l.c" - #include "features/rs6000/powerpc-64l.c" - #include "features/rs6000/powerpc-altivec64l.c" - #include "features/rs6000/powerpc-cell64l.c" -@@ -82,6 +83,7 @@ - #include "features/rs6000/powerpc-isa205-vsx64l.c" - #include "features/rs6000/powerpc-isa205-ppr-dscr-vsx64l.c" - #include "features/rs6000/powerpc-isa207-vsx64l.c" -+#include "features/rs6000/powerpc-isa207-htm-vsx64l.c" - #include "features/rs6000/powerpc-e500l.c" - - /* Shared library operations for PowerPC-Linux. */ -@@ -637,6 +639,239 @@ const struct regset ppc32_linux_pmuregset = { - regcache_collect_regset - }; - -+/* Hardware Transactional Memory special-purpose register regmap. */ -+ -+static const struct regcache_map_entry ppc32_regmap_tm_spr[] = -+ { -+ { 1, PPC_TFHAR_REGNUM, 8 }, -+ { 1, PPC_TEXASR_REGNUM, 8 }, -+ { 1, PPC_TFIAR_REGNUM, 8 }, -+ { 0 } -+ }; -+ -+/* Hardware Transactional Memory special-purpose register regset. */ -+ -+const struct regset ppc32_linux_tm_sprregset = { -+ ppc32_regmap_tm_spr, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ -+/* Regmaps for the Hardware Transactional Memory checkpointed -+ general-purpose regsets for 32-bit, 64-bit big-endian, and 64-bit -+ little endian targets. The ptrace and core file buffers for 64-bit -+ targets use 8-byte fields for the 4-byte registers, and the -+ position of the register in the fields depends on the endianess. -+ The 32-bit regmap is the same for both endian types because the -+ fields are all 4-byte long. -+ -+ The layout of checkpointed GPR regset is the same as a regular -+ struct pt_regs, but we skip all registers that are not actually -+ checkpointed by the processor (e.g. msr, nip), except when -+ generating a core file. The 64-bit regset is 48 * 8 bytes long. -+ In some 64-bit kernels, the regset for a 32-bit inferior has the -+ same length, but all the registers are squeezed in the first half -+ (48 * 4 bytes). The pt_regs struct calls the regular cr ccr, but -+ we use ccr for "checkpointed condition register". Note that CR -+ (condition register) field 0 is not checkpointed, but the kernel -+ returns all 4 bytes. The skipped registers should not be touched -+ when writing the regset to the inferior (with -+ PTRACE_SETREGSET). */ -+ -+static const struct regcache_map_entry ppc32_regmap_cgpr[] = -+ { -+ { 32, PPC_CR0_REGNUM, 4 }, -+ { 3, REGCACHE_MAP_SKIP, 4 }, /* nip, msr, orig_gpr3. */ -+ { 1, PPC_CCTR_REGNUM, 4 }, -+ { 1, PPC_CLR_REGNUM, 4 }, -+ { 1, PPC_CXER_REGNUM, 4 }, -+ { 1, PPC_CCR_REGNUM, 4 }, -+ { 9, REGCACHE_MAP_SKIP, 4 }, /* All the rest. */ -+ { 0 } -+ }; -+ -+static const struct regcache_map_entry ppc64_le_regmap_cgpr[] = -+ { -+ { 32, PPC_CR0_REGNUM, 8 }, -+ { 3, REGCACHE_MAP_SKIP, 8 }, -+ { 1, PPC_CCTR_REGNUM, 8 }, -+ { 1, PPC_CLR_REGNUM, 8 }, -+ { 1, PPC_CXER_REGNUM, 4 }, -+ { 1, REGCACHE_MAP_SKIP, 4 }, /* CXER padding. */ -+ { 1, PPC_CCR_REGNUM, 4 }, -+ { 1, REGCACHE_MAP_SKIP, 4}, /* CCR padding. */ -+ { 9, REGCACHE_MAP_SKIP, 8}, -+ { 0 } -+ }; -+ -+static const struct regcache_map_entry ppc64_be_regmap_cgpr[] = -+ { -+ { 32, PPC_CR0_REGNUM, 8 }, -+ { 3, REGCACHE_MAP_SKIP, 8 }, -+ { 1, PPC_CCTR_REGNUM, 8 }, -+ { 1, PPC_CLR_REGNUM, 8 }, -+ { 1, REGCACHE_MAP_SKIP, 4}, /* CXER padding. */ -+ { 1, PPC_CXER_REGNUM, 4 }, -+ { 1, REGCACHE_MAP_SKIP, 4}, /* CCR padding. */ -+ { 1, PPC_CCR_REGNUM, 4 }, -+ { 9, REGCACHE_MAP_SKIP, 8}, -+ { 0 } -+ }; -+ -+/* Regsets for the Hardware Transactional Memory checkpointed -+ general-purpose registers for 32-bit, 64-bit big-endian, and 64-bit -+ little endian targets. -+ -+ Some 64-bit kernels generate a checkpointed gpr note section with -+ 48*8 bytes for a 32-bit thread, of which only 48*4 are actually -+ used, so we set the variable size flag in the corresponding regset -+ to accept this case. */ -+ -+static const struct regset ppc32_linux_cgprregset = { -+ ppc32_regmap_cgpr, -+ regcache_supply_regset, -+ regcache_collect_regset, -+ REGSET_VARIABLE_SIZE -+}; -+ -+static const struct regset ppc64_be_linux_cgprregset = { -+ ppc64_be_regmap_cgpr, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ -+static const struct regset ppc64_le_linux_cgprregset = { -+ ppc64_le_regmap_cgpr, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ -+/* Hardware Transactional Memory checkpointed floating-point regmap. */ -+ -+static const struct regcache_map_entry ppc32_regmap_cfpr[] = -+ { -+ { 32, PPC_CF0_REGNUM, 8 }, -+ { 1, PPC_CFPSCR_REGNUM, 8 }, -+ { 0 } -+ }; -+ -+/* Hardware Transactional Memory checkpointed floating-point regset. */ -+ -+const struct regset ppc32_linux_cfprregset = { -+ ppc32_regmap_cfpr, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ -+/* Regmaps for the Hardware Transactional Memory checkpointed vector -+ regsets, for big and little endian targets. The position of the -+ 4-byte VSCR in its 16-byte field depends on the endianess. */ -+ -+static const struct regcache_map_entry ppc32_le_regmap_cvmx[] = -+ { -+ { 32, PPC_CVR0_REGNUM, 16 }, -+ { 1, PPC_CVSCR_REGNUM, 4 }, -+ { 1, REGCACHE_MAP_SKIP, 12 }, -+ { 1, PPC_CVRSAVE_REGNUM, 4 }, -+ { 1, REGCACHE_MAP_SKIP, 12 }, -+ { 0 } -+ }; -+ -+static const struct regcache_map_entry ppc32_be_regmap_cvmx[] = -+ { -+ { 32, PPC_CVR0_REGNUM, 16 }, -+ { 1, REGCACHE_MAP_SKIP, 12 }, -+ { 1, PPC_CVSCR_REGNUM, 4 }, -+ { 1, PPC_CVRSAVE_REGNUM, 4 }, -+ { 1, REGCACHE_MAP_SKIP, 12}, -+ { 0 } -+ }; -+ -+/* Hardware Transactional Memory checkpointed vector regsets, for little -+ and big endian targets. */ -+ -+static const struct regset ppc32_le_linux_cvmxregset = { -+ ppc32_le_regmap_cvmx, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ -+static const struct regset ppc32_be_linux_cvmxregset = { -+ ppc32_be_regmap_cvmx, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ -+/* Hardware Transactional Memory checkpointed vector-scalar regmap. */ -+ -+static const struct regcache_map_entry ppc32_regmap_cvsx[] = -+ { -+ { 32, PPC_CVSR0_UPPER_REGNUM, 8 }, -+ { 0 } -+ }; -+ -+/* Hardware Transactional Memory checkpointed vector-scalar regset. */ -+ -+const struct regset ppc32_linux_cvsxregset = { -+ ppc32_regmap_cvsx, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ -+/* Hardware Transactional Memory checkpointed Program Priority Register -+ regmap. */ -+ -+static const struct regcache_map_entry ppc32_regmap_cppr[] = -+ { -+ { 1, PPC_CPPR_REGNUM, 8 }, -+ { 0 } -+ }; -+ -+/* Hardware Transactional Memory checkpointed Program Priority Register -+ regset. */ -+ -+const struct regset ppc32_linux_cpprregset = { -+ ppc32_regmap_cppr, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ -+/* Hardware Transactional Memory checkpointed Data Stream Control -+ Register regmap. */ -+ -+static const struct regcache_map_entry ppc32_regmap_cdscr[] = -+ { -+ { 1, PPC_CDSCR_REGNUM, 8 }, -+ { 0 } -+ }; -+ -+/* Hardware Transactional Memory checkpointed Data Stream Control -+ Register regset. */ -+ -+const struct regset ppc32_linux_cdscrregset = { -+ ppc32_regmap_cdscr, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ -+/* Hardware Transactional Memory checkpointed Target Address Register -+ regmap. */ -+ -+static const struct regcache_map_entry ppc32_regmap_ctar[] = -+ { -+ { 1, PPC_CTAR_REGNUM, 8 }, -+ { 0 } -+ }; -+ -+/* Hardware Transactional Memory checkpointed Target Address Register -+ regset. */ -+ -+const struct regset ppc32_linux_ctarregset = { -+ ppc32_regmap_ctar, -+ regcache_supply_regset, -+ regcache_collect_regset -+}; -+ - const struct regset * - ppc_linux_gregset (int wordsize) - { -@@ -664,6 +899,88 @@ ppc_linux_vsxregset (void) - return &ppc32_linux_vsxregset; - } - -+const struct regset * -+ppc_linux_cgprregset (struct gdbarch *gdbarch) -+{ -+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -+ -+ if (tdep->wordsize == 4) -+ { -+ return &ppc32_linux_cgprregset; -+ } -+ else -+ { -+ if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) -+ return &ppc64_be_linux_cgprregset; -+ else -+ return &ppc64_le_linux_cgprregset; -+ } -+} -+ -+const struct regset * -+ppc_linux_cvmxregset (struct gdbarch *gdbarch) -+{ -+ if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) -+ return &ppc32_be_linux_cvmxregset; -+ else -+ return &ppc32_le_linux_cvmxregset; -+} -+ -+/* Collect function used to generate the core note for the -+ checkpointed GPR regset. Here, we don't want to skip the -+ "checkpointed" NIP and MSR, so that the note section we generate is -+ similar to the one generated by the kernel. To avoid having to -+ define additional registers in GDB which are not actually -+ checkpointed in the architecture, we copy TFHAR to the checkpointed -+ NIP slot, which is what the kernel does, and copy the regular MSR -+ to the checkpointed MSR slot, which will have a similar value in -+ most cases. */ -+ -+static void -+ppc_linux_collect_core_cpgrregset (const struct regset *regset, -+ const struct regcache *regcache, -+ int regnum, void *buf, size_t len) -+{ -+ struct gdbarch *gdbarch = regcache->arch (); -+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -+ -+ const struct regset *cgprregset = ppc_linux_cgprregset (gdbarch); -+ -+ /* We collect the checkpointed GPRs already defined in the regular -+ regmap, then overlay TFHAR/MSR on the checkpointed NIP/MSR -+ slots. */ -+ cgprregset->collect_regset (cgprregset, regcache, regnum, buf, len); -+ -+ /* Check that we are collecting all the registers, which should be -+ the case when generating a core file. */ -+ if (regnum != -1) -+ return; -+ -+ /* PT_NIP and PT_MSR are 32 and 33 for powerpc. Don't redefine -+ these symbols since this file can run on clients in other -+ architectures where they can already be defined to other -+ values. */ -+ int pt_offset = 32; -+ -+ /* Check that our buffer is long enough to hold two slots at -+ pt_offset * wordsize, one for NIP and one for MSR. */ -+ gdb_assert ((pt_offset + 2) * tdep->wordsize <= len); -+ -+ /* TFHAR is 8 bytes wide, but the NIP slot for a 32-bit thread is -+ 4-bytes long. We use raw_collect_integer which handles -+ differences in the sizes for the source and destination buffers -+ for both endian modes. */ -+ (regcache->raw_collect_integer -+ (PPC_TFHAR_REGNUM, ((gdb_byte *) buf) + pt_offset * tdep->wordsize, -+ tdep->wordsize, false)); -+ -+ pt_offset = 33; -+ -+ (regcache->raw_collect_integer -+ (PPC_MSR_REGNUM, ((gdb_byte *) buf) + pt_offset * tdep->wordsize, -+ tdep->wordsize, false)); -+} -+ - /* Iterate over supported core file register note sections. */ - - static void -@@ -728,6 +1045,121 @@ ppc_linux_iterate_over_regset_sections (struct gdbarch *gdbarch, - PPC_LINUX_SIZEOF_PMUREGSET, - &ppc32_linux_pmuregset, "Performance Monitor Registers", - cb_data); -+ -+ if (tdep->have_htm_spr) -+ cb (".reg-ppc-tm-spr", PPC_LINUX_SIZEOF_TM_SPRREGSET, -+ PPC_LINUX_SIZEOF_TM_SPRREGSET, -+ &ppc32_linux_tm_sprregset, -+ "Hardware Transactional Memory Special Purpose Registers", -+ cb_data); -+ -+ /* Checkpointed registers can be unavailable, don't call back if -+ we are generating a core file. */ -+ -+ if (tdep->have_htm_core) -+ { -+ /* Only generate the checkpointed GPR core note if we also have -+ access to the HTM SPRs, because we need TFHAR to fill the -+ "checkpointed" NIP slot. We can read a core file without it -+ since GDB is not aware of this NIP as a visible register. */ -+ if (regcache == NULL || -+ (REG_VALID == regcache->get_register_status (PPC_CR0_REGNUM) -+ && tdep->have_htm_spr)) -+ { -+ int cgpr_size = (tdep->wordsize == 4? -+ PPC32_LINUX_SIZEOF_CGPRREGSET -+ : PPC64_LINUX_SIZEOF_CGPRREGSET); -+ -+ const struct regset *cgprregset = -+ ppc_linux_cgprregset (gdbarch); -+ -+ if (regcache != NULL) -+ { -+ struct regset core_cgprregset = *cgprregset; -+ -+ core_cgprregset.collect_regset -+ = ppc_linux_collect_core_cpgrregset; -+ -+ cb (".reg-ppc-tm-cgpr", -+ cgpr_size, cgpr_size, -+ &core_cgprregset, -+ "Checkpointed General Purpose Registers", cb_data); -+ } -+ else -+ { -+ cb (".reg-ppc-tm-cgpr", -+ cgpr_size, cgpr_size, -+ cgprregset, -+ "Checkpointed General Purpose Registers", cb_data); -+ } -+ } -+ } -+ -+ if (tdep->have_htm_fpu) -+ { -+ if (regcache == NULL || -+ REG_VALID == regcache->get_register_status (PPC_CF0_REGNUM)) -+ cb (".reg-ppc-tm-cfpr", PPC_LINUX_SIZEOF_CFPRREGSET, -+ PPC_LINUX_SIZEOF_CFPRREGSET, -+ &ppc32_linux_cfprregset, -+ "Checkpointed Floating Point Registers", cb_data); -+ } -+ -+ if (tdep->have_htm_altivec) -+ { -+ if (regcache == NULL || -+ REG_VALID == regcache->get_register_status (PPC_CVR0_REGNUM)) -+ { -+ const struct regset *cvmxregset = -+ ppc_linux_cvmxregset (gdbarch); -+ -+ cb (".reg-ppc-tm-cvmx", PPC_LINUX_SIZEOF_CVMXREGSET, -+ PPC_LINUX_SIZEOF_CVMXREGSET, -+ cvmxregset, -+ "Checkpointed Altivec (VMX) Registers", cb_data); -+ } -+ } -+ -+ if (tdep->have_htm_vsx) -+ { -+ if (regcache == NULL || -+ (REG_VALID -+ == regcache->get_register_status (PPC_CVSR0_UPPER_REGNUM))) -+ cb (".reg-ppc-tm-cvsx", PPC_LINUX_SIZEOF_CVSXREGSET, -+ PPC_LINUX_SIZEOF_CVSXREGSET, -+ &ppc32_linux_cvsxregset, -+ "Checkpointed VSX Registers", cb_data); -+ } -+ -+ if (tdep->ppc_cppr_regnum != -1) -+ { -+ if (regcache == NULL || -+ REG_VALID == regcache->get_register_status (PPC_CPPR_REGNUM)) -+ cb (".reg-ppc-tm-cppr", PPC_LINUX_SIZEOF_CPPRREGSET, -+ PPC_LINUX_SIZEOF_CPPRREGSET, -+ &ppc32_linux_cpprregset, -+ "Checkpointed Priority Program Register", cb_data); -+ } -+ -+ if (tdep->ppc_cdscr_regnum != -1) -+ { -+ if (regcache == NULL || -+ REG_VALID == regcache->get_register_status (PPC_CDSCR_REGNUM)) -+ cb (".reg-ppc-tm-cdscr", PPC_LINUX_SIZEOF_CDSCRREGSET, -+ PPC_LINUX_SIZEOF_CDSCRREGSET, -+ &ppc32_linux_cdscrregset, -+ "Checkpointed Data Stream Control Register", cb_data); -+ } -+ -+ if (tdep->ppc_ctar_regnum) -+ { -+ if ( regcache == NULL || -+ REG_VALID == regcache->get_register_status (PPC_CTAR_REGNUM)) -+ cb (".reg-ppc-tm-ctar", PPC_LINUX_SIZEOF_CTARREGSET, -+ PPC_LINUX_SIZEOF_CTARREGSET, -+ &ppc32_linux_ctarregset, -+ "Checkpointed Target Address Register", cb_data); -+ } - } - - static void -@@ -1144,6 +1576,7 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch, - asection *dscr = bfd_get_section_by_name (abfd, ".reg-ppc-dscr"); - asection *tar = bfd_get_section_by_name (abfd, ".reg-ppc-tar"); - asection *pmu = bfd_get_section_by_name (abfd, ".reg-ppc-pmu"); -+ asection *htmspr = bfd_get_section_by_name (abfd, ".reg-ppc-tm-spr"); - - if (! section) - return NULL; -@@ -1185,7 +1618,11 @@ ppc_linux_core_read_description (struct gdbarch *gdbarch, - been unavailable when the core file was created. They will - be in the tdep but will show as unavailable. */ - if (tar && pmu) -- features.isa207 = true; -+ { -+ features.isa207 = true; -+ if (htmspr) -+ features.htm = true; -+ } - } - - return ppc_linux_match_description (features); -@@ -2063,6 +2500,7 @@ _initialize_ppc_linux_tdep (void) - initialize_tdesc_powerpc_isa205_vsx32l (); - initialize_tdesc_powerpc_isa205_ppr_dscr_vsx32l (); - initialize_tdesc_powerpc_isa207_vsx32l (); -+ initialize_tdesc_powerpc_isa207_htm_vsx32l (); - initialize_tdesc_powerpc_64l (); - initialize_tdesc_powerpc_altivec64l (); - initialize_tdesc_powerpc_cell64l (); -@@ -2072,5 +2510,6 @@ _initialize_ppc_linux_tdep (void) - initialize_tdesc_powerpc_isa205_vsx64l (); - initialize_tdesc_powerpc_isa205_ppr_dscr_vsx64l (); - initialize_tdesc_powerpc_isa207_vsx64l (); -+ initialize_tdesc_powerpc_isa207_htm_vsx64l (); - initialize_tdesc_powerpc_e500l (); - } -diff --git a/gdb/ppc-linux-tdep.h b/gdb/ppc-linux-tdep.h ---- a/gdb/ppc-linux-tdep.h -+++ b/gdb/ppc-linux-tdep.h -@@ -32,6 +32,14 @@ const struct regset *ppc_linux_fpregset (void); - const struct regset *ppc_linux_vrregset (struct gdbarch *gdbarch); - const struct regset *ppc_linux_vsxregset (void); - -+/* Get the checkpointed GPR regset that matches the target wordsize -+ and byteorder of GDBARCH. */ -+const struct regset *ppc_linux_cgprregset (struct gdbarch *gdbarch); -+ -+/* Get the checkpointed vector regset that matches the target byte -+ order. */ -+const struct regset* ppc_linux_cvmxregset (struct gdbarch *gdbarch); -+ - /* Extra register number constants. The Linux kernel stores a - "trap" code and the original value of r3 into special "registers"; - these need to be saved and restored when performing an inferior -@@ -50,5 +58,11 @@ extern const struct regset ppc32_linux_dscrregset; - extern const struct regset ppc32_linux_tarregset; - extern const struct regset ppc32_linux_ebbregset; - extern const struct regset ppc32_linux_pmuregset; -+extern const struct regset ppc32_linux_tm_sprregset; -+extern const struct regset ppc32_linux_cfprregset; -+extern const struct regset ppc32_linux_cvsxregset; -+extern const struct regset ppc32_linux_cpprregset; -+extern const struct regset ppc32_linux_cdscrregset; -+extern const struct regset ppc32_linux_ctarregset; - - #endif /* PPC_LINUX_TDEP_H */ -diff --git a/gdb/ppc-tdep.h b/gdb/ppc-tdep.h ---- a/gdb/ppc-tdep.h -+++ b/gdb/ppc-tdep.h -@@ -274,6 +274,21 @@ struct gdbarch_tdep - int ppc_sdar_regnum; - int ppc_sier_regnum; - -+ /* Hardware Transactional Memory registers. */ -+ int have_htm_spr; -+ int have_htm_core; -+ int have_htm_fpu; -+ int have_htm_altivec; -+ int have_htm_vsx; -+ int ppc_cppr_regnum; -+ int ppc_cdscr_regnum; -+ int ppc_ctar_regnum; -+ -+ /* HTM pseudo registers. */ -+ int ppc_cdl0_regnum; -+ int ppc_cvsr0_regnum; -+ int ppc_cefpr0_regnum; -+ - /* Offset to ABI specific location where link register is saved. */ - int lr_frame_offset; - -@@ -343,6 +358,29 @@ enum { - PPC_SDAR_REGNUM = 181, - PPC_SIER_REGNUM = 182, - -+ /* Hardware transactional memory registers. */ -+ PPC_TFHAR_REGNUM = 183, -+ PPC_TEXASR_REGNUM = 184, -+ PPC_TFIAR_REGNUM = 185, -+ -+ PPC_CR0_REGNUM = 186, -+ PPC_CCR_REGNUM = 218, -+ PPC_CXER_REGNUM = 219, -+ PPC_CLR_REGNUM = 220, -+ PPC_CCTR_REGNUM = 221, -+ -+ PPC_CF0_REGNUM = 222, -+ PPC_CFPSCR_REGNUM = 254, -+ -+ PPC_CVR0_REGNUM = 255, -+ PPC_CVSCR_REGNUM = 287, -+ PPC_CVRSAVE_REGNUM = 288, -+ -+ PPC_CVSR0_UPPER_REGNUM = 289, -+ -+ PPC_CPPR_REGNUM = 321, -+ PPC_CDSCR_REGNUM = 322, -+ PPC_CTAR_REGNUM = 323, - PPC_NUM_REGS - }; - -@@ -355,6 +393,21 @@ enum { - #define PPC_IS_PMU_REGNUM(i) \ - ((i) >= PPC_MMCR0_REGNUM && (i) <= PPC_SIER_REGNUM) - -+#define PPC_IS_TMSPR_REGNUM(i) \ -+ ((i) >= PPC_TFHAR_REGNUM && (i) <= PPC_TFIAR_REGNUM) -+ -+#define PPC_IS_CKPTGP_REGNUM(i) \ -+ ((i) >= PPC_CR0_REGNUM && (i) <= PPC_CCTR_REGNUM) -+ -+#define PPC_IS_CKPTFP_REGNUM(i) \ -+ ((i) >= PPC_CF0_REGNUM && (i) <= PPC_CFPSCR_REGNUM) -+ -+#define PPC_IS_CKPTVMX_REGNUM(i) \ -+ ((i) >= PPC_CVR0_REGNUM && (i) <= PPC_CVRSAVE_REGNUM) -+ -+#define PPC_IS_CKPTVSX_REGNUM(i) \ -+ ((i) >= PPC_CVSR0_UPPER_REGNUM && (i) < (PPC_CVSR0_UPPER_REGNUM + 32)) -+ - /* An instruction to match. */ - - struct ppc_insn_pattern -diff --git a/gdb/regformats/rs6000/powerpc-isa207-htm-vsx32l.dat b/gdb/regformats/rs6000/powerpc-isa207-htm-vsx32l.dat -new file mode 100644 ---- /dev/null -+++ b/gdb/regformats/rs6000/powerpc-isa207-htm-vsx32l.dat -@@ -0,0 +1,296 @@ -+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro: -+# Generated from: rs6000/powerpc-isa207-htm-vsx32l.xml -+name:powerpc_isa207_htm_vsx32l -+xmltarget:powerpc-isa207-htm-vsx32l.xml -+expedite:r1,pc -+32:r0 -+32:r1 -+32:r2 -+32:r3 -+32:r4 -+32:r5 -+32:r6 -+32:r7 -+32:r8 -+32:r9 -+32:r10 -+32:r11 -+32:r12 -+32:r13 -+32:r14 -+32:r15 -+32:r16 -+32:r17 -+32:r18 -+32:r19 -+32:r20 -+32:r21 -+32:r22 -+32:r23 -+32:r24 -+32:r25 -+32:r26 -+32:r27 -+32:r28 -+32:r29 -+32:r30 -+32:r31 -+64:f0 -+64:f1 -+64:f2 -+64:f3 -+64:f4 -+64:f5 -+64:f6 -+64:f7 -+64:f8 -+64:f9 -+64:f10 -+64:f11 -+64:f12 -+64:f13 -+64:f14 -+64:f15 -+64:f16 -+64:f17 -+64:f18 -+64:f19 -+64:f20 -+64:f21 -+64:f22 -+64:f23 -+64:f24 -+64:f25 -+64:f26 -+64:f27 -+64:f28 -+64:f29 -+64:f30 -+64:f31 -+32:pc -+32:msr -+32:cr -+32:lr -+32:ctr -+32:xer -+64:fpscr -+32:orig_r3 -+32:trap -+128:vr0 -+128:vr1 -+128:vr2 -+128:vr3 -+128:vr4 -+128:vr5 -+128:vr6 -+128:vr7 -+128:vr8 -+128:vr9 -+128:vr10 -+128:vr11 -+128:vr12 -+128:vr13 -+128:vr14 -+128:vr15 -+128:vr16 -+128:vr17 -+128:vr18 -+128:vr19 -+128:vr20 -+128:vr21 -+128:vr22 -+128:vr23 -+128:vr24 -+128:vr25 -+128:vr26 -+128:vr27 -+128:vr28 -+128:vr29 -+128:vr30 -+128:vr31 -+32:vscr -+32:vrsave -+64:vs0h -+64:vs1h -+64:vs2h -+64:vs3h -+64:vs4h -+64:vs5h -+64:vs6h -+64:vs7h -+64:vs8h -+64:vs9h -+64:vs10h -+64:vs11h -+64:vs12h -+64:vs13h -+64:vs14h -+64:vs15h -+64:vs16h -+64:vs17h -+64:vs18h -+64:vs19h -+64:vs20h -+64:vs21h -+64:vs22h -+64:vs23h -+64:vs24h -+64:vs25h -+64:vs26h -+64:vs27h -+64:vs28h -+64:vs29h -+64:vs30h -+64:vs31h -+64:ppr -+64:dscr -+64:tar -+64:bescr -+64:ebbhr -+64:ebbrr -+64:mmcr0 -+64:mmcr2 -+64:siar -+64:sdar -+64:sier -+64:tfhar -+64:texasr -+64:tfiar -+32:cr0 -+32:cr1 -+32:cr2 -+32:cr3 -+32:cr4 -+32:cr5 -+32:cr6 -+32:cr7 -+32:cr8 -+32:cr9 -+32:cr10 -+32:cr11 -+32:cr12 -+32:cr13 -+32:cr14 -+32:cr15 -+32:cr16 -+32:cr17 -+32:cr18 -+32:cr19 -+32:cr20 -+32:cr21 -+32:cr22 -+32:cr23 -+32:cr24 -+32:cr25 -+32:cr26 -+32:cr27 -+32:cr28 -+32:cr29 -+32:cr30 -+32:cr31 -+32:ccr -+32:cxer -+32:clr -+32:cctr -+64:cf0 -+64:cf1 -+64:cf2 -+64:cf3 -+64:cf4 -+64:cf5 -+64:cf6 -+64:cf7 -+64:cf8 -+64:cf9 -+64:cf10 -+64:cf11 -+64:cf12 -+64:cf13 -+64:cf14 -+64:cf15 -+64:cf16 -+64:cf17 -+64:cf18 -+64:cf19 -+64:cf20 -+64:cf21 -+64:cf22 -+64:cf23 -+64:cf24 -+64:cf25 -+64:cf26 -+64:cf27 -+64:cf28 -+64:cf29 -+64:cf30 -+64:cf31 -+64:cfpscr -+128:cvr0 -+128:cvr1 -+128:cvr2 -+128:cvr3 -+128:cvr4 -+128:cvr5 -+128:cvr6 -+128:cvr7 -+128:cvr8 -+128:cvr9 -+128:cvr10 -+128:cvr11 -+128:cvr12 -+128:cvr13 -+128:cvr14 -+128:cvr15 -+128:cvr16 -+128:cvr17 -+128:cvr18 -+128:cvr19 -+128:cvr20 -+128:cvr21 -+128:cvr22 -+128:cvr23 -+128:cvr24 -+128:cvr25 -+128:cvr26 -+128:cvr27 -+128:cvr28 -+128:cvr29 -+128:cvr30 -+128:cvr31 -+32:cvscr -+32:cvrsave -+64:cvs0h -+64:cvs1h -+64:cvs2h -+64:cvs3h -+64:cvs4h -+64:cvs5h -+64:cvs6h -+64:cvs7h -+64:cvs8h -+64:cvs9h -+64:cvs10h -+64:cvs11h -+64:cvs12h -+64:cvs13h -+64:cvs14h -+64:cvs15h -+64:cvs16h -+64:cvs17h -+64:cvs18h -+64:cvs19h -+64:cvs20h -+64:cvs21h -+64:cvs22h -+64:cvs23h -+64:cvs24h -+64:cvs25h -+64:cvs26h -+64:cvs27h -+64:cvs28h -+64:cvs29h -+64:cvs30h -+64:cvs31h -+64:cppr -+64:cdscr -+64:ctar -diff --git a/gdb/regformats/rs6000/powerpc-isa207-htm-vsx64l.dat b/gdb/regformats/rs6000/powerpc-isa207-htm-vsx64l.dat -new file mode 100644 ---- /dev/null -+++ b/gdb/regformats/rs6000/powerpc-isa207-htm-vsx64l.dat -@@ -0,0 +1,296 @@ -+# THIS FILE IS GENERATED. -*- buffer-read-only: t -*- vi :set ro: -+# Generated from: rs6000/powerpc-isa207-htm-vsx64l.xml -+name:powerpc_isa207_htm_vsx64l -+xmltarget:powerpc-isa207-htm-vsx64l.xml -+expedite:r1,pc -+64:r0 -+64:r1 -+64:r2 -+64:r3 -+64:r4 -+64:r5 -+64:r6 -+64:r7 -+64:r8 -+64:r9 -+64:r10 -+64:r11 -+64:r12 -+64:r13 -+64:r14 -+64:r15 -+64:r16 -+64:r17 -+64:r18 -+64:r19 -+64:r20 -+64:r21 -+64:r22 -+64:r23 -+64:r24 -+64:r25 -+64:r26 -+64:r27 -+64:r28 -+64:r29 -+64:r30 -+64:r31 -+64:f0 -+64:f1 -+64:f2 -+64:f3 -+64:f4 -+64:f5 -+64:f6 -+64:f7 -+64:f8 -+64:f9 -+64:f10 -+64:f11 -+64:f12 -+64:f13 -+64:f14 -+64:f15 -+64:f16 -+64:f17 -+64:f18 -+64:f19 -+64:f20 -+64:f21 -+64:f22 -+64:f23 -+64:f24 -+64:f25 -+64:f26 -+64:f27 -+64:f28 -+64:f29 -+64:f30 -+64:f31 -+64:pc -+64:msr -+32:cr -+64:lr -+64:ctr -+32:xer -+64:fpscr -+64:orig_r3 -+64:trap -+128:vr0 -+128:vr1 -+128:vr2 -+128:vr3 -+128:vr4 -+128:vr5 -+128:vr6 -+128:vr7 -+128:vr8 -+128:vr9 -+128:vr10 -+128:vr11 -+128:vr12 -+128:vr13 -+128:vr14 -+128:vr15 -+128:vr16 -+128:vr17 -+128:vr18 -+128:vr19 -+128:vr20 -+128:vr21 -+128:vr22 -+128:vr23 -+128:vr24 -+128:vr25 -+128:vr26 -+128:vr27 -+128:vr28 -+128:vr29 -+128:vr30 -+128:vr31 -+32:vscr -+32:vrsave -+64:vs0h -+64:vs1h -+64:vs2h -+64:vs3h -+64:vs4h -+64:vs5h -+64:vs6h -+64:vs7h -+64:vs8h -+64:vs9h -+64:vs10h -+64:vs11h -+64:vs12h -+64:vs13h -+64:vs14h -+64:vs15h -+64:vs16h -+64:vs17h -+64:vs18h -+64:vs19h -+64:vs20h -+64:vs21h -+64:vs22h -+64:vs23h -+64:vs24h -+64:vs25h -+64:vs26h -+64:vs27h -+64:vs28h -+64:vs29h -+64:vs30h -+64:vs31h -+64:ppr -+64:dscr -+64:tar -+64:bescr -+64:ebbhr -+64:ebbrr -+64:mmcr0 -+64:mmcr2 -+64:siar -+64:sdar -+64:sier -+64:tfhar -+64:texasr -+64:tfiar -+64:cr0 -+64:cr1 -+64:cr2 -+64:cr3 -+64:cr4 -+64:cr5 -+64:cr6 -+64:cr7 -+64:cr8 -+64:cr9 -+64:cr10 -+64:cr11 -+64:cr12 -+64:cr13 -+64:cr14 -+64:cr15 -+64:cr16 -+64:cr17 -+64:cr18 -+64:cr19 -+64:cr20 -+64:cr21 -+64:cr22 -+64:cr23 -+64:cr24 -+64:cr25 -+64:cr26 -+64:cr27 -+64:cr28 -+64:cr29 -+64:cr30 -+64:cr31 -+32:ccr -+32:cxer -+64:clr -+64:cctr -+64:cf0 -+64:cf1 -+64:cf2 -+64:cf3 -+64:cf4 -+64:cf5 -+64:cf6 -+64:cf7 -+64:cf8 -+64:cf9 -+64:cf10 -+64:cf11 -+64:cf12 -+64:cf13 -+64:cf14 -+64:cf15 -+64:cf16 -+64:cf17 -+64:cf18 -+64:cf19 -+64:cf20 -+64:cf21 -+64:cf22 -+64:cf23 -+64:cf24 -+64:cf25 -+64:cf26 -+64:cf27 -+64:cf28 -+64:cf29 -+64:cf30 -+64:cf31 -+64:cfpscr -+128:cvr0 -+128:cvr1 -+128:cvr2 -+128:cvr3 -+128:cvr4 -+128:cvr5 -+128:cvr6 -+128:cvr7 -+128:cvr8 -+128:cvr9 -+128:cvr10 -+128:cvr11 -+128:cvr12 -+128:cvr13 -+128:cvr14 -+128:cvr15 -+128:cvr16 -+128:cvr17 -+128:cvr18 -+128:cvr19 -+128:cvr20 -+128:cvr21 -+128:cvr22 -+128:cvr23 -+128:cvr24 -+128:cvr25 -+128:cvr26 -+128:cvr27 -+128:cvr28 -+128:cvr29 -+128:cvr30 -+128:cvr31 -+32:cvscr -+32:cvrsave -+64:cvs0h -+64:cvs1h -+64:cvs2h -+64:cvs3h -+64:cvs4h -+64:cvs5h -+64:cvs6h -+64:cvs7h -+64:cvs8h -+64:cvs9h -+64:cvs10h -+64:cvs11h -+64:cvs12h -+64:cvs13h -+64:cvs14h -+64:cvs15h -+64:cvs16h -+64:cvs17h -+64:cvs18h -+64:cvs19h -+64:cvs20h -+64:cvs21h -+64:cvs22h -+64:cvs23h -+64:cvs24h -+64:cvs25h -+64:cvs26h -+64:cvs27h -+64:cvs28h -+64:cvs29h -+64:cvs30h -+64:cvs31h -+64:cppr -+64:cdscr -+64:ctar -diff --git a/gdb/rs6000-tdep.c b/gdb/rs6000-tdep.c ---- a/gdb/rs6000-tdep.c -+++ b/gdb/rs6000-tdep.c -@@ -105,6 +105,22 @@ - && (regnum) >= (tdep)->ppc_efpr0_regnum \ - && (regnum) < (tdep)->ppc_efpr0_regnum + ppc_num_efprs) - -+/* Determine if regnum is a checkpointed decimal float -+ pseudo-register. */ -+#define IS_CDFP_PSEUDOREG(tdep, regnum) ((tdep)->ppc_cdl0_regnum >= 0 \ -+ && (regnum) >= (tdep)->ppc_cdl0_regnum \ -+ && (regnum) < (tdep)->ppc_cdl0_regnum + 16) -+ -+/* Determine if regnum is a Checkpointed POWER7 VSX register. */ -+#define IS_CVSX_PSEUDOREG(tdep, regnum) ((tdep)->ppc_cvsr0_regnum >= 0 \ -+ && (regnum) >= (tdep)->ppc_cvsr0_regnum \ -+ && (regnum) < (tdep)->ppc_cvsr0_regnum + ppc_num_vsrs) -+ -+/* Determine if regnum is a Checkpointed POWER7 Extended FP register. */ -+#define IS_CEFP_PSEUDOREG(tdep, regnum) ((tdep)->ppc_cefpr0_regnum >= 0 \ -+ && (regnum) >= (tdep)->ppc_cefpr0_regnum \ -+ && (regnum) < (tdep)->ppc_cefpr0_regnum + ppc_num_efprs) -+ - /* Holds the current set of options to be passed to the disassembler. */ - static char *powerpc_disassembler_options; - -@@ -2375,6 +2391,11 @@ rs6000_register_name (struct gdbarch *gdbarch, int regno) - && regno < tdep->ppc_vsr0_upper_regnum + ppc_num_gprs) - return ""; - -+ /* Hide the upper halves of the cvs0~cvs31 registers. */ -+ if (PPC_CVSR0_UPPER_REGNUM <= regno -+ && regno < PPC_CVSR0_UPPER_REGNUM + ppc_num_gprs) -+ return ""; -+ - /* Check if the SPE pseudo registers are available. */ - if (IS_SPE_PSEUDOREG (tdep, regno)) - { -@@ -2429,6 +2450,48 @@ rs6000_register_name (struct gdbarch *gdbarch, int regno) - return efpr_regnames[regno - tdep->ppc_efpr0_regnum]; - } - -+ /* Check if this is a Checkpointed DFP pseudo-register. */ -+ if (IS_CDFP_PSEUDOREG (tdep, regno)) -+ { -+ static const char *const cdfp128_regnames[] = { -+ "cdl0", "cdl1", "cdl2", "cdl3", -+ "cdl4", "cdl5", "cdl6", "cdl7", -+ "cdl8", "cdl9", "cdl10", "cdl11", -+ "cdl12", "cdl13", "cdl14", "cdl15" -+ }; -+ return cdfp128_regnames[regno - tdep->ppc_cdl0_regnum]; -+ } -+ -+ /* Check if this is a Checkpointed VSX pseudo-register. */ -+ if (IS_CVSX_PSEUDOREG (tdep, regno)) -+ { -+ static const char *const cvsx_regnames[] = { -+ "cvs0", "cvs1", "cvs2", "cvs3", "cvs4", "cvs5", "cvs6", "cvs7", -+ "cvs8", "cvs9", "cvs10", "cvs11", "cvs12", "cvs13", "cvs14", -+ "cvs15", "cvs16", "cvs17", "cvs18", "cvs19", "cvs20", "cvs21", -+ "cvs22", "cvs23", "cvs24", "cvs25", "cvs26", "cvs27", "cvs28", -+ "cvs29", "cvs30", "cvs31", "cvs32", "cvs33", "cvs34", "cvs35", -+ "cvs36", "cvs37", "cvs38", "cvs39", "cvs40", "cvs41", "cvs42", -+ "cvs43", "cvs44", "cvs45", "cvs46", "cvs47", "cvs48", "cvs49", -+ "cvs50", "cvs51", "cvs52", "cvs53", "cvs54", "cvs55", "cvs56", -+ "cvs57", "cvs58", "cvs59", "cvs60", "cvs61", "cvs62", "cvs63" -+ }; -+ return cvsx_regnames[regno - tdep->ppc_cvsr0_regnum]; -+ } -+ -+ /* Check if the this is a Checkpointed Extended FP pseudo-register. */ -+ if (IS_CEFP_PSEUDOREG (tdep, regno)) -+ { -+ static const char *const cefpr_regnames[] = { -+ "cf32", "cf33", "cf34", "cf35", "cf36", "cf37", "cf38", -+ "cf39", "cf40", "cf41", "cf42", "cf43", "cf44", "cf45", -+ "cf46", "cf47", "cf48", "cf49", "cf50", "cf51", -+ "cf52", "cf53", "cf54", "cf55", "cf56", "cf57", -+ "cf58", "cf59", "cf60", "cf61", "cf62", "cf63" -+ }; -+ return cefpr_regnames[regno - tdep->ppc_cefpr0_regnum]; -+ } -+ - return tdesc_register_name (gdbarch, regno); - } - -@@ -2440,24 +2503,26 @@ rs6000_pseudo_register_type (struct gdbarch *gdbarch, int regnum) - { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); - -- /* These are the only pseudo-registers we support. */ -- gdb_assert (IS_SPE_PSEUDOREG (tdep, regnum) -- || IS_DFP_PSEUDOREG (tdep, regnum) -- || IS_VSX_PSEUDOREG (tdep, regnum) -- || IS_EFP_PSEUDOREG (tdep, regnum)); -- - /* These are the e500 pseudo-registers. */ - if (IS_SPE_PSEUDOREG (tdep, regnum)) - return rs6000_builtin_type_vec64 (gdbarch); -- else if (IS_DFP_PSEUDOREG (tdep, regnum)) -+ else if (IS_DFP_PSEUDOREG (tdep, regnum) -+ || IS_CDFP_PSEUDOREG (tdep, regnum)) - /* PPC decimal128 pseudo-registers. */ - return builtin_type (gdbarch)->builtin_declong; -- else if (IS_VSX_PSEUDOREG (tdep, regnum)) -+ else if (IS_VSX_PSEUDOREG (tdep, regnum) -+ || IS_CVSX_PSEUDOREG (tdep, regnum)) - /* POWER7 VSX pseudo-registers. */ - return rs6000_builtin_type_vec128 (gdbarch); -- else -+ else if (IS_EFP_PSEUDOREG (tdep, regnum) -+ || IS_CEFP_PSEUDOREG (tdep, regnum)) - /* POWER7 Extended FP pseudo-registers. */ - return builtin_type (gdbarch)->builtin_double; -+ else -+ internal_error (__FILE__, __LINE__, -+ _("rs6000_pseudo_register_type: " -+ "called on unexpected register '%s' (%d)"), -+ gdbarch_register_name (gdbarch, regnum), regnum); - } - - /* The register format for RS/6000 floating point registers is always -@@ -2633,25 +2698,35 @@ dfp_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache, - int reg_nr, gdb_byte *buffer) - { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -- int reg_index = reg_nr - tdep->ppc_dl0_regnum; -+ int reg_index, fp0; - enum register_status status; - -+ if (IS_DFP_PSEUDOREG (tdep, reg_nr)) -+ { -+ reg_index = reg_nr - tdep->ppc_dl0_regnum; -+ fp0 = PPC_F0_REGNUM; -+ } -+ else -+ { -+ gdb_assert (IS_CDFP_PSEUDOREG (tdep, reg_nr)); -+ -+ reg_index = reg_nr - tdep->ppc_cdl0_regnum; -+ fp0 = PPC_CF0_REGNUM; -+ } -+ - if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) - { - /* Read two FP registers to form a whole dl register. */ -- status = regcache->raw_read (tdep->ppc_fp0_regnum + -- 2 * reg_index, buffer); -+ status = regcache->raw_read (fp0 + 2 * reg_index, buffer); - if (status == REG_VALID) -- status = regcache->raw_read (tdep->ppc_fp0_regnum + -- 2 * reg_index + 1, buffer + 8); -+ status = regcache->raw_read (fp0 + 2 * reg_index + 1, -+ buffer + 8); - } - else - { -- status = regcache->raw_read (tdep->ppc_fp0_regnum + -- 2 * reg_index + 1, buffer); -+ status = regcache->raw_read (fp0 + 2 * reg_index + 1, buffer); - if (status == REG_VALID) -- status = regcache->raw_read (tdep->ppc_fp0_regnum + -- 2 * reg_index, buffer + 8); -+ status = regcache->raw_read (fp0 + 2 * reg_index, buffer + 8); - } - - return status; -@@ -2663,23 +2738,32 @@ dfp_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, - int reg_nr, const gdb_byte *buffer) - { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -- int reg_index = reg_nr - tdep->ppc_dl0_regnum; -+ int reg_index, fp0; -+ -+ if (IS_DFP_PSEUDOREG (tdep, reg_nr)) -+ { -+ reg_index = reg_nr - tdep->ppc_dl0_regnum; -+ fp0 = PPC_F0_REGNUM; -+ } -+ else -+ { -+ gdb_assert (IS_CDFP_PSEUDOREG (tdep, reg_nr)); -+ -+ reg_index = reg_nr - tdep->ppc_cdl0_regnum; -+ fp0 = PPC_CF0_REGNUM; -+ } - - if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) - { - /* Write each half of the dl register into a separate -- FP register. */ -- regcache->raw_write (tdep->ppc_fp0_regnum + -- 2 * reg_index, buffer); -- regcache->raw_write (tdep->ppc_fp0_regnum + -- 2 * reg_index + 1, buffer + 8); -+ FP register. */ -+ regcache->raw_write (fp0 + 2 * reg_index, buffer); -+ regcache->raw_write (fp0 + 2 * reg_index + 1, buffer + 8); - } - else - { -- regcache->raw_write (tdep->ppc_fp0_regnum + -- 2 * reg_index + 1, buffer); -- regcache->raw_write (tdep->ppc_fp0_regnum + -- 2 * reg_index, buffer + 8); -+ regcache->raw_write (fp0 + 2 * reg_index + 1, buffer); -+ regcache->raw_write (fp0 + 2 * reg_index, buffer + 8); - } - } - -@@ -2689,30 +2773,43 @@ vsx_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache, - int reg_nr, gdb_byte *buffer) - { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -- int reg_index = reg_nr - tdep->ppc_vsr0_regnum; -+ int reg_index, vr0, fp0, vsr0_upper; - enum register_status status; - -+ if (IS_VSX_PSEUDOREG (tdep, reg_nr)) -+ { -+ reg_index = reg_nr - tdep->ppc_vsr0_regnum; -+ vr0 = PPC_VR0_REGNUM; -+ fp0 = PPC_F0_REGNUM; -+ vsr0_upper = PPC_VSR0_UPPER_REGNUM; -+ } -+ else -+ { -+ gdb_assert (IS_CVSX_PSEUDOREG (tdep, reg_nr)); -+ -+ reg_index = reg_nr - tdep->ppc_cvsr0_regnum; -+ vr0 = PPC_CVR0_REGNUM; -+ fp0 = PPC_CF0_REGNUM; -+ vsr0_upper = PPC_CVSR0_UPPER_REGNUM; -+ } -+ - /* Read the portion that overlaps the VMX registers. */ - if (reg_index > 31) -- status = regcache->raw_read (tdep->ppc_vr0_regnum + -- reg_index - 32, buffer); -+ status = regcache->raw_read (vr0 + reg_index - 32, buffer); - else - /* Read the portion that overlaps the FPR registers. */ - if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) - { -- status = regcache->raw_read (tdep->ppc_fp0_regnum + -- reg_index, buffer); -+ status = regcache->raw_read (fp0 + reg_index, buffer); - if (status == REG_VALID) -- status = regcache->raw_read (tdep->ppc_vsr0_upper_regnum + -- reg_index, buffer + 8); -+ status = regcache->raw_read (vsr0_upper + reg_index, -+ buffer + 8); - } - else - { -- status = regcache->raw_read (tdep->ppc_fp0_regnum + -- reg_index, buffer + 8); -+ status = regcache->raw_read (fp0 + reg_index, buffer + 8); - if (status == REG_VALID) -- status = regcache->raw_read (tdep->ppc_vsr0_upper_regnum + -- reg_index, buffer); -+ status = regcache->raw_read (vsr0_upper + reg_index, buffer); - } - - return status; -@@ -2724,56 +2821,103 @@ vsx_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, - int reg_nr, const gdb_byte *buffer) - { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -- int reg_index = reg_nr - tdep->ppc_vsr0_regnum; -+ int reg_index, vr0, fp0, vsr0_upper; -+ -+ if (IS_VSX_PSEUDOREG (tdep, reg_nr)) -+ { -+ reg_index = reg_nr - tdep->ppc_vsr0_regnum; -+ vr0 = PPC_VR0_REGNUM; -+ fp0 = PPC_F0_REGNUM; -+ vsr0_upper = PPC_VSR0_UPPER_REGNUM; -+ } -+ else -+ { -+ gdb_assert (IS_CVSX_PSEUDOREG (tdep, reg_nr)); -+ -+ reg_index = reg_nr - tdep->ppc_cvsr0_regnum; -+ vr0 = PPC_CVR0_REGNUM; -+ fp0 = PPC_CF0_REGNUM; -+ vsr0_upper = PPC_CVSR0_UPPER_REGNUM; -+ } - - /* Write the portion that overlaps the VMX registers. */ - if (reg_index > 31) -- regcache->raw_write (tdep->ppc_vr0_regnum + -- reg_index - 32, buffer); -+ regcache->raw_write (vr0 + reg_index - 32, buffer); - else - /* Write the portion that overlaps the FPR registers. */ - if (gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG) - { -- regcache->raw_write (tdep->ppc_fp0_regnum + -- reg_index, buffer); -- regcache->raw_write (tdep->ppc_vsr0_upper_regnum + -- reg_index, buffer + 8); -+ regcache->raw_write (fp0 + reg_index, buffer); -+ regcache->raw_write (vsr0_upper + reg_index, buffer + 8); - } - else - { -- regcache->raw_write (tdep->ppc_fp0_regnum + -- reg_index, buffer + 8); -- regcache->raw_write (tdep->ppc_vsr0_upper_regnum + -- reg_index, buffer); -+ regcache->raw_write (fp0 + reg_index, buffer + 8); -+ regcache->raw_write (vsr0_upper + reg_index, buffer); - } - } - - /* Read method for POWER7 Extended FP pseudo-registers. */ - static enum register_status --efpr_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache, -+efp_pseudo_register_read (struct gdbarch *gdbarch, readable_regcache *regcache, - int reg_nr, gdb_byte *buffer) - { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -- int reg_index = reg_nr - tdep->ppc_efpr0_regnum; -+ int reg_index, vr0; -+ -+ if (IS_EFP_PSEUDOREG (tdep, reg_nr)) -+ { -+ reg_index = reg_nr - tdep->ppc_efpr0_regnum; -+ vr0 = PPC_VR0_REGNUM; -+ } -+ else -+ { -+ gdb_assert (IS_CEFP_PSEUDOREG (tdep, reg_nr)); -+ -+ reg_index = reg_nr - tdep->ppc_cefpr0_regnum; -+ vr0 = PPC_CVR0_REGNUM; -+ } -+ - int offset = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8; - - /* Read the portion that overlaps the VMX register. */ -- return regcache->raw_read_part (tdep->ppc_vr0_regnum + reg_index, -- offset, register_size (gdbarch, reg_nr), -+ return regcache->raw_read_part (vr0 + reg_index, offset, -+ register_size (gdbarch, reg_nr), - buffer); - } - - /* Write method for POWER7 Extended FP pseudo-registers. */ - static void --efpr_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, -+efp_pseudo_register_write (struct gdbarch *gdbarch, struct regcache *regcache, - int reg_nr, const gdb_byte *buffer) - { - struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -- int reg_index = reg_nr - tdep->ppc_efpr0_regnum; -+ int reg_index, vr0; - int offset = gdbarch_byte_order (gdbarch) == BFD_ENDIAN_BIG ? 0 : 8; - -+ if (IS_EFP_PSEUDOREG (tdep, reg_nr)) -+ { -+ reg_index = reg_nr - tdep->ppc_efpr0_regnum; -+ vr0 = PPC_VR0_REGNUM; -+ } -+ else -+ { -+ gdb_assert (IS_CEFP_PSEUDOREG (tdep, reg_nr)); -+ -+ reg_index = reg_nr - tdep->ppc_cefpr0_regnum; -+ vr0 = PPC_CVR0_REGNUM; -+ -+ /* The call to raw_write_part fails silently if the initial read -+ of the read-update-write sequence returns an invalid status, -+ so we check this manually and throw an error if needed. */ -+ regcache->raw_update (vr0 + reg_index); -+ if (regcache->get_register_status (vr0 + reg_index) != REG_VALID) -+ error (_("Cannot write to the checkpointed EFP register, " -+ "the corresponding vector register is unavailable.")); -+ } -+ - /* Write the portion that overlaps the VMX register. */ -- regcache->raw_write_part (tdep->ppc_vr0_regnum + reg_index, offset, -+ regcache->raw_write_part (vr0 + reg_index, offset, - register_size (gdbarch, reg_nr), buffer); - } - -@@ -2789,12 +2933,15 @@ rs6000_pseudo_register_read (struct gdbarch *gdbarch, - - if (IS_SPE_PSEUDOREG (tdep, reg_nr)) - return e500_pseudo_register_read (gdbarch, regcache, reg_nr, buffer); -- else if (IS_DFP_PSEUDOREG (tdep, reg_nr)) -+ else if (IS_DFP_PSEUDOREG (tdep, reg_nr) -+ || IS_CDFP_PSEUDOREG (tdep, reg_nr)) - return dfp_pseudo_register_read (gdbarch, regcache, reg_nr, buffer); -- else if (IS_VSX_PSEUDOREG (tdep, reg_nr)) -+ else if (IS_VSX_PSEUDOREG (tdep, reg_nr) -+ || IS_CVSX_PSEUDOREG (tdep, reg_nr)) - return vsx_pseudo_register_read (gdbarch, regcache, reg_nr, buffer); -- else if (IS_EFP_PSEUDOREG (tdep, reg_nr)) -- return efpr_pseudo_register_read (gdbarch, regcache, reg_nr, buffer); -+ else if (IS_EFP_PSEUDOREG (tdep, reg_nr) -+ || IS_CEFP_PSEUDOREG (tdep, reg_nr)) -+ return efp_pseudo_register_read (gdbarch, regcache, reg_nr, buffer); - else - internal_error (__FILE__, __LINE__, - _("rs6000_pseudo_register_read: " -@@ -2814,12 +2961,15 @@ rs6000_pseudo_register_write (struct gdbarch *gdbarch, - - if (IS_SPE_PSEUDOREG (tdep, reg_nr)) - e500_pseudo_register_write (gdbarch, regcache, reg_nr, buffer); -- else if (IS_DFP_PSEUDOREG (tdep, reg_nr)) -+ else if (IS_DFP_PSEUDOREG (tdep, reg_nr) -+ || IS_CDFP_PSEUDOREG (tdep, reg_nr)) - dfp_pseudo_register_write (gdbarch, regcache, reg_nr, buffer); -- else if (IS_VSX_PSEUDOREG (tdep, reg_nr)) -+ else if (IS_VSX_PSEUDOREG (tdep, reg_nr) -+ || IS_CVSX_PSEUDOREG (tdep, reg_nr)) - vsx_pseudo_register_write (gdbarch, regcache, reg_nr, buffer); -- else if (IS_EFP_PSEUDOREG (tdep, reg_nr)) -- efpr_pseudo_register_write (gdbarch, regcache, reg_nr, buffer); -+ else if (IS_EFP_PSEUDOREG (tdep, reg_nr) -+ || IS_CEFP_PSEUDOREG (tdep, reg_nr)) -+ efp_pseudo_register_write (gdbarch, regcache, reg_nr, buffer); - else - internal_error (__FILE__, __LINE__, - _("rs6000_pseudo_register_write: " -@@ -2827,6 +2977,97 @@ rs6000_pseudo_register_write (struct gdbarch *gdbarch, - gdbarch_register_name (gdbarch, reg_nr), reg_nr); - } - -+/* Set the register mask in AX with the registers that form the DFP or -+ checkpointed DFP pseudo-register REG_NR. */ -+ -+static void -+dfp_ax_pseudo_register_collect (struct gdbarch *gdbarch, -+ struct agent_expr *ax, int reg_nr) -+{ -+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -+ int reg_index, fp0; -+ -+ if (IS_DFP_PSEUDOREG (tdep, reg_nr)) -+ { -+ reg_index = reg_nr - tdep->ppc_dl0_regnum; -+ fp0 = PPC_F0_REGNUM; -+ } -+ else -+ { -+ gdb_assert (IS_CDFP_PSEUDOREG (tdep, reg_nr)); -+ -+ reg_index = reg_nr - tdep->ppc_cdl0_regnum; -+ fp0 = PPC_CF0_REGNUM; -+ } -+ -+ ax_reg_mask (ax, fp0 + 2 * reg_index); -+ ax_reg_mask (ax, fp0 + 2 * reg_index + 1); -+} -+ -+/* Set the register mask in AX with the registers that form the VSX or -+ checkpointed VSX pseudo-register REG_NR. */ -+ -+static void -+vsx_ax_pseudo_register_collect (struct gdbarch *gdbarch, -+ struct agent_expr *ax, int reg_nr) -+{ -+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -+ int reg_index, vr0, fp0, vsr0_upper; -+ -+ if (IS_VSX_PSEUDOREG (tdep, reg_nr)) -+ { -+ reg_index = reg_nr - tdep->ppc_vsr0_regnum; -+ vr0 = PPC_VR0_REGNUM; -+ fp0 = PPC_F0_REGNUM; -+ vsr0_upper = PPC_VSR0_UPPER_REGNUM; -+ } -+ else -+ { -+ gdb_assert (IS_CVSX_PSEUDOREG (tdep, reg_nr)); -+ -+ reg_index = reg_nr - tdep->ppc_cvsr0_regnum; -+ vr0 = PPC_CVR0_REGNUM; -+ fp0 = PPC_CF0_REGNUM; -+ vsr0_upper = PPC_CVSR0_UPPER_REGNUM; -+ } -+ -+ if (reg_index > 31) -+ { -+ ax_reg_mask (ax, vr0 + reg_index - 32); -+ } -+ else -+ { -+ ax_reg_mask (ax, fp0 + reg_index); -+ ax_reg_mask (ax, vsr0_upper + reg_index); -+ } -+} -+ -+/* Set the register mask in AX with the register that corresponds to -+ the EFP or checkpointed EFP pseudo-register REG_NR. */ -+ -+static void -+efp_ax_pseudo_register_collect (struct gdbarch *gdbarch, -+ struct agent_expr *ax, int reg_nr) -+{ -+ struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch); -+ int reg_index, vr0; -+ -+ if (IS_EFP_PSEUDOREG (tdep, reg_nr)) -+ { -+ reg_index = reg_nr - tdep->ppc_efpr0_regnum; -+ vr0 = PPC_VR0_REGNUM; -+ } -+ else -+ { -+ gdb_assert (IS_CEFP_PSEUDOREG (tdep, reg_nr)); -+ -+ reg_index = reg_nr - tdep->ppc_cefpr0_regnum; -+ vr0 = PPC_CVR0_REGNUM; -+ } -+ -+ ax_reg_mask (ax, vr0 + reg_index); -+} -+ - static int - rs6000_ax_pseudo_register_collect (struct gdbarch *gdbarch, - struct agent_expr *ax, int reg_nr) -@@ -2838,29 +3079,20 @@ rs6000_ax_pseudo_register_collect (struct gdbarch *gdbarch, - ax_reg_mask (ax, tdep->ppc_gp0_regnum + reg_index); - ax_reg_mask (ax, tdep->ppc_ev0_upper_regnum + reg_index); - } -- else if (IS_DFP_PSEUDOREG (tdep, reg_nr)) -+ else if (IS_DFP_PSEUDOREG (tdep, reg_nr) -+ || IS_CDFP_PSEUDOREG (tdep, reg_nr)) - { -- int reg_index = reg_nr - tdep->ppc_dl0_regnum; -- ax_reg_mask (ax, tdep->ppc_fp0_regnum + 2 * reg_index); -- ax_reg_mask (ax, tdep->ppc_fp0_regnum + 2 * reg_index + 1); -+ dfp_ax_pseudo_register_collect (gdbarch, ax, reg_nr); - } -- else if (IS_VSX_PSEUDOREG (tdep, reg_nr)) -+ else if (IS_VSX_PSEUDOREG (tdep, reg_nr) -+ || IS_CVSX_PSEUDOREG (tdep, reg_nr)) - { -- int reg_index = reg_nr - tdep->ppc_vsr0_regnum; -- if (reg_index > 31) -- { -- ax_reg_mask (ax, tdep->ppc_vr0_regnum + reg_index - 32); -- } -- else -- { -- ax_reg_mask (ax, tdep->ppc_fp0_regnum + reg_index); -- ax_reg_mask (ax, tdep->ppc_vsr0_upper_regnum + reg_index); -- } -+ vsx_ax_pseudo_register_collect (gdbarch, ax, reg_nr); - } -- else if (IS_EFP_PSEUDOREG (tdep, reg_nr)) -+ else if (IS_EFP_PSEUDOREG (tdep, reg_nr) -+ || IS_CEFP_PSEUDOREG (tdep, reg_nr)) - { -- int reg_index = reg_nr - tdep->ppc_efpr0_regnum; -- ax_reg_mask (ax, tdep->ppc_vr0_regnum + reg_index); -+ efp_ax_pseudo_register_collect (gdbarch, ax, reg_nr); - } - else - internal_error (__FILE__, __LINE__, -@@ -5871,7 +6103,10 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - enum powerpc_elf_abi elf_abi = POWERPC_ELF_AUTO; - int have_fpu = 0, have_spe = 0, have_mq = 0, have_altivec = 0; - int have_dfp = 0, have_vsx = 0, have_ppr = 0, have_dscr = 0; -- int have_tar = 0, have_ebb = 0, have_pmu = 0; -+ int have_tar = 0, have_ebb = 0, have_pmu = 0, have_htm_spr = 0; -+ int have_htm_core = 0, have_htm_fpu = 0, have_htm_altivec = 0; -+ int have_htm_vsx = 0, have_htm_ppr = 0, have_htm_dscr = 0; -+ int have_htm_tar = 0; - int tdesc_wordsize = -1; - const struct target_desc *tdesc = info.target_desc; - struct tdesc_arch_data *tdesc_data = NULL; -@@ -6270,6 +6505,201 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - } - else - have_pmu = 0; -+ -+ /* Hardware Transactional Memory Registers. */ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.htm.spr"); -+ if (feature != NULL) -+ { -+ static const char *const tm_spr_regs[] = { -+ "tfhar", "texasr", "tfiar" -+ }; -+ -+ valid_p = 1; -+ for (i = 0; i < ARRAY_SIZE (tm_spr_regs); i++) -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_TFHAR_REGNUM + i, -+ tm_spr_regs[i]); -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ -+ have_htm_spr = 1; -+ } -+ else -+ have_htm_spr = 0; -+ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.htm.core"); -+ if (feature != NULL) -+ { -+ static const char *const cgprs[] = { -+ "cr0", "cr1", "cr2", "cr3", "cr4", "cr5", "cr6", "cr7", -+ "cr8", "cr9", "cr10", "cr11", "cr12", "cr13", "cr14", -+ "cr15", "cr16", "cr17", "cr18", "cr19", "cr20", "cr21", -+ "cr22", "cr23", "cr24", "cr25", "cr26", "cr27", "cr28", -+ "cr29", "cr30", "cr31", "ccr", "cxer", "clr", "cctr" -+ }; -+ -+ valid_p = 1; -+ -+ for (i = 0; i < ARRAY_SIZE (cgprs); i++) -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_CR0_REGNUM + i, -+ cgprs[i]); -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ -+ have_htm_core = 1; -+ } -+ else -+ have_htm_core = 0; -+ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.htm.fpu"); -+ if (feature != NULL) -+ { -+ valid_p = 1; -+ -+ static const char *const cfprs[] = { -+ "cf0", "cf1", "cf2", "cf3", "cf4", "cf5", "cf6", "cf7", -+ "cf8", "cf9", "cf10", "cf11", "cf12", "cf13", "cf14", "cf15", -+ "cf16", "cf17", "cf18", "cf19", "cf20", "cf21", "cf22", -+ "cf23", "cf24", "cf25", "cf26", "cf27", "cf28", "cf29", -+ "cf30", "cf31", "cfpscr" -+ }; -+ -+ for (i = 0; i < ARRAY_SIZE (cfprs); i++) -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_CF0_REGNUM + i, -+ cfprs[i]); -+ -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ have_htm_fpu = 1; -+ } -+ else -+ have_htm_fpu = 0; -+ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.htm.altivec"); -+ if (feature != NULL) -+ { -+ valid_p = 1; -+ -+ static const char *const cvmx[] = { -+ "cvr0", "cvr1", "cvr2", "cvr3", "cvr4", "cvr5", "cvr6", -+ "cvr7", "cvr8", "cvr9", "cvr10", "cvr11", "cvr12", "cvr13", -+ "cvr14", "cvr15","cvr16", "cvr17", "cvr18", "cvr19", "cvr20", -+ "cvr21", "cvr22", "cvr23", "cvr24", "cvr25", "cvr26", -+ "cvr27", "cvr28", "cvr29", "cvr30", "cvr31", "cvscr", -+ "cvrsave" -+ }; -+ -+ for (i = 0; i < ARRAY_SIZE (cvmx); i++) -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ PPC_CVR0_REGNUM + i, -+ cvmx[i]); -+ -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ have_htm_altivec = 1; -+ } -+ else -+ have_htm_altivec = 0; -+ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.htm.vsx"); -+ if (feature != NULL) -+ { -+ valid_p = 1; -+ -+ static const char *const cvsx[] = { -+ "cvs0h", "cvs1h", "cvs2h", "cvs3h", "cvs4h", "cvs5h", -+ "cvs6h", "cvs7h", "cvs8h", "cvs9h", "cvs10h", "cvs11h", -+ "cvs12h", "cvs13h", "cvs14h", "cvs15h", "cvs16h", "cvs17h", -+ "cvs18h", "cvs19h", "cvs20h", "cvs21h", "cvs22h", "cvs23h", -+ "cvs24h", "cvs25h", "cvs26h", "cvs27h", "cvs28h", "cvs29h", -+ "cvs30h", "cvs31h" -+ }; -+ -+ for (i = 0; i < ARRAY_SIZE (cvsx); i++) -+ valid_p &= tdesc_numbered_register (feature, tdesc_data, -+ (PPC_CVSR0_UPPER_REGNUM -+ + i), -+ cvsx[i]); -+ -+ if (!valid_p || !have_htm_fpu || !have_htm_altivec) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ have_htm_vsx = 1; -+ } -+ else -+ have_htm_vsx = 0; -+ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.htm.ppr"); -+ if (feature != NULL) -+ { -+ valid_p = tdesc_numbered_register (feature, tdesc_data, -+ PPC_CPPR_REGNUM, "cppr"); -+ -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ have_htm_ppr = 1; -+ } -+ else -+ have_htm_ppr = 0; -+ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.htm.dscr"); -+ if (feature != NULL) -+ { -+ valid_p = tdesc_numbered_register (feature, tdesc_data, -+ PPC_CDSCR_REGNUM, "cdscr"); -+ -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ have_htm_dscr = 1; -+ } -+ else -+ have_htm_dscr = 0; -+ -+ feature = tdesc_find_feature (tdesc, -+ "org.gnu.gdb.power.htm.tar"); -+ if (feature != NULL) -+ { -+ valid_p = tdesc_numbered_register (feature, tdesc_data, -+ PPC_CTAR_REGNUM, "ctar"); -+ -+ if (!valid_p) -+ { -+ tdesc_data_cleanup (tdesc_data); -+ return NULL; -+ } -+ have_htm_tar = 1; -+ } -+ else -+ have_htm_tar = 0; - } - - /* If we have a 64-bit binary on a 32-bit target, complain. Also -@@ -6482,6 +6912,15 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - tdep->ppc_sdar_regnum = have_pmu ? PPC_SDAR_REGNUM : -1; - tdep->ppc_sier_regnum = have_pmu ? PPC_SIER_REGNUM : -1; - -+ tdep->have_htm_spr = have_htm_spr; -+ tdep->have_htm_core = have_htm_core; -+ tdep->have_htm_fpu = have_htm_fpu; -+ tdep->have_htm_altivec = have_htm_altivec; -+ tdep->have_htm_vsx = have_htm_vsx; -+ tdep->ppc_cppr_regnum = have_htm_ppr ? PPC_CPPR_REGNUM : -1; -+ tdep->ppc_cdscr_regnum = have_htm_dscr ? PPC_CDSCR_REGNUM : -1; -+ tdep->ppc_ctar_regnum = have_htm_tar ? PPC_CTAR_REGNUM : -1; -+ - set_gdbarch_pc_regnum (gdbarch, PPC_PC_REGNUM); - set_gdbarch_sp_regnum (gdbarch, PPC_R0_REGNUM + 1); - set_gdbarch_fp0_regnum (gdbarch, tdep->ppc_fp0_regnum); -@@ -6503,7 +6942,7 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - else - tdep->lr_frame_offset = 4; - -- if (have_spe || have_dfp || have_vsx) -+ if (have_spe || have_dfp || have_vsx || have_htm_fpu || have_htm_vsx) - { - set_gdbarch_pseudo_register_read (gdbarch, rs6000_pseudo_register_read); - set_gdbarch_pseudo_register_write (gdbarch, -@@ -6525,6 +6964,11 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - if (have_vsx) - /* Include both VSX and Extended FP registers. */ - num_pseudoregs += 96; -+ if (have_htm_fpu) -+ num_pseudoregs += 16; -+ /* Include both checkpointed VSX and EFP registers. */ -+ if (have_htm_vsx) -+ num_pseudoregs += 64 + 32; - - set_gdbarch_num_pseudo_regs (gdbarch, num_pseudoregs); - -@@ -6640,6 +7084,9 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - tdep->ppc_dl0_regnum = -1; - tdep->ppc_vsr0_regnum = -1; - tdep->ppc_efpr0_regnum = -1; -+ tdep->ppc_cdl0_regnum = -1; -+ tdep->ppc_cvsr0_regnum = -1; -+ tdep->ppc_cefpr0_regnum = -1; - - cur_reg = gdbarch_num_regs (gdbarch); - -@@ -6660,6 +7107,18 @@ rs6000_gdbarch_init (struct gdbarch_info info, struct gdbarch_list *arches) - tdep->ppc_efpr0_regnum = cur_reg; - cur_reg += 32; - } -+ if (have_htm_fpu) -+ { -+ tdep->ppc_cdl0_regnum = cur_reg; -+ cur_reg += 16; -+ } -+ if (have_htm_vsx) -+ { -+ tdep->ppc_cvsr0_regnum = cur_reg; -+ cur_reg += 64; -+ tdep->ppc_cefpr0_regnum = cur_reg; -+ cur_reg += 32; -+ } - - gdb_assert (gdbarch_num_regs (gdbarch) - + gdbarch_num_pseudo_regs (gdbarch) == cur_reg); -diff --git a/gdb/testsuite/gdb.arch/powerpc-htm-regs.c b/gdb/testsuite/gdb.arch/powerpc-htm-regs.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/powerpc-htm-regs.c -@@ -0,0 +1,39 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright (C) 2018 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 . */ -+ -+int main (void) -+{ -+ /* Touch DSCR. Some kernels won't schedule the thread with a DSCR -+ altered by ptrace unless the register was used at some point. */ -+ unsigned long dscr = 0x0; -+ -+ /* This is the non-privileged SPR number to access DSCR, -+ available since isa 207. */ -+ asm volatile ("mtspr 3,%0" : : "r" (dscr)); -+ -+ asm volatile ("tbegin."); // first marker -+ asm volatile goto ("bc 12,2,%l[end]" -+ : -+ : -+ : -+ : end); -+ asm volatile ("tabort. 0"); -+end: -+ asm volatile ("nop"); // second marker -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.arch/powerpc-htm-regs.exp b/gdb/testsuite/gdb.arch/powerpc-htm-regs.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/powerpc-htm-regs.exp -@@ -0,0 +1,328 @@ -+# Copyright (C) 2018 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 . -+ -+# This file is part of the gdb testsuite. -+ -+# Test access to HTM (Hardware Transactional Memory) registers. The -+# tests read the values of various registers before stepping the -+# inferior through a "tbegin." instruction to start a transaction, -+# then the checkpointed versions of the registers are checked against -+# the pre-transactional values. Then, new values are written to some -+# of the checkpointed registers, these values are read back and saved, -+# the inferior continues until the transaction aborts, and the regular -+# registers are then checked against the saved values, because the -+# abort should have reverted the registers to these values. -+ -+if {![istarget "powerpc*-*-linux*"]} then { -+ verbose "Skipping PowerPC test for HTM registers." -+ return -+} -+ -+standard_testfile .c .gen.c -+ -+# First check if our processor and kernel support access to -+# the registers we need and to the HTM facility. -+ -+proc check_register_access { regname } { -+ global gdb_prompt -+ -+ set test "$regname register access" -+ gdb_test_multiple "info reg $regname" "$test" { -+ -re "Invalid register.*\r\n$gdb_prompt $" { -+ unsupported "$test" -+ return 0 -+ } -+ -re "\r\n$regname.*\r\n$gdb_prompt $" { -+ pass "$test" -+ return 1 -+ } -+ } -+ return 0 -+} -+ -+proc check_htm_support {} { -+ global gdb_prompt -+ set test "htm support" -+ -+ gdb_test_multiple "stepi" "$test" { -+ -re "Illegal instruction.*\r\n$gdb_prompt $" { -+ unsupported $test -+ return 0 -+ } -+ -re "nop.*\r\n$gdb_prompt $" -+ { -+ pass $test -+ return 1 -+ } -+ } -+ return 0; -+} -+ -+with_test_prefix "check htm support" { -+ set gen_src [standard_output_file $srcfile2] -+ -+ gdb_produce_source $gen_src { -+ int main () { -+ asm volatile ("tbegin."); // marker -+ asm volatile ("nop"); -+ return 0; -+ } -+ } -+ -+ if {[build_executable "compile" $binfile $gen_src {debug}] == -1} { -+ return -+ } -+ -+ clean_restart $binfile -+ -+ # Displaced-stepping a tbegin. causes problems, -+ # so we make the breakpoint temporary. -+ gdb_breakpoint [gdb_get_line_number "marker" "$gen_src"] temporary -+ -+ gdb_run_cmd -+ -+ # Wait for the prompt. -+ if {[gdb_test "" "Temporary breakpoint.*"] != 0 } { -+ return -+ } -+ -+ # Make sure that we stopped at the right place (just before tbegin. is -+ # executed). -+ if { [gdb_test "x/i \$pc" "=> $hex.*:.*tbegin\\..*" "disassemble tbegin"] != 0} { -+ return -+ } -+ -+ if {![check_register_access "vs0"]} { -+ return -+ } -+ -+ if {![check_register_access "texasr"]} { -+ return -+ } -+ -+ if {![check_register_access "dscr"]} { -+ return -+ } -+ -+ if {![check_register_access "ppr"]} { -+ return -+ } -+ -+ if {![check_register_access "tar"]} { -+ return -+ } -+ -+ if {![check_htm_support]} { -+ return -+ } -+} -+ -+# Now do the actual test. -+if {[build_executable "compile" $binfile $srcfile {debug}] == -1} { -+ return -+} -+ -+clean_restart $binfile -+ -+gdb_breakpoint [gdb_get_line_number "first marker"] temporary -+ -+gdb_run_cmd -+ -+# Wait for the prompt. -+gdb_test "" "Temporary breakpoint.*" -+ -+if {[gdb_test "x/i \$pc" "=> $hex.*:.*tbegin\\..*" "disassemble tbegin"] != 0} { -+ return -+} -+ -+# Now we write non-zero values to some registers, then read the values -+# of various registers, then stepi to start the transaction. The -+# checkpointed register state should correspond to the values we read. -+ -+# Write to the GPRs -+for {set i 0} {$i < 32} {incr i 1} { -+ gdb_test_no_output "set \$r$i = $i" -+} -+ -+gdb_test_no_output "set \$xer = 0xc0000000" -+ -+# FPRs -+gdb_test_no_output "set \$f0 = 0.5" -+for {set i 1} {$i < 32} {incr i 1} { -+ gdb_test_no_output "set \$f$i = \$f[expr $i - 1] + 1.0" -+} -+ -+gdb_test_no_output "set \$fpscr = 0x84005000" -+ -+# VRs -+for {set i 0} {$i < 32} {incr i 1} { -+ for {set j 0} {$j < 4} {incr j 1} { -+ gdb_test_no_output "set \$vr$i.v4_int32\[$j\] = $i" -+ } -+} -+ -+gdb_test_no_output "set \$dscr = 0x2" -+gdb_test_no_output "set \$tar = &main" "set tar" -+ -+# Get the pre-transactional value of the registers. -+for {set i 0} {$i < 32} {incr i 1} { -+ set "r$i" [get_hexadecimal_valueof "\$r$i" "default0"] -+} -+ -+set cr [get_hexadecimal_valueof "\$cr" "default0"] -+set xer [get_hexadecimal_valueof "\$xer" "default0"] -+set lr [get_hexadecimal_valueof "\$lr" "default0"] -+set ctr [get_hexadecimal_valueof "\$ctr" "default0"] -+ -+for {set i 0} {$i < 32} {incr i 1} { -+ set "f$i" [get_valueof "" "\$f$i" "default0"] -+} -+ -+set fpscr [get_hexadecimal_valueof "\$fpscr" "default0"] -+ -+for {set i 0} {$i < 32} {incr i 1} { -+ set "vr$i" [get_hexadecimal_valueof "\$vr$i.uint128" "default0"] -+} -+ -+set vscr [get_hexadecimal_valueof "\$vscr" "default0"] -+set vrsave [get_hexadecimal_valueof "\$vrsave" "default0"] -+ -+for {set i 0} {$i < 64} {incr i 1} { -+ set "vs$i" [get_hexadecimal_valueof "\$vs$i.uint128" "default0"] -+} -+ -+set dscr [get_hexadecimal_valueof "\$dscr" "default0"] -+set ppr [get_hexadecimal_valueof "\$ppr" "default0"] -+set tar [get_hexadecimal_valueof "\$tar" "default0"] -+ -+gdb_test "stepi" "asm.*bc.*" -+ -+proc test_register_match {reg_name reg_var_name hex} { -+ set test "$reg_name matches $reg_var_name" -+ -+ # In some infrequent cases CXER doesn't match the -+ # pre-transactional XER, possibly due to a linux kernel bug. -+ set should_xfail 0 -+ if [istarget "powerpc*-*-linux*" && reg_name == "cxer"] { -+ set should_xfail 1 -+ } -+ -+ upvar $reg_var_name expected_val -+ -+ if {$hex} { -+ set actual_val [get_hexadecimal_valueof "\$$reg_name" "default1"] -+ } else { -+ set actual_val [get_valueof "" "\$$reg_name" "default1"] -+ } -+ -+ if { "$expected_val" == "$actual_val" } { -+ pass $test -+ } else { -+ if {$should_xfail} { -+ xfail $test -+ } else { -+ fail $test -+ } -+ } -+} -+ -+for {set i 0} {$i < 32} {incr i 1} { -+ test_register_match "cr$i" "r$i" 1 -+} -+ -+test_register_match "ccr" "cr" 1 -+test_register_match "cxer" "xer" 1 -+test_register_match "clr" "lr" 1 -+test_register_match "cctr" "ctr" 1 -+ -+for {set i 0} {$i < 32} {incr i 1} { -+ test_register_match "cf$i" "f$i" 0 -+} -+ -+test_register_match "cfpscr" "fpscr" 1 -+ -+for {set i 0} {$i < 32} {incr i 1} { -+ test_register_match "cvr$i.uint128" "vr$i" 1 -+} -+ -+test_register_match "cvscr" "vscr" 1 -+test_register_match "cvrsave" "vrsave" 1 -+ -+for {set i 0} {$i < 64} {incr i 1} { -+ test_register_match "cvs$i.uint128" "vs$i" 1 -+} -+ -+test_register_match "cdscr" "dscr" 1 -+test_register_match "cppr" "ppr" 1 -+test_register_match "ctar" "tar" 1 -+ -+# Support for writing to the checkpointed registers is not -+# currently available in the gdbserver stub. -+if [target_is_gdbserver] { -+ unsupported "write to checkpointed registers" -+ return -+} -+ -+# Now write different values to some of the checkpointed registers and -+# check that the transaction abort reverts the register to these -+# values. -+for {set i 0} {$i < 32} {incr i 1} { -+ gdb_test_no_output "set \$cr$i = $i + 0xC00" -+} -+ -+gdb_test_no_output "set \$cf0 = 0.25" -+for {set i 1} {$i < 32} {incr i 1} { -+ gdb_test_no_output "set \$cf$i = \$cf[expr $i - 1] + 1.0" -+} -+ -+for {set i 0} {$i < 32} {incr i 1} { -+ for {set j 0} {$j < 4} {incr j 1} { -+ gdb_test_no_output "set \$cvr$i.v4_int32\[$j\] = $i + 0xF00" -+ } -+} -+ -+# Read back the values. -+with_test_prefix "after write" { -+ for {set i 0} {$i < 32} {incr i 1} { -+ set "cr$i" [get_hexadecimal_valueof "\$cr$i" "default0"] -+ } -+ -+ for {set i 0} {$i < 32} {incr i 1} { -+ set "cf$i" [get_valueof "" "\$cf$i" "default0"] -+ } -+ -+ for {set i 0} {$i < 64} {incr i 1} { -+ set "cvs$i" [get_hexadecimal_valueof "\$cvs$i.uint128" "default0"] -+ } -+} -+ -+gdb_breakpoint [gdb_get_line_number "second marker"] -+ -+gdb_test "continue" -+ -+with_test_prefix "after transaction failure" { -+ for {set i 0} {$i < 32} {incr i 1} { -+ test_register_match "r$i" "cr$i" 1 -+ } -+ -+ for {set i 0} {$i < 32} {incr i 1} { -+ test_register_match "f$i" "cf$i" 0 -+ } -+ -+ for {set i 0} {$i < 64} {incr i 1} { -+ test_register_match "vs$i.uint128" "cvs$i" 1 -+ } -+} -+ diff --git a/gdb-rhbz1187581-power8-regs-not-in-8.2-15of15.patch b/gdb-rhbz1187581-power8-regs-not-in-8.2-15of15.patch deleted file mode 100644 index a2339b6503a86e4a088bd9c0d9803d1277c0eead..0000000000000000000000000000000000000000 --- a/gdb-rhbz1187581-power8-regs-not-in-8.2-15of15.patch +++ /dev/null @@ -1,43 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 11 Jan 2019 17:02:19 -0500 -Subject: gdb-rhbz1187581-power8-regs-not-in-8.2-15of15.patch - -;; [PowerPC] Document requirements for VSX feature -;; Pedro Franco de Carvalho, RH BZ 1187581 - -[PowerPC] Document requirements for VSX feature - -As suggested in -https://sourceware.org/ml/gdb-patches/2018-10/msg00510.html, this -patch changes the documentation for the VSX tdesc feature to make it -clear that the altivec and FPU features are requirements. - -gdb/doc/ChangeLog: -2018-11-09 Pedro Franco de Carvalho - - * gdb.texinfo (PowerPC Features): Document the altivec and fpu - requirements for the org.gnu.gdb.power.vsx feature. - -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -42541,11 +42541,13 @@ contain registers @samp{vr0} through @samp{vr31}, @samp{vscr}, - and @samp{vrsave}. - - The @samp{org.gnu.gdb.power.vsx} feature is optional. It should --contain registers @samp{vs0h} through @samp{vs31h}. @value{GDBN} --will combine these registers with the floating point registers --(@samp{f0} through @samp{f31}) and the altivec registers (@samp{vr0} --through @samp{vr31}) to present the 128-bit wide registers @samp{vs0} --through @samp{vs63}, the set of vector registers for POWER7. -+contain registers @samp{vs0h} through @samp{vs31h}. @value{GDBN} will -+combine these registers with the floating point registers (@samp{f0} -+through @samp{f31}) and the altivec registers (@samp{vr0} through -+@samp{vr31}) to present the 128-bit wide registers @samp{vs0} through -+@samp{vs63}, the set of vector-scalar registers for POWER7. -+Therefore, this feature requires both @samp{org.gnu.gdb.power.fpu} and -+@samp{org.gnu.gdb.power.altivec}. - - The @samp{org.gnu.gdb.power.spe} feature is optional. It should - contain registers @samp{ev0h} through @samp{ev31h}, @samp{acc}, and diff --git a/gdb-rhbz1491128-batch-mode-exit-status-1of2.patch b/gdb-rhbz1491128-batch-mode-exit-status-1of2.patch deleted file mode 100644 index 3648130013d1a07259ebd5f6dcb9c0419b329dc6..0000000000000000000000000000000000000000 --- a/gdb-rhbz1491128-batch-mode-exit-status-1of2.patch +++ /dev/null @@ -1,323 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Gary Benson -Date: Wed, 29 Aug 2018 16:11:50 +0100 -Subject: gdb-rhbz1491128-batch-mode-exit-status-1of2.patch - -;; Fix for 'gdb in batch mode always exit with status 0' (Gary Benson) -;; RHBZ #1491128 - -Indicate batch mode failures by exiting with nonzero status - -This commit causes GDB in batch mode to exit with nonzero status -if the last command to be executed fails. - -gdb/ChangeLog: - - PR gdb/13000: - * gdb/main.c (captured_main_1): Exit with nonzero status - in batch mode if the last command to be executed failed. - * NEWS: Mention the above. - -gdb/testsuite/ChangeLog: - - PR gdb/13000: - * gdb.base/batch-exit-status.exp: New file. - * gdb.base/batch-exit-status.good-commands: Likewise. - * gdb.base/batch-exit-status.bad-commands: Likewise. - -diff --git a/gdb/ChangeLog b/gdb/ChangeLog ---- a/gdb/ChangeLog -+++ b/gdb/ChangeLog -@@ -1,3 +1,10 @@ -+2018-08-16 Gary Benson -+ -+ PR gdb/13000: -+ * gdb/main.c (captured_main_1): Exit with nonzero status -+ in batch mode if the last command to be executed failed. -+ * NEWS: Mention the above. -+ - 2018-08-03 Sergio Durigan Junior - - * ser-tcp.c (net_open): Fix thinko when deciding whether to -diff --git a/gdb/NEWS b/gdb/NEWS ---- a/gdb/NEWS -+++ b/gdb/NEWS -@@ -7,6 +7,9 @@ - can be passed using the '[ADDRESS]:PORT' notation, or the regular - 'ADDRESS:PORT' method. - -+* GDB in batch mode now exits with status 1 if the last command to be -+ executed failed. -+ - *** Changes in GDB 8.2 - - * The 'set disassembler-options' command now supports specifying options -diff --git a/gdb/main.c b/gdb/main.c ---- a/gdb/main.c -+++ b/gdb/main.c -@@ -518,6 +518,7 @@ captured_main_1 (struct captured_main_args *context, int &python_script) - int i; - int save_auto_load; - struct objfile *objfile; -+ int ret = 1; - - #ifdef HAVE_SBRK - /* Set this before constructing scoped_command_stats. */ -@@ -1051,7 +1052,7 @@ captured_main_1 (struct captured_main_args *context, int &python_script) - processed; it sets global parameters, which are independent of - what file you are debugging or what directory you are in. */ - if (system_gdbinit && !inhibit_gdbinit) -- catch_command_errors (source_script, system_gdbinit, 0); -+ ret = catch_command_errors (source_script, system_gdbinit, 0); - - /* Read and execute $HOME/.gdbinit file, if it exists. This is done - *before* all the command line arguments are processed; it sets -@@ -1059,7 +1060,7 @@ captured_main_1 (struct captured_main_args *context, int &python_script) - debugging or what directory you are in. */ - - if (home_gdbinit && !inhibit_gdbinit && !inhibit_home_gdbinit) -- catch_command_errors (source_script, home_gdbinit, 0); -+ ret = catch_command_errors (source_script, home_gdbinit, 0); - - /* Process '-ix' and '-iex' options early. */ - for (i = 0; i < cmdarg_vec.size (); i++) -@@ -1069,12 +1070,12 @@ captured_main_1 (struct captured_main_args *context, int &python_script) - switch (cmdarg_p.type) - { - case CMDARG_INIT_FILE: -- catch_command_errors (source_script, cmdarg_p.string, -- !batch_flag); -+ ret = catch_command_errors (source_script, cmdarg_p.string, -+ !batch_flag); - break; - case CMDARG_INIT_COMMAND: -- catch_command_errors (execute_command, cmdarg_p.string, -- !batch_flag); -+ ret = catch_command_errors (execute_command, cmdarg_p.string, -+ !batch_flag); - break; - } - } -@@ -1082,11 +1083,11 @@ captured_main_1 (struct captured_main_args *context, int &python_script) - /* Now perform all the actions indicated by the arguments. */ - if (cdarg != NULL) - { -- catch_command_errors (cd_command, cdarg, 0); -+ ret = catch_command_errors (cd_command, cdarg, 0); - } - - for (i = 0; i < dirarg.size (); i++) -- catch_command_errors (directory_switch, dirarg[i], 0); -+ ret = catch_command_errors (directory_switch, dirarg[i], 0); - - /* Skip auto-loading section-specified scripts until we've sourced - local_gdbinit (which is often used to augment the source search -@@ -1115,19 +1116,19 @@ captured_main_1 (struct captured_main_args *context, int &python_script) - catch_command_errors returns non-zero on success! - Do not load EXECARG as a symbol file if it has been already processed - as a core file. */ -- if (catch_command_errors (func, execarg, !batch_flag) -- && core_bfd == NULL) -- catch_command_errors (symbol_file_add_main_adapter, symarg, -- !batch_flag); -+ ret = catch_command_errors (func, execarg, !batch_flag); -+ if (ret != 0 && core_bfd == NULL) -+ ret = catch_command_errors (symbol_file_add_main_adapter, -+ symarg, !batch_flag); - } - else - { - if (execarg != NULL) -- catch_command_errors (exec_file_attach, execarg, -- !batch_flag); -+ ret = catch_command_errors (exec_file_attach, execarg, -+ !batch_flag); - if (symarg != NULL) -- catch_command_errors (symbol_file_add_main_adapter, symarg, -- !batch_flag); -+ ret = catch_command_errors (symbol_file_add_main_adapter, -+ symarg, !batch_flag); - } - - if (corearg && pidarg) -@@ -1135,9 +1136,14 @@ captured_main_1 (struct captured_main_args *context, int &python_script) - "a core file at the same time.")); - - if (corearg != NULL) -- catch_command_errors (core_file_command, corearg, !batch_flag); -+ { -+ ret = catch_command_errors (core_file_command, corearg, -+ !batch_flag); -+ } - else if (pidarg != NULL) -- catch_command_errors (attach_command, pidarg, !batch_flag); -+ { -+ ret = catch_command_errors (attach_command, pidarg, !batch_flag); -+ } - else if (pid_or_core_arg) - { - /* The user specified 'gdb program pid' or gdb program core'. -@@ -1146,17 +1152,23 @@ captured_main_1 (struct captured_main_args *context, int &python_script) - - if (isdigit (pid_or_core_arg[0])) - { -- if (catch_command_errors (attach_command, pid_or_core_arg, -- !batch_flag) == 0 -+ ret = catch_command_errors (attach_command, pid_or_core_arg, -+ !batch_flag); -+ if (ret == 0 - /* attach_command could succeed partially and core_file_command - would try to kill it. */ - && !have_inferiors ()) -- catch_command_errors (core_file_command, pid_or_core_arg, -- !batch_flag); -+ ret = catch_command_errors (core_file_command, -+ pid_or_core_arg, -+ !batch_flag); -+ } -+ else -+ { -+ /* Can't be a pid, better be a corefile. */ -+ ret = catch_command_errors (core_file_command, -+ pid_or_core_arg, -+ !batch_flag); - } -- else /* Can't be a pid, better be a corefile. */ -- catch_command_errors (core_file_command, pid_or_core_arg, -- !batch_flag); - } - - if (ttyarg != NULL) -@@ -1180,7 +1192,7 @@ captured_main_1 (struct captured_main_args *context, int &python_script) - { - auto_load_local_gdbinit_loaded = 1; - -- catch_command_errors (source_script, local_gdbinit, 0); -+ ret = catch_command_errors (source_script, local_gdbinit, 0); - } - } - -@@ -1200,12 +1212,12 @@ captured_main_1 (struct captured_main_args *context, int &python_script) - switch (cmdarg_p.type) - { - case CMDARG_FILE: -- catch_command_errors (source_script, cmdarg_p.string, -- !batch_flag); -+ ret = catch_command_errors (source_script, cmdarg_p.string, -+ !batch_flag); - break; - case CMDARG_COMMAND: -- catch_command_errors (execute_command, cmdarg_p.string, -- !batch_flag); -+ ret = catch_command_errors (execute_command, cmdarg_p.string, -+ !batch_flag); - break; - } - } -@@ -1217,8 +1229,11 @@ captured_main_1 (struct captured_main_args *context, int &python_script) - - if (batch_flag) - { -+ int error_status = EXIT_FAILURE; -+ int *exit_arg = ret == 0 ? &error_status : NULL; -+ - /* We have hit the end of the batch file. */ -- quit_force (NULL, 0); -+ quit_force (exit_arg, 0); - } - } - -diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog ---- a/gdb/testsuite/ChangeLog -+++ b/gdb/testsuite/ChangeLog -@@ -1,3 +1,10 @@ -+2018-08-16 Gary Benson -+ -+ PR gdb/13000: -+ * gdb.base/batch-exit-status.exp: New file. -+ * gdb.base/batch-exit-status.good-commands: Likewise. -+ * gdb.base/batch-exit-status.bad-commands: Likewise. -+ - 2018-07-11 Sergio Durigan Junior - Jan Kratochvil - Paul Fertser -diff --git a/gdb/testsuite/gdb.base/batch-exit-status.bad-commands b/gdb/testsuite/gdb.base/batch-exit-status.bad-commands -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/batch-exit-status.bad-commands -@@ -0,0 +1 @@ -+bork -diff --git a/gdb/testsuite/gdb.base/batch-exit-status.exp b/gdb/testsuite/gdb.base/batch-exit-status.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/batch-exit-status.exp -@@ -0,0 +1,63 @@ -+# Copyright (C) 2018 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 "gdb -batch" exits with appropriate status. -+ -+standard_testfile -+ -+set good_commands "$srcdir/$subdir/batch-exit-status.good-commands" -+set bad_commands "$srcdir/$subdir/batch-exit-status.bad-commands" -+ -+proc _test_exit_status {expect_status cmdline_opts} { -+ global gdb_spawn_id -+ -+ gdb_exit -+ if {[gdb_spawn_with_cmdline_opts $cmdline_opts] != 0} { -+ fail "spawn" -+ return -+ } -+ -+ set result [wait -i $gdb_spawn_id] -+ verbose $result -+ gdb_assert { [lindex $result 2] == 0 } -+ set actual_status [lindex $result 3] -+ gdb_assert { $actual_status == $expect_status } -+} -+ -+proc test_exit_status {expect_status cmdline_opts} { -+ with_test_prefix $cmdline_opts { -+ _test_exit_status $expect_status $cmdline_opts -+ } -+} -+ -+# gdb -batch with nothing to do should exit 0. -+test_exit_status 0 "-batch" -+ -+# Bad command-line options should cause exit 1. -+test_exit_status 1 "-batch -jslkflsdjlkfjlksdjf" -+ -+# gdb -batch with good commands should exit 0. -+test_exit_status 0 "-batch -ex \"info source\"" -+test_exit_status 0 "-batch -x $good_commands" -+ -+# gdb -batch with bad commands should exit 1. -+test_exit_status 1 "-batch -ex \"set not-a-thing 4\"" -+test_exit_status 1 "-batch -x $bad_commands" -+ -+# Success or failure of the last thing determines the exit code. -+test_exit_status 0 "-batch -ex \"set not-a-thing 4\" -x $good_commands" -+test_exit_status 0 "-batch -x $bad_commands -ex \"info source\"" -+test_exit_status 1 "-batch -x $good_commands -x $bad_commands" -+test_exit_status 1 "-batch -x $good_commands -ex \"set not-a-thing 4\"" -diff --git a/gdb/testsuite/gdb.base/batch-exit-status.good-commands b/gdb/testsuite/gdb.base/batch-exit-status.good-commands -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/batch-exit-status.good-commands -@@ -0,0 +1 @@ -+info mem diff --git a/gdb-rhbz1491128-batch-mode-exit-status-2of2.patch b/gdb-rhbz1491128-batch-mode-exit-status-2of2.patch deleted file mode 100644 index b1ba52393514bd48061422eb0fb91b359c28ac1a..0000000000000000000000000000000000000000 --- a/gdb-rhbz1491128-batch-mode-exit-status-2of2.patch +++ /dev/null @@ -1,65 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Gary Benson -Date: Mon, 3 Sep 2018 16:14:55 +0100 -Subject: gdb-rhbz1491128-batch-mode-exit-status-2of2.patch - -;; Fix for 'gdb in batch mode always exit with status 0' (Gary Benson) -;; RHBZ #1491128 - -Fix batch exit status test failure on Fedora 28 - -This commit adds calls to remote_close and clear_gdb_spawn_id to -gdb.base/batch-exit-status.exp, fixing failures reported by buildbot -on Fedora 28 where gdb_spawn_id not being reset by the previous test -caused default_gdb_spawn to return without spawning. - -This commit also changes the test to use detect GDB's exit using -gdb_test_multiple expecting 'eof', rather than using 'wait -i' alone. -This means the testcase won't hang forever on failure as fixed in -gdb.base/quit.exp by commit 15763a09d4ae ("Fix 'gdb.base/quit.exp -hangs forever' if the test fails"). - -gdb/testsuite/ChangeLog: - - * gdb.base/batch-exit-status.exp: Use gdb_test_multiple and expect - 'eof' before 'wait -i'. Use remote_close and clear_gdb_spawn_id. - -diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog ---- a/gdb/testsuite/ChangeLog -+++ b/gdb/testsuite/ChangeLog -@@ -1,3 +1,8 @@ -+2018-09-04 Gary Benson -+ -+ * gdb.base/batch-exit-status.exp: Use gdb_test_multiple and expect -+ 'eof' before 'wait -i'. Use remote_close and clear_gdb_spawn_id. -+ - 2018-08-16 Gary Benson - - PR gdb/13000: -diff --git a/gdb/testsuite/gdb.base/batch-exit-status.exp b/gdb/testsuite/gdb.base/batch-exit-status.exp ---- a/gdb/testsuite/gdb.base/batch-exit-status.exp -+++ b/gdb/testsuite/gdb.base/batch-exit-status.exp -@@ -29,11 +29,18 @@ proc _test_exit_status {expect_status cmdline_opts} { - return - } - -- set result [wait -i $gdb_spawn_id] -- verbose $result -- gdb_assert { [lindex $result 2] == 0 } -- set actual_status [lindex $result 3] -- gdb_assert { $actual_status == $expect_status } -+ gdb_test_multiple "" "run til exit" { -+ eof { -+ set result [wait -i $gdb_spawn_id] -+ verbose $result -+ -+ gdb_assert { [lindex $result 2] == 0 } -+ gdb_assert { [lindex $result 3] == $expect_status } -+ -+ remote_close host -+ clear_gdb_spawn_id -+ } -+ } - } - - proc test_exit_status {expect_status cmdline_opts} { diff --git a/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-1of5.patch b/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-1of5.patch deleted file mode 100644 index 4a14a36dcfa58ef787aea3a13b219361ea793201..0000000000000000000000000000000000000000 --- a/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-1of5.patch +++ /dev/null @@ -1,746 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Sergio Durigan Junior -Date: Fri, 11 Jan 2019 10:52:17 -0500 -Subject: - gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-1of5.patch - -;; Fix 'Assertion `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' failed.' -;; Keith Seitz, RHBZ#1560010. - -gdb/23712: Introduce multidictionary's - -gdb/23712 is a new manifestation of the now-infamous (at least to me) -symtab/23010 assertion failure (DICT_LANGUAGE == SYMBOL_LANGAUGE). - -An example of the problem (using test case from symtab/23010): - -Reading symbols from /home/rdiez/rdiez/arduino/JtagDue/BuildOutput/JtagDue-obj-release/firmware.elf...done. -(gdb) p SysTick_Handler -dwarf2read.c:9715: internal-error: void dw2_add_symbol_to_list(symbol*, pending**): Assertion `(*listhead) == NULL || (SYMBOL_LANGUAGE ((*listhead)->symbol[0]) == SYMBOL_LANGUAGE (symbol))' failed. -A problem internal to GDB has been detected, -further debugging may prove unreliable. -Quit this debugging session? (y or n) - -This assertion was added specifically to catch this condition (of adding -symbols of different languages to a single pending list). - -The problems we're now seeing on systems utilizing DWARF debugging seem to -be caused by the use of LTO, which adds a CU with an artificial DIE of -language C99 which references DIEs in other CUs of language C++. - -Thus, we create a dictionary containing symbols of C99 but end up -stuffing C++ symbols into it, and the dw2_add_symbol_to_list triggers. - -The approach taken here to fix this is to introduce multi-language -dictionaries to "replace" the standard, single-language dictionaries -used today. - -Note to reviewers: This patch introduces some temporary functions to -aide with review. This and other artifacts (such as "See dictionary.h" -which appear incorrect) will all be valid at the end of the series. - -This first patch introduces the new multidictionary and its API (which -is, by design, identical to the old dictionary interface). It also -mutates dict_create_hashed and dict_create_linear so that they take -a std::vector instead of the usual struct pending linked list. This will -be needed later on. - -This patch does /not/ actually enable multidictionary's. That is left -for a subsequent patch in the series. - -I've done exhaustive performance testing with this approach, and I've -attempted to minimize the overhead for the (overwhelmingly) most common -one-language scenario. - -On average, a -g3 -O0 GDB (the one we developers use) will see -approximately a 4% slowdown when initially reading symbols. [I've -tested only GDB and firefox with -readnow.] When using -O2, this -difference shrinks to ~0.5%. Since a number of runs with these -patches actually run /faster/ than unpatched GDB, I conclude that -these tests have at least a 0.5% error margin. - -On our own gdb.perf test suite, again, results appear to be pretty -negligible. Differences to unpatched GDB range from -7.8% (yes, -patched version is again faster than unpatched) to 27%. All tests -lying outside "negligible," such as the 27% slowdown, involve a total -run time of 0.0007 (or less) with smaller numbers of CUs/DSOs (usually 10 -or 100). In all cases, the follow-up tests with more CUs/DSOs is never -more than 3% difference to the baseline, unpatched GDB. - -In my opinion, these results are satisfactory. - -gdb/ChangeLog: - - PR gdb/23712 - PR symtab/23010 - * dictionary.c: Include unordered_map. - (pending_to_vector): New function. - (dict_create_hashed_1, dict_create_linear_1, dict_add_pending_1): - Rewrite the non-"_1" functions to take vector instead - of linked list. - (dict_create_hashed, dict_create_linear, dict_add_pending): Use the - "new" _1 versions of the same name. - (multidictionary): Define. - (std::hash - - /* This file implements dictionaries, which are tables that associate - symbols to names. They are represented by an opaque type 'struct -@@ -341,53 +342,66 @@ static void insert_symbol_hashed (struct dictionary *dict, - - static void expand_hashtable (struct dictionary *dict); - -+/* A function to convert a linked list into a vector. */ -+ -+static std::vector -+pending_to_vector (const struct pending *symbol_list) -+{ -+ std::vector symlist; -+ -+ for (const struct pending *list_counter = symbol_list; -+ list_counter != nullptr; list_counter = list_counter->next) -+ { -+ for (int i = list_counter->nsyms - 1; i >= 0; --i) -+ symlist.push_back (list_counter->symbol[i]); -+ } -+ -+ return symlist; -+} -+ - /* The creation functions. */ - --/* See dictionary.h. */ -+/* A function to transition dict_create_hashed to new API. */ - --struct dictionary * --dict_create_hashed (struct obstack *obstack, -- enum language language, -- const struct pending *symbol_list) -+static struct dictionary * -+dict_create_hashed_1 (struct obstack *obstack, -+ enum language language, -+ const std::vector &symbol_list) - { -- struct dictionary *retval; -- int nsyms = 0, nbuckets, i; -- struct symbol **buckets; -- const struct pending *list_counter; -- -- retval = XOBNEW (obstack, struct dictionary); -+ /* Allocate the dictionary. */ -+ struct dictionary *retval = XOBNEW (obstack, struct dictionary); - DICT_VECTOR (retval) = &dict_hashed_vector; - DICT_LANGUAGE (retval) = language_def (language); - -- /* Calculate the number of symbols, and allocate space for them. */ -- for (list_counter = symbol_list; -- list_counter != NULL; -- list_counter = list_counter->next) -- { -- nsyms += list_counter->nsyms; -- } -- nbuckets = DICT_HASHTABLE_SIZE (nsyms); -+ /* Allocate space for symbols. */ -+ int nsyms = symbol_list.size (); -+ int nbuckets = DICT_HASHTABLE_SIZE (nsyms); - DICT_HASHED_NBUCKETS (retval) = nbuckets; -- buckets = XOBNEWVEC (obstack, struct symbol *, nbuckets); -+ struct symbol **buckets = XOBNEWVEC (obstack, struct symbol *, nbuckets); - memset (buckets, 0, nbuckets * sizeof (struct symbol *)); - DICT_HASHED_BUCKETS (retval) = buckets; - - /* Now fill the buckets. */ -- for (list_counter = symbol_list; -- list_counter != NULL; -- list_counter = list_counter->next) -- { -- for (i = list_counter->nsyms - 1; i >= 0; --i) -- { -- insert_symbol_hashed (retval, list_counter->symbol[i]); -- } -- } -+ for (const auto &sym : symbol_list) -+ insert_symbol_hashed (retval, sym); - - return retval; - } - - /* See dictionary.h. */ - -+struct dictionary * -+dict_create_hashed (struct obstack *obstack, -+ enum language language, -+ const struct pending *symbol_list) -+{ -+ std::vector symlist = pending_to_vector (symbol_list); -+ -+ return dict_create_hashed_1 (obstack, language, symlist); -+} -+ -+/* See dictionary.h. */ -+ - extern struct dictionary * - dict_create_hashed_expandable (enum language language) - { -@@ -403,52 +417,45 @@ dict_create_hashed_expandable (enum language language) - return retval; - } - --/* See dictionary.h. */ -+/* A function to transition dict_create_linear to new API. */ - --struct dictionary * --dict_create_linear (struct obstack *obstack, -- enum language language, -- const struct pending *symbol_list) -+static struct dictionary * -+dict_create_linear_1 (struct obstack *obstack, -+ enum language language, -+ const std::vector &symbol_list) - { -- struct dictionary *retval; -- int nsyms = 0, i, j; -- struct symbol **syms; -- const struct pending *list_counter; -- -- retval = XOBNEW (obstack, struct dictionary); -+ struct dictionary *retval = XOBNEW (obstack, struct dictionary); - DICT_VECTOR (retval) = &dict_linear_vector; - DICT_LANGUAGE (retval) = language_def (language); - -- /* Calculate the number of symbols, and allocate space for them. */ -- for (list_counter = symbol_list; -- list_counter != NULL; -- list_counter = list_counter->next) -- { -- nsyms += list_counter->nsyms; -- } -+ /* Allocate space for symbols. */ -+ int nsyms = symbol_list.size (); - DICT_LINEAR_NSYMS (retval) = nsyms; -- syms = XOBNEWVEC (obstack, struct symbol *, nsyms ); -+ struct symbol **syms = XOBNEWVEC (obstack, struct symbol *, nsyms); - DICT_LINEAR_SYMS (retval) = syms; - -- /* Now fill in the symbols. Start filling in from the back, so as -- to preserve the original order of the symbols. */ -- for (list_counter = symbol_list, j = nsyms - 1; -- list_counter != NULL; -- list_counter = list_counter->next) -- { -- for (i = list_counter->nsyms - 1; -- i >= 0; -- --i, --j) -- { -- syms[j] = list_counter->symbol[i]; -- } -- } -+ /* Now fill in the symbols. */ -+ int idx = nsyms - 1; -+ for (const auto &sym : symbol_list) -+ syms[idx--] = sym; - - return retval; - } - - /* See dictionary.h. */ - -+struct dictionary * -+dict_create_linear (struct obstack *obstack, -+ enum language language, -+ const struct pending *symbol_list) -+{ -+ std::vector symlist = pending_to_vector (symbol_list); -+ -+ return dict_create_linear_1 (obstack, language, symlist); -+} -+ -+/* See dictionary.h. */ -+ - struct dictionary * - dict_create_linear_expandable (enum language language) - { -@@ -483,20 +490,26 @@ dict_add_symbol (struct dictionary *dict, struct symbol *sym) - (DICT_VECTOR (dict))->add_symbol (dict, sym); - } - -+/* A function to transition dict_add_pending to new API. */ -+ -+static void -+dict_add_pending_1 (struct dictionary *dict, -+ const std::vector &symbol_list) -+{ -+ /* Preserve ordering by reversing the list. */ -+ for (auto sym = symbol_list.rbegin (); sym != symbol_list.rend (); ++sym) -+ dict_add_symbol (dict, *sym); -+} -+ - /* Utility to add a list of symbols to a dictionary. - DICT must be an expandable dictionary. */ - - void - dict_add_pending (struct dictionary *dict, const struct pending *symbol_list) - { -- const struct pending *list; -- int i; -+ std::vector symlist = pending_to_vector (symbol_list); - -- for (list = symbol_list; list != NULL; list = list->next) -- { -- for (i = 0; i < list->nsyms; ++i) -- dict_add_symbol (dict, list->symbol[i]); -- } -+ dict_add_pending_1 (dict, symlist); - } - - /* Initialize ITERATOR to point at the first symbol in DICT, and -@@ -929,3 +942,408 @@ add_symbol_linear_expandable (struct dictionary *dict, - - DICT_LINEAR_SYM (dict, nsyms - 1) = sym; - } -+ -+/* Multi-language dictionary support. */ -+ -+/* The structure describing a multi-language dictionary. */ -+ -+struct multidictionary -+{ -+ /* An array of dictionaries, one per language. All dictionaries -+ must be of the same type. This should be free'd for expandable -+ dictionary types. */ -+ struct dictionary **dictionaries; -+ -+ /* The number of language dictionaries currently allocated. -+ Only used for expandable dictionaries. */ -+ unsigned short n_allocated_dictionaries; -+}; -+ -+/* A hasher for enum language. Injecting this into std is a convenience -+ when using unordered_map with C++11. */ -+ -+namespace std -+{ -+ template<> struct hash -+ { -+ typedef enum language argument_type; -+ typedef std::size_t result_type; -+ -+ result_type operator() (const argument_type &l) const noexcept -+ { -+ return static_cast (l); -+ } -+ }; -+} /* namespace std */ -+ -+/* A helper function to collate symbols on the pending list by language. */ -+ -+static std::unordered_map> -+collate_pending_symbols_by_language (const struct pending *symbol_list) -+{ -+ std::unordered_map> nsyms; -+ -+ for (const struct pending *list_counter = symbol_list; -+ list_counter != nullptr; list_counter = list_counter->next) -+ { -+ for (int i = list_counter->nsyms - 1; i >= 0; --i) -+ { -+ enum language language = SYMBOL_LANGUAGE (list_counter->symbol[i]); -+ nsyms[language].push_back (list_counter->symbol[i]); -+ } -+ } -+ -+ return nsyms; -+} -+ -+/* See dictionary.h. */ -+ -+struct multidictionary * -+mdict_create_hashed (struct obstack *obstack, -+ const struct pending *symbol_list) -+{ -+ struct multidictionary *retval -+ = XOBNEW (obstack, struct multidictionary); -+ std::unordered_map> nsyms -+ = collate_pending_symbols_by_language (symbol_list); -+ -+ /* Loop over all languages and create/populate dictionaries. */ -+ retval->dictionaries -+ = XOBNEWVEC (obstack, struct dictionary *, nsyms.size ()); -+ retval->n_allocated_dictionaries = nsyms.size (); -+ -+ int idx = 0; -+ for (const auto &pair : nsyms) -+ { -+ enum language language = pair.first; -+ std::vector symlist = pair.second; -+ -+ retval->dictionaries[idx++] -+ = dict_create_hashed_1 (obstack, language, symlist); -+ } -+ -+ return retval; -+} -+ -+/* See dictionary.h. */ -+ -+struct multidictionary * -+mdict_create_hashed_expandable (enum language language) -+{ -+ struct multidictionary *retval = XNEW (struct multidictionary); -+ -+ /* We have no symbol list to populate, but we create an empty -+ dictionary of the requested language to populate later. */ -+ retval->n_allocated_dictionaries = 1; -+ retval->dictionaries = XNEW (struct dictionary *); -+ retval->dictionaries[0] = dict_create_hashed_expandable (language); -+ -+ return retval; -+} -+ -+/* See dictionary.h. */ -+ -+struct multidictionary * -+mdict_create_linear (struct obstack *obstack, -+ const struct pending *symbol_list) -+{ -+ struct multidictionary *retval -+ = XOBNEW (obstack, struct multidictionary); -+ std::unordered_map> nsyms -+ = collate_pending_symbols_by_language (symbol_list); -+ -+ /* Loop over all languages and create/populate dictionaries. */ -+ retval->dictionaries -+ = XOBNEWVEC (obstack, struct dictionary *, nsyms.size ()); -+ retval->n_allocated_dictionaries = nsyms.size (); -+ -+ int idx = 0; -+ for (const auto &pair : nsyms) -+ { -+ enum language language = pair.first; -+ std::vector symlist = pair.second; -+ -+ retval->dictionaries[idx++] -+ = dict_create_linear_1 (obstack, language, symlist); -+ } -+ -+ return retval; -+} -+ -+/* See dictionary.h. */ -+ -+struct multidictionary * -+mdict_create_linear_expandable (enum language language) -+{ -+ struct multidictionary *retval = XNEW (struct multidictionary); -+ -+ /* We have no symbol list to populate, but we create an empty -+ dictionary to populate later. */ -+ retval->n_allocated_dictionaries = 1; -+ retval->dictionaries = XNEW (struct dictionary *); -+ retval->dictionaries[0] = dict_create_linear_expandable (language); -+ -+ return retval; -+} -+ -+/* See dictionary.h. */ -+ -+void -+mdict_free (struct multidictionary *mdict) -+{ -+ /* Grab the type of dictionary being used. */ -+ enum dict_type type = mdict->dictionaries[0]->vector->type; -+ -+ /* Loop over all dictionaries and free them. */ -+ for (unsigned short idx = 0; idx < mdict->n_allocated_dictionaries; ++idx) -+ dict_free (mdict->dictionaries[idx]); -+ -+ /* Free the dictionary list, if needed. */ -+ switch (type) -+ { -+ case DICT_HASHED: -+ case DICT_LINEAR: -+ /* Memory was allocated on an obstack when created. */ -+ break; -+ -+ case DICT_HASHED_EXPANDABLE: -+ case DICT_LINEAR_EXPANDABLE: -+ xfree (mdict->dictionaries); -+ break; -+ } -+} -+ -+/* Helper function to find the dictionary associated with LANGUAGE -+ or NULL if there is no dictionary of that language. */ -+ -+static struct dictionary * -+find_language_dictionary (const struct multidictionary *mdict, -+ enum language language) -+{ -+ for (unsigned short idx = 0; idx < mdict->n_allocated_dictionaries; ++idx) -+ { -+ if (DICT_LANGUAGE (mdict->dictionaries[idx])->la_language == language) -+ return mdict->dictionaries[idx]; -+ } -+ -+ return nullptr; -+} -+ -+/* Create a new language dictionary for LANGUAGE and add it to the -+ multidictionary MDICT's list of dictionaries. If MDICT is not -+ based on expandable dictionaries, this function throws an -+ internal error. */ -+ -+static struct dictionary * -+create_new_language_dictionary (struct multidictionary *mdict, -+ enum language language) -+{ -+ struct dictionary *retval = nullptr; -+ -+ /* We use the first dictionary entry to decide what create function -+ to call. Not optimal but sufficient. */ -+ gdb_assert (mdict->dictionaries[0] != nullptr); -+ switch (mdict->dictionaries[0]->vector->type) -+ { -+ case DICT_HASHED: -+ case DICT_LINEAR: -+ internal_error (__FILE__, __LINE__, -+ _("create_new_language_dictionary: attempted to expand " -+ "non-expandable multidictionary")); -+ -+ case DICT_HASHED_EXPANDABLE: -+ retval = dict_create_hashed_expandable (language); -+ break; -+ -+ case DICT_LINEAR_EXPANDABLE: -+ retval = dict_create_linear_expandable (language); -+ break; -+ } -+ -+ /* Grow the dictionary vector and save the new dictionary. */ -+ mdict->dictionaries -+ = (struct dictionary **) xrealloc (mdict->dictionaries, -+ (++mdict->n_allocated_dictionaries -+ * sizeof (struct dictionary *))); -+ mdict->dictionaries[mdict->n_allocated_dictionaries - 1] = retval; -+ -+ return retval; -+} -+ -+/* See dictionary.h. */ -+ -+void -+mdict_add_symbol (struct multidictionary *mdict, struct symbol *sym) -+{ -+ struct dictionary *dict -+ = find_language_dictionary (mdict, SYMBOL_LANGUAGE (sym)); -+ -+ if (dict == nullptr) -+ { -+ /* SYM is of a new language that we haven't previously seen. -+ Create a new dictionary for it. */ -+ dict = create_new_language_dictionary (mdict, SYMBOL_LANGUAGE (sym)); -+ } -+ -+ dict_add_symbol (dict, sym); -+} -+ -+/* See dictionary.h. */ -+ -+void -+mdict_add_pending (struct multidictionary *mdict, -+ const struct pending *symbol_list) -+{ -+ std::unordered_map> nsyms -+ = collate_pending_symbols_by_language (symbol_list); -+ -+ for (const auto &pair : nsyms) -+ { -+ enum language language = pair.first; -+ std::vector symlist = pair.second; -+ struct dictionary *dict = find_language_dictionary (mdict, language); -+ -+ if (dict == nullptr) -+ { -+ /* The language was not previously seen. Create a new dictionary -+ for it. */ -+ dict = create_new_language_dictionary (mdict, language); -+ } -+ -+ dict_add_pending_1 (dict, symlist); -+ } -+} -+ -+/* See dictionary.h. */ -+ -+struct symbol * -+mdict_iterator_first (const multidictionary *mdict, -+ struct mdict_iterator *miterator) -+{ -+ miterator->mdict = mdict; -+ miterator->current_idx = 0; -+ -+ for (unsigned short idx = miterator->current_idx; -+ idx < mdict->n_allocated_dictionaries; ++idx) -+ { -+ struct symbol *result -+ = dict_iterator_first (mdict->dictionaries[idx], &miterator->iterator); -+ -+ if (result != nullptr) -+ { -+ miterator->current_idx = idx; -+ return result; -+ } -+ } -+ -+ return nullptr; -+} -+ -+/* See dictionary.h. */ -+ -+struct symbol * -+mdict_iterator_next (struct mdict_iterator *miterator) -+{ -+ struct symbol *result = dict_iterator_next (&miterator->iterator); -+ -+ if (result != nullptr) -+ return result; -+ -+ /* The current dictionary had no matches -- move to the next -+ dictionary, if any. */ -+ for (unsigned short idx = ++miterator->current_idx; -+ idx < miterator->mdict->n_allocated_dictionaries; ++idx) -+ { -+ result -+ = dict_iterator_first (miterator->mdict->dictionaries[idx], -+ &miterator->iterator); -+ if (result != nullptr) -+ { -+ miterator->current_idx = idx; -+ return result; -+ } -+ } -+ -+ return nullptr; -+} -+ -+/* See dictionary.h. */ -+ -+struct symbol * -+mdict_iter_match_first (const struct multidictionary *mdict, -+ const lookup_name_info &name, -+ struct mdict_iterator *miterator) -+{ -+ miterator->mdict = mdict; -+ miterator->current_idx = 0; -+ -+ for (unsigned short idx = miterator->current_idx; -+ idx < mdict->n_allocated_dictionaries; ++idx) -+ { -+ struct symbol *result -+ = dict_iter_match_first (mdict->dictionaries[idx], name, -+ &miterator->iterator); -+ -+ if (result != nullptr) -+ return result; -+ } -+ -+ return nullptr; -+} -+ -+/* See dictionary.h. */ -+ -+struct symbol * -+mdict_iter_match_next (const lookup_name_info &name, -+ struct mdict_iterator *miterator) -+{ -+ /* Search the current dictionary. */ -+ struct symbol *result = dict_iter_match_next (name, &miterator->iterator); -+ -+ if (result != nullptr) -+ return result; -+ -+ /* The current dictionary had no matches -- move to the next -+ dictionary, if any. */ -+ for (unsigned short idx = ++miterator->current_idx; -+ idx < miterator->mdict->n_allocated_dictionaries; ++idx) -+ { -+ result -+ = dict_iter_match_first (miterator->mdict->dictionaries[idx], -+ name, &miterator->iterator); -+ if (result != nullptr) -+ { -+ miterator->current_idx = idx; -+ return result; -+ } -+ } -+ -+ return nullptr; -+} -+ -+/* See dictionary.h. */ -+ -+int -+mdict_size (const struct multidictionary *mdict) -+{ -+ int size = 0; -+ -+ for (unsigned short idx = 0; idx < mdict->n_allocated_dictionaries; ++idx) -+ size += dict_size (mdict->dictionaries[idx]); -+ -+ return size; -+} -+ -+/* See dictionary.h. */ -+ -+bool -+mdict_empty (const struct multidictionary *mdict) -+{ -+ for (unsigned short idx = 0; idx < mdict->n_allocated_dictionaries; ++idx) -+ { -+ if (!dict_empty (mdict->dictionaries[idx])) -+ return false; -+ } -+ -+ return true; -+} -diff --git a/gdb/dictionary.h b/gdb/dictionary.h ---- a/gdb/dictionary.h -+++ b/gdb/dictionary.h -@@ -113,6 +113,21 @@ struct dict_iterator - struct symbol *current; - }; - -+/* The multi-language dictionary iterator. Like dict_iterator above, -+ these contents should be considered private. */ -+ -+struct mdict_iterator -+{ -+ /* The multidictionary with whcih this iterator is associated. */ -+ const struct multidictionary *mdict; -+ -+ /* The iterator used to iterate through individual dictionaries. */ -+ struct dict_iterator iterator; -+ -+ /* The current index of the dictionary being iterated over. */ -+ unsigned short current_idx; -+}; -+ - /* Initialize ITERATOR to point at the first symbol in DICT, and - return that first symbol, or NULL if DICT is empty. */ - diff --git a/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-2of5.patch b/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-2of5.patch deleted file mode 100644 index f86ce0b5da6d336935b429fbdc7b91451615f61a..0000000000000000000000000000000000000000 --- a/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-2of5.patch +++ /dev/null @@ -1,644 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Sergio Durigan Junior -Date: Fri, 11 Jan 2019 11:25:11 -0500 -Subject: - gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-2of5.patch - -;; Fix 'Assertion `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' failed.' -;; Keith Seitz, RHBZ#1560010. - -gdb/23712: Use new multidictionary API - -This patch builds on the previous by enabling the `new' multidictionary -API. A lot of the hunks are simply textual replacements of "dict_" -with "mdict_" and similar transformations. - -A word of warning, even with the use of multidictionaries, the code -still does not satisfactorily fix the reported problems with gdb/23712 -(or gdb/23010). We still have additional changes to make before that -happens. - -gdb/ChangeLog: - - PR gdb/23712 - PR symtab/23010 - * dictionary.h (struct dictionary): Replace declaration with - multidictionary. - (dict_create_hashed, dict_create_hashed_expandable) - (dict_create_linear, dict_create_linear_expandable) - (dict_free, dict_add_symbol, dict_add_pending, dict_empty) - (dict_iterator_first, dict_iterator_next, dict_iter_match_first) - (dict_iter_match_next, dict_size): Rename to "mdict_" versions - taking multidictionary argument. - [ALL_DICT_SYMBOLS]: Update for multidictionary. - * block.h (struct block) : Change to multidictionary - and rename `multidict'. - * block.c, buildsym.c, jit.c, mdebugread.c, objfiles.c, - symmisc.c: Update all dictionary references to multidictionary. - -diff --git a/gdb/block.c b/gdb/block.c ---- a/gdb/block.c -+++ b/gdb/block.c -@@ -387,9 +387,9 @@ block_global_block (const struct block *block) - zero/NULL. This is useful for creating "dummy" blocks that don't - correspond to actual source files. - -- Warning: it sets the block's BLOCK_DICT to NULL, which isn't a -+ Warning: it sets the block's BLOCK_MULTIDICT to NULL, which isn't a - valid value. If you really don't want the block to have a -- dictionary, then you should subsequently set its BLOCK_DICT to -+ dictionary, then you should subsequently set its BLOCK_MULTIDICT to - dict_create_linear (obstack, NULL). */ - - struct block * -@@ -544,10 +544,11 @@ block_iterator_step (struct block_iterator *iterator, int first) - - block = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), - iterator->which); -- sym = dict_iterator_first (BLOCK_DICT (block), &iterator->dict_iter); -+ sym = mdict_iterator_first (BLOCK_MULTIDICT (block), -+ &iterator->mdict_iter); - } - else -- sym = dict_iterator_next (&iterator->dict_iter); -+ sym = mdict_iterator_next (&iterator->mdict_iter); - - if (sym != NULL) - return sym; -@@ -569,7 +570,7 @@ block_iterator_first (const struct block *block, - initialize_block_iterator (block, iterator); - - if (iterator->which == FIRST_LOCAL_BLOCK) -- return dict_iterator_first (block->dict, &iterator->dict_iter); -+ return mdict_iterator_first (block->multidict, &iterator->mdict_iter); - - return block_iterator_step (iterator, 1); - } -@@ -580,7 +581,7 @@ struct symbol * - block_iterator_next (struct block_iterator *iterator) - { - if (iterator->which == FIRST_LOCAL_BLOCK) -- return dict_iterator_next (&iterator->dict_iter); -+ return mdict_iterator_next (&iterator->mdict_iter); - - return block_iterator_step (iterator, 0); - } -@@ -612,11 +613,11 @@ block_iter_match_step (struct block_iterator *iterator, - - block = BLOCKVECTOR_BLOCK (COMPUNIT_BLOCKVECTOR (cust), - iterator->which); -- sym = dict_iter_match_first (BLOCK_DICT (block), name, -- &iterator->dict_iter); -+ sym = mdict_iter_match_first (BLOCK_MULTIDICT (block), name, -+ &iterator->mdict_iter); - } - else -- sym = dict_iter_match_next (name, &iterator->dict_iter); -+ sym = mdict_iter_match_next (name, &iterator->mdict_iter); - - if (sym != NULL) - return sym; -@@ -639,7 +640,8 @@ block_iter_match_first (const struct block *block, - initialize_block_iterator (block, iterator); - - if (iterator->which == FIRST_LOCAL_BLOCK) -- return dict_iter_match_first (block->dict, name, &iterator->dict_iter); -+ return mdict_iter_match_first (block->multidict, name, -+ &iterator->mdict_iter); - - return block_iter_match_step (iterator, name, 1); - } -@@ -651,7 +653,7 @@ block_iter_match_next (const lookup_name_info &name, - struct block_iterator *iterator) - { - if (iterator->which == FIRST_LOCAL_BLOCK) -- return dict_iter_match_next (name, &iterator->dict_iter); -+ return mdict_iter_match_next (name, &iterator->mdict_iter); - - return block_iter_match_step (iterator, name, 0); - } -@@ -731,7 +733,7 @@ block_lookup_symbol_primary (const struct block *block, const char *name, - const domain_enum domain) - { - struct symbol *sym, *other; -- struct dict_iterator dict_iter; -+ struct mdict_iterator mdict_iter; - - lookup_name_info lookup_name (name, symbol_name_match_type::FULL); - -@@ -740,9 +742,10 @@ block_lookup_symbol_primary (const struct block *block, const char *name, - || BLOCK_SUPERBLOCK (BLOCK_SUPERBLOCK (block)) == NULL); - - other = NULL; -- for (sym = dict_iter_match_first (block->dict, lookup_name, &dict_iter); -+ for (sym -+ = mdict_iter_match_first (block->multidict, lookup_name, &mdict_iter); - sym != NULL; -- sym = dict_iter_match_next (lookup_name, &dict_iter)) -+ sym = mdict_iter_match_next (lookup_name, &mdict_iter)) - { - if (SYMBOL_DOMAIN (sym) == domain) - return sym; -diff --git a/gdb/block.h b/gdb/block.h ---- a/gdb/block.h -+++ b/gdb/block.h -@@ -111,7 +111,7 @@ struct block - - /* This is used to store the symbols in the block. */ - -- struct dictionary *dict; -+ struct multidictionary *multidict; - - /* Contains information about namespace-related info relevant to this block: - using directives and the current namespace scope. */ -@@ -143,7 +143,7 @@ struct global_block - #define BLOCK_END(bl) (bl)->endaddr - #define BLOCK_FUNCTION(bl) (bl)->function - #define BLOCK_SUPERBLOCK(bl) (bl)->superblock --#define BLOCK_DICT(bl) (bl)->dict -+#define BLOCK_MULTIDICT(bl) (bl)->multidict - #define BLOCK_NAMESPACE(bl) (bl)->namespace_info - - /* Accessor for ranges field within block BL. */ -@@ -298,9 +298,9 @@ struct block_iterator - - enum block_enum which; - -- /* The underlying dictionary iterator. */ -+ /* The underlying multidictionary iterator. */ - -- struct dict_iterator dict_iter; -+ struct mdict_iterator mdict_iter; - }; - - /* Initialize ITERATOR to point at the first symbol in BLOCK, and -diff --git a/gdb/buildsym.c b/gdb/buildsym.c ---- a/gdb/buildsym.c -+++ b/gdb/buildsym.c -@@ -349,23 +349,21 @@ finish_block_internal (struct symbol *symbol, - - if (symbol) - { -- BLOCK_DICT (block) -- = dict_create_linear (&objfile->objfile_obstack, -- buildsym_compunit->language, *listhead); -+ BLOCK_MULTIDICT (block) -+ = mdict_create_linear (&objfile->objfile_obstack, *listhead); - } - else - { - if (expandable) - { -- BLOCK_DICT (block) -- = dict_create_hashed_expandable (buildsym_compunit->language); -- dict_add_pending (BLOCK_DICT (block), *listhead); -+ BLOCK_MULTIDICT (block) -+ = mdict_create_hashed_expandable (buildsym_compunit->language); -+ mdict_add_pending (BLOCK_MULTIDICT (block), *listhead); - } - else - { -- BLOCK_DICT (block) = -- dict_create_hashed (&objfile->objfile_obstack, -- buildsym_compunit->language, *listhead); -+ BLOCK_MULTIDICT (block) = -+ mdict_create_hashed (&objfile->objfile_obstack, *listhead); - } - } - -@@ -377,7 +375,7 @@ finish_block_internal (struct symbol *symbol, - if (symbol) - { - struct type *ftype = SYMBOL_TYPE (symbol); -- struct dict_iterator iter; -+ struct mdict_iterator miter; - SYMBOL_BLOCK_VALUE (symbol) = block; - BLOCK_FUNCTION (block) = symbol; - -@@ -391,7 +389,7 @@ finish_block_internal (struct symbol *symbol, - - /* Here we want to directly access the dictionary, because - we haven't fully initialized the block yet. */ -- ALL_DICT_SYMBOLS (BLOCK_DICT (block), iter, sym) -+ ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (block), miter, sym) - { - if (SYMBOL_IS_ARGUMENT (sym)) - nparams++; -@@ -405,7 +403,7 @@ finish_block_internal (struct symbol *symbol, - iparams = 0; - /* Here we want to directly access the dictionary, because - we haven't fully initialized the block yet. */ -- ALL_DICT_SYMBOLS (BLOCK_DICT (block), iter, sym) -+ ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (block), miter, sym) - { - if (iparams == nparams) - break; -@@ -1448,7 +1446,7 @@ end_symtab_with_blockvector (struct block *static_block, - { - struct block *block = BLOCKVECTOR_BLOCK (blockvector, block_i); - struct symbol *sym; -- struct dict_iterator iter; -+ struct mdict_iterator miter; - - /* Inlined functions may have symbols not in the global or - static symbol lists. */ -@@ -1459,7 +1457,7 @@ end_symtab_with_blockvector (struct block *static_block, - /* Note that we only want to fix up symbols from the local - blocks, not blocks coming from included symtabs. That is why - we use ALL_DICT_SYMBOLS here and not ALL_BLOCK_SYMBOLS. */ -- ALL_DICT_SYMBOLS (BLOCK_DICT (block), iter, sym) -+ ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (block), miter, sym) - if (symbol_symtab (sym) == NULL) - symbol_set_symtab (sym, symtab); - } -@@ -1598,7 +1596,7 @@ augment_type_symtab (void) - to the primary symtab. */ - set_missing_symtab (file_symbols, cust); - -- dict_add_pending (BLOCK_DICT (block), file_symbols); -+ mdict_add_pending (BLOCK_MULTIDICT (block), file_symbols); - } - - if (global_symbols != NULL) -@@ -1609,7 +1607,7 @@ augment_type_symtab (void) - to the primary symtab. */ - set_missing_symtab (global_symbols, cust); - -- dict_add_pending (BLOCK_DICT (block), global_symbols); -+ mdict_add_pending (BLOCK_MULTIDICT (block), global_symbols); - } - - reset_symtab_globals (); -diff --git a/gdb/dictionary.h b/gdb/dictionary.h ---- a/gdb/dictionary.h -+++ b/gdb/dictionary.h -@@ -25,10 +25,10 @@ - - #include "symfile.h" - --/* An opaque type for dictionaries; only dictionary.c should know -- about its innards. */ -+/* An opaque type for multi-language dictionaries; only dictionary.c should -+ know about its innards. */ - --struct dictionary; -+struct multidictionary; - - /* Other types needed for declarations. */ - -@@ -38,65 +38,64 @@ struct pending; - struct language_defn; - - /* The creation functions for various implementations of -- dictionaries. */ -+ multi-language dictionaries. */ - --/* Create a dictionary of symbols of language LANGUAGE implemented via -+/* Create a multi-language dictionary of symbols implemented via - a fixed-size hashtable. All memory it uses is allocated on - OBSTACK; the environment is initialized from SYMBOL_LIST. */ - --extern struct dictionary *dict_create_hashed (struct obstack *obstack, -- enum language language, -- const struct pending -- *symbol_list); -+extern struct multidictionary * -+ mdict_create_hashed (struct obstack *obstack, -+ const struct pending *symbol_list); - --/* Create a dictionary of symbols of language LANGUAGE, implemented -- via a hashtable that grows as necessary. The dictionary is -- initially empty; to add symbols to it, call dict_add_symbol(). -- Call dict_free() when you're done with it. */ -+/* Create a multi-language dictionary of symbols, implemented -+ via a hashtable that grows as necessary. The initial dictionary of -+ LANGUAGE is empty; to add symbols to it, call mdict_add_symbol(). -+ Call mdict_free() when you're done with it. */ - --extern struct dictionary * -- dict_create_hashed_expandable (enum language language); -+extern struct multidictionary * -+ mdict_create_hashed_expandable (enum language language); - --/* Create a dictionary of symbols of language LANGUAGE, implemented -+/* Create a multi-language dictionary of symbols, implemented - via a fixed-size array. All memory it uses is allocated on - OBSTACK; the environment is initialized from the SYMBOL_LIST. The - symbols are ordered in the same order that they're found in - SYMBOL_LIST. */ - --extern struct dictionary *dict_create_linear (struct obstack *obstack, -- enum language language, -- const struct pending -- *symbol_list); -+extern struct multidictionary * -+ mdict_create_linear (struct obstack *obstack, -+ const struct pending *symbol_list); - --/* Create a dictionary of symbols of language LANGUAGE, implemented -- via an array that grows as necessary. The dictionary is initially -- empty; to add symbols to it, call dict_add_symbol(). Call -- dict_free() when you're done with it. */ -+/* Create a multi-language dictionary of symbols, implemented -+ via an array that grows as necessary. The multidictionary initially -+ contains a single empty dictionary of LANGUAGE; to add symbols to it, -+ call mdict_add_symbol(). Call mdict_free() when you're done with it. */ - --extern struct dictionary * -- dict_create_linear_expandable (enum language language); -+extern struct multidictionary * -+ mdict_create_linear_expandable (enum language language); - --/* The functions providing the interface to dictionaries. Note that -- the most common parts of the interface, namely symbol lookup, are -- only provided via iterator functions. */ -+/* The functions providing the interface to multi-language dictionaries. -+ Note that the most common parts of the interface, namely symbol lookup, -+ are only provided via iterator functions. */ - --/* Free the memory used by a dictionary that's not on an obstack. (If -+/* Free the memory used by a multidictionary that's not on an obstack. (If - any.) */ - --extern void dict_free (struct dictionary *dict); -+extern void mdict_free (struct multidictionary *mdict); - --/* Add a symbol to an expandable dictionary. */ -+/* Add a symbol to an expandable multidictionary. */ - --extern void dict_add_symbol (struct dictionary *dict, struct symbol *sym); -+extern void mdict_add_symbol (struct multidictionary *mdict, -+ struct symbol *sym); - --/* Utility to add a list of symbols to a dictionary. */ -+/* Utility to add a list of symbols to a multidictionary. */ - --extern void dict_add_pending (struct dictionary *dict, -- const struct pending *symbol_list); -+extern void mdict_add_pending (struct multidictionary *mdict, -+ const struct pending *symbol_list); - --/* Is the dictionary empty? */ -+/* Is the multidictionary empty? */ - --extern int dict_empty (struct dictionary *dict); -+extern int mdict_empty (struct multidictionary *mdict); - - /* A type containing data that is used when iterating over all symbols - in a dictionary. Don't ever look at its innards; this type would -@@ -128,44 +127,46 @@ struct mdict_iterator - unsigned short current_idx; - }; - --/* Initialize ITERATOR to point at the first symbol in DICT, and -- return that first symbol, or NULL if DICT is empty. */ -+/* Initialize ITERATOR to point at the first symbol in MDICT, and -+ return that first symbol, or NULL if MDICT is empty. */ - --extern struct symbol *dict_iterator_first (const struct dictionary *dict, -- struct dict_iterator *iterator); -+extern struct symbol * -+ mdict_iterator_first (const struct multidictionary *mdict, -+ struct mdict_iterator *miterator); - --/* Advance ITERATOR, and return the next symbol, or NULL if there are -+/* Advance MITERATOR, and return the next symbol, or NULL if there are - no more symbols. Don't call this if you've previously received -- NULL from dict_iterator_first or dict_iterator_next on this -+ NULL from mdict_iterator_first or mdict_iterator_next on this - iteration. */ - --extern struct symbol *dict_iterator_next (struct dict_iterator *iterator); -+extern struct symbol *mdict_iterator_next (struct mdict_iterator *miterator); - --/* Initialize ITERATOR to point at the first symbol in DICT whose -+/* Initialize MITERATOR to point at the first symbol in MDICT whose - SYMBOL_SEARCH_NAME is NAME, as tested using COMPARE (which must use - the same conventions as strcmp_iw and be compatible with any - dictionary hashing function), and return that first symbol, or NULL - if there are no such symbols. */ - --extern struct symbol *dict_iter_match_first (const struct dictionary *dict, -- const lookup_name_info &name, -- struct dict_iterator *iterator); -+extern struct symbol * -+ mdict_iter_match_first (const struct multidictionary *mdict, -+ const lookup_name_info &name, -+ struct mdict_iterator *miterator); - --/* Advance ITERATOR to point at the next symbol in DICT whose -+/* Advance MITERATOR to point at the next symbol in MDICT whose - SYMBOL_SEARCH_NAME is NAME, as tested using COMPARE (see - dict_iter_match_first), or NULL if there are no more such symbols. - Don't call this if you've previously received NULL from -- dict_iterator_match_first or dict_iterator_match_next on this -- iteration. And don't call it unless ITERATOR was created by a -- previous call to dict_iter_match_first with the same NAME and COMPARE. */ -+ mdict_iterator_match_first or mdict_iterator_match_next on this -+ iteration. And don't call it unless MITERATOR was created by a -+ previous call to mdict_iter_match_first with the same NAME and COMPARE. */ - --extern struct symbol *dict_iter_match_next (const lookup_name_info &name, -- struct dict_iterator *iterator); -+extern struct symbol *mdict_iter_match_next (const lookup_name_info &name, -+ struct mdict_iterator *miterator); - --/* Return some notion of the size of the dictionary: the number of -+/* Return some notion of the size of the multidictionary: the number of - symbols if we have that, the number of hash buckets otherwise. */ - --extern int dict_size (const struct dictionary *dict); -+extern int mdict_size (const struct multidictionary *mdict); - - /* Macro to loop through all symbols in a dictionary DICT, in no - particular order. ITER is a struct dict_iterator (NOTE: __not__ a -@@ -175,8 +176,8 @@ extern int dict_size (const struct dictionary *dict); - early by a break if you desire. */ - - #define ALL_DICT_SYMBOLS(dict, iter, sym) \ -- for ((sym) = dict_iterator_first ((dict), &(iter)); \ -+ for ((sym) = mdict_iterator_first ((dict), &(iter)); \ - (sym); \ -- (sym) = dict_iterator_next (&(iter))) -+ (sym) = mdict_iterator_next (&(iter))) - - #endif /* DICTIONARY_H */ -diff --git a/gdb/jit.c b/gdb/jit.c ---- a/gdb/jit.c -+++ b/gdb/jit.c -@@ -651,14 +651,12 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) - size_t blockvector_size; - CORE_ADDR begin, end; - struct blockvector *bv; -- enum language language; - - actual_nblocks = FIRST_LOCAL_BLOCK + stab->nblocks; - - cust = allocate_compunit_symtab (objfile, stab->file_name); - allocate_symtab (cust, stab->file_name); - add_compunit_symtab_to_objfile (cust); -- language = compunit_language (cust); - - /* JIT compilers compile in memory. */ - COMPUNIT_DIRNAME (cust) = NULL; -@@ -702,8 +700,8 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) - TARGET_CHAR_BIT, - "void"); - -- BLOCK_DICT (new_block) = dict_create_linear (&objfile->objfile_obstack, -- language, NULL); -+ BLOCK_MULTIDICT (new_block) -+ = mdict_create_linear (&objfile->objfile_obstack, NULL); - /* The address range. */ - BLOCK_START (new_block) = (CORE_ADDR) gdb_block_iter->begin; - BLOCK_END (new_block) = (CORE_ADDR) gdb_block_iter->end; -@@ -740,8 +738,8 @@ finalize_symtab (struct gdb_symtab *stab, struct objfile *objfile) - new_block = (i == GLOBAL_BLOCK - ? allocate_global_block (&objfile->objfile_obstack) - : allocate_block (&objfile->objfile_obstack)); -- BLOCK_DICT (new_block) = dict_create_linear (&objfile->objfile_obstack, -- language, NULL); -+ BLOCK_MULTIDICT (new_block) -+ = mdict_create_linear (&objfile->objfile_obstack, NULL); - BLOCK_SUPERBLOCK (new_block) = block_iter; - block_iter = new_block; - -diff --git a/gdb/mdebugread.c b/gdb/mdebugread.c ---- a/gdb/mdebugread.c -+++ b/gdb/mdebugread.c -@@ -4534,7 +4534,7 @@ static void - add_symbol (struct symbol *s, struct symtab *symtab, struct block *b) - { - symbol_set_symtab (s, symtab); -- dict_add_symbol (BLOCK_DICT (b), s); -+ mdict_add_symbol (BLOCK_MULTIDICT (b), s); - } - - /* Add a new block B to a symtab S. */ -@@ -4762,7 +4762,7 @@ new_bvect (int nblocks) - } - - /* Allocate and zero a new block of language LANGUAGE, and set its -- BLOCK_DICT. If function is non-zero, assume the block is -+ BLOCK_MULTIDICT. If function is non-zero, assume the block is - associated to a function, and make sure that the symbols are stored - linearly; otherwise, store them hashed. */ - -@@ -4775,9 +4775,9 @@ new_block (enum block_type type, enum language language) - struct block *retval = XCNEW (struct block); - - if (type == FUNCTION_BLOCK) -- BLOCK_DICT (retval) = dict_create_linear_expandable (language); -+ BLOCK_MULTIDICT (retval) = mdict_create_linear_expandable (language); - else -- BLOCK_DICT (retval) = dict_create_hashed_expandable (language); -+ BLOCK_MULTIDICT (retval) = mdict_create_hashed_expandable (language); - - return retval; - } -diff --git a/gdb/objfiles.c b/gdb/objfiles.c ---- a/gdb/objfiles.c -+++ b/gdb/objfiles.c -@@ -813,40 +813,40 @@ objfile_relocate1 (struct objfile *objfile, - } - - ALL_OBJFILE_COMPUNITS (objfile, cust) -- { -- const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (cust); -- int block_line_section = COMPUNIT_BLOCK_LINE_SECTION (cust); -- -- if (BLOCKVECTOR_MAP (bv)) -- addrmap_relocate (BLOCKVECTOR_MAP (bv), -- ANOFFSET (delta, block_line_section)); -- -- for (i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i) -- { -- struct block *b; -- struct symbol *sym; -- struct dict_iterator iter; -- -- b = BLOCKVECTOR_BLOCK (bv, i); -- BLOCK_START (b) += ANOFFSET (delta, block_line_section); -- BLOCK_END (b) += ANOFFSET (delta, block_line_section); -- -- if (BLOCK_RANGES (b) != nullptr) -- for (int j = 0; j < BLOCK_NRANGES (b); j++) -+ { -+ const struct blockvector *bv = COMPUNIT_BLOCKVECTOR (cust); -+ int block_line_section = COMPUNIT_BLOCK_LINE_SECTION (cust); -+ -+ if (BLOCKVECTOR_MAP (bv)) -+ addrmap_relocate (BLOCKVECTOR_MAP (bv), -+ ANOFFSET (delta, block_line_section)); -+ -+ for (int i = 0; i < BLOCKVECTOR_NBLOCKS (bv); ++i) -+ { -+ struct block *b; -+ struct symbol *sym; -+ struct mdict_iterator miter; -+ -+ b = BLOCKVECTOR_BLOCK (bv, i); -+ BLOCK_START (b) += ANOFFSET (delta, block_line_section); -+ BLOCK_END (b) += ANOFFSET (delta, block_line_section); -+ -+ if (BLOCK_RANGES (b) != nullptr) -+ for (int j = 0; j < BLOCK_NRANGES (b); j++) -+ { -+ BLOCK_RANGE_START (b, j) -+ += ANOFFSET (delta, block_line_section); -+ BLOCK_RANGE_END (b, j) += ANOFFSET (delta, block_line_section); -+ } -+ -+ /* We only want to iterate over the local symbols, not any -+ symbols in included symtabs. */ -+ ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b), miter, sym) - { -- BLOCK_RANGE_START (b, j) -- += ANOFFSET (delta, block_line_section); -- BLOCK_RANGE_END (b, j) += ANOFFSET (delta, block_line_section); -+ relocate_one_symbol (sym, objfile, delta); - } -- -- /* We only want to iterate over the local symbols, not any -- symbols in included symtabs. */ -- ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym) -- { -- relocate_one_symbol (sym, objfile, delta); -- } -- } -- } -+ } -+ } - } - - /* Relocate isolated symbols. */ -diff --git a/gdb/symmisc.c b/gdb/symmisc.c ---- a/gdb/symmisc.c -+++ b/gdb/symmisc.c -@@ -275,7 +275,7 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile) - struct objfile *objfile = SYMTAB_OBJFILE (symtab); - struct gdbarch *gdbarch = get_objfile_arch (objfile); - int i; -- struct dict_iterator iter; -+ struct mdict_iterator miter; - int len; - struct linetable *l; - const struct blockvector *bv; -@@ -331,7 +331,7 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile) - even if we're using a hashtable, but nothing else but this message - wants it. */ - fprintf_filtered (outfile, ", %d syms/buckets in ", -- dict_size (BLOCK_DICT (b))); -+ mdict_size (BLOCK_MULTIDICT (b))); - fputs_filtered (paddress (gdbarch, BLOCK_START (b)), outfile); - fprintf_filtered (outfile, ".."); - fputs_filtered (paddress (gdbarch, BLOCK_END (b)), outfile); -@@ -349,7 +349,7 @@ dump_symtab_1 (struct symtab *symtab, struct ui_file *outfile) - /* Now print each symbol in this block (in no particular order, if - we're using a hashtable). Note that we only want this - block, not any blocks from included symtabs. */ -- ALL_DICT_SYMBOLS (BLOCK_DICT (b), iter, sym) -+ ALL_DICT_SYMBOLS (BLOCK_MULTIDICT (b), miter, sym) - { - TRY - { diff --git a/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-3of5.patch b/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-3of5.patch deleted file mode 100644 index 25b8320e0918f44d82bd3c7c2895881d8297ea4b..0000000000000000000000000000000000000000 --- a/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-3of5.patch +++ /dev/null @@ -1,232 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Sergio Durigan Junior -Date: Fri, 11 Jan 2019 11:26:59 -0500 -Subject: - gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-3of5.patch - -;; Fix 'Assertion `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' failed.' -;; Keith Seitz, RHBZ#1560010. - -gdb/23712: Cleanup/Remove temporary dictionary functions - -Now that multidictionary's are being used, there is no longer any need -to retain the four temporary functions introduced in the beginning of -this series. - -This patch removes them. - -As an additional cleanup, since the single-language dictionaries are -no longer used outside dictionary.c, make all of those functions -static. - -gdb/ChangeLog: - - PR gdb/23712 - PR symtab/23010 - * dictionary.c (pending_to_vector): Remove. - (dict_create_hashed_1, dict_create_linear_1, dict_add_pending_1): - Remove _1 suffix, replacing functions of the same name. Update - all callers. - (dict_create_hashed, dict_create_hashed_expandable) - (dict_create_linear, dict_create_linear_expandable, dict_free) - (dict_add_symbol, dict_add_pending, dict_size, dict_empty): - Make functions static. - -diff --git a/gdb/dictionary.c b/gdb/dictionary.c ---- a/gdb/dictionary.c -+++ b/gdb/dictionary.c -@@ -342,31 +342,14 @@ static void insert_symbol_hashed (struct dictionary *dict, - - static void expand_hashtable (struct dictionary *dict); - --/* A function to convert a linked list into a vector. */ -- --static std::vector --pending_to_vector (const struct pending *symbol_list) --{ -- std::vector symlist; -- -- for (const struct pending *list_counter = symbol_list; -- list_counter != nullptr; list_counter = list_counter->next) -- { -- for (int i = list_counter->nsyms - 1; i >= 0; --i) -- symlist.push_back (list_counter->symbol[i]); -- } -- -- return symlist; --} -- - /* The creation functions. */ - --/* A function to transition dict_create_hashed to new API. */ -+/* Create a hashed dictionary of a given language. */ - - static struct dictionary * --dict_create_hashed_1 (struct obstack *obstack, -- enum language language, -- const std::vector &symbol_list) -+dict_create_hashed (struct obstack *obstack, -+ enum language language, -+ const std::vector &symbol_list) - { - /* Allocate the dictionary. */ - struct dictionary *retval = XOBNEW (obstack, struct dictionary); -@@ -388,21 +371,9 @@ dict_create_hashed_1 (struct obstack *obstack, - return retval; - } - --/* See dictionary.h. */ -- --struct dictionary * --dict_create_hashed (struct obstack *obstack, -- enum language language, -- const struct pending *symbol_list) --{ -- std::vector symlist = pending_to_vector (symbol_list); -- -- return dict_create_hashed_1 (obstack, language, symlist); --} -+/* Create an expandable hashed dictionary of a given language. */ - --/* See dictionary.h. */ -- --extern struct dictionary * -+static struct dictionary * - dict_create_hashed_expandable (enum language language) - { - struct dictionary *retval = XNEW (struct dictionary); -@@ -417,12 +388,12 @@ dict_create_hashed_expandable (enum language language) - return retval; - } - --/* A function to transition dict_create_linear to new API. */ -+/* Create a linear dictionary of a given language. */ - - static struct dictionary * --dict_create_linear_1 (struct obstack *obstack, -- enum language language, -- const std::vector &symbol_list) -+dict_create_linear (struct obstack *obstack, -+ enum language language, -+ const std::vector &symbol_list) - { - struct dictionary *retval = XOBNEW (obstack, struct dictionary); - DICT_VECTOR (retval) = &dict_linear_vector; -@@ -442,21 +413,9 @@ dict_create_linear_1 (struct obstack *obstack, - return retval; - } - --/* See dictionary.h. */ -- --struct dictionary * --dict_create_linear (struct obstack *obstack, -- enum language language, -- const struct pending *symbol_list) --{ -- std::vector symlist = pending_to_vector (symbol_list); -- -- return dict_create_linear_1 (obstack, language, symlist); --} -- --/* See dictionary.h. */ -+/* Create an expandable linear dictionary of a given language. */ - --struct dictionary * -+static struct dictionary * - dict_create_linear_expandable (enum language language) - { - struct dictionary *retval = XNEW (struct dictionary); -@@ -476,7 +435,7 @@ dict_create_linear_expandable (enum language language) - /* Free the memory used by a dictionary that's not on an obstack. (If - any.) */ - --void -+static void - dict_free (struct dictionary *dict) - { - (DICT_VECTOR (dict))->free (dict); -@@ -484,34 +443,24 @@ dict_free (struct dictionary *dict) - - /* Add SYM to DICT. DICT had better be expandable. */ - --void -+static void - dict_add_symbol (struct dictionary *dict, struct symbol *sym) - { - (DICT_VECTOR (dict))->add_symbol (dict, sym); - } - --/* A function to transition dict_add_pending to new API. */ -+/* Utility to add a list of symbols to a dictionary. -+ DICT must be an expandable dictionary. */ - - static void --dict_add_pending_1 (struct dictionary *dict, -- const std::vector &symbol_list) -+dict_add_pending (struct dictionary *dict, -+ const std::vector &symbol_list) - { - /* Preserve ordering by reversing the list. */ - for (auto sym = symbol_list.rbegin (); sym != symbol_list.rend (); ++sym) - dict_add_symbol (dict, *sym); - } - --/* Utility to add a list of symbols to a dictionary. -- DICT must be an expandable dictionary. */ -- --void --dict_add_pending (struct dictionary *dict, const struct pending *symbol_list) --{ -- std::vector symlist = pending_to_vector (symbol_list); -- -- dict_add_pending_1 (dict, symlist); --} -- - /* Initialize ITERATOR to point at the first symbol in DICT, and - return that first symbol, or NULL if DICT is empty. */ - -@@ -548,7 +497,7 @@ dict_iter_match_next (const lookup_name_info &name, - ->iter_match_next (name, iterator); - } - --int -+static int - dict_size (const struct dictionary *dict) - { - return (DICT_VECTOR (dict))->size (dict); -@@ -560,7 +509,7 @@ dict_size (const struct dictionary *dict) - - /* Test to see if DICT is empty. */ - --int -+static int - dict_empty (struct dictionary *dict) - { - struct dict_iterator iter; -@@ -1019,7 +968,7 @@ mdict_create_hashed (struct obstack *obstack, - std::vector symlist = pair.second; - - retval->dictionaries[idx++] -- = dict_create_hashed_1 (obstack, language, symlist); -+ = dict_create_hashed (obstack, language, symlist); - } - - return retval; -@@ -1064,7 +1013,7 @@ mdict_create_linear (struct obstack *obstack, - std::vector symlist = pair.second; - - retval->dictionaries[idx++] -- = dict_create_linear_1 (obstack, language, symlist); -+ = dict_create_linear (obstack, language, symlist); - } - - return retval; -@@ -1210,7 +1159,7 @@ mdict_add_pending (struct multidictionary *mdict, - dict = create_new_language_dictionary (mdict, language); - } - -- dict_add_pending_1 (dict, symlist); -+ dict_add_pending (dict, symlist); - } - } - diff --git a/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-4of5.patch b/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-4of5.patch deleted file mode 100644 index 354c494669b85d92e3df3481e51c1b2b44806b27..0000000000000000000000000000000000000000 --- a/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-4of5.patch +++ /dev/null @@ -1,90 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Sergio Durigan Junior -Date: Fri, 11 Jan 2019 11:29:25 -0500 -Subject: - gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-4of5.patch - -;; Fix 'Assertion `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' failed.' -;; Keith Seitz, RHBZ#1560010. - -gdb/23712: Remove dw2_add_symbol_to_list - -Finally, we can remove dw2_add_symbol_to_list since the wrapper function -originally introduced to catch this multi-language scenario is no longer -needed. With multi-language dictionaries, we can now support adding -symbols of multiple languages, negating the need for the assertion -entirely. - -This patch should now fix gdb/23712 (and symtab/23010). At least it will -if the NULL buildsym_compunit problem doesn't strike first (see gdb/23773). - -gdb/ChangeLog: - - PR gdb/23712 - PR symtab/23010 - * dwarf2read.c (dw2_add_symbol_to_list): Remove. - (fixup_go_packaging, new_symbol): Use add_symbol_to_list. - -diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c ---- a/gdb/dwarf2read.c -+++ b/gdb/dwarf2read.c -@@ -9715,23 +9715,6 @@ compute_delayed_physnames (struct dwarf2_cu *cu) - cu->method_list.clear (); - } - --/* A wrapper for add_symbol_to_list to ensure that SYMBOL's language is -- the same as all other symbols in LISTHEAD. If a new symbol is added -- with a different language, this function asserts. */ -- --static inline void --dw2_add_symbol_to_list (struct symbol *symbol, struct pending **listhead) --{ -- /* Only assert if LISTHEAD already contains symbols of a different -- language (dict_create_hashed/insert_symbol_hashed requires that all -- symbols in this list are of the same language). */ -- gdb_assert ((*listhead) == NULL -- || (SYMBOL_LANGUAGE ((*listhead)->symbol[0]) -- == SYMBOL_LANGUAGE (symbol))); -- -- add_symbol_to_list (symbol, listhead); --} -- - /* Go objects should be embedded in a DW_TAG_module DIE, - and it's not clear if/how imported objects will appear. - To keep Go support simple until that's worked out, -@@ -9803,7 +9786,7 @@ fixup_go_packaging (struct dwarf2_cu *cu) - SYMBOL_ACLASS_INDEX (sym) = LOC_TYPEDEF; - SYMBOL_TYPE (sym) = type; - -- dw2_add_symbol_to_list (sym, &global_symbols); -+ add_symbol_to_list (sym, &global_symbols); - - xfree (package_name); - } -@@ -21387,7 +21370,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, - SYMBOL_TYPE (sym) = objfile_type (objfile)->builtin_core_addr; - SYMBOL_DOMAIN (sym) = LABEL_DOMAIN; - SYMBOL_ACLASS_INDEX (sym) = LOC_LABEL; -- dw2_add_symbol_to_list (sym, cu->list_in_scope); -+ add_symbol_to_list (sym, cu->list_in_scope); - break; - case DW_TAG_subprogram: - /* SYMBOL_BLOCK_VALUE (sym) will be filled in later by -@@ -21645,7 +21628,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, - case DW_TAG_common_block: - SYMBOL_ACLASS_INDEX (sym) = LOC_COMMON_BLOCK; - SYMBOL_DOMAIN (sym) = COMMON_BLOCK_DOMAIN; -- dw2_add_symbol_to_list (sym, cu->list_in_scope); -+ add_symbol_to_list (sym, cu->list_in_scope); - break; - default: - /* Not a tag we recognize. Hopefully we aren't processing -@@ -21665,7 +21648,7 @@ new_symbol (struct die_info *die, struct type *type, struct dwarf2_cu *cu, - } - - if (list_to_add != NULL) -- dw2_add_symbol_to_list (sym, list_to_add); -+ add_symbol_to_list (sym, list_to_add); - - /* For the benefit of old versions of GCC, check for anonymous - namespaces based on the demangled name. */ diff --git a/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-5of5.patch b/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-5of5.patch deleted file mode 100644 index 959b57769e697b3d387d157394c251f10377f21e..0000000000000000000000000000000000000000 --- a/gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-5of5.patch +++ /dev/null @@ -1,183 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Sergio Durigan Junior -Date: Fri, 11 Jan 2019 11:31:59 -0500 -Subject: - gdb-rhbz1560010-fix-assertion-symbol-language-dict-language-5of5.patch - -;; Fix 'Assertion `SYMBOL_LANGUAGE (sym) == DICT_LANGUAGE (dict)->la_language' failed.' -;; Keith Seitz, RHBZ#1560010. - -gdb/23712: Test case for multidictionary - -This is a test derived from one of the reproducers in symtab/23010. -The DIE tree used here is typical of compilations with LTO, where an -artificial parent DIE of language C99 imports DIEs of other languages. - -gdb/testsuite/ChangeLog: - - PR gdb/23712 - PR symtab/23010 - * gdb.dwarf2/multidictionary.exp: New file. - -diff --git a/gdb/testsuite/gdb.dwarf2/multidictionary.exp b/gdb/testsuite/gdb.dwarf2/multidictionary.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/multidictionary.exp -@@ -0,0 +1,157 @@ -+# Copyright 2019 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 . -+ -+# A test of multi-language dictionaries, a solution to symtab/23010 et al. -+ -+load_lib dwarf.exp -+ -+# This test can only be run on targets which support DWARF. -+if {![dwarf2_support]} { -+ return 0 -+} -+ -+standard_testfile main.c .S -+ -+# Create the DWARF. This is derived from the reproducer in the bug -+# mentioned above. This DIE tree is typical of compilations wtih -+# LTO enabled. -+ -+set asm_file [standard_output_file $srcfile2] -+Dwarf::assemble $asm_file { -+ declare_labels D45d9 D5079 D5080 D50a9 D50af D5ab2 D5ac2 D5ace D5acf -+ declare_labels D2135f D2216a D22171 D226c4 D226ca D244ca \ -+ D245da D245e6 -+ declare_labels D41c21 D42025 D42045 D42038 D42045 D420b5 -+ -+ cu {} { -+ D45d9: compile_unit { -+ {language @DW_LANG_C_plus_plus} -+ {name "SerialPortUtils.cpp"} -+ } { -+ D5079: base_type { -+ {byte_size 1 sdata} -+ {encoding @DW_ATE_unsigned} -+ {name "char"} -+ } -+ -+ D5080: const_type { -+ {type :$D5079} -+ } -+ -+ D50a9: pointer_type { -+ {byte_size 4 sdata} -+ {type :$D5080} -+ } -+ -+ D50af: const_type { -+ {type :$D50a9} -+ } -+ -+ D5ab2: subprogram { -+ {external 1 flag} -+ {linkage_name "_Z18SerialSyncWriteStrPKc"} -+ } { -+ D5ac2: formal_parameter { -+ {name "msg"} -+ {type :$D50af} -+ } -+ D5ace: lexical_block {} { -+ D5acf: DW_TAG_variable { -+ {name "p"} -+ {type :$D50a9} -+ } -+ } -+ } -+ } -+ } -+ -+ cu {} { -+ D2135f: compile_unit { -+ {language @DW_LANG_C_plus_plus} -+ {name "Main.cpp"} -+ } { -+ D2216a: base_type { -+ {byte_size 1 sdata} -+ {encoding @DW_ATE_unsigned_char} -+ {name "char"} -+ } -+ -+ D22171: const_type { -+ {type :$D2216a} -+ } -+ -+ D226c4: pointer_type { -+ {byte_size 4 sdata} -+ {type :$D22171} -+ } -+ -+ D226ca: const_type { -+ {type :$D226c4} -+ } -+ -+ D245da: subprogram { -+ {name "PrintPanicMsg"} -+ } { -+ D245e6: formal_parameter { -+ {name "msg"} -+ {type :$D226ca} -+ } -+ } -+ } -+ } -+ -+ cu {} { -+ D41c21: compile_unit { -+ {language @DW_LANG_C99} -+ {name ""} -+ } { -+ D42025: subprogram { -+ {abstract_origin %$D245da} -+ {low_pc 0x80b60 addr} -+ {high_pc 0x6c data4} -+ } { -+ D42038: formal_parameter { -+ {abstract_origin %$D245e6} -+ } -+ -+ D42045: inlined_subroutine { -+ {abstract_origin %$D5ab2} -+ {low_pc 0x8060 addr} -+ {high_pc 0xc data4} -+ } { -+ D420b5: formal_parameter { -+ {abstract_origin %$D5ac2} -+ } -+ } -+ } -+ } -+ } -+} -+ -+# Build the test executable. -+if {[build_executable $testfile.exp $testfile [list $asm_file $srcfile] {}] \ -+ == -1} { -+ return -1 -+} -+ -+# We force the DIEs above to be read in via "-readnow". -+gdb_spawn_with_cmdline_opts "-readnow" -+gdb_load $binfile -+ -+# All we need to do is check whether GDB is alive. Without -+# multidictionaries, it will either crash, assert, or throw an -+# internal_error. -+gdb_test "p 1" "= 1" "GDB is alive" -+ diff --git a/gdb-rhbz1639242-fix-dwarf2_find_containing_comp_unit-binary-search.patch b/gdb-rhbz1639242-fix-dwarf2_find_containing_comp_unit-binary-search.patch deleted file mode 100644 index b56aee15f18f931e877c6c834f740dac8125e01c..0000000000000000000000000000000000000000 --- a/gdb-rhbz1639242-fix-dwarf2_find_containing_comp_unit-binary-search.patch +++ /dev/null @@ -1,176 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Sergio Durigan Junior -Date: Fri, 30 Nov 2018 15:20:27 -0500 -Subject: - gdb-rhbz1639242-fix-dwarf2_find_containing_comp_unit-binary-search.patch - -;; Fix for 'py-bt is broken, results in exception'. -;; RHBZ 1639242 - -Fix dwarf2read.c:dwarf2_find_containing_comp_unit's binary search - -First of all, I would like to express my gratitude to Keith Seitz, Jan -Kratochvil and Tom Tromey, who were really kind and helped a lot with -this bug. The patch itself was authored by Jan. - -This all began with: - - https://bugzilla.redhat.com/show_bug.cgi?id=1639242 - py-bt is broken, results in exception - -In summary, the error reported by the bug above is: - - $ gdb -args python3 - GNU gdb (GDB) Fedora 8.1.1-3.fc28 - (...) - Reading symbols from python3...Reading symbols from /usr/lib/debug/usr/bin/python3.6-3.6.6-1.fc28.x86_64.debug...done. - done. - Dwarf Error: could not find partial DIE containing offset 0x316 [in module /usr/lib/debug/usr/bin/python3.6-3.6.6-1.fc28.x86_64.debug] - -After a long investigation, and after thinking that the problem might -actually be on DWZ's side, we were able to determine that there's -something wrong going on when -dwarf2read.c:dwarf2_find_containing_comp_unit performs a binary search -over all of the CUs belonging to an objfile in order to find the CU -which contains a DIE at an specific offset. The current algorithm is: - - static struct dwarf2_per_cu_data * - dwarf2_find_containing_comp_unit (sect_offset sect_off, - unsigned int offset_in_dwz, - struct dwarf2_per_objfile *dwarf2_per_objfile) - { - struct dwarf2_per_cu_data *this_cu; - int low, high; - const sect_offset *cu_off; - - low = 0; - high = dwarf2_per_objfile->all_comp_units.size () - 1; - while (high > low) - { - struct dwarf2_per_cu_data *mid_cu; - int mid = low + (high - low) / 2; - - mid_cu = dwarf2_per_objfile->all_comp_units[mid]; - cu_off = &mid_cu->sect_off; - if (mid_cu->is_dwz > offset_in_dwz - || (mid_cu->is_dwz == offset_in_dwz && *cu_off >= sect_off)) - high = mid; - else - low = mid + 1; - } - -For the sake of this example, let's consider that "sect_off = -0x7d". - -There are a few important things going on here. First, -"dwarf2_per_objfile->all_comp_units ()" will be sorted first by -whether the CU is a DWZ CU, and then by cu->sect_off. In this -specific bug, "offset_in_dwz" is false, which means that, for the most -part of the loop, we're going to do "high = mid" (i.e, we'll work with -the lower part of the vector). - -In our particular case, when we reach the part where "mid_cu->is_dwz -== offset_in_dwz" (i.e, both are false), we end up with "high = 2" and -"mid = 1". I.e., there are only 2 elements in the vector who are not -DWZ. The vector looks like this: - - #0: cu->sect_off = 0; length = 114; is_dwz = false <-- low - #1: cu->sect_off = 114; length = 7796; is_dwz = false <-- mid - #2: cu->sect_off = 0; length = 28; is_dwz = true <-- high - ... - -The CU we want is #1, which is exactly where "mid" is. Also, #1 is -not DWZ, which is also exactly what we want. So we perform the second -comparison: - - (mid_cu->is_dwz == offset_in_dwz && *cu_off >= sect_off) - ^^^^^^^^^^^^^^^^^^^ - -Because "*cu_off = 114" and "sect_off = 0x7d", this evaluates to -false, so we end up with "low = mid + 1 = 2", which actually gives us -the wrong CU (i.e., a CU that is DWZ). Next in the code, GDB does: - - gdb_assert (low == high); - this_cu = dwarf2_per_objfile->all_comp_units[low]; - cu_off = &this_cu->sect_off; - if (this_cu->is_dwz != offset_in_dwz || *cu_off > sect_off) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - { - if (low == 0 || this_cu->is_dwz != offset_in_dwz) - error (_("Dwarf Error: could not find partial DIE containing " - "offset %s [in module %s]"), - sect_offset_str (sect_off), - bfd_get_filename (dwarf2_per_objfile->objfile->obfd)); - ... - -Triggering the error we saw in the original bug report. - -It's important to notice that we see the error message because the -selected CU is a DWZ one, but we're looking for a non-DWZ CU here. -However, even when the selected CU is *not* a DWZ (and we don't see -any error message), we still end up with the wrong CU. For example, -suppose that the vector had: - - #0: cu->sect_off = 0; length = 114; is_dwz = false - #1: cu->sect_off = 114; length = 7796; is_dwz = false - #2: cu->sect_off = 7910; length = 28; is_dwz = false - ... - -I.e., #2's "is_dwz" is false instead of true. In this case, we still -want #1, because that's where the DIE is located. After the loop ends -up in #2, we have "is_dwz" as false, which is what we wanted, so we -compare offsets. In this case, "7910 >= 0x7d", so we set "mid = high -= 2". Next iteration, we have "mid = 0 + (2 - 0) / 2 = 1", and thus -we examining #1. "is_dwz" is still false, but "114 >= 0x7d" also -evaluates to false, so "low = mid + 1 = 2", which makes the loop stop. -Therefore, we end up choosing #2 as our CU, even though #1 is the -right one. - -The problem here is happening because we're comparing "sect_off" -directly against "*cu_off", while we should actually be comparing -against "*cu_off + mid_cu->length" (i.e., the end offset): - - ... - || (mid_cu->is_dwz == offset_in_dwz - && *cu_off + mid_cu->length >= sect_off)) - ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - ... - -And this is what the patch does. The idea is that if GDB is searching -for an offset that falls above the *end* of the CU being -analyzed (i.e., "mid"), then the next iteration should try a -higher-offset CU next. The previous algorithm was using -the *beginning* of the CU. - -Unfortunately, I could not devise a testcase for this problem, so I am -proposing a fix with this huge explanation attached to it in the hope -that it is sufficient. After talking a bit to Keith (our testcase -guru), it seems that one would have to create an objfile with both DWZ -and non-DWZ sections, which may prove very hard to do, I think. - -I ran this patch on our BuildBot, and no regressions were detected. - -gdb/ChangeLog: -2018-11-30 Jan Kratochvil - Keith Seitz - Tom Tromey - Sergio Durigan Junior - - https://bugzilla.redhat.com/show_bug.cgi?id=1613614 - * dwarf2read.c (dwarf2_find_containing_comp_unit): Add - 'mid_cu->length' to '*cu_off' when checking if 'sect_off' is - inside the CU. - -diff --git a/gdb/dwarf2read.c b/gdb/dwarf2read.c ---- a/gdb/dwarf2read.c -+++ b/gdb/dwarf2read.c -@@ -25039,7 +25039,8 @@ dwarf2_find_containing_comp_unit (sect_offset sect_off, - mid_cu = dwarf2_per_objfile->all_comp_units[mid]; - cu_off = &mid_cu->sect_off; - if (mid_cu->is_dwz > offset_in_dwz -- || (mid_cu->is_dwz == offset_in_dwz && *cu_off >= sect_off)) -+ || (mid_cu->is_dwz == offset_in_dwz -+ && *cu_off + mid_cu->length >= sect_off)) - high = mid; - else - low = mid + 1; diff --git a/gdb-rhbz1653410-avoid-crash-when-calling-warning-too-early.patch b/gdb-rhbz1653410-avoid-crash-when-calling-warning-too-early.patch deleted file mode 100644 index 59bb6984cd572f0b26f0672f430c0f690f774665..0000000000000000000000000000000000000000 --- a/gdb-rhbz1653410-avoid-crash-when-calling-warning-too-early.patch +++ /dev/null @@ -1,145 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Tom Tromey -Date: Fri, 5 Oct 2018 14:54:35 -0600 -Subject: gdb-rhbz1653410-avoid-crash-when-calling-warning-too-early.patch - -;; Fix for 'GDB crashes when running from a deleted directory' -;; (Tom Tromey, RHBZ#1653410) - -Avoid crash when calling warning too early - -I noticed that if you pass the name of an existing file (not a -directory) as the argument to --data-directory, gdb will crash: - - $ ./gdb -nx --data-directory ./gdb - ../../binutils-gdb/gdb/target.c:590:56: runtime error: member call on null pointer of type 'struct target_ops' - -This was later reported as PR gdb/23838. - -This happens because warning ends up calling -target_supports_terminal_ours, which calls current_top_target, which -returns nullptr this early. - -This fixes the problem by handling this case specially in -target_supports_terminal_ours. I also changed -target_supports_terminal_ours to return bool. - -gdb/ChangeLog -2018-11-08 Tom Tromey - - PR gdb/23555: - PR gdb/23838: - * target.h (target_supports_terminal_ours): Return bool. - * target.c (target_supports_terminal_ours): Handle case where - current_top_target returns nullptr. Return bool. - -gdb/testsuite/ChangeLog -2018-11-08 Tom Tromey - - PR gdb/23555: - PR gdb/23838: - * gdb.base/warning.exp: New file. - -diff --git a/gdb/ChangeLog b/gdb/ChangeLog ---- a/gdb/ChangeLog -+++ b/gdb/ChangeLog -@@ -1,3 +1,11 @@ -+2018-11-08 Tom Tromey -+ -+ PR gdb/23555: -+ PR gdb/23838: -+ * target.h (target_supports_terminal_ours): Return bool. -+ * target.c (target_supports_terminal_ours): Handle case where -+ current_top_target returns nullptr. Return bool. -+ - 2018-08-16 Gary Benson - - PR gdb/13000: -diff --git a/gdb/target.c b/gdb/target.c ---- a/gdb/target.c -+++ b/gdb/target.c -@@ -584,10 +584,16 @@ target_terminal::info (const char *arg, int from_tty) - - /* See target.h. */ - --int -+bool - target_supports_terminal_ours (void) - { -- return current_top_target ()->supports_terminal_ours (); -+ /* This can be called before there is any target, so we must check -+ for nullptr here. */ -+ target_ops *top = current_top_target (); -+ -+ if (top == nullptr) -+ return false; -+ return top->supports_terminal_ours (); - } - - static void -diff --git a/gdb/target.h b/gdb/target.h ---- a/gdb/target.h -+++ b/gdb/target.h -@@ -1576,7 +1576,7 @@ extern int target_remove_breakpoint (struct gdbarch *gdbarch, - /* Return true if the target stack has a non-default - "terminal_ours" method. */ - --extern int target_supports_terminal_ours (void); -+extern bool target_supports_terminal_ours (void); - - /* Kill the inferior process. Make it go away. */ - -diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog ---- a/gdb/testsuite/ChangeLog -+++ b/gdb/testsuite/ChangeLog -@@ -1,3 +1,9 @@ -+2018-11-08 Tom Tromey -+ -+ PR gdb/23555: -+ PR gdb/23838: -+ * gdb.base/warning.exp: New file. -+ - 2018-09-04 Gary Benson - - * gdb.base/batch-exit-status.exp: Use gdb_test_multiple and expect -diff --git a/gdb/testsuite/gdb.base/warning.exp b/gdb/testsuite/gdb.base/warning.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/warning.exp -@@ -0,0 +1,36 @@ -+# Copyright 2018 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 that an early warning does not cause a crash. -+ -+if {[is_remote host]} { -+ unsupported "warning.exp can only run on local host" -+ return -+} -+ -+set tname [standard_temp_file warning] -+set fd [open $tname w] -+puts $fd "anything" -+close $fd -+ -+set save $INTERNAL_GDBFLAGS -+set INTERNAL_GDBFLAGS "-nw -nx -data-directory $tname" -+ -+gdb_start -+ -+# Make sure gdb started up. -+gdb_test "echo 23\\n" "23" -+ -+set INTERNAL_GDBFLAGS $save diff --git a/gdb-rhbz1659535-z15-record-replay.patch b/gdb-rhbz1659535-z15-record-replay.patch deleted file mode 100644 index e943646be7090259f7d117aab755cea673a90cc5..0000000000000000000000000000000000000000 --- a/gdb-rhbz1659535-z15-record-replay.patch +++ /dev/null @@ -1,174 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Tue, 12 May 2020 15:38:27 -0400 -Subject: gdb-rhbz1659535-z15-record-replay.patch - -;; Backport z15 record/replay -;; Andreas Arnaz, RH BZ 1659535 - - commit 6d9d6da48e84a65871a9d72fa785105d603990a6 - Author: Andreas Arnez - Date: Wed Oct 9 11:09:22 2019 +0200 - s390: Add record/replay support for arch13 instructions - - Enable recording most of the new "arch13" instructions on z/Architecture - targets, except for the specialized-function-assist instructions: - - SORTL - sort lists - DFLTCC - deflate conversion call - KDSA - compute digital signature authentication - - gdb/ChangeLog: - - * s390-tdep.c (390_process_record): Handle new arch13 instructions - except SORTL, DFLTCC, and KDSA. - -diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c ---- a/gdb/s390-tdep.c -+++ b/gdb/s390-tdep.c -@@ -4101,6 +4101,7 @@ ex: - case 0xb998: /* ALCR - add logical with carry */ - case 0xb999: /* SLBR - subtract logical with borrow */ - case 0xb9f4: /* NRK - and */ -+ case 0xb9f5: /* NCRK - and with complement */ - case 0xb9f6: /* ORK - or */ - case 0xb9f7: /* XRK - xor */ - case 0xb9f8: /* ARK - add */ -@@ -4133,20 +4134,32 @@ ex: - case 0xb919: /* SGFR - subtract */ - case 0xb91a: /* ALGFR - add logical */ - case 0xb91b: /* SLGFR - subtract logical */ -+ case 0xb964: /* NNGRK - and 64 bit */ -+ case 0xb965: /* OCGRK - or with complement 64 bit */ -+ case 0xb966: /* NOGRK - or 64 bit */ -+ case 0xb967: /* NXGRK - not exclusive or 64 bit */ -+ case 0xb974: /* NNRK - and 32 bit */ -+ case 0xb975: /* OCRK - or with complement 32 bit */ -+ case 0xb976: /* NORK - or 32 bit */ -+ case 0xb977: /* NXRK - not exclusive or 32 bit */ - case 0xb980: /* NGR - and */ - case 0xb981: /* OGR - or */ - case 0xb982: /* XGR - xor */ - case 0xb988: /* ALCGR - add logical with carry */ - case 0xb989: /* SLBGR - subtract logical with borrow */ -+ case 0xb9c0: /* SELFHR - select high */ - case 0xb9e1: /* POPCNT - population count */ - case 0xb9e4: /* NGRK - and */ -+ case 0xb9e5: /* NCGRK - and with complement */ - case 0xb9e6: /* OGRK - or */ - case 0xb9e7: /* XGRK - xor */ - case 0xb9e8: /* AGRK - add */ - case 0xb9e9: /* SGRK - subtract */ - case 0xb9ea: /* ALGRK - add logical */ -+ case 0xb9e3: /* SELGR - select 64 bit */ - case 0xb9eb: /* SLGRK - subtract logical */ - case 0xb9ed: /* MSGRKC - multiply single 64x64 -> 64 */ -+ case 0xb9f0: /* SELR - select 32 bit */ - case 0xb9fd: /* MSRKC - multiply single 32x32 -> 32 */ - /* 64-bit gpr destination + flags */ - if (s390_record_gpr_g (gdbarch, regcache, inib[6])) -@@ -4522,7 +4535,13 @@ ex: - return -1; - break; - -- /* 0xb932-0xb93b undefined */ -+ /* 0xb932-0xb937 undefined */ -+ -+ /* 0xb938 unsupported: SORTL - sort lists */ -+ /* 0xb939 unsupported: DFLTCC - deflate conversion call */ -+ /* 0xb93a unsupported: KDSA - compute dig. signature auth. */ -+ -+ /* 0xb93b undefined */ - - case 0xb93c: /* PPNO - perform pseudorandom number operation [partial] */ - regcache_raw_read_unsigned (regcache, S390_R1_REGNUM, &tmp); -@@ -5452,6 +5471,13 @@ ex: - /* 0xe3ce undefined */ - /* 0xe3d0-0xe3ff undefined */ - -+ case 0xe601: /* VLEBRH - vector load byte reversed element */ -+ case 0xe602: /* VLEBRG - vector load byte reversed element */ -+ case 0xe603: /* VLEBRF - vector load byte reversed element */ -+ case 0xe604: /* VLLEBRZ - vector load byte rev. el. and zero */ -+ case 0xe605: /* VLBRREP - vector load byte rev. el. and replicate */ -+ case 0xe606: /* VLBR - vector load byte reversed elements */ -+ case 0xe607: /* VLER - vector load elements reversed */ - case 0xe634: /* VPKZ - vector pack zoned */ - case 0xe635: /* VLRL - vector load rightmost with immed. length */ - case 0xe637: /* VLRLR - vector load rightmost with length */ -@@ -5514,6 +5540,9 @@ ex: - case 0xe77f: /* VSRAB - vector shift right arithmetic by byte */ - case 0xe784: /* VPDI - vector permute doubleword immediate */ - 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 0xe78b: /* VSTRS - vector string search */ - case 0xe78c: /* VPERM - vector permute */ - case 0xe78d: /* VSEL - vector select */ - case 0xe78e: /* VFMS - vector fp multiply and subtract */ -@@ -5542,10 +5571,10 @@ ex: - case 0xe7bc: /* VGFMA - vector Galois field multiply sum and accumulate */ - case 0xe7bd: /* VSBCBI - vector subtract with borrow compute borrow indication */ - case 0xe7bf: /* VSBI - vector subtract with borrow indication */ -- case 0xe7c0: /* VCLGD - vector convert to logical 64-bit */ -- case 0xe7c1: /* VCDLG - vector convert from logical 64-bit */ -- case 0xe7c2: /* VCGD - vector convert to fixed 64-bit */ -- case 0xe7c3: /* VCDG - vector convert from fixed 64-bit */ -+ case 0xe7c0: /* VCLFP - vector fp convert to logical */ -+ case 0xe7c1: /* VCFPL - vector fp convert from logical */ -+ case 0xe7c2: /* VCSFP - vector fp convert to fixed */ -+ case 0xe7c3: /* VCFPS - vector fp convert from fixed */ - case 0xe7c4: /* VLDE/VFLL - vector fp load lengthened */ - case 0xe7c5: /* VLED/VFLR - vector fp load rounded */ - case 0xe7c7: /* VFI - vector load fp integer */ -@@ -5596,6 +5625,7 @@ ex: - return -1; - break; - -+ case 0xe609: /* VSTEBRH - vector store byte reversed element */ - case 0xe709: /* VSTEH - vector store element */ - oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0); - if (record_full_arch_list_add_mem (oaddr, 2)) -@@ -5604,6 +5634,7 @@ ex: - return -1; - break; - -+ case 0xe60a: /* VSTEBRG - vector store byte reversed element */ - case 0xe70a: /* VSTEG - vector store element */ - oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0); - if (record_full_arch_list_add_mem (oaddr, 8)) -@@ -5612,6 +5643,7 @@ ex: - return -1; - break; - -+ case 0xe60b: /* VSTEBRF - vector store byte reversed element */ - case 0xe70b: /* VSTEF - vector store element */ - oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0); - if (record_full_arch_list_add_mem (oaddr, 4)) -@@ -5622,6 +5654,8 @@ ex: - - /* 0xe70c-0xe70d undefined */ - -+ case 0xe60e: /* VSTBR - vector store byte reversed elements */ -+ case 0xe60f: /* VSTER - vector store elements reversed */ - case 0xe70e: /* VST - vector store */ - oaddr = s390_record_calc_disp (gdbarch, regcache, inib[3], insn[1], 0); - if (record_full_arch_list_add_mem (oaddr, 16)) -@@ -6201,7 +6235,16 @@ ex: - /* SSE/SIL-format instruction */ - switch (insn[0]) - { -- /* 0xe500-0xe543 undefined, privileged, or unsupported */ -+ /* 0xe500-0xe509 undefined, privileged, or unsupported */ -+ -+ case 0xe50a: /* MVCRL - move right to left */ -+ regcache_raw_read_unsigned (regcache, S390_R0_REGNUM, &tmp); -+ oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0); -+ if (record_full_arch_list_add_mem (oaddr, (tmp & 0xff) + 1)) -+ return -1; -+ break; -+ -+ /* 0xe50b-0xe543 undefined, privileged, or unsupported */ - - case 0xe544: /* MVHHI - move */ - oaddr = s390_record_calc_disp (gdbarch, regcache, 0, insn[1], 0); diff --git a/gdb-rhbz1666249-suggest-yum-instead-of-dnf.patch b/gdb-rhbz1666249-suggest-yum-instead-of-dnf.patch deleted file mode 100644 index 39ed2d176d1f7fa9baf693493f69e937e0599017..0000000000000000000000000000000000000000 --- a/gdb-rhbz1666249-suggest-yum-instead-of-dnf.patch +++ /dev/null @@ -1,20 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 8 Mar 2019 11:39:10 -0800 -Subject: gdb-rhbz1666249-suggest-yum-instead-of-dnf.patch - -;; Fix 'gdb suggests using "dnf debuginfo-install' -;; Keith Seitz, RHBZ 1666249 - -diff --git a/gdb/build-id.c b/gdb/build-id.c ---- a/gdb/build-id.c -+++ b/gdb/build-id.c -@@ -1013,6 +1013,8 @@ missing_rpm_list_print (void) - printf_unfiltered (_("Missing separate debuginfos, use: %s"), - #ifdef DNF_DEBUGINFO_INSTALL - "dnf " -+#else -+ "yum " - #endif - "debuginfo-install"); - for (array_iter = array; array_iter < array + missing_rpm_list_entries; diff --git a/gdb-rhbz1668635-libiberty-demangle_template-memleak.patch b/gdb-rhbz1668635-libiberty-demangle_template-memleak.patch deleted file mode 100644 index 885bc664896dcf98b513fd71d0d801f6db1d846b..0000000000000000000000000000000000000000 --- a/gdb-rhbz1668635-libiberty-demangle_template-memleak.patch +++ /dev/null @@ -1,1699 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Fri, 8 Mar 2019 14:33:02 -0800 -Subject: gdb-rhbz1668635-libiberty-demangle_template-memleak.patch - -;; Fix 'libiberty: Memory leak in demangle_template function resulting in a denial of service" -;; Simon Marchi, RH BZ 1668635 - -gdb: Remove support for old mangling schemes - -An upcoming sync with gcc's libiberty [1] will remove support for old -mangling schemes (GNU v2, Lucid, ARM, HP and EDG). It will remove the -cplus_demangle_opname function, so we need to get rid of its usages in -GDB (it's a GNU v2 specific function). - -I think the changes are mostly relatively obvious, some hacks that were -necessary to support overloaded operators with GNU v2 mangling are not -needed anymore. - -The change in stabsread.c is perhaps less obvious. I think we could get -rid of more code in that region that is specific to old mangling -schemes, but I chose to do only the minimal changes required to remove -the cplus_demangle_opname uses. There is also a detailed comment just -above that explaining how GNU v2 and v3 mangled symbols are handled, I -decided to leave it as-is, since I wasn't sure which part to remove, -change or leave there. - -[1] The commit "Remove support for demangling GCC 2.x era mangling -schemes.", specifically. - -gdb/ChangeLog: - - * gdbtypes.c (check_stub_method_group): Remove handling of old - mangling schemes. - * linespec.c (find_methods): Likewise. - * stabsread.c (read_member_functions): Likewise. - * valops.c (search_struct_method): Likewise. - (value_struct_elt_for_reference): Likewise. - * NEWS: Mention this change. - -gdb/testsuite/ChangeLog: - - * gdb.cp/demangle.exp (test_gnu_style_demangling): Rename to... - (test_gnuv3_style_demangling): ... this. - (test_lucid_style_demangling): Remove. - (test_arm_style_demangling): Remove. - (test_hp_style_demangling): Remove. - (do_tests): Remove calls to the above. - -gdb/doc/ChangeLog: - - * gdb.texinfo (Print Settings): Remove mention of specific - demangle-style values, just refer to the in-process help. - -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -10390,31 +10390,10 @@ or demangled form. - @cindex symbol decoding style, C@t{++} - @kindex set demangle-style - @item set demangle-style @var{style} --Choose among several encoding schemes used by different compilers to --represent C@t{++} names. The choices for @var{style} are currently: -- --@table @code --@item auto --Allow @value{GDBN} to choose a decoding style by inspecting your program. --This is the default. -- --@item gnu --Decode based on the @sc{gnu} C@t{++} compiler (@code{g++}) encoding algorithm. -- --@item hp --Decode based on the HP ANSI C@t{++} (@code{aCC}) encoding algorithm. -- --@item lucid --Decode based on the Lucid C@t{++} compiler (@code{lcc}) encoding algorithm. -- --@item arm --Decode using the algorithm in the @cite{C@t{++} Annotated Reference Manual}. --@strong{Warning:} this setting alone is not sufficient to allow --debugging @code{cfront}-generated executables. @value{GDBN} would --require further enhancement to permit that. -- --@end table --If you omit @var{style}, you will see a list of possible formats. -+Choose among several encoding schemes used by different compilers to represent -+C@t{++} names. If you omit @var{style}, you will see a list of possible -+formats. The default value is @var{auto}, which lets @value{GDBN} choose a -+decoding style by inspecting your program. - - @item show demangle-style - Display the encoding style currently in use for decoding C@t{++} symbols. -diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c ---- a/gdb/gdbtypes.c -+++ b/gdb/gdbtypes.c -@@ -2779,37 +2779,11 @@ check_stub_method_group (struct type *type, int method_id) - { - int len = TYPE_FN_FIELDLIST_LENGTH (type, method_id); - struct fn_field *f = TYPE_FN_FIELDLIST1 (type, method_id); -- int j, found_stub = 0; - -- for (j = 0; j < len; j++) -- if (TYPE_FN_FIELD_STUB (f, j)) -- { -- found_stub = 1; -+ for (int j = 0; j < len; j++) -+ { -+ if (TYPE_FN_FIELD_STUB (f, j)) - check_stub_method (type, method_id, j); -- } -- -- /* GNU v3 methods with incorrect names were corrected when we read -- in type information, because it was cheaper to do it then. The -- only GNU v2 methods with incorrect method names are operators and -- destructors; destructors were also corrected when we read in type -- information. -- -- Therefore the only thing we need to handle here are v2 operator -- names. */ -- if (found_stub && !startswith (TYPE_FN_FIELD_PHYSNAME (f, 0), "_Z")) -- { -- int ret; -- char dem_opname[256]; -- -- ret = cplus_demangle_opname (TYPE_FN_FIELDLIST_NAME (type, -- method_id), -- dem_opname, DMGL_ANSI); -- if (!ret) -- ret = cplus_demangle_opname (TYPE_FN_FIELDLIST_NAME (type, -- method_id), -- dem_opname, 0); -- if (ret) -- TYPE_FN_FIELDLIST_NAME (type, method_id) = xstrdup (dem_opname); - } - } - -diff --git a/gdb/linespec.c b/gdb/linespec.c ---- a/gdb/linespec.c -+++ b/gdb/linespec.c -@@ -1234,17 +1234,6 @@ find_methods (struct type *t, enum language t_lang, const char *name, - --method_counter) - { - const char *method_name = TYPE_FN_FIELDLIST_NAME (t, method_counter); -- char dem_opname[64]; -- -- if (startswith (method_name, "__") || -- startswith (method_name, "op") || -- startswith (method_name, "type")) -- { -- if (cplus_demangle_opname (method_name, dem_opname, DMGL_ANSI)) -- method_name = dem_opname; -- else if (cplus_demangle_opname (method_name, dem_opname, 0)) -- method_name = dem_opname; -- } - - if (symbol_name_compare (method_name, lookup_name, NULL)) - { -diff --git a/gdb/stabsread.c b/gdb/stabsread.c ---- a/gdb/stabsread.c -+++ b/gdb/stabsread.c -@@ -2553,7 +2553,6 @@ read_member_functions (struct field_info *fip, const char **pp, - } - else - { -- int has_stub = 0; - int has_destructor = 0, has_other = 0; - int is_v3 = 0; - struct next_fnfield *tmp_sublist; -@@ -2617,8 +2616,6 @@ read_member_functions (struct field_info *fip, const char **pp, - tmp_sublist = sublist; - while (tmp_sublist != NULL) - { -- if (tmp_sublist->fn_field.is_stub) -- has_stub = 1; - if (tmp_sublist->fn_field.physname[0] == '_' - && tmp_sublist->fn_field.physname[1] == 'Z') - is_v3 = 1; -@@ -2705,23 +2702,6 @@ read_member_functions (struct field_info *fip, const char **pp, - "~", main_fn_name, (char *)NULL); - xfree (main_fn_name); - } -- else if (!has_stub) -- { -- char dem_opname[256]; -- int ret; -- -- ret = cplus_demangle_opname (new_fnlist->fn_fieldlist.name, -- dem_opname, DMGL_ANSI); -- if (!ret) -- ret = cplus_demangle_opname (new_fnlist->fn_fieldlist.name, -- dem_opname, 0); -- if (ret) -- new_fnlist->fn_fieldlist.name -- = ((const char *) -- obstack_copy0 (&objfile->objfile_obstack, dem_opname, -- strlen (dem_opname))); -- xfree (main_fn_name); -- } - - new_fnlist->fn_fieldlist.fn_fields - = OBSTACK_CALLOC (&objfile->objfile_obstack, length, fn_field); -diff --git a/gdb/testsuite/gdb.cp/demangle.exp b/gdb/testsuite/gdb.cp/demangle.exp ---- a/gdb/testsuite/gdb.cp/demangle.exp -+++ b/gdb/testsuite/gdb.cp/demangle.exp -@@ -110,419 +110,13 @@ proc test_demangling_exact {test result} { - test_demangling_core gdb_test_exact $test $result - } - -- -- - # --# Test gnu style name demangling -+# Test gnu-v3 style name demangling - # - --proc test_gnu_style_demangling {} { -+proc test_gnuv3_style_demangling {} { - global gdb_prompt - -- test_demangling "gnu: Abort__FP6EditoriPCc" \ -- "Abort\[(\]+Editor \[*\]+, int, (const char|char const) \[*\]+\[)\]+" -- test_demangling_exact "gnu: AddAlignment__9ivTSolverUiP12ivInteractorP7ivTGlue" "ivTSolver::AddAlignment(unsigned int, ivInteractor *, ivTGlue *)" -- test_demangling "gnu: Append__15NameChooserViewPCc" \ -- "NameChooserView::Append\[(\]+(const char|char const) \[*\]+\[)\]+" -- test_demangling_exact "gnu: ArrowheadIntersects__9ArrowLineP9ArrowheadR6BoxObjP7Graphic" "ArrowLine::ArrowheadIntersects(Arrowhead *, BoxObj &, Graphic *)" -- test_demangling_exact "gnu: AtEnd__13ivRubberGroup" "ivRubberGroup::AtEnd(void)" -- test_demangling_exact "gnu: BgFilter__9ivTSolverP12ivInteractor" "ivTSolver::BgFilter(ivInteractor *)" -- test_demangling "gnu: BitPatterntoa__FRC10BitPatternccc" \ -- "BitPatterntoa\[(\]+(const BitPattern|BitPattern const) &, char, char, char\[)\]+" -- test_demangling_exact "gnu: Check__6UArrayi" "UArray::Check(int)" -- test_demangling_exact "gnu: CoreConstDecls__8TextCodeR7ostream" "TextCode::CoreConstDecls(ostream &)" -- test_demangling_exact "gnu: Detach__8StateVarP12StateVarView" "StateVar::Detach(StateVarView *)" -- test_demangling_exact "gnu: Done__9ComponentG8Iterator" "Component::Done(Iterator)" -- test_demangling "gnu: DrawDestinationTransformedImage__FP7_XImageiiT0iiUlUiiiUiUlUlP4_XGCRC13ivTransformeriiii" \ -- "DrawDestinationTransformedImage\[(\]+_XImage \[*\]+, int, int, _XImage \[*\]+, int, int, unsigned long, unsigned int, int, int, unsigned int, unsigned long, unsigned long, _XGC \[*\]+, (const ivTransformer|ivTransformer const) &, int, int, int, int\[)\]+" -- -- test_demangling "gnu: Edit__12StringEditorPCcii" \ -- "StringEditor::Edit\[(\]+(const char|char const) \[*\]+, int, int\[)\]+" -- test_demangling_exact "gnu: Effect__11RelateManipR7ivEvent" "RelateManip::Effect(ivEvent &)" -- test_demangling "gnu: FilterName__FPCc" \ -- "FilterName\[(\]+(const char|char const) \[*\]+\[)\]+" -- test_demangling "gnu: Filter__6PSTextPCci" \ -- "PSText::Filter\[(\]+(const char|char const) \[*\]+, int\[)\]+" -- test_demangling "gnu: FindColor__7CatalogPCciii" \ -- "Catalog::FindColor\[(\]+(const char|char const) \[*\]+, int, int, int\[)\]+" -- test_demangling_exact "gnu: FindFixed__FRP4CNetP4CNet" "FindFixed(CNet *&, CNet *)" -- test_demangling "gnu: FindFont__7CatalogPCcN21" \ -- "Catalog::FindFont\[(\]+(const char|char const) \[*\]+, (const char|char const) \[*\]+, (const char|char const) \[*\]+\[)\]+" -- test_demangling_exact "gnu: Fix48_abort__FR8twolongs" "Fix48_abort(twolongs &)" -- test_demangling_exact "gnu: GetBarInfo__15iv2_6_VScrollerP13ivPerspectiveRiT2" "iv2_6_VScroller::GetBarInfo(ivPerspective *, int &, int &)" -- test_demangling_exact "gnu: GetBgColor__C9ivPainter" "ivPainter::GetBgColor(void) const" -- -- test_demangling "gnu: Iisdouble__FPC6IntRep" \ -- "Iisdouble\[(\]+(const IntRep|IntRep const) \[*\]+\[)\]+" -- test_demangling_exact "gnu: InsertBody__15H_PullrightMenuii" "H_PullrightMenu::InsertBody(int, int)" -- test_demangling_exact "gnu: InsertCharacter__9TextManipc" "TextManip::InsertCharacter(char)" -- -- test_demangling_exact "gnu: InsertToplevel__7ivWorldP12ivInteractorT1" "ivWorld::InsertToplevel(ivInteractor *, ivInteractor *)" -- test_demangling_exact "gnu: InsertToplevel__7ivWorldP12ivInteractorT1iiUi" "ivWorld::InsertToplevel(ivInteractor *, ivInteractor *, int, int, unsigned int)" -- test_demangling "gnu: IsADirectory__FPCcR4stat" \ -- "IsADirectory\[(\]+(const char|char const) \[*\]+, stat &\[)\]+" -- test_demangling_exact "gnu: IsAGroup__FP11GraphicViewP11GraphicComp" "IsAGroup(GraphicView *, GraphicComp *)" -- test_demangling_exact "gnu: IsA__10ButtonCodeUl" "ButtonCode::IsA(unsigned long)" -- -- test_demangling_exact "gnu: ReadName__FR7istreamPc" "ReadName(istream &, char *)" -- test_demangling_exact "gnu: Redraw__13StringBrowseriiii" "StringBrowser::Redraw(int, int, int, int)" -- test_demangling_exact "gnu: Rotate__13ivTransformerf" "ivTransformer::Rotate(float)" -- test_demangling_exact "gnu: Rotated__C13ivTransformerf" "ivTransformer::Rotated(float) const" -- test_demangling_exact "gnu: Round__Ff" "Round(float)" -- -- test_demangling_exact "gnu: SetExport__16MemberSharedNameUi" "MemberSharedName::SetExport(unsigned int)" -- test_demangling_exact "gnu: Set__14ivControlState13ControlStatusUi" "ivControlState::Set(ControlStatus, unsigned int)" -- test_demangling_exact "gnu: Set__5DFacePcii" "DFace::Set(char *, int, int)" -- -- test_demangling_exact "gnu: VConvert__9ivTSolverP12ivInteractorRP8TElementT2" "ivTSolver::VConvert(ivInteractor *, TElement *&, TElement *&)" -- test_demangling_exact "gnu: VConvert__9ivTSolverP7ivTGlueRP8TElement" "ivTSolver::VConvert(ivTGlue *, TElement *&)" -- test_demangling_exact "gnu: VOrder__9ivTSolverUiRP12ivInteractorT2" "ivTSolver::VOrder(unsigned int, ivInteractor *&, ivInteractor *&)" -- test_demangling "gnu: Valid__7CatalogPCcRP4Tool" \ -- "Catalog::Valid\[(\]+(const char|char const) \[*\]+, Tool \[*\]+&\[)\]+" -- test_demangling_exact "gnu: _10PageButton\$__both" "PageButton::__both" -- test_demangling_exact "gnu: _3RNG\$singleMantissa" "RNG::singleMantissa" -- test_demangling_exact "gnu: _5IComp\$_release" "IComp::_release" -- test_demangling_exact "gnu: _\$_10BitmapComp" "BitmapComp::~BitmapComp(void)" -- -- test_demangling_exact "gnu: _\$_9__io_defs" "__io_defs::~__io_defs(void)" -- test_demangling_exact "gnu: _\$_Q23foo3bar" "foo::bar::~bar(void)" -- test_demangling_exact "gnu: _\$_Q33foo3bar4bell" "foo::bar::bell::~bell(void)" -- test_demangling_exact "gnu: __10ivTelltaleiP7ivGlyph" "ivTelltale::ivTelltale(int, ivGlyph *)" -- test_demangling_exact "gnu: __10ivViewportiP12ivInteractorUi" "ivViewport::ivViewport(int, ivInteractor *, unsigned int)" -- test_demangling_exact "gnu: __10ostrstream" "ostrstream::ostrstream(void)" -- test_demangling_exact "gnu: __10ostrstreamPcii" "ostrstream::ostrstream(char *, int, int)" -- test_demangling "gnu: __11BasicDialogiPCcP13ivButtonStateN22Ui" \ -- "BasicDialog::BasicDialog\[(\]+int, (const char|char const) \[*\]+, ivButtonState \[*\]+, (const char|char const) \[*\]+, (const char|char const) \[*\]+, unsigned int\[)\]+" -- test_demangling_exact "gnu: __11BitmapTablei" "BitmapTable::BitmapTable(int)" -- test_demangling_exact "gnu: __12ViewportCodeP12ViewportComp" "ViewportCode::ViewportCode(ViewportComp *)" -- test_demangling "gnu: __12iv2_6_BorderiPCci" \ -- "iv2_6_Border::iv2_6_Border\[(\]+int, (const char|char const) \[*\]+, int\[)\]+" -- test_demangling_exact "gnu: __12iv2_6_Borderii" "iv2_6_Border::iv2_6_Border(int, int)" -- test_demangling "gnu: __12ivBackgroundiP7ivGlyphPC7ivColor" \ -- "ivBackground::ivBackground\[(\]+int, ivGlyph \[*\]+, (const ivColor|ivColor const) \[*\]+\[)\]+" -- test_demangling_exact "gnu: __12ivBreak_Listl" "ivBreak_List::ivBreak_List(long)" -- test_demangling "gnu: __14TextInteractoriPCcUi" \ -- "TextInteractor::TextInteractor\[(\]+int, (const char|char const) \[*\]+, unsigned int\[)\]+" -- test_demangling_exact "gnu: __14iv2_6_MenuItemiP12ivInteractor" "iv2_6_MenuItem::iv2_6_MenuItem(int, ivInteractor *)" -- test_demangling "gnu: __14iv2_6_MenuItemiPCcP12ivInteractor" \ -- "iv2_6_MenuItem::iv2_6_MenuItem\[(\]+int, (const char|char const) \[*\]+, ivInteractor \[*\]+\[)\]+" -- -- test_demangling_exact "gnu: __20DisplayList_IteratorR11DisplayList" "DisplayList_Iterator::DisplayList_Iterator(DisplayList &)" -- test_demangling_exact "gnu: __3fooRT0" "foo::foo(foo &)" -- test_demangling_exact "gnu: __3fooiN31" "foo::foo(int, int, int, int)" -- test_demangling "gnu: __3fooiPCc" \ -- "foo::foo\[(\]+int, (const char|char const) \[*\]+\[)\]+" -- test_demangling_exact "gnu: __3fooiRT0iT2iT2" "foo::foo(int, foo &, int, foo &, int, foo &)" -- test_demangling "gnu: __6GetOptiPPcPCc" \ -- "GetOpt::GetOpt\[(\]+int, char \[*\]+\[*\]+, (const char|char const) \[*\]+\[)\]+" -- test_demangling_exact "gnu: __6KeyMapPT0" "KeyMap::KeyMap(KeyMap *)" -- test_demangling "gnu: __7ivWorldPCcRiPPcPC12ivOptionDescPC14ivPropertyData" \ -- "ivWorld::ivWorld\[(\]+(const char|char const) \[*\]+, int &, char \[*\]+\[*\]+, (const ivOptionDesc|ivOptionDesc const) \[*\]+, (const ivPropertyData|ivPropertyData const) \[*\]+\[)\]+" -- test_demangling "gnu: __7procbufPCci" \ -- "procbuf::procbuf\[(\]+(const char|char const) \[*\]+, int\[)\]+" -- test_demangling_exact "gnu: __8ArrowCmdP6EditorUiUi" "ArrowCmd::ArrowCmd(Editor *, unsigned int, unsigned int)" -- -- test_demangling_exact "gnu: __9F_EllipseiiiiP7Graphic" "F_Ellipse::F_Ellipse(int, int, int, int, Graphic *)" -- test_demangling_exact "gnu: __9FrameDataP9FrameCompi" "FrameData::FrameData(FrameComp *, int)" -- test_demangling_exact "gnu: __9HVGraphicP9CanvasVarP7Graphic" "HVGraphic::HVGraphic(CanvasVar *, Graphic *)" -- test_demangling_exact "gnu: __Q23foo3bar" "foo::bar::bar(void)" -- test_demangling_exact "gnu: __Q33foo3bar4bell" "foo::bar::bell::bell(void)" -- test_demangling_exact "gnu: __aa__3fooRT0" "foo::operator&&(foo &)" -- test_demangling_exact "gnu: __aad__3fooRT0" "foo::operator&=(foo &)" -- test_demangling_exact "gnu: __ad__3fooRT0" "foo::operator&(foo &)" -- test_demangling_exact "gnu: __adv__3fooRT0" "foo::operator/=(foo &)" -- test_demangling_exact "gnu: __aer__3fooRT0" "foo::operator^=(foo &)" -- test_demangling_exact "gnu: __als__3fooRT0" "foo::operator<<=(foo &)" -- test_demangling_exact "gnu: __amd__3fooRT0" "foo::operator%=(foo &)" -- test_demangling_exact "gnu: __ami__3fooRT0" "foo::operator-=(foo &)" -- test_demangling_exact "gnu: __aml__3FixRT0" "Fix::operator*=(Fix &)" -- test_demangling_exact "gnu: __aml__5Fix16i" "Fix16::operator*=(int)" -- test_demangling_exact "gnu: __aml__5Fix32RT0" "Fix32::operator*=(Fix32 &)" -- test_demangling_exact "gnu: __aor__3fooRT0" "foo::operator|=(foo &)" -- test_demangling_exact "gnu: __apl__3fooRT0" "foo::operator+=(foo &)" -- test_demangling_exact "gnu: __ars__3fooRT0" "foo::operator>>=(foo &)" -- -- test_demangling_exact "gnu: __as__3fooRT0" "foo::operator=(foo &)" -- test_demangling_exact "gnu: __cl__3fooRT0" "foo::operator()(foo &)" -- test_demangling_exact "gnu: __cl__6Normal" "Normal::operator()(void)" -- test_demangling_exact "gnu: __cl__6Stringii" "String::operator()(int, int)" -- test_demangling_exact "gnu: __cm__3fooRT0" "foo::operator, (foo &)" -- test_demangling_exact "gnu: __co__3foo" "foo::operator~(void)" -- test_demangling_exact "gnu: __dl__3fooPv" "foo::operator delete(void *)" -- test_demangling_exact "gnu: __dv__3fooRT0" "foo::operator/(foo &)" -- test_demangling_exact "gnu: __eq__3fooRT0" "foo::operator==(foo &)" -- test_demangling_exact "gnu: __er__3fooRT0" "foo::operator^(foo &)" -- test_demangling_exact "gnu: __ge__3fooRT0" "foo::operator>=(foo &)" -- test_demangling_exact "gnu: __gt__3fooRT0" "foo::operator>(foo &)" -- test_demangling_exact "gnu: __le__3fooRT0" "foo::operator<=(foo &)" -- test_demangling_exact "gnu: __ls__3fooRT0" "foo::operator<<(foo &)" -- test_demangling_exact "gnu: __ls__FR7ostreamPFR3ios_R3ios" "operator<<(ostream &, ios &(*)(ios &))" -- test_demangling_exact "gnu: __ls__FR7ostreamR3Fix" "operator<<(ostream &, Fix &)" -- test_demangling_exact "gnu: __lt__3fooRT0" "foo::operator<(foo &)" -- test_demangling_exact "gnu: __md__3fooRT0" "foo::operator%(foo &)" -- test_demangling_exact "gnu: __mi__3fooRT0" "foo::operator-(foo &)" -- test_demangling_exact "gnu: __ml__3fooRT0" "foo::operator*(foo &)" -- test_demangling_exact "gnu: __mm__3fooi" "foo::operator--(int)" -- -- test_demangling_exact "gnu: __ne__3fooRT0" "foo::operator!=(foo &)" -- test_demangling "gnu: __ne__FRC7ComplexT0" \ -- "operator!=\[(\]+(const Complex|Complex const) &, (const Complex|Complex const) &\[)\]+" -- test_demangling "gnu: __ne__FRC7Complexd" \ -- "operator!=\[(\]+(const Complex|Complex const) &, double\[)\]+" -- test_demangling "gnu: __ne__FRC9SubStringRC6String" \ -- "operator!=\[(\]+(const SubString|SubString const) &, (const String|String const) &\[)\]+" -- test_demangling_exact "gnu: __nt__3foo" "foo::operator!(void)" -- test_demangling_exact "gnu: __nw__3fooi" "foo::operator new(int)" -- test_demangling_exact "gnu: __oo__3fooRT0" "foo::operator||(foo &)" -- test_demangling_exact "gnu: __opPc__3foo" "foo::operator char *(void)" -- test_demangling_exact "gnu: __opi__3foo" "foo::operator int(void)" -- test_demangling_exact "gnu: __or__3fooRT0" "foo::operator|(foo &)" -- test_demangling_exact "gnu: __pl__3fooRT0" "foo::operator+(foo &)" -- test_demangling_exact "gnu: __pp__3fooi" "foo::operator++(int)" -- test_demangling_exact "gnu: __rf__3foo" "foo::operator->(void)" -- test_demangling_exact "gnu: __rm__3fooRT0" "foo::operator->*(foo &)" -- test_demangling_exact "gnu: __rs__3fooRT0" "foo::operator>>(foo &)" -- test_demangling "gnu: __vc__3fooRT0" "foo::operator\\\[\\\]\\(foo &\\)" -- test_demangling "gnu: _gsub__6StringRC5RegexPCci" \ -- "String::_gsub\[(\]+(const Regex|Regex const) &, (const char|char const) \[*\]+, int\[)\]+" -- test_demangling_exact "gnu: _new_Fix__FUs" "_new_Fix(unsigned short)" -- -- # gcc 2.4.5 (and earlier) style virtual tables. We want to continue to -- # correctly demangle these even if newer compilers use a different form. -- test_demangling_exact "gnu: _vt.foo" "foo virtual table" -- test_demangling_exact "gnu: _vt.foo.bar" "foo::bar virtual table" -- test_demangling_exact "gnu: _vt\$foo" "foo virtual table" -- test_demangling_exact "gnu: _vt\$foo\$bar" "foo::bar virtual table" -- -- test_demangling_exact "gnu: append__7ivGlyphPT0" "ivGlyph::append(ivGlyph *)" -- test_demangling "gnu: arg__FRC7Complex" \ -- "arg\[(\]+(const Complex|Complex const) &\[)\]+" -- test_demangling_exact "gnu: clearok__FP7_win_sti" "clearok(_win_st *, int)" -- -- test_demangling_exact "gnu: complexfunc2__FPFPc_i" "complexfunc2(int (*)(char *))" -- test_demangling_exact "gnu: complexfunc3__FPFPFPl_s_i" "complexfunc3(int (*)(short (*)(long *)))" -- test_demangling_exact "gnu: complexfunc4__FPFPFPc_s_i" "complexfunc4(int (*)(short (*)(char *)))" -- test_demangling_exact "gnu: complexfunc5__FPFPc_PFl_i" "complexfunc5(int (*(*)(char *))(long))" -- test_demangling_exact "gnu: complexfunc6__FPFPi_PFl_i" "complexfunc6(int (*(*)(int *))(long))" -- test_demangling_exact "gnu: complexfunc7__FPFPFPc_i_PFl_i" "complexfunc7(int (*(*)(int (*)(char *)))(long))" -- test_demangling "gnu: contains__C9BitStringRC10BitPattern" \ -- "BitString::contains\[(\]+(const BitPattern|BitPattern const) &\[)\]+ const" -- test_demangling "gnu: contains__C9BitStringRC12BitSubStringi" \ -- "BitString::contains\[(\]+(const BitSubString|BitSubString const) &, int\[)\]+ const" -- test_demangling "gnu: contains__C9BitStringRT0" \ -- "BitString::contains\[(\]+(const BitString|BitString const) &\[)\]+ const" -- test_demangling "gnu: div__FPC6IntRepT0P6IntRep" \ -- "div\[(\]+(const IntRep|IntRep const) \[*\]+, (const IntRep|IntRep const) \[*\]+, IntRep \[*\]+\[)\]+" -- test_demangling "gnu: div__FPC6IntReplP6IntRep" \ -- "div\[(\]+(const IntRep|IntRep const) \[*\]+, long, IntRep \[*\]+\[)\]+" -- test_demangling "gnu: div__FRC8RationalT0R8Rational" \ -- "div\[(\]+(const Rational|Rational const) &, (const Rational|Rational const) &, Rational &\[)\]+" -- test_demangling "gnu: divide__FRC7IntegerT0R7IntegerT2" \ -- "divide\[(\]+(const Integer|Integer const) &, (const Integer|Integer const) &, Integer &, Integer &\[)\]+" -- test_demangling "gnu: divide__FRC7IntegerlR7IntegerRl" \ -- "divide\[(\]+(const Integer|Integer const) &, long, Integer &, long &\[)\]+" -- test_demangling "gnu: enable__14DocumentViewerPCcUi" \ -- "DocumentViewer::enable\[(\]+(const char|char const) \[*\]+, unsigned int\[)\]+" -- -- test_demangling_exact "gnu: foo__FiN30" "foo(int, int, int, int)" -- test_demangling_exact "gnu: foo__FiR3fooiT1iT1" "foo(int, foo &, int, foo &, int, foo &)" -- test_demangling_exact "gnu: foo___3barl" "bar::foo_(long)" -- test_demangling_exact "gnu: insert__15ivClippingStacklRP8_XRegion" "ivClippingStack::insert(long, _XRegion *&)" -- test_demangling_exact "gnu: insert__16ChooserInfo_ListlR11ChooserInfo" "ChooserInfo_List::insert(long, ChooserInfo &)" -- test_demangling_exact "gnu: insert__17FontFamilyRepListlRP15ivFontFamilyRep" "FontFamilyRepList::insert(long, ivFontFamilyRep *&)" -- test_demangling_exact "gnu: leaveok__FP7_win_stc" "leaveok(_win_st *, char)" -- test_demangling_exact "gnu: left_mover__C7ivMFKitP12ivAdjustableP7ivStyle" "ivMFKit::left_mover(ivAdjustable *, ivStyle *) const" -- test_demangling "gnu: matches__C9BitStringRC10BitPatterni" \ -- "BitString::matches\[(\]+(const BitPattern|BitPattern const) &, int\[)\]+ const" -- test_demangling "gnu: matches__C9SubStringRC5Regex" \ -- "SubString::matches\[(\]+(const Regex|Regex const) &\[)\]+ const" -- -- test_demangling_exact "gnu: overload1arg__FSc" "overload1arg(signed char)" -- test_demangling_exact "gnu: overload1arg__FUc" "overload1arg(unsigned char)" -- test_demangling_exact "gnu: overload1arg__FUi" "overload1arg(unsigned int)" -- test_demangling_exact "gnu: overload1arg__FUl" "overload1arg(unsigned long)" -- test_demangling_exact "gnu: overload1arg__FUs" "overload1arg(unsigned short)" -- test_demangling_exact "gnu: overload1arg__Fc" "overload1arg(char)" -- test_demangling_exact "gnu: overload1arg__Fd" "overload1arg(double)" -- test_demangling_exact "gnu: overload1arg__Ff" "overload1arg(float)" -- test_demangling_exact "gnu: overload1arg__Fi" "overload1arg(int)" -- test_demangling_exact "gnu: overload1arg__Fl" "overload1arg(long)" -- test_demangling_exact "gnu: overload1arg__Fs" "overload1arg(short)" -- test_demangling_exact "gnu: overload1arg__Fv" "overload1arg(void)" -- test_demangling_exact "gnu: overloadargs__Fi" "overloadargs(int)" -- test_demangling_exact "gnu: overloadargs__Fii" "overloadargs(int, int)" -- test_demangling_exact "gnu: overloadargs__Fiii" "overloadargs(int, int, int)" -- test_demangling_exact "gnu: overloadargs__Fiiii" "overloadargs(int, int, int, int)" -- -- test_demangling_exact "gnu: overloadargs__Fiiiii" "overloadargs(int, int, int, int, int)" -- test_demangling_exact "gnu: overloadargs__Fiiiiii" "overloadargs(int, int, int, int, int, int)" -- test_demangling_exact "gnu: overloadargs__Fiiiiiii" "overloadargs(int, int, int, int, int, int, int)" -- test_demangling_exact "gnu: overloadargs__Fiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int)" -- test_demangling_exact "gnu: overloadargs__Fiiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int, int)" -- test_demangling_exact "gnu: overloadargs__Fiiiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int, int, int)" -- test_demangling_exact "gnu: overloadargs__Fiiiiiiiiiii" "overloadargs(int, int, int, int, int, int, int, int, int, int, int)" -- test_demangling "gnu: pick__13ivCompositionP8ivCanvasRC12ivAllocationiR5ivHit" \ -- "ivComposition::pick\[(\]+ivCanvas \[*\]+, (const ivAllocation|ivAllocation const) &, int, ivHit &\[)\]+" -- test_demangling "gnu: pointer__C11ivHScrollerRC7ivEventRC12ivAllocation" \ -- "ivHScroller::pointer\[(\]+(const ivEvent|ivEvent const) &, (const ivAllocation|ivAllocation const) &\[)\]+ const" -- test_demangling_exact "gnu: poke__8ivRasterUlUlffff" "ivRaster::poke(unsigned long, unsigned long, float, float, float, float)" -- test_demangling_exact "gnu: polar__Fdd" "polar(double, double)" -- test_demangling "gnu: read__10osStdInputRPCc" \ -- "osStdInput::read\[(\]+(const char|char const) \[*\]+&\[)\]+" -- -- test_demangling_exact "gnu: scale__13ivTransformerff" "ivTransformer::scale(float, float)" -- test_demangling "gnu: scanw__12CursesWindowPCce" \ -- "CursesWindow::scanw\[(\]+(const char|char const) \[*\]+,...\[)\]+" -- test_demangling "gnu: scmp__FPCcT0" \ -- "scmp\[(\]+(const char|char const) \[*\]+, (const char|char const) \[*\]+\[)\]+" -- test_demangling_exact "gnu: sgetn__7filebufPci" "filebuf::sgetn(char *, int)" -- test_demangling_exact "gnu: shift__FP5_FrepiT0" "shift(_Frep *, int, _Frep *)" -- test_demangling_exact "gnu: test__C6BitSeti" "BitSet::test(int) const" -- test_demangling_exact "gnu: test__C6BitSetii" "BitSet::test(int, int) const" -- test_demangling "gnu: testbit__FRC7Integerl" \ -- "testbit\[(\]+(const Integer|Integer const) &, long\[)\]+" -- test_demangling_exact "gnu: text_source__8Documentl" "Document::text_source(long)" -- test_demangling_exact "gnu: variance__6Erlangd" "Erlang::variance(double)" -- test_demangling "gnu: vform__8iostreamPCcPc" \ -- "iostream::vform\[(\]+(const char|char const) \[*\]+, char \[*\]+\[)\]+" -- test_demangling_exact "gnu: view__14DocumentViewerP8ItemViewP11TabularItem" "DocumentViewer::view(ItemView *, TabularItem *)" -- test_demangling_exact "gnu: xy_extents__11ivExtensionffff" "ivExtension::xy_extents(float, float, float, float)" -- test_demangling_exact "gnu: zero__8osMemoryPvUi" "osMemory::zero(void *, unsigned int)" -- test_demangling_exact "gnu: _2T4\$N" "T4::N" -- test_demangling_exact "gnu: _Q22T42t1\$N" "T4::t1::N" -- test_demangling_exact "gnu: get__2T1" "T1::get(void)" -- test_demangling_exact "gnu: get__Q22T11a" "T1::a::get(void)" -- test_demangling_exact "gnu: get__Q32T11a1b" "T1::a::b::get(void)" -- test_demangling_exact "gnu: get__Q42T11a1b1c" "T1::a::b::c::get(void)" -- test_demangling_exact "gnu: get__Q52T11a1b1c1d" "T1::a::b::c::d::get(void)" -- test_demangling_exact "gnu: put__2T1i" "T1::put(int)" -- test_demangling_exact "gnu: put__Q22T11ai" "T1::a::put(int)" -- test_demangling_exact "gnu: put__Q32T11a1bi" "T1::a::b::put(int)" -- test_demangling_exact "gnu: put__Q42T11a1b1ci" "T1::a::b::c::put(int)" -- test_demangling_exact "gnu: put__Q52T11a1b1c1di" "T1::a::b::c::d::put(int)" -- -- test_demangling_exact "gnu: bar__3fooPv" "foo::bar(void *)" -- test_demangling "gnu: bar__3fooPCv" \ -- "foo::bar\[(\]+(const void|void const) *\[*\]+\[)\]+" -- test_demangling_exact "gnu: bar__C3fooPv" "foo::bar(void *) const" -- test_demangling "gnu: bar__C3fooPCv" \ -- "foo::bar\[(\]+(const void|void const) *\[*\]+\[)\]+ const" -- test_demangling_exact "gnu: __eq__3fooRT0" "foo::operator==(foo &)" -- test_demangling "gnu: __eq__3fooRC3foo" \ -- "foo::operator==\[(\]+(const foo|foo const) &\[)\]+" -- test_demangling_exact "gnu: __eq__C3fooR3foo" "foo::operator==(foo &) const" -- test_demangling "gnu: __eq__C3fooRT0" \ -- "foo::operator==\[(\]+(const foo|foo const) &\[)\]+ const" -- -- test_demangling_exact "gnu: elem__t6vector1Zdi" "vector::elem(int)" -- test_demangling_exact "gnu: elem__t6vector1Zii" "vector::elem(int)" -- test_demangling_exact "gnu: __t6vector1Zdi" "vector::vector(int)" -- test_demangling_exact "gnu: __t6vector1Zii" "vector::vector(int)" -- test_demangling_exact "gnu: _\$_t6vector1Zdi" "vector::~vector(int)" -- test_demangling_exact "gnu: _\$_t6vector1Zii" "vector::~vector(int)" -- -- test_demangling_exact "gnu: __nw__t2T11ZcUi" "T1::operator new(unsigned int)" -- test_demangling_exact "gnu: __nw__t2T11Z1tUi" "T1::operator new(unsigned int)" -- test_demangling_exact "gnu: __dl__t2T11ZcPv" "T1::operator delete(void *)" -- test_demangling_exact "gnu: __dl__t2T11Z1tPv" "T1::operator delete(void *)" -- test_demangling_exact "gnu: __t2T11Zci" "T1::T1(int)" -- test_demangling_exact "gnu: __t2T11Zc" "T1::T1(void)" -- test_demangling_exact "gnu: __t2T11Z1ti" "T1::T1(int)" -- test_demangling_exact "gnu: __t2T11Z1t" "T1::T1(void)" -- -- test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity3Pix" \ -- "List::Pix::Pix(void)" -- -- test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity3PixPQ2t4List1Z10VHDLEntity7element" \ -- "List::Pix::Pix(List::element *)" -- -- test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity3PixRCQ2t4List1Z10VHDLEntity3Pix" \ -- "List::Pix::Pix(List::Pix const &)" -- -- test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity7elementRC10VHDLEntityPT0" \ -- "List::element::element(VHDLEntity const &, List::element *)" -- -- test_demangling_exact "gnu: __Q2t4List1Z10VHDLEntity7elementRCQ2t4List1Z10VHDLEntity7element" \ -- "List::element::element(List::element const &)" -- -- test_demangling_exact "gnu: __cl__C11VHDLLibraryGt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ -- "VHDLLibrary::operator()(PixX >) const" -- -- test_demangling_exact "gnu: __cl__Ct4List1Z10VHDLEntityRCQ2t4List1Z10VHDLEntity3Pix" \ -- "List::operator()(List::Pix const &) const" -- -- test_demangling_exact "gnu: __ne__FPvRCQ2t4List1Z10VHDLEntity3Pix" \ -- "operator!=(void *, List::Pix const &)" -- -- test_demangling_exact "gnu: __ne__FPvRCt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ -- "operator!=(void *, PixX > const &)" -- -- test_demangling_exact "gnu: __t4List1Z10VHDLEntityRCt4List1Z10VHDLEntity" \ -- "List::List(List const &)" -- -- test_demangling_exact "gnu: __t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ -- "PixX >::PixX(void)" -- -- test_demangling_exact "gnu: __t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntityP14VHDLLibraryRepGQ2t4List1Z10VHDLEntity3Pix" \ -- "PixX >::PixX(VHDLLibraryRep *, List::Pix)" -- -- test_demangling_exact "gnu: __t4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntityRCt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ -- "PixX >::PixX(PixX > const &)" -- -- test_demangling_exact "gnu: nextE__C11VHDLLibraryRt4PixX3Z11VHDLLibraryZ14VHDLLibraryRepZt4List1Z10VHDLEntity" \ -- "VHDLLibrary::nextE(PixX > &) const" -- -- test_demangling_exact "gnu: next__Ct4List1Z10VHDLEntityRQ2t4List1Z10VHDLEntity3Pix" \ -- "List::next(List::Pix &) const" -- -- test_demangling_exact "gnu: _GLOBAL_\$D\$set" "global destructors keyed to set" -- -- test_demangling_exact "gnu: _GLOBAL_\$I\$set" "global constructors keyed to set" -- -- test_demangling_exact "gnu: __as__t5ListS1ZUiRCt5ListS1ZUi" \ -- "ListS::operator=(ListS const &)" -- -- test_demangling_exact "gnu: __cl__Ct5ListS1ZUiRCQ2t5ListS1ZUi3Vix" \ -- "ListS::operator()(ListS::Vix const &) const" -- -- test_demangling_exact "gnu: __cl__Ct5SetLS1ZUiRCQ2t5SetLS1ZUi3Vix" \ -- "SetLS::operator()(SetLS::Vix const &) const" -- -- test_demangling_exact "gnu: __t10ListS_link1ZUiRCUiPT0" \ -- "ListS_link::ListS_link(unsigned int const &, ListS_link *)" -- -- test_demangling_exact "gnu: __t10ListS_link1ZUiRCt10ListS_link1ZUi" \ -- "ListS_link::ListS_link(ListS_link const &)" -- -- test_demangling_exact "gnu: __t5ListS1ZUiRCt5ListS1ZUi" \ -- "ListS::ListS(ListS const &)" -- -- test_demangling_exact "gnu: next__Ct5ListS1ZUiRQ2t5ListS1ZUi3Vix" \ -- "ListS::next(ListS::Vix &) const" -- -- test_demangling_exact "gnu: __ne__FPvRCQ2t5SetLS1ZUi3Vix" \ -- "operator!=(void *, SetLS::Vix const &)" -- test_demangling_exact "gnu: __t8ListElem1Z5LabelRt4List1Z5Label" \ -- "ListElem