From 020e73349114c56dedb2395f9f7be90b3396a6d7 Mon Sep 17 00:00:00 2001 From: Guinevere Larsen Date: Wed, 28 May 2025 12:38:40 -0300 Subject: [PATCH] Rebase RHEL9 GDB to 16.3 Resolves: RHEL-91381 Resolves: RHEL-50069 --- .gitignore | 1 + _gdb.spec.Patch.include | 250 +- _gdb.spec.patch.include | 54 - _git_upstream_commit | 2 +- _patch_order | 58 +- gdb-6.3-attach-see-vdso-test.patch | 120 - gdb-6.3-gstack-20050411.patch | 258 - ...337-resolve-tls-without-debuginfo-v2.patch | 265 - ...5-bz243845-stale-testing-zombie-test.patch | 89 - gdb-6.5-section-num-fixup-test.patch | 127 - ...warning-missing-debuginfo-rhbz981154.patch | 129 - ...buildid-locate-rpm-librpm-workaround.patch | 19 - gdb-6.6-buildid-locate-rpm.patch | 1084 --- ...6.6-buildid-locate-solib-missing-ids.patch | 238 - gdb-6.6-buildid-locate.patch | 1925 ---- gdb-6.6-bz229517-gcore-without-terminal.patch | 188 - gdb-6.6-testsuite-timeouts.patch | 32 - gdb-6.7-ppc-clobbered-registers-O2-test.patch | 108 - gdb-add-rpm-suggestion-script.patch | 1009 +++ gdb-archer-next-over-throw-cxx-exec.patch | 2 +- gdb-bz634108-solib_address.patch | 41 - gdb-container-rh-pkg.patch | 30 - gdb-core-open-vdso-warning.patch | 58 - gdb-fedora-libncursesw.patch | 333 - gdb-ftbs-swapped-calloc-args.patch | 42 - gdb-glibc-strstr-workaround.patch | 132 - gdb-linux_perf-bundle.patch | 226 - gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch | 264 - ...-generate-dwarf-5-index-consistently.patch | 101 - ...2086-generate-gdb-index-consistently.patch | 230 - ...hbz-2232086-reduce-size-of-gdb-index.patch | 222 - ...07614-memleak-infpy_read_memory-test.patch | 170 - ...149205-catch-syscall-after-fork-test.patch | 1 + gdb-rhbz1156192-recursive-dlopen-test.patch | 371 - ...bz1261564-aarch64-hw-watchpoint-test.patch | 104 - ...hbz2232086-refactor-selftest-support.patch | 77 - ...hbz2250652-avoid-PyOS_ReadlineTState.patch | 48 - gdb-rhbz2250652-gdbpy_gil.patch | 81 - ...2261580-intrusive_list-assertion-fix.patch | 55 - ...dvar-assertion-frame-failed-testcase.patch | 147 - ...inferior-funcall-bp-condition-1-of-5.patch | 70 - ...inferior-funcall-bp-condition-2-of-5.patch | 1274 --- ...inferior-funcall-bp-condition-3-of-5.patch | 1148 --- ...inferior-funcall-bp-condition-4-of-5.patch | 413 - ...inferior-funcall-bp-condition-5-of-5.patch | 467 - gdb-rhel-19390-pc-not-saved.patch | 379 - gdb-rhel-36225-add-arch14-record.patch | 46 - gdb-rhel-36518-add-power11-support.patch | 48 - gdb-rhel-36527-apx-disasm.patch | 7834 ----------------- ....patch => gdb-rhel-50069-support-z17.patch | 10 +- ...hel-86801-binutils-z17-update-10of12.patch | 103 - ...hel-86801-binutils-z17-update-11of12.patch | 244 - ...rhel-86801-binutils-z17-update-1of12.patch | 343 - ...rhel-86801-binutils-z17-update-2of12.patch | 99 - ...rhel-86801-binutils-z17-update-3of12.patch | 244 - ...rhel-86801-binutils-z17-update-4of12.patch | 30 - ...rhel-86801-binutils-z17-update-5of12.patch | 24 - ...rhel-86801-binutils-z17-update-6of12.patch | 97 - ...rhel-86801-binutils-z17-update-7of12.patch | 97 - ...rhel-86801-binutils-z17-update-8of12.patch | 25 - ...rhel-86801-binutils-z17-update-9of12.patch | 151 - ...ltaneous-step-resume-breakpoint-test.patch | 162 - gdb-test-bt-cfi-without-die.patch | 214 - gdb-test-dw2-aranges.patch | 220 - gdb.spec | 955 +- generate-git-repo-from-patches.sh | 6 +- generate-patches-from-git-repo.sh | 17 +- sources | 4 +- 68 files changed, 1496 insertions(+), 21919 deletions(-) delete mode 100644 gdb-6.3-attach-see-vdso-test.patch delete mode 100644 gdb-6.3-gstack-20050411.patch delete mode 100644 gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch delete mode 100644 gdb-6.5-bz243845-stale-testing-zombie-test.patch delete mode 100644 gdb-6.5-section-num-fixup-test.patch delete mode 100644 gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch delete mode 100644 gdb-6.6-buildid-locate-rpm-librpm-workaround.patch delete mode 100644 gdb-6.6-buildid-locate-rpm.patch delete mode 100644 gdb-6.6-buildid-locate-solib-missing-ids.patch delete mode 100644 gdb-6.6-buildid-locate.patch delete mode 100644 gdb-6.6-bz229517-gcore-without-terminal.patch delete mode 100644 gdb-6.6-testsuite-timeouts.patch delete mode 100644 gdb-6.7-ppc-clobbered-registers-O2-test.patch create mode 100644 gdb-add-rpm-suggestion-script.patch delete mode 100644 gdb-bz634108-solib_address.patch delete mode 100644 gdb-container-rh-pkg.patch delete mode 100644 gdb-core-open-vdso-warning.patch delete mode 100644 gdb-fedora-libncursesw.patch delete mode 100644 gdb-ftbs-swapped-calloc-args.patch delete mode 100644 gdb-glibc-strstr-workaround.patch delete mode 100644 gdb-linux_perf-bundle.patch delete mode 100644 gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch delete mode 100644 gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch delete mode 100644 gdb-rhbz-2232086-generate-gdb-index-consistently.patch delete mode 100644 gdb-rhbz-2232086-reduce-size-of-gdb-index.patch delete mode 100644 gdb-rhbz1007614-memleak-infpy_read_memory-test.patch delete mode 100644 gdb-rhbz1156192-recursive-dlopen-test.patch delete mode 100644 gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch delete mode 100644 gdb-rhbz2232086-refactor-selftest-support.patch delete mode 100644 gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch delete mode 100644 gdb-rhbz2250652-gdbpy_gil.patch delete mode 100644 gdb-rhbz2261580-intrusive_list-assertion-fix.patch delete mode 100644 gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch delete mode 100644 gdb-rhel-13298-inferior-funcall-bp-condition-1-of-5.patch delete mode 100644 gdb-rhel-13298-inferior-funcall-bp-condition-2-of-5.patch delete mode 100644 gdb-rhel-13298-inferior-funcall-bp-condition-3-of-5.patch delete mode 100644 gdb-rhel-13298-inferior-funcall-bp-condition-4-of-5.patch delete mode 100644 gdb-rhel-13298-inferior-funcall-bp-condition-5-of-5.patch delete mode 100644 gdb-rhel-19390-pc-not-saved.patch delete mode 100644 gdb-rhel-36225-add-arch14-record.patch delete mode 100644 gdb-rhel-36518-add-power11-support.patch delete mode 100644 gdb-rhel-36527-apx-disasm.patch rename gdb-rhel-86801-binutils-z17-update-12of12.patch => gdb-rhel-50069-support-z17.patch (81%) delete mode 100644 gdb-rhel-86801-binutils-z17-update-10of12.patch delete mode 100644 gdb-rhel-86801-binutils-z17-update-11of12.patch delete mode 100644 gdb-rhel-86801-binutils-z17-update-1of12.patch delete mode 100644 gdb-rhel-86801-binutils-z17-update-2of12.patch delete mode 100644 gdb-rhel-86801-binutils-z17-update-3of12.patch delete mode 100644 gdb-rhel-86801-binutils-z17-update-4of12.patch delete mode 100644 gdb-rhel-86801-binutils-z17-update-5of12.patch delete mode 100644 gdb-rhel-86801-binutils-z17-update-6of12.patch delete mode 100644 gdb-rhel-86801-binutils-z17-update-7of12.patch delete mode 100644 gdb-rhel-86801-binutils-z17-update-8of12.patch delete mode 100644 gdb-rhel-86801-binutils-z17-update-9of12.patch delete mode 100644 gdb-simultaneous-step-resume-breakpoint-test.patch delete mode 100644 gdb-test-bt-cfi-without-die.patch delete mode 100644 gdb-test-dw2-aranges.patch diff --git a/.gitignore b/.gitignore index 17a5208..ceb9c50 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ /v2.0.4.tar.gz /gdb-14.2.tar.xz /v2.0.5.tar.gz +/gdb-16.3.tar.xz diff --git a/_gdb.spec.Patch.include b/_gdb.spec.Patch.include index baf1520..b18fc10 100644 --- a/_gdb.spec.Patch.include +++ b/_gdb.spec.Patch.include @@ -1,153 +1,43 @@ # Check distro name is included in the version output. Patch001: gdb-6.3-rh-testversion-20041202.patch -# Add a wrapper script to GDB that implements pstack using the -# --readnever option. -#=push -Patch002: gdb-6.3-gstack-20050411.patch - -# Support TLS symbols (+`errno' suggestion if no pthread is found) (BZ 185337). -#=push+jan: It should be replaced by Infinity project. -Patch003: gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch - # Test sideeffects of skipping ppc .so libs trampolines (BZ 218379). #=fedoratest -Patch004: gdb-6.5-bz218379-ppc-solib-trampoline-test.patch - -# Allow running `/usr/bin/gcore' with provided but inaccessible tty (BZ 229517). -#=fedoratest -Patch005: gdb-6.6-bz229517-gcore-without-terminal.patch - -# Avoid too long timeouts on failing cases of "annota1.exp annota3.exp". -#=fedoratest -Patch006: gdb-6.6-testsuite-timeouts.patch +Patch002: gdb-6.5-bz218379-ppc-solib-trampoline-test.patch # Support for stepping over PPC atomic instruction sequences (BZ 237572). #=fedoratest -Patch007: gdb-6.6-bz237572-ppc-atomic-sequence-test.patch - -# Test kernel VDSO decoding while attaching to an i386 process. -#=fedoratest -Patch008: gdb-6.3-attach-see-vdso-test.patch - -# Test leftover zombie process (BZ 243845). -#=fedoratest -Patch009: gdb-6.5-bz243845-stale-testing-zombie-test.patch - -# New locating of the matching binaries from the pure core file (build-id). -#=push+jan -Patch010: 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 -Patch011: gdb-6.6-buildid-locate-solib-missing-ids.patch - -#=push+jan -Patch012: gdb-6.6-buildid-locate-rpm.patch - -# Test PPC hiding of call-volatile parameter register. -#=fedoratest -Patch013: gdb-6.7-ppc-clobbered-registers-O2-test.patch +Patch003: gdb-6.6-bz237572-ppc-atomic-sequence-test.patch # Test gcore memory and time requirements for large inferiors. #=fedoratest -Patch014: gdb-6.5-gcore-buffer-limit-test.patch +Patch004: 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. -Patch015: gdb-6.3-mapping-zero-inode-test.patch - -# Test a crash on libraries missing the .text section. -#=fedoratest -Patch016: gdb-6.5-section-num-fixup-test.patch +Patch005: gdb-6.3-mapping-zero-inode-test.patch # Fix resolving of variables at locations lists in prelinked libs (BZ 466901). #=fedoratest -Patch017: gdb-6.8-bz466901-backtrace-full-prelinked.patch - -# New test for step-resume breakpoint placed in multiple threads at once. -#=fedoratest -Patch018: 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@.*> -Patch019: gdb-core-open-vdso-warning.patch +Patch006: gdb-6.8-bz466901-backtrace-full-prelinked.patch # Fix follow-exec for C++ programs (bugreported by Martin Stransky). #=fedoratest -Patch020: gdb-archer-next-over-throw-cxx-exec.patch - -# Workaround librpm BZ 643031 due to its unexpected exit() calls (BZ 642879). -#=push+jan -Patch021: gdb-6.6-buildid-locate-rpm-librpm-workaround.patch - -# [delayed-symfile] Test a backtrace regression on CFIs without DIE (BZ 614604). -#=fedoratest -Patch022: gdb-test-bt-cfi-without-die.patch - -# Verify GDB Python built-in function gdb.solib_address exists (BZ # 634108). -#=fedoratest -Patch023: gdb-bz634108-solib_address.patch - -# [archer-tromey-delayed-symfile] New test gdb.dwarf2/dw2-aranges.exp. -#=fedoratest -Patch024: gdb-test-dw2-aranges.patch - -# Workaround PR libc/14166 for inferior calls of strstr. -#=fedoratest: Compatibility with RHELs (unchecked which ones). -Patch025: gdb-glibc-strstr-workaround.patch +Patch007: gdb-archer-next-over-throw-cxx-exec.patch # Testcase for `Setting solib-absolute-prefix breaks vDSO' (BZ 818343). #=fedoratest -Patch026: 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 -Patch027: gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch - -# Fix 'memory leak in infpy_read_memory()' (RH BZ 1007614) -#=fedoratest -Patch028: 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 -Patch029: gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch - -# Testcase for '[SAP] Recursive dlopen causes SAP HANA installer to -# crash.' (RH BZ 1156192). -#=fedoratest -Patch030: gdb-rhbz1156192-recursive-dlopen-test.patch +Patch008: gdb-rhbz-818343-set-solib-absolute-prefix-testcase.patch # Fix '`catch syscall' doesn't work for parent after `fork' is called' # (Philippe Waroquiers, RH BZ 1149205). #=fedoratest -Patch031: gdb-rhbz1149205-catch-syscall-after-fork-test.patch +Patch009: gdb-rhbz1149205-catch-syscall-after-fork-test.patch # Fix '[ppc64] and [s390x] wrong prologue skip on -O2 -g code' (Jan # Kratochvil, RH BZ 1084404). #=fedoratest -Patch032: gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch - -# Force libncursesw over libncurses to match the includes (RH BZ 1270534). -#=push+jan -Patch033: gdb-fedora-libncursesw.patch - -# [aarch64] Fix hardware watchpoints (RH BZ 1261564). -#=fedoratest -Patch034: gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch - -# Add messages suggesting more recent RHEL gdbserver (RH BZ 1321114). -#=fedora -Patch035: gdb-container-rh-pkg.patch - -# [dts+el7] [x86*] Bundle linux_perf.h for libipt (RH BZ 1256513). -#=fedora -Patch036: gdb-linux_perf-bundle.patch +Patch010: gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch # Update gdb-add-index.sh such that, when the GDB environment # variable is not set, the script is smarter than just looking for @@ -161,121 +51,13 @@ Patch036: gdb-linux_perf-bundle.patch # https://fedoraproject.org/wiki/Changes/Minimal_GDB_in_buildroot # #=fedora -Patch037: gdb-add-index.patch +Patch011: gdb-add-index.patch -# Back-port upstream commit 1f0fab7ff86 as part of a fix for -# non-deterministic gdb-index generation (RH BZ 2232086). -Patch038: gdb-rhbz2232086-refactor-selftest-support.patch +# Not a backport. Add a new script which hooks into GDB and suggests +# RPMs to install when GDB finds an objfile with no debug info. +Patch012: gdb-add-rpm-suggestion-script.patch -# Back-port upstream commit aa19bc1d259 as part of a fix for -# non-deterministic gdb-index generation (RH BZ 2232086). -Patch039: gdb-rhbz-2232086-reduce-size-of-gdb-index.patch - -# Back-port upstream commit acc117b57f7 as part of a fix for -# non-deterministic gdb-index generation (RH BZ 2232086). -Patch040: gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch - -# Back-port upstream commit aff250145af as part of a fix for -# non-deterministic gdb-index generation (RH BZ 2232086). -Patch041: gdb-rhbz-2232086-generate-gdb-index-consistently.patch - -# Back-port upstream commit 3644f41dc80 as part of a fix for -# non-deterministic gdb-index generation (RH BZ 2232086). -Patch042: gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch - - -Patch043: gdb-rhbz2250652-gdbpy_gil.patch - - -Patch044: gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch - - -Patch045: gdb-ftbs-swapped-calloc-args.patch - -# Backport upstream workaround for GCC 14 problem which cause assertion -# failures in GDB. -Patch046: gdb-rhbz2261580-intrusive_list-assertion-fix.patch - -# Backport "gdb: s390: Add arch14 record/replay support" -# (Andreas Arnez, RHEL-36225) -Patch047: gdb-rhel-36225-add-arch14-record.patch - -# Backport "PowerPC: Add support for Power11 options" -# (Peter Bergner, RHEL-36518) -Patch048: gdb-rhel-36518-add-power11-support.patch - -# Update x86 disassembler -Patch049: gdb-rhel-36527-apx-disasm.patch - -#Revert "gdb: remove unnecessary parameter wait_ptid from do_target_wait" -#(Andrew Burgess, RHEL-13298) -Patch050: gdb-rhel-13298-inferior-funcall-bp-condition-1-of-5.patch - -#gdb: fix b/p conditions with infcalls in multi-threaded inferiors -#(Andrew Burgess, RHEL-13298) -Patch051: gdb-rhel-13298-inferior-funcall-bp-condition-2-of-5.patch - -#gdb: add timeouts for inferior function calls -#(Andrew Burgess, RHEL-13298) -Patch052: gdb-rhel-13298-inferior-funcall-bp-condition-3-of-5.patch - -#gdb: introduce unwind-on-timeout setting -#(Andrew Burgess, RHEL-13298) -Patch053: gdb-rhel-13298-inferior-funcall-bp-condition-4-of-5.patch - -#gdb: rename unwindonsignal to unwind-on-signal -#(Andrew Burgess, RHEL-13298) -Patch054: gdb-rhel-13298-inferior-funcall-bp-condition-5-of-5.patch - -#gdb/unwinders: better support for $pc not saved -#(Andrew Burgess, RHEL-19390) -Patch055: gdb-rhel-19390-pc-not-saved.patch - -# Backkport "s390: Make operand table indices relative to each other" -# (Jens Remus, RHEL-86801) -Patch056: gdb-rhel-86801-binutils-z17-update-1of12.patch - -# Backkport "s390: Align optional operand definition to specs" -# (Jens Remus, RHEL-86801) -Patch057: gdb-rhel-86801-binutils-z17-update-2of12.patch - -# Backkport "s390: Add missing extended mnemonics" -# (Jens Remus, RHEL-86801) -Patch058: gdb-rhel-86801-binutils-z17-update-3of12.patch - -# Backkport "s390: Correct prno instruction name" -# (Jens Remus, RHEL-86801) -Patch059: gdb-rhel-86801-binutils-z17-update-4of12.patch - -# Backkport "Fix building for the s390 target with clang" -# (Nick Clifton, RHEL-86801) -Patch060: gdb-rhel-86801-binutils-z17-update-5of12.patch - -# Backkport "s390: Align letter case of instruction descriptions" -# (Jens Remus, RHEL-86801) -Patch061: gdb-rhel-86801-binutils-z17-update-6of12.patch - -# Backkport "s390: Provide IBM z16 (arch14) instruction descriptions" -# (Jens Remus, RHEL-86801) -Patch062: gdb-rhel-86801-binutils-z17-update-7of12.patch - -# Backkport "s390: Align opcodes to lower-case" -# (Jens Remus, RHEL-86801) -Patch063: gdb-rhel-86801-binutils-z17-update-8of12.patch - -# Backkport "s390: Simplify (dis)assembly of insn operands with const bits" -# (Jens Remus, RHEL-86801) -Patch064: gdb-rhel-86801-binutils-z17-update-9of12.patch - -# Backkport "s390: Relax risbg[n]z, risb{h|l}gz, {rns|ros|rxs}bgt operand constraints" -# (Jens Remus, RHEL-86801) -Patch065: gdb-rhel-86801-binutils-z17-update-10of12.patch - -# Backkport "s390: Add arch15 instructions" -# (Andreas Krebbel, RHEL-86801) -Patch066: gdb-rhel-86801-binutils-z17-update-11of12.patch - -# Backkport "s390: Add support for z17 as CPU name" -# (Jens Remus, RHEL-86801) -Patch067: gdb-rhel-86801-binutils-z17-update-12of12.patch +# Backport "s390: Add support for z17 as CPU name" +# (Jens Remus, RHEL-50069) +Patch013: gdb-rhel-50069-support-z17.patch diff --git a/_gdb.spec.patch.include b/_gdb.spec.patch.include index 6bc063a..cb13330 100644 --- a/_gdb.spec.patch.include +++ b/_gdb.spec.patch.include @@ -11,57 +11,3 @@ %patch -p1 -P011 %patch -p1 -P012 %patch -p1 -P013 -%patch -p1 -P014 -%patch -p1 -P015 -%patch -p1 -P016 -%patch -p1 -P017 -%patch -p1 -P018 -%patch -p1 -P019 -%patch -p1 -P020 -%patch -p1 -P021 -%patch -p1 -P022 -%patch -p1 -P023 -%patch -p1 -P024 -%patch -p1 -P025 -%patch -p1 -P026 -%patch -p1 -P027 -%patch -p1 -P028 -%patch -p1 -P029 -%patch -p1 -P030 -%patch -p1 -P031 -%patch -p1 -P032 -%patch -p1 -P033 -%patch -p1 -P034 -%patch -p1 -P035 -%patch -p1 -P036 -%patch -p1 -P037 -%patch -p1 -P038 -%patch -p1 -P039 -%patch -p1 -P040 -%patch -p1 -P041 -%patch -p1 -P042 -%patch -p1 -P043 -%patch -p1 -P044 -%patch -p1 -P045 -%patch -p1 -P046 -%patch -p1 -P047 -%patch -p1 -P048 -%patch -p1 -P049 -%patch -p1 -P050 -%patch -p1 -P051 -%patch -p1 -P052 -%patch -p1 -P053 -%patch -p1 -P054 -%patch -p1 -P055 -%patch -p1 -P056 -%patch -p1 -P057 -%patch -p1 -P058 -%patch -p1 -P059 -%patch -p1 -P060 -%patch -p1 -P061 -%patch -p1 -P062 -%patch -p1 -P063 -%patch -p1 -P064 -%patch -p1 -P065 -%patch -p1 -P066 -%patch -p1 -P067 diff --git a/_git_upstream_commit b/_git_upstream_commit index b70cde9..1e79418 100644 --- a/_git_upstream_commit +++ b/_git_upstream_commit @@ -1 +1 @@ -02c10eaecb63e5dbb99cbfdd1c5385e53ed031ff +140ba011c003fda0fb2f746cf2bc0f010bf4ac03 diff --git a/_patch_order b/_patch_order index 02327d4..bf9dc18 100644 --- a/_patch_order +++ b/_patch_order @@ -1,67 +1,13 @@ gdb-6.3-rh-testversion-20041202.patch -gdb-6.3-gstack-20050411.patch -gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch gdb-6.5-bz218379-ppc-solib-trampoline-test.patch -gdb-6.6-bz229517-gcore-without-terminal.patch -gdb-6.6-testsuite-timeouts.patch gdb-6.6-bz237572-ppc-atomic-sequence-test.patch -gdb-6.3-attach-see-vdso-test.patch -gdb-6.5-bz243845-stale-testing-zombie-test.patch -gdb-6.6-buildid-locate.patch -gdb-6.6-buildid-locate-solib-missing-ids.patch -gdb-6.6-buildid-locate-rpm.patch -gdb-6.7-ppc-clobbered-registers-O2-test.patch gdb-6.5-gcore-buffer-limit-test.patch gdb-6.3-mapping-zero-inode-test.patch -gdb-6.5-section-num-fixup-test.patch gdb-6.8-bz466901-backtrace-full-prelinked.patch -gdb-simultaneous-step-resume-breakpoint-test.patch -gdb-core-open-vdso-warning.patch gdb-archer-next-over-throw-cxx-exec.patch -gdb-6.6-buildid-locate-rpm-librpm-workaround.patch -gdb-test-bt-cfi-without-die.patch -gdb-bz634108-solib_address.patch -gdb-test-dw2-aranges.patch -gdb-glibc-strstr-workaround.patch gdb-rhbz-818343-set-solib-absolute-prefix-testcase.patch -gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch -gdb-rhbz1007614-memleak-infpy_read_memory-test.patch -gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch -gdb-rhbz1156192-recursive-dlopen-test.patch gdb-rhbz1149205-catch-syscall-after-fork-test.patch gdb-rhbz1084404-ppc64-s390x-wrong-prologue-skip-O2-g-3of3.patch -gdb-fedora-libncursesw.patch -gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch -gdb-container-rh-pkg.patch -gdb-linux_perf-bundle.patch gdb-add-index.patch -gdb-rhbz2232086-refactor-selftest-support.patch -gdb-rhbz-2232086-reduce-size-of-gdb-index.patch -gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch -gdb-rhbz-2232086-generate-gdb-index-consistently.patch -gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch -gdb-rhbz2250652-gdbpy_gil.patch -gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch -gdb-ftbs-swapped-calloc-args.patch -gdb-rhbz2261580-intrusive_list-assertion-fix.patch -gdb-rhel-36225-add-arch14-record.patch -gdb-rhel-36518-add-power11-support.patch -gdb-rhel-36527-apx-disasm.patch -gdb-rhel-13298-inferior-funcall-bp-condition-1-of-5.patch -gdb-rhel-13298-inferior-funcall-bp-condition-2-of-5.patch -gdb-rhel-13298-inferior-funcall-bp-condition-3-of-5.patch -gdb-rhel-13298-inferior-funcall-bp-condition-4-of-5.patch -gdb-rhel-13298-inferior-funcall-bp-condition-5-of-5.patch -gdb-rhel-19390-pc-not-saved.patch -gdb-rhel-86801-binutils-z17-update-1of12.patch -gdb-rhel-86801-binutils-z17-update-2of12.patch -gdb-rhel-86801-binutils-z17-update-3of12.patch -gdb-rhel-86801-binutils-z17-update-4of12.patch -gdb-rhel-86801-binutils-z17-update-5of12.patch -gdb-rhel-86801-binutils-z17-update-6of12.patch -gdb-rhel-86801-binutils-z17-update-7of12.patch -gdb-rhel-86801-binutils-z17-update-8of12.patch -gdb-rhel-86801-binutils-z17-update-9of12.patch -gdb-rhel-86801-binutils-z17-update-10of12.patch -gdb-rhel-86801-binutils-z17-update-11of12.patch -gdb-rhel-86801-binutils-z17-update-12of12.patch +gdb-add-rpm-suggestion-script.patch +gdb-rhel-50069-support-z17.patch diff --git a/gdb-6.3-attach-see-vdso-test.patch b/gdb-6.3-attach-see-vdso-test.patch deleted file mode 100644 index daba42f..0000000 --- a/gdb-6.3-attach-see-vdso-test.patch +++ /dev/null @@ -1,120 +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.3-attach-see-vdso-test.patch - -;; Test kernel VDSO decoding while attaching to an i386 process. -;;=fedoratest - -diff --git a/gdb/testsuite/gdb.base/attach-see-vdso.c b/gdb/testsuite/gdb.base/attach-see-vdso.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/attach-see-vdso.c -@@ -0,0 +1,25 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2007 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -+ -+#include -+ -+int main () -+{ -+ pause (); -+ return 1; -+} -diff --git a/gdb/testsuite/gdb.base/attach-see-vdso.exp b/gdb/testsuite/gdb.base/attach-see-vdso.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/attach-see-vdso.exp -@@ -0,0 +1,77 @@ -+# Copyright 2007 -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ -+# This file was created by Jan Kratochvil . -+ -+# This test only works on Linux -+if { ![istarget "*-*-linux-gnu*"] } { -+ return 0 -+} -+ -+if {[use_gdb_stub]} { -+ untested "skipping test because of use_gdb_stub" -+ return -1 -+} -+ -+set testfile "attach-see-vdso" -+set srcfile ${testfile}.c -+set binfile [standard_output_file ${testfile}] -+set escapedbinfile [string_to_regexp [standard_output_file ${testfile}]] -+ -+# The kernel VDSO is used for the syscalls returns only on i386 (not x86_64). -+# -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug additional_flags=-m32}] != "" } { -+ gdb_suppress_entire_file "Testcase nonthraded compile failed, so all tests in this file will automatically fail." -+} -+ -+if [get_compiler_info ${binfile}] { -+ return -1 -+} -+ -+# Start the program running and then wait for a bit, to be sure -+# that it can be attached to. -+ -+set testpid [eval exec $binfile &] -+ -+# Avoid some race: -+sleep 2 -+ -+# Start with clean gdb -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+# Never call: gdb_load ${binfile} -+# as the former problem would not reproduce otherwise. -+ -+set test "attach" -+gdb_test_multiple "attach $testpid" "$test" { -+ -re "Attaching to process $testpid\r?\n.*$gdb_prompt $" { -+ pass "$test" -+ } -+} -+ -+gdb_test "bt" "#0 *0x\[0-9a-f\]* in \[^?\].*" "backtrace decodes VDSO" -+ -+# Exit and detach the process. -+ -+gdb_exit -+ -+# Make sure we don't leave a process around to confuse -+# the next test run (and prevent the compile by keeping -+# the text file busy), in case the "set should_exit" didn't -+# work. -+ -+remote_exec build "kill -9 ${testpid}" diff --git a/gdb-6.3-gstack-20050411.patch b/gdb-6.3-gstack-20050411.patch deleted file mode 100644 index 01e8ffa..0000000 --- a/gdb-6.3-gstack-20050411.patch +++ /dev/null @@ -1,258 +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-gstack-20050411.patch - -;; Add a wrapper script to GDB that implements pstack using the -;; --readnever option. -;;=push - -2004-11-23 Andrew Cagney - - * Makefile.in (uninstall-gstack, install-gstack): New rules, add - to install and uninstall. - * gstack.sh, gstack.1: New files. - -diff --git a/gdb/Makefile.in b/gdb/Makefile.in ---- a/gdb/Makefile.in -+++ b/gdb/Makefile.in -@@ -2035,7 +2035,7 @@ info install-info clean-info dvi pdf install-pdf html install-html: force - install: all - @$(MAKE) $(FLAGS_TO_PASS) install-only - --install-only: $(CONFIG_INSTALL) -+install-only: install-gstack $(CONFIG_INSTALL) - transformed_name=`t='$(program_transform_name)'; \ - echo gdb | sed -e "$$t"` ; \ - if test "x$$transformed_name" = x; then \ -@@ -2085,7 +2085,25 @@ install-guile: - install-python: - $(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(GDB_DATADIR)/python/gdb - --uninstall: force $(CONFIG_UNINSTALL) -+GSTACK=gstack -+.PHONY: install-gstack -+install-gstack: -+ transformed_name=`t='$(program_transform_name)'; \ -+ echo $(GSTACK) | sed -e "$$t"` ; \ -+ if test "x$$transformed_name" = x; then \ -+ transformed_name=$(GSTACK) ; \ -+ else \ -+ true ; \ -+ fi ; \ -+ $(SHELL) $(srcdir)/../mkinstalldirs $(DESTDIR)$(bindir) ; \ -+ $(INSTALL_PROGRAM) $(srcdir)/$(GSTACK).sh \ -+ $(DESTDIR)$(bindir)/$$transformed_name$(EXEEXT) ; \ -+ : $(SHELL) $(srcdir)/../mkinstalldirs \ -+ $(DESTDIR)$(man1dir) ; \ -+ : $(INSTALL_DATA) $(srcdir)/gstack.1 \ -+ $(DESTDIR)$(man1dir)/$$transformed_name.1 -+ -+uninstall: force uninstall-gstack $(CONFIG_UNINSTALL) - transformed_name=`t='$(program_transform_name)'; \ - echo gdb | sed -e $$t` ; \ - if test "x$$transformed_name" = x; then \ -@@ -2116,6 +2134,18 @@ uninstall: force $(CONFIG_UNINSTALL) - rm -f $(DESTDIR)$(bindir)/$$transformed_name - @$(MAKE) DO=uninstall "DODIRS=$(SUBDIRS)" $(FLAGS_TO_PASS) subdir_do - -+.PHONY: uninstall-gstack -+uninstall-gstack: -+ transformed_name=`t='$(program_transform_name)'; \ -+ echo $(GSTACK) | sed -e $$t` ; \ -+ if test "x$$transformed_name" = x; then \ -+ transformed_name=$(GSTACK) ; \ -+ else \ -+ true ; \ -+ fi ; \ -+ rm -f $(DESTDIR)$(bindir)/$$transformed_name$(EXEEXT) \ -+ $(DESTDIR)$(man1dir)/$$transformed_name.1 -+ - # The C++ name parser can be built standalone for testing. - test-cp-name-parser.o: cp-name-parser.c - $(COMPILE) -DTEST_CPNAMES cp-name-parser.c -diff --git a/gdb/gstack.sh b/gdb/gstack.sh -new file mode 100644 ---- /dev/null -+++ b/gdb/gstack.sh -@@ -0,0 +1,43 @@ -+#!/bin/sh -+ -+if test $# -ne 1; then -+ echo "Usage: `basename $0 .sh` " 1>&2 -+ exit 1 -+fi -+ -+if test ! -r /proc/$1; then -+ echo "Process $1 not found." 1>&2 -+ exit 1 -+fi -+ -+# GDB doesn't allow "thread apply all bt" when the process isn't -+# threaded; need to peek at the process to determine if that or the -+# simpler "bt" should be used. -+ -+backtrace="bt" -+if test -d /proc/$1/task ; then -+ # Newer kernel; has a task/ directory. -+ if test `/bin/ls /proc/$1/task | /usr/bin/wc -l` -gt 1 2>/dev/null ; then -+ backtrace="thread apply all bt" -+ fi -+elif test -f /proc/$1/maps ; then -+ # Older kernel; go by it loading libpthread. -+ if /bin/grep -e libpthread /proc/$1/maps > /dev/null 2>&1 ; then -+ backtrace="thread apply all bt" -+ fi -+fi -+ -+GDB=${GDB:-gdb} -+ -+# Run GDB, strip out unwanted noise. -+# --readnever is no longer used since .gdb_index is now in use. -+$GDB --quiet -nx $GDBARGS /proc/$1/exe $1 <&1 | -+set width 0 -+set height 0 -+set pagination no -+$backtrace -+EOF -+/bin/sed -n \ -+ -e 's/^\((gdb) \)*//' \ -+ -e '/^#/p' \ -+ -e '/^Thread/p' -diff --git a/gdb/testsuite/gdb.base/gstack.c b/gdb/testsuite/gdb.base/gstack.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gstack.c -@@ -0,0 +1,43 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2005, 2007, 2008, 2009 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include -+#include -+#include -+ -+void -+func (void) -+{ -+ const char msg[] = "looping\n"; -+ -+ /* Use the most simple notification not to get caught by attach on exiting -+ the function. */ -+ write (1, msg, strlen (msg)); -+ -+ for (;;); -+} -+ -+int -+main (void) -+{ -+ alarm (60); -+ nice (100); -+ -+ func (); -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/gstack.exp b/gdb/testsuite/gdb.base/gstack.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gstack.exp -@@ -0,0 +1,84 @@ -+# Copyright (C) 2012 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+set testfile gstack -+set executable ${testfile} -+set binfile [standard_output_file $executable] -+if {[build_executable ${testfile} ${executable} "" {debug}] == -1} { -+ return -1 -+} -+ -+set test "spawn inferior" -+set command "${binfile}" -+set res [remote_spawn host $command]; -+if { $res < 0 || $res == "" } { -+ perror "Spawning $command failed." -+ fail $test -+ return -+} -+ -+# The spawn id of the test inferior. -+set test_spawn_id $res -+ -+set use_gdb_stub 1 -+set pid [exp_pid -i $res] -+gdb_expect { -+ -re "looping\r\n" { -+ pass $test -+ } -+ eof { -+ fail "$test (eof)" -+ return -+ } -+ timeout { -+ fail "$test (timeout)" -+ return -+ } -+} -+ -+# Testcase uses the most simple notification not to get caught by attach on -+# exiting the function. Still we could retry the gstack command if we fail. -+ -+set test "spawn gstack" -+set command "sh -c GDB=$GDB\\ GDBARGS=-data-directory\\\\\\ $BUILD_DATA_DIRECTORY\\ sh\\ ${srcdir}/../gstack.sh\\ $pid\\;echo\\ GSTACK-END" -+set res [remote_spawn host $command]; -+if { $res < 0 || $res == "" } { -+ perror "Spawning $command failed." -+ fail $test -+} -+ -+set gdb_spawn_id $res -+ -+gdb_test_multiple "" $test { -+ -re "^#0 +(0x\[0-9a-f\]+ in )?\\.?func \\(\\) at \[^\r\n\]*\r\n#1 +0x\[0-9a-f\]+ in \\.?main \\(\\) at \[^\r\n\]*\r\nGSTACK-END\r\n\$" { -+ pass $test -+ } -+} -+ -+gdb_test_multiple "" "gstack exits" { -+ eof { -+ set result [wait -i $gdb_spawn_id] -+ verbose $result -+ -+ gdb_assert { [lindex $result 2] == 0 } "gstack exits with no error" -+ gdb_assert { [lindex $result 3] == 0 } "gstack's exit status is 0" -+ -+ remote_close host -+ clear_gdb_spawn_id -+ } -+} -+ -+# Kill the test inferior. -+kill_wait_spawned_process $test_spawn_id diff --git a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch b/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch deleted file mode 100644 index ab64f7f..0000000 --- a/gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch +++ /dev/null @@ -1,265 +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-bz185337-resolve-tls-without-debuginfo-v2.patch - -;; Support TLS symbols (+`errno' suggestion if no pthread is found) (BZ 185337). -;;=push+jan: It should be replaced by Infinity project. - -https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=185337 - -2008-02-24 Jan Kratochvil - - Port to GDB-6.8pre. - -currently for trivial nonthreaded helloworld with no debug info up to -ggdb2 you -will get: - (gdb) p errno - [some error] - -* with -ggdb2 and less "errno" in fact does not exist anywhere as it was - compiled to "(*__errno_location ())" and the macro definition is not present. - Unfortunately gdb will find the TLS symbol and it will try to access it but - as the program has been compiled without -lpthread the TLS base register - (%gs on i386) is not setup and it will result in: - Cannot access memory at address 0x8 - -Attached suggestion patch how to deal with the most common "errno" symbol -for the most common under-ggdb3 compiled programs. - -Original patch hooked into target_translate_tls_address. But its inferior -call invalidates `struct frame *' in the callers - RH BZ 690908. - -https://bugzilla.redhat.com/show_bug.cgi?id=1166549 - -2007-11-03 Jan Kratochvil - - * ./gdb/dwarf2read.c (read_partial_die, dwarf2_linkage_name): Prefer - DW_AT_MIPS_linkage_name over DW_AT_name now only for non-C. - -glibc-debuginfo-2.7-2.x86_64: /usr/lib/debug/lib64/libc.so.6.debug: - <81a2> DW_AT_name : (indirect string, offset: 0x280e): __errno_location - <81a8> DW_AT_MIPS_linkage_name: (indirect string, offset: 0x2808): *__GI___errno_location - -diff --git a/gdb/printcmd.c b/gdb/printcmd.c ---- a/gdb/printcmd.c -+++ b/gdb/printcmd.c -@@ -1308,6 +1308,11 @@ process_print_command_args (const char *args, value_print_options *print_opts, - - if (exp != nullptr && *exp) - { -+ /* '*((int *(*) (void)) __errno_location) ()' is incompatible with -+ function descriptors. */ -+ if (target_has_execution () && strcmp (exp, "errno") == 0) -+ exp = "*(*(int *(*)(void)) __errno_location) ()"; -+ - /* This setting allows large arrays to be printed by limiting the - number of elements that are loaded into GDB's memory; we only - need to load as many array elements as we plan to print. */ -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno.c b/gdb/testsuite/gdb.dwarf2/dw2-errno.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-errno.c -@@ -0,0 +1,28 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2005, 2007 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . -+ -+ Please email any bugs, comments, and/or additions to this file to: -+ bug-gdb@prep.ai.mit.edu */ -+ -+#include -+ -+int main() -+{ -+ errno = 42; -+ -+ return 0; /* breakpoint */ -+} -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno.exp b/gdb/testsuite/gdb.dwarf2/dw2-errno.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-errno.exp -@@ -0,0 +1,60 @@ -+# Copyright 2007 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+set testfile dw2-errno -+set srcfile ${testfile}.c -+set binfile [standard_output_file ${testfile}] -+ -+proc prep {} { -+ global srcdir subdir binfile -+ gdb_exit -+ gdb_start -+ gdb_reinitialize_dir $srcdir/$subdir -+ gdb_load ${binfile} -+ -+ runto_main -+ -+ gdb_breakpoint [gdb_get_line_number "breakpoint"] -+ gdb_continue_to_breakpoint "breakpoint" -+} -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g2"] != "" } { -+ untested "Couldn't compile test program" -+ return -1 -+} -+prep -+gdb_test "print errno" ".* = 42" "errno with macros=N threads=N" -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g3"] != "" } { -+ untested "Couldn't compile test program" -+ return -1 -+} -+prep -+gdb_test "print errno" ".* = 42" "errno with macros=Y threads=N" -+ -+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g2"] != "" } { -+ return -1 -+} -+prep -+gdb_test "print errno" ".* = 42" "errno with macros=N threads=Y" -+ -+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable "additional_flags=-g3"] != "" } { -+ return -1 -+} -+prep -+gdb_test "print errno" ".* = 42" "errno with macros=Y threads=Y" -+ -+# TODO: Test the error on resolving ERRNO with only libc loaded. -+# Just how to find the current libc filename? -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno2.c b/gdb/testsuite/gdb.dwarf2/dw2-errno2.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-errno2.c -@@ -0,0 +1,28 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2005, 2007 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . -+ -+ Please email any bugs, comments, and/or additions to this file to: -+ bug-gdb@prep.ai.mit.edu */ -+ -+#include -+ -+int main() -+{ -+ errno = 42; -+ -+ return 0; /* breakpoint */ -+} -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp b/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-errno2.exp -@@ -0,0 +1,71 @@ -+# Copyright 2007 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+set testfile dw2-errno2 -+set srcfile ${testfile}.c -+set binfile [standard_output_file ${testfile}] -+ -+proc prep { message {do_xfail 0} } { with_test_prefix $message { -+ global srcdir subdir binfile variant -+ gdb_exit -+ gdb_start -+ gdb_reinitialize_dir $srcdir/$subdir -+ gdb_load ${binfile}${variant} -+ -+ runto_main -+ -+ gdb_breakpoint [gdb_get_line_number "breakpoint"] -+ gdb_continue_to_breakpoint "breakpoint" -+ -+ gdb_test "gcore ${binfile}${variant}.core" "\r\nSaved corefile .*" "gcore $variant" -+ -+ gdb_test "print errno" ".* = 42" -+ -+ gdb_test "kill" ".*" "kill" {Kill the program being debugged\? \(y or n\) } "y" -+ gdb_test "core-file ${binfile}${variant}.core" "\r\nCore was generated by .*" "core-file" -+ if $do_xfail { -+ setup_xfail "*-*-*" -+ } -+ gdb_test "print (int) errno" ".* = 42" "print errno for core" -+}} -+ -+set variant g2thrN -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g2"] != "" } { -+ untested "Couldn't compile test program" -+ return -1 -+} -+prep "macros=N threads=N" 1 -+ -+set variant g3thrN -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g3"] != "" } { -+ untested "Couldn't compile test program" -+ return -1 -+} -+prep "macros=Y threads=N" 1 -+ -+set variant g2thrY -+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g2"] != "" } { -+ return -1 -+} -+prep "macros=N threads=Y" -+ -+set variant g3thrY -+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}${variant}" executable "additional_flags=-g3"] != "" } { -+ return -1 -+} -+prep "macros=Y threads=Y" 1 -+ -+# TODO: Test the error on resolving ERRNO with only libc loaded. -+# Just how to find the current libc filename? diff --git a/gdb-6.5-bz243845-stale-testing-zombie-test.patch b/gdb-6.5-bz243845-stale-testing-zombie-test.patch deleted file mode 100644 index 2d62949..0000000 --- a/gdb-6.5-bz243845-stale-testing-zombie-test.patch +++ /dev/null @@ -1,89 +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-bz243845-stale-testing-zombie-test.patch - -;; Test leftover zombie process (BZ 243845). -;;=fedoratest - -diff --git a/gdb/testsuite/gdb.base/tracefork-zombie.exp b/gdb/testsuite/gdb.base/tracefork-zombie.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/tracefork-zombie.exp -@@ -0,0 +1,76 @@ -+# Copyright 2007 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ -+ -+# are we on a target board -+if {[use_gdb_stub]} { -+ untested "skipping test because of use_gdb_stub" -+ return -1 -+} -+ -+# Start the program running and then wait for a bit, to be sure -+# that it can be attached to. -+ -+gdb_exit -+gdb_start -+gdb_load sleep -+ -+set gdb_pid [exp_pid -i [board_info host fileid]] -+set test "identified the child GDB" -+if {$gdb_pid != "" && $gdb_pid > 0} { -+ pass $test -+ verbose -log "Child GDB PID $gdb_pid" -+} else { -+ fail $test -+} -+ -+set testpid [eval exec sleep 10 &] -+exec sleep 2 -+ -+set test "attach" -+gdb_test_multiple "attach $testpid" "$test" { -+ -re "Attaching to program.*`?.*'?, process $testpid..*$gdb_prompt $" { -+ pass "$test" -+ } -+ -re "Attaching to program.*`?.*\.exe'?, process $testpid.*\[Switching to thread $testpid\..*\].*$gdb_prompt $" { -+ # Response expected on Cygwin -+ pass "$test" -+ } -+} -+ -+# Some time to let GDB spawn its testing child. -+exec sleep 2 -+ -+set found none -+foreach procpid [glob -directory /proc -type d {[0-9]*}] { -+ if {[catch {open $procpid/status} statusfi]} { -+ continue -+ } -+ set status [read $statusfi] -+ close $statusfi -+ if {1 -+ && [regexp -line {^Name:\tgdb$} $status] -+ && [regexp -line {^PPid:\t1$} $status] -+ && [regexp -line "^TracerPid:\t$gdb_pid$" $status]} { -+ set found $procpid -+ verbose -log "Found linux_test_for_tracefork zombie PID $procpid" -+ } -+} -+set test "linux_test_for_tracefork leaves no zombie" -+if {$found eq {none}} { -+ pass $test -+} else { -+ fail $test -+} diff --git a/gdb-6.5-section-num-fixup-test.patch b/gdb-6.5-section-num-fixup-test.patch deleted file mode 100644 index 2fa3995..0000000 --- a/gdb-6.5-section-num-fixup-test.patch +++ /dev/null @@ -1,127 +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-section-num-fixup-test.patch - -;; Test a crash on libraries missing the .text section. -;;=fedoratest - -diff --git a/gdb/testsuite/gdb.base/datalib-lib.c b/gdb/testsuite/gdb.base/datalib-lib.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/datalib-lib.c -@@ -0,0 +1,22 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2008 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ -+ Please email any bugs, comments, and/or additions to this file to: -+ bug-gdb@prep.ai.mit.edu */ -+ -+int var; -diff --git a/gdb/testsuite/gdb.base/datalib-main.c b/gdb/testsuite/gdb.base/datalib-main.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/datalib-main.c -@@ -0,0 +1,26 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2008 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 2 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program; if not, write to the Free Software -+ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ -+ Please email any bugs, comments, and/or additions to this file to: -+ bug-gdb@prep.ai.mit.edu */ -+ -+int -+main (void) -+{ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/datalib.exp b/gdb/testsuite/gdb.base/datalib.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/datalib.exp -@@ -0,0 +1,56 @@ -+# Copyright 2008 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ -+if {[use_gdb_stub]} { -+ untested "skipping test because of use_gdb_stub" -+ return -1 -+} -+ -+set testfile datalib -+set srcfilemain ${testfile}-main.c -+set srcfilelib ${testfile}-lib.c -+set libfile [standard_output_file ${testfile}-lib.so] -+set binfile [standard_output_file ${testfile}-main] -+if { [gdb_compile "${srcdir}/${subdir}/${srcfilelib}" "${libfile}" executable [list debug {additional_flags=-shared -nostdlib}]] != "" } { -+ untested "Couldn't compile test program" -+ return -1 -+} -+if { [gdb_compile "${srcdir}/${subdir}/${srcfilemain}" "${binfile} ${libfile}" executable {debug}] != "" } { -+ untested "Couldn't compile test program" -+ return -1 -+} -+ -+# Get things started. -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+# We must use a separate library as the main executable is compiled to the -+# address 0 by default and it would get fixed up already at the end of -+# INIT_OBJFILE_SECT_INDICES. We also cannot PRELINK it as PRELINK is missing -+# on ia64. The library must be NOSTDLIB as otherwise some stub code would -+# create the `.text' section there. Also DEBUG option is useful as some of -+# the crashes occur in dwarf2read.c. -+ -+# FAIL case: -+# ../../gdb/ia64-tdep.c:2838: internal-error: sect_index_text not initialized -+# A problem internal to GDB has been detected, -+ -+gdb_test "start" \ -+ "main \\(\\) at .*${srcfilemain}.*" \ -+ "start" diff --git a/gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch b/gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch deleted file mode 100644 index 985cb6a..0000000 --- a/gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch +++ /dev/null @@ -1,129 +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-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch - -;; Fix 'gdb gives highly misleading error when debuginfo pkg is present, -;; but not corresponding binary pkg' (RH BZ 981154). -;;=push+jan - -Comments by Sergio Durigan Junior : - - This is the fix for RH BZ #981154 - - It is mainly a testcase addition, but a minor fix in the gdb/build-id.c - file was also needed. - - gdb/build-id.c was added by: - - commit dc294be54c96414035eed7d53dafdea0a6f31a72 - Author: Tom Tromey - Date: Tue Oct 8 19:56:15 2013 +0000 - - and had a little thinko there. The variable 'filename' needs to be set to - 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/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 -+++ b/gdb/testsuite/gdb.base/rhbz981154-misleading-yum-install-warning.exp -@@ -0,0 +1,97 @@ -+# 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 "normal.c" -+ -+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { -+ return -1 -+} -+ -+# Get the build-id of the file -+set build_id_debug_file [build_id_debug_filename_get $binfile] -+regsub -all ".debug$" $build_id_debug_file "" build_id_without_debug -+ -+# Run to main -+if { ![runto_main] } { -+ return -1 -+} -+ -+# We first need to generate a corefile -+set escapedfilename [string_to_regexp [standard_output_file gcore.test]] -+set core_supported 0 -+gdb_test_multiple "gcore [standard_output_file gcore.test]" \ -+ "save a corefile" \ -+{ -+ -re "Saved corefile ${escapedfilename}\[\r\n\]+$gdb_prompt $" { -+ pass "save a corefile" -+ global core_supported -+ set core_supported 1 -+ } -+ -re "Can't create a corefile\[\r\n\]+$gdb_prompt $" { -+ unsupported "save a corefile" -+ global core_supported -+ set core_supported 0 -+ } -+} -+ -+if {!$core_supported} { -+ return -1 -+} -+ -+# Move the binfile to a temporary name -+remote_exec build "mv $binfile ${binfile}.old" -+ -+# Reinitialize GDB and see if we get a yum/dnf warning -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+ -+with_test_prefix "first run:" { -+ gdb_test "set build-id-verbose 1" "" \ -+ "set build-id-verbose" -+ -+ gdb_test "set debug-file-directory [file dirname [standard_output_file gcore.test]]" "" \ -+ "set debug-file-directory" -+ -+ gdb_test "core-file [standard_output_file gcore.test]" \ -+ "Missing separate debuginfo for the main executable file\r\nTry: (yum|dnf) --enablerepo='\\*debug\\*' install [standard_output_file $build_id_without_debug]\r\n.*" \ -+ "test first yum/dnf warning" -+} -+ -+# Now we define and create our .build-id -+file mkdir [file dirname [standard_output_file ${build_id_without_debug}]] -+# Cannot use "file link" (from TCL) because it requires the target file to -+# exist. -+remote_exec build "ln -s $binfile [standard_output_file ${build_id_without_debug}]" -+ -+# Reinitialize GDB to get the second yum/dnf warning -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+ -+with_test_prefix "second run:" { -+ gdb_test "set build-id-verbose 1" "" \ -+ "set build-id-verbose" -+ -+ gdb_test "set debug-file-directory [file dirname [standard_output_file gcore.test]]" "" \ -+ "set debug-file-directory" -+ -+ gdb_test "core-file [standard_output_file gcore.test]" \ -+ "Missing separate debuginfo for the main executable file\r\nTry: (yum|dnf) --enablerepo='\\*debug\\*' install $binfile\r\n.*" \ -+ "test second yum/dnf warning" -+} -+ -+# Leaving the link there will cause breakage in the next run. -+remote_exec build "rm -f [standard_output_file ${build_id_without_debug}]" diff --git a/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch b/gdb-6.6-buildid-locate-rpm-librpm-workaround.patch deleted file mode 100644 index 2b862a0..0000000 --- a/gdb-6.6-buildid-locate-rpm-librpm-workaround.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.6-buildid-locate-rpm-librpm-workaround.patch - -;; Workaround librpm BZ 643031 due to its unexpected exit() calls (BZ 642879). -;;=push+jan - -diff --git a/gdb/proc-service.list b/gdb/proc-service.list ---- a/gdb/proc-service.list -+++ b/gdb/proc-service.list -@@ -37,4 +37,7 @@ - ps_pstop; - ps_ptread; - ps_ptwrite; -+ -+ /* gdb-6.6-buildid-locate-rpm.patch */ -+ rpmsqEnable; - }; diff --git a/gdb-6.6-buildid-locate-rpm.patch b/gdb-6.6-buildid-locate-rpm.patch deleted file mode 100644 index f38fdd5..0000000 --- a/gdb-6.6-buildid-locate-rpm.patch +++ /dev/null @@ -1,1084 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Kevin Buettner -Date: Wed, 22 Feb 2023 22:30:40 -0700 -Subject: gdb-6.6-buildid-locate-rpm.patch - -;;=push+jan - -diff --git a/gdb/aclocal.m4 b/gdb/aclocal.m4 ---- a/gdb/aclocal.m4 -+++ b/gdb/aclocal.m4 -@@ -11,7 +11,223 @@ - # even the implied warranty of MERCHANTABILITY or FITNESS FOR A - # PARTICULAR PURPOSE. - -+# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- -+# serial 1 (pkg-config-0.24) -+# -+# Copyright © 2004 Scott James Remnant . -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, but -+# WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -+# General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+# -+# As a special exception to the GNU General Public License, if you -+# distribute this file as part of a program that contains a -+# configuration script generated by Autoconf, you may include it under -+# the same distribution terms that you use for the rest of that program. -+ -+# PKG_PROG_PKG_CONFIG([MIN-VERSION]) -+# ---------------------------------- -+AC_DEFUN([PKG_PROG_PKG_CONFIG], -+[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) -+m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) -+m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) -+AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) -+AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) -+AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) -+ -+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then -+ AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) -+fi -+if test -n "$PKG_CONFIG"; then -+ _pkg_min_version=m4_default([$1], [0.9.0]) -+ AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) -+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then -+ AC_MSG_RESULT([yes]) -+ else -+ AC_MSG_RESULT([no]) -+ PKG_CONFIG="" -+ fi -+fi[]dnl -+])# PKG_PROG_PKG_CONFIG -+ -+# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -+# -+# Check to see whether a particular set of modules exists. Similar -+# to PKG_CHECK_MODULES(), but does not set variables or print errors. -+# -+# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -+# only at the first occurence in configure.ac, so if the first place -+# it's called might be skipped (such as if it is within an "if", you -+# have to call PKG_CHECK_EXISTS manually -+# -------------------------------------------------------------- -+AC_DEFUN([PKG_CHECK_EXISTS], -+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -+if test -n "$PKG_CONFIG" && \ -+ AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then -+ m4_default([$2], [:]) -+m4_ifvaln([$3], [else -+ $3])dnl -+fi]) -+ -+# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) -+# --------------------------------------------- -+m4_define([_PKG_CONFIG], -+[if test -n "$$1"; then -+ pkg_cv_[]$1="$$1" -+ elif test -n "$PKG_CONFIG"; then -+ PKG_CHECK_EXISTS([$3], -+ [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` -+ test "x$?" != "x0" && pkg_failed=yes ], -+ [pkg_failed=yes]) -+ else -+ pkg_failed=untried -+fi[]dnl -+])# _PKG_CONFIG -+ -+# _PKG_SHORT_ERRORS_SUPPORTED -+# ----------------------------- -+AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], -+[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) -+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then -+ _pkg_short_errors_supported=yes -+else -+ _pkg_short_errors_supported=no -+fi[]dnl -+])# _PKG_SHORT_ERRORS_SUPPORTED -+ -+ -+# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], -+# [ACTION-IF-NOT-FOUND]) -+# -+# -+# Note that if there is a possibility the first call to -+# PKG_CHECK_MODULES might not happen, you should be sure to include an -+# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac -+# -+# -+# -------------------------------------------------------------- -+AC_DEFUN([PKG_CHECK_MODULES], -+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -+AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl -+AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl -+ -+pkg_failed=no -+AC_MSG_CHECKING([for $1]) -+ -+_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) -+_PKG_CONFIG([$1][_LIBS], [libs], [$2]) -+ -+m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS -+and $1[]_LIBS to avoid the need to call pkg-config. -+See the pkg-config man page for more details.]) -+ -+if test $pkg_failed = yes; then -+ AC_MSG_RESULT([no]) -+ _PKG_SHORT_ERRORS_SUPPORTED -+ if test $_pkg_short_errors_supported = yes; then -+ $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` -+ else -+ $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` -+ fi -+ # Put the nasty error message in config.log where it belongs -+ echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD -+ -+ m4_default([$4], [AC_MSG_ERROR( -+[Package requirements ($2) were not met: -+ -+$$1_PKG_ERRORS -+ -+Consider adjusting the PKG_CONFIG_PATH environment variable if you -+installed software in a non-standard prefix. -+ -+_PKG_TEXT])[]dnl -+ ]) -+elif test $pkg_failed = untried; then -+ AC_MSG_RESULT([no]) -+ m4_default([$4], [AC_MSG_FAILURE( -+[The pkg-config script could not be found or is too old. Make sure it -+is in your PATH or set the PKG_CONFIG environment variable to the full -+path to pkg-config. -+ -+_PKG_TEXT -+ -+To get pkg-config, see .])[]dnl -+ ]) -+else -+ $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS -+ $1[]_LIBS=$pkg_cv_[]$1[]_LIBS -+ AC_MSG_RESULT([yes]) -+ $3 -+fi[]dnl -+])# PKG_CHECK_MODULES -+ -+ -+# PKG_INSTALLDIR(DIRECTORY) -+# ------------------------- -+# Substitutes the variable pkgconfigdir as the location where a module -+# should install pkg-config .pc files. By default the directory is -+# $libdir/pkgconfig, but the default can be changed by passing -+# DIRECTORY. The user can override through the --with-pkgconfigdir -+# parameter. -+AC_DEFUN([PKG_INSTALLDIR], -+[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) -+m4_pushdef([pkg_description], -+ [pkg-config installation directory @<:@]pkg_default[@:>@]) -+AC_ARG_WITH([pkgconfigdir], -+ [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, -+ [with_pkgconfigdir=]pkg_default) -+AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) -+m4_popdef([pkg_default]) -+m4_popdef([pkg_description]) -+]) dnl PKG_INSTALLDIR -+ -+ -+# PKG_NOARCH_INSTALLDIR(DIRECTORY) -+# ------------------------- -+# Substitutes the variable noarch_pkgconfigdir as the location where a -+# module should install arch-independent pkg-config .pc files. By -+# default the directory is $datadir/pkgconfig, but the default can be -+# changed by passing DIRECTORY. The user can override through the -+# --with-noarch-pkgconfigdir parameter. -+AC_DEFUN([PKG_NOARCH_INSTALLDIR], -+[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) -+m4_pushdef([pkg_description], -+ [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) -+AC_ARG_WITH([noarch-pkgconfigdir], -+ [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, -+ [with_noarch_pkgconfigdir=]pkg_default) -+AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) -+m4_popdef([pkg_default]) -+m4_popdef([pkg_description]) -+]) dnl PKG_NOARCH_INSTALLDIR -+ -+ -+# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, -+# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) -+# ------------------------------------------- -+# Retrieves the value of the pkg-config variable for the given module. -+AC_DEFUN([PKG_CHECK_VAR], -+[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl -+AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl -+ -+_PKG_CONFIG([$1], [variable="][$3]["], [$2]) -+AS_VAR_COPY([$1], [pkg_cv_][$1]) -+ -+AS_VAR_IF([$1], [""], [$5], [$4])dnl -+])# PKG_CHECK_VAR -+ - m4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])]) -+ - # AM_AUX_DIR_EXPAND -*- Autoconf -*- - - # Copyright (C) 2001-2017 Free Software Foundation, Inc. -diff --git a/gdb/build-id.c b/gdb/build-id.c ---- a/gdb/build-id.c -+++ b/gdb/build-id.c -@@ -780,10 +780,10 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor) - static rpmts (*rpmtsCreate_p) (void); - extern rpmts rpmtsFree(rpmts ts); - static rpmts (*rpmtsFree_p) (rpmts ts); -- extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, -+ extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag, - const void * keyp, size_t keylen); - static rpmdbMatchIterator (*rpmtsInitIterator_p) (const rpmts ts, -- rpmTag rpmtag, -+ rpmDbiTagVal rpmtag, - const void *keyp, - size_t keylen); - #else /* !DLOPEN_LIBRPM */ -@@ -838,7 +838,7 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor) - && (rpmdbNextIterator_p = (Header (*) (rpmdbMatchIterator mi)) dlsym (h, "rpmdbNextIterator")) - && (rpmtsCreate_p = (rpmts (*) (void)) dlsym (h, "rpmtsCreate")) - && (rpmtsFree_p = (rpmts (*) (rpmts ts)) dlsym (h, "rpmtsFree")) -- && (rpmtsInitIterator_p = (rpmdbMatchIterator (*) (const rpmts ts, rpmTag rpmtag, const void *keyp, size_t keylen)) dlsym (h, "rpmtsInitIterator")))) -+ && (rpmtsInitIterator_p = (rpmdbMatchIterator (*) (const rpmts ts, rpmDbiTagVal rpmtag, const void *keyp, size_t keylen)) dlsym (h, "rpmtsInitIterator")))) - { - warning (_("Opened library \"%s\" is incompatible (%s), " - "missing debuginfos notifications will not be displayed"), -@@ -926,7 +926,7 @@ missing_rpm_enlist_1 (const char *filename, int verify_vendor) - - /* RPMDBI_PACKAGES requires keylen == sizeof (int). */ - /* RPMDBI_LABEL is an interface for NVR-based dbiFindByLabel(). */ -- mi_debuginfo = rpmtsInitIterator_p (ts, (rpmTag) RPMDBI_LABEL, debuginfo, 0); -+ mi_debuginfo = rpmtsInitIterator_p (ts, (rpmDbiTagVal) RPMDBI_LABEL, debuginfo, 0); - xfree (debuginfo); - if (mi_debuginfo) - { -diff --git a/gdb/config.in b/gdb/config.in ---- a/gdb/config.in -+++ b/gdb/config.in -@@ -42,6 +42,9 @@ - /* Handle .ctf type-info sections */ - #undef ENABLE_LIBCTF - -+/* librpm version specific library name to dlopen. */ -+#undef DLOPEN_LIBRPM -+ - /* Define to 1 if translation of program messages to the user's native - language is requested. */ - #undef ENABLE_NLS -@@ -265,6 +268,9 @@ - /* Define to 1 if you have the `m' library (-lm). */ - #undef HAVE_LIBM - -+/* Define if librpm library is being used. */ -+#undef HAVE_LIBRPM -+ - /* Define to 1 if you have the header file. */ - #undef HAVE_LIBUNWIND_IA64_H - -diff --git a/gdb/configure b/gdb/configure ---- a/gdb/configure -+++ b/gdb/configure -@@ -778,6 +778,11 @@ AMD_DBGAPI_CFLAGS - ENABLE_BFD_64_BIT_FALSE - ENABLE_BFD_64_BIT_TRUE - subdirs -+RPM_LIBS -+RPM_CFLAGS -+PKG_CONFIG_LIBDIR -+PKG_CONFIG_PATH -+PKG_CONFIG - GDB_DATADIR - DEBUGDIR - MAKEINFO_EXTRA_FLAGS -@@ -911,6 +916,7 @@ with_gdb_datadir - with_relocated_sources - with_auto_load_dir - with_auto_load_safe_path -+with_rpm - enable_targets - enable_64_bit_bfd - with_amd_dbgapi -@@ -988,6 +994,8 @@ AMD_DBGAPI_CFLAGS - AMD_DBGAPI_LIBS - DEBUGINFOD_CFLAGS - DEBUGINFOD_LIBS -+RPM_CFLAGS -+RPM_LIBS - YACC - YFLAGS - ZSTD_CFLAGS -@@ -1679,6 +1687,8 @@ Optional Packages: - --with-amd-dbgapi support for the amd-dbgapi target (yes / no / auto) - --with-debuginfod Enable debuginfo lookups with debuginfod - (auto/yes/no) -+ --with-rpm query rpm database for missing debuginfos (yes/no, -+ def. auto=librpm.so) - --with-libunwind-ia64 use libunwind frame unwinding for ia64 targets - --with-curses use the curses library instead of the termcap - library -@@ -1759,6 +1769,8 @@ Some influential environment variables: - C compiler flags for DEBUGINFOD, overriding pkg-config - DEBUGINFOD_LIBS - linker flags for DEBUGINFOD, overriding pkg-config -+ RPM_CFLAGS C compiler flags for RPM, overriding pkg-config -+ RPM_LIBS linker flags for RPM, overriding pkg-config - YACC The `Yet Another Compiler Compiler' implementation to use. - Defaults to the first program found out of: `bison -y', `byacc', - `yacc'. -@@ -18039,6 +18051,495 @@ _ACEOF - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $with_auto_load_safe_path" >&5 - $as_echo "$with_auto_load_safe_path" >&6; } - -+# Integration with rpm library to support missing debuginfo suggestions. -+# --without-rpm: Disable any rpm support. -+# --with-rpm=libname.so: Try to dynamically open `libname.so' during runtime. -+# Even with runtime missing `libname.so' GDB will still other run correctly. -+# Missing `libname.so' during ./configure will abort the configuration. -+# --with-rpm=librpm.so: Like `--with-rpm=libname.so' but try to find specific -+# minor version first such as `librpm-4.6.so' as minor version differences -+# mean API+ABI incompatibility. If the specific match versioned library name -+# could not be found still open dynamically at least `librpm.so'. -+# --with-rpm: Like `--with-rpm=librpm.so' but if any of its detection fails try -+# to find librpm for compilation-time linking by pkg-config. GDB binary will -+# be probably linked with the version specific library (as `librpm-4.6.so'). -+# Failure to find librpm by pkg-config will abort the configuration. -+# (default) --with-rpm=auto: Like `--with-rpm=librpm.so' but if even pkg-config -+# cannot find librpm use to the rpmless compilation (like `--without-rpm'). -+ -+ -+# Check whether --with-rpm was given. -+if test "${with_rpm+set}" = set; then : -+ withval=$with_rpm; -+else -+ with_rpm="auto" -+fi -+ -+ -+ -+ -+if test "x$with_rpm" != "xno"; then -+ if test "x$with_rpm" = "xyes"; then -+ LIBRPM="librpm.so" -+ RPM_REQUIRE=true -+ DLOPEN_REQUIRE=false -+ elif test "x$with_rpm" = "xauto"; then -+ LIBRPM="librpm.so" -+ RPM_REQUIRE=false -+ DLOPEN_REQUIRE=false -+ else -+ LIBRPM="$with_rpm" -+ RPM_REQUIRE=true -+ DLOPEN_REQUIRE=true -+ fi -+ LIBRPM_STRING='"'"$LIBRPM"'"' -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking specific librpm version" >&5 -+$as_echo_n "checking specific librpm version... " >&6; } -+ HAVE_DLOPEN_LIBRPM=false -+ save_LIBS="$LIBS" -+ LIBS="$LIBS -ldl" -+ if test "$cross_compiling" = yes; then : -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 -+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;} -+as_fn_error "cannot run test program while cross compiling -+See \`config.log' for more details." "$LINENO" 5; } -+else -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+#include -+#include -+#include -+#include -+ -+int -+main () -+{ -+ -+ void *h; -+ const char *const *rpmverp; -+ FILE *f; -+ -+ f = fopen ("conftest.out", "w"); -+ if (!f) -+ { -+ fprintf (stderr, "Cannot write \"%s\": %s\n", "conftest.out", -+ strerror (errno)); -+ return 1; -+ } -+ h = dlopen ($LIBRPM_STRING, RTLD_LAZY); -+ if (!h) -+ { -+ fprintf (stderr, "dlopen (\"%s\"): %s\n", $LIBRPM_STRING, dlerror ()); -+ return 1; -+ } -+ rpmverp = dlsym (h, "RPMVERSION"); -+ if (!rpmverp) -+ { -+ fprintf (stderr, "dlsym (\"RPMVERSION\"): %s\n", dlerror ()); -+ return 1; -+ } -+ fprintf (stderr, "RPMVERSION is: \""); -+ fprintf (stderr, "%s\"\n", *rpmverp); -+ -+ /* Try to find the specific librpm version only for "librpm.so" as we do -+ not know how to assemble the version string otherwise. */ -+ -+ if (strcmp ("librpm.so", $LIBRPM_STRING) != 0) -+ { -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ else -+ { -+ char *h2_name; -+ void *h2; -+ int major, minor; -+ -+ if (sscanf (*rpmverp, "%d.%d", &major, &minor) != 2) -+ { -+ fprintf (stderr, "Unable to parse RPMVERSION.\n"); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ /* Avoid the square brackets by malloc. */ -+ h2_name = malloc (64); -+ sprintf (h2_name, "librpm-%d.%d.so", major, minor); -+ h2 = dlopen (h2_name, RTLD_LAZY); -+ if (!h2) -+ { -+ fprintf (stderr, "dlopen (\"%s\"): %s\n", h2_name, dlerror ()); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ if (h2 != h) -+ { -+ fprintf (stderr, "dlopen of \"%s\" and \"%s\" are different.\n", -+ $LIBRPM_STRING, h2_name); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ /* Found the valid .so name with a specific version. */ -+ fprintf (f, "%s\n", h2_name); -+ return 0; -+ } -+ -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_run "$LINENO"; then : -+ -+ DLOPEN_LIBRPM="`cat conftest.out`" -+ if test "x$DLOPEN_LIBRPM" != "x"; then -+ HAVE_DLOPEN_LIBRPM=true -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $DLOPEN_LIBRPM" >&5 -+$as_echo "$DLOPEN_LIBRPM" >&6; } -+ fi -+ -+fi -+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ -+ conftest.$ac_objext conftest.beam conftest.$ac_ext -+fi -+ -+ rm -f conftest.out -+ -+ -+ -+ if $HAVE_DLOPEN_LIBRPM; then -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking rpm library API compatibility" >&5 -+$as_echo_n "checking rpm library API compatibility... " >&6; } -+ # The compilation requires -Werror to verify anything. -+ save_CFLAGS="$CFLAGS" -+ CFLAGS="$CFLAGS -Werror" -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+/* Duplicate here the declarations to verify they match "elfread.c". */ -+#include -+#include -+#include -+#include -+extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); -+extern int rpmReadConfigFiles(const char * file, const char * target); -+extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); -+extern Header rpmdbNextIterator(rpmdbMatchIterator mi); -+extern rpmts rpmtsCreate(void); -+extern rpmts rpmtsFree(rpmts ts); -+extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag, -+ const void * keyp, size_t keylen); -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_compile "$LINENO"; then : -+ -+ LIBRPM_COMPAT=true -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -+$as_echo "yes" >&6; } -+ -+else -+ -+ LIBRPM_COMPAT=false -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+ -+fi -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ CFLAGS="$save_CFLAGS" -+ -+ if ! $LIBRPM_COMPAT; then -+ HAVE_DLOPEN_LIBRPM=false -+ fi -+ fi -+ -+ if $HAVE_DLOPEN_LIBRPM; then -+ DLOPEN_LIBRPM_STRING='"'"$DLOPEN_LIBRPM"'"' -+ -+cat >>confdefs.h <<_ACEOF -+#define DLOPEN_LIBRPM $DLOPEN_LIBRPM_STRING -+_ACEOF -+ -+ -+$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h -+ -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+ LIBS="$save_LIBS" -+ if $DLOPEN_REQUIRE; then -+ as_fn_error "Specific name $LIBRPM was requested but it could not be opened." "$LINENO" 5 -+ fi -+ -+ -+ -+ -+ -+ -+ -+if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then -+ if test -n "$ac_tool_prefix"; then -+ # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. -+set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } -+if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : -+ $as_echo_n "(cached) " >&6 -+else -+ case $PKG_CONFIG in -+ [\\/]* | ?:[\\/]*) -+ ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. -+ ;; -+ *) -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+ done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+fi -+PKG_CONFIG=$ac_cv_path_PKG_CONFIG -+if test -n "$PKG_CONFIG"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 -+$as_echo "$PKG_CONFIG" >&6; } -+else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+fi -+ -+ -+fi -+if test -z "$ac_cv_path_PKG_CONFIG"; then -+ ac_pt_PKG_CONFIG=$PKG_CONFIG -+ # Extract the first word of "pkg-config", so it can be a program name with args. -+set dummy pkg-config; ac_word=$2 -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -+$as_echo_n "checking for $ac_word... " >&6; } -+if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : -+ $as_echo_n "(cached) " >&6 -+else -+ case $ac_pt_PKG_CONFIG in -+ [\\/]* | ?:[\\/]*) -+ ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. -+ ;; -+ *) -+ as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -+for as_dir in $PATH -+do -+ IFS=$as_save_IFS -+ test -z "$as_dir" && as_dir=. -+ for ac_exec_ext in '' $ac_executable_extensions; do -+ if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -+ ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" -+ $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -+ break 2 -+ fi -+done -+ done -+IFS=$as_save_IFS -+ -+ ;; -+esac -+fi -+ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG -+if test -n "$ac_pt_PKG_CONFIG"; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 -+$as_echo "$ac_pt_PKG_CONFIG" >&6; } -+else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+fi -+ -+ if test "x$ac_pt_PKG_CONFIG" = x; then -+ PKG_CONFIG="" -+ else -+ case $cross_compiling:$ac_tool_warned in -+yes:) -+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -+ac_tool_warned=yes ;; -+esac -+ PKG_CONFIG=$ac_pt_PKG_CONFIG -+ fi -+else -+ PKG_CONFIG="$ac_cv_path_PKG_CONFIG" -+fi -+ -+fi -+if test -n "$PKG_CONFIG"; then -+ _pkg_min_version=0.9.0 -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 -+$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } -+ if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -+$as_echo "yes" >&6; } -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+ PKG_CONFIG="" -+ fi -+fi -+ -+pkg_failed=no -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for RPM" >&5 -+$as_echo_n "checking for RPM... " >&6; } -+ -+if test -n "$RPM_CFLAGS"; then -+ pkg_cv_RPM_CFLAGS="$RPM_CFLAGS" -+ elif test -n "$PKG_CONFIG"; then -+ if test -n "$PKG_CONFIG" && \ -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"rpm\""; } >&5 -+ ($PKG_CONFIG --exists --print-errors "rpm") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+ test $ac_status = 0; }; then -+ pkg_cv_RPM_CFLAGS=`$PKG_CONFIG --cflags "rpm" 2>/dev/null` -+ test "x$?" != "x0" && pkg_failed=yes -+else -+ pkg_failed=yes -+fi -+ else -+ pkg_failed=untried -+fi -+if test -n "$RPM_LIBS"; then -+ pkg_cv_RPM_LIBS="$RPM_LIBS" -+ elif test -n "$PKG_CONFIG"; then -+ if test -n "$PKG_CONFIG" && \ -+ { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"rpm\""; } >&5 -+ ($PKG_CONFIG --exists --print-errors "rpm") 2>&5 -+ ac_status=$? -+ $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 -+ test $ac_status = 0; }; then -+ pkg_cv_RPM_LIBS=`$PKG_CONFIG --libs "rpm" 2>/dev/null` -+ test "x$?" != "x0" && pkg_failed=yes -+else -+ pkg_failed=yes -+fi -+ else -+ pkg_failed=untried -+fi -+ -+ -+ -+if test $pkg_failed = yes; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+ -+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then -+ _pkg_short_errors_supported=yes -+else -+ _pkg_short_errors_supported=no -+fi -+ if test $_pkg_short_errors_supported = yes; then -+ RPM_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "rpm" 2>&1` -+ else -+ RPM_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "rpm" 2>&1` -+ fi -+ # Put the nasty error message in config.log where it belongs -+ echo "$RPM_PKG_ERRORS" >&5 -+ -+ HAVE_LIBRPM=false -+elif test $pkg_failed = untried; then -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+ HAVE_LIBRPM=false -+else -+ RPM_CFLAGS=$pkg_cv_RPM_CFLAGS -+ RPM_LIBS=$pkg_cv_RPM_LIBS -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -+$as_echo "yes" >&6; } -+ HAVE_LIBRPM=true -+fi -+ -+ if $HAVE_LIBRPM; then -+ -+ { $as_echo "$as_me:${as_lineno-$LINENO}: checking rpm library API compatibility" >&5 -+$as_echo_n "checking rpm library API compatibility... " >&6; } -+ # The compilation requires -Werror to verify anything. -+ save_CFLAGS="$CFLAGS" -+ CFLAGS="$CFLAGS -Werror" -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+/* Duplicate here the declarations to verify they match "elfread.c". */ -+#include -+#include -+#include -+#include -+extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); -+extern int rpmReadConfigFiles(const char * file, const char * target); -+extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); -+extern Header rpmdbNextIterator(rpmdbMatchIterator mi); -+extern rpmts rpmtsCreate(void); -+extern rpmts rpmtsFree(rpmts ts); -+extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag, -+ const void * keyp, size_t keylen); -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_compile "$LINENO"; then : -+ -+ LIBRPM_COMPAT=true -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 -+$as_echo "yes" >&6; } -+ -+else -+ -+ LIBRPM_COMPAT=false -+ { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -+$as_echo "no" >&6; } -+ -+fi -+rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext -+ CFLAGS="$save_CFLAGS" -+ -+ if ! $LIBRPM_COMPAT; then -+ HAVE_LIBRPM=false -+ RPM_PKG_ERRORS="Found $LIBRPM API is incompatibile with this GDB" -+ fi -+ fi -+ -+ if $HAVE_LIBRPM; then -+ -+$as_echo "#define HAVE_LIBRPM 1" >>confdefs.h -+ -+ CFLAGS="$CFLAGS $RPM_CFLAGS" -+ LIBS="$LIBS $RPM_LIBS" -+ else -+ if $RPM_REQUIRE; then -+ as_fn_error "$RPM_PKG_ERRORS" "$LINENO" 5 -+ else -+ { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $RPM_PKG_ERRORS" >&5 -+$as_echo "$as_me: WARNING: $RPM_PKG_ERRORS" >&2;} -+ fi -+ fi -+ fi -+fi -+ - - - subdirs="$subdirs testsuite" -diff --git a/gdb/configure.ac b/gdb/configure.ac ---- a/gdb/configure.ac -+++ b/gdb/configure.ac -@@ -173,6 +173,200 @@ AC_DEFINE_DIR(AUTO_LOAD_SAFE_PATH, escape_dir, - [Directories safe to hold auto-loaded files.]) - AC_MSG_RESULT([$with_auto_load_safe_path]) - -+# Integration with rpm library to support missing debuginfo suggestions. -+# --without-rpm: Disable any rpm support. -+# --with-rpm=libname.so: Try to dynamically open `libname.so' during runtime. -+# Even with runtime missing `libname.so' GDB will still other run correctly. -+# Missing `libname.so' during ./configure will abort the configuration. -+# --with-rpm=librpm.so: Like `--with-rpm=libname.so' but try to find specific -+# minor version first such as `librpm-4.6.so' as minor version differences -+# mean API+ABI incompatibility. If the specific match versioned library name -+# could not be found still open dynamically at least `librpm.so'. -+# --with-rpm: Like `--with-rpm=librpm.so' but if any of its detection fails try -+# to find librpm for compilation-time linking by pkg-config. GDB binary will -+# be probably linked with the version specific library (as `librpm-4.6.so'). -+# Failure to find librpm by pkg-config will abort the configuration. -+# (default) --with-rpm=auto: Like `--with-rpm=librpm.so' but if even pkg-config -+# cannot find librpm use to the rpmless compilation (like `--without-rpm'). -+ -+AC_ARG_WITH([rpm], -+ [AS_HELP_STRING([--with-rpm], -+ [query rpm database for missing debuginfos (yes/no, def. auto=librpm.so)])], [], [with_rpm="auto"]) -+ -+m4_pattern_allow([^AC_MSG_ERROR$]) -+m4_pattern_allow([^AC_MSG_WARN$]) -+if test "x$with_rpm" != "xno"; then -+ if test "x$with_rpm" = "xyes"; then -+ LIBRPM="librpm.so" -+ RPM_REQUIRE=true -+ DLOPEN_REQUIRE=false -+ elif test "x$with_rpm" = "xauto"; then -+ LIBRPM="librpm.so" -+ RPM_REQUIRE=false -+ DLOPEN_REQUIRE=false -+ else -+ LIBRPM="$with_rpm" -+ RPM_REQUIRE=true -+ DLOPEN_REQUIRE=true -+ fi -+ LIBRPM_STRING='"'"$LIBRPM"'"' -+ -+ AC_MSG_CHECKING([specific librpm version]) -+ HAVE_DLOPEN_LIBRPM=false -+ save_LIBS="$LIBS" -+ LIBS="$LIBS -ldl" -+ AC_RUN_IFELSE(AC_LANG_PROGRAM([[ -+#include -+#include -+#include -+#include -+ ]], [[ -+ void *h; -+ const char *const *rpmverp; -+ FILE *f; -+ -+ f = fopen ("conftest.out", "w"); -+ if (!f) -+ { -+ fprintf (stderr, "Cannot write \"%s\": %s\n", "conftest.out", -+ strerror (errno)); -+ return 1; -+ } -+ h = dlopen ($LIBRPM_STRING, RTLD_LAZY); -+ if (!h) -+ { -+ fprintf (stderr, "dlopen (\"%s\"): %s\n", $LIBRPM_STRING, dlerror ()); -+ return 1; -+ } -+ rpmverp = dlsym (h, "RPMVERSION"); -+ if (!rpmverp) -+ { -+ fprintf (stderr, "dlsym (\"RPMVERSION\"): %s\n", dlerror ()); -+ return 1; -+ } -+ fprintf (stderr, "RPMVERSION is: \""); -+ fprintf (stderr, "%s\"\n", *rpmverp); -+ -+ /* Try to find the specific librpm version only for "librpm.so" as we do -+ not know how to assemble the version string otherwise. */ -+ -+ if (strcmp ("librpm.so", $LIBRPM_STRING) != 0) -+ { -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ else -+ { -+ char *h2_name; -+ void *h2; -+ int major, minor; -+ -+ if (sscanf (*rpmverp, "%d.%d", &major, &minor) != 2) -+ { -+ fprintf (stderr, "Unable to parse RPMVERSION.\n"); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ /* Avoid the square brackets by malloc. */ -+ h2_name = malloc (64); -+ sprintf (h2_name, "librpm-%d.%d.so", major, minor); -+ h2 = dlopen (h2_name, RTLD_LAZY); -+ if (!h2) -+ { -+ fprintf (stderr, "dlopen (\"%s\"): %s\n", h2_name, dlerror ()); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ if (h2 != h) -+ { -+ fprintf (stderr, "dlopen of \"%s\" and \"%s\" are different.\n", -+ $LIBRPM_STRING, h2_name); -+ fprintf (f, "%s\n", $LIBRPM_STRING); -+ return 0; -+ } -+ /* Found the valid .so name with a specific version. */ -+ fprintf (f, "%s\n", h2_name); -+ return 0; -+ } -+ ]]), [ -+ DLOPEN_LIBRPM="`cat conftest.out`" -+ if test "x$DLOPEN_LIBRPM" != "x"; then -+ HAVE_DLOPEN_LIBRPM=true -+ AC_MSG_RESULT($DLOPEN_LIBRPM) -+ fi -+ ]) -+ rm -f conftest.out -+ -+ m4_define([CHECK_LIBRPM_COMPAT], [ -+ AC_MSG_CHECKING([rpm library API compatibility]) -+ # The compilation requires -Werror to verify anything. -+ save_CFLAGS="$CFLAGS" -+ CFLAGS="$CFLAGS -Werror" -+ AC_COMPILE_IFELSE(AC_LANG_PROGRAM([[ -+/* Duplicate here the declarations to verify they match "elfread.c". */ -+#include -+#include -+#include -+#include -+extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); -+extern int rpmReadConfigFiles(const char * file, const char * target); -+extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); -+extern Header rpmdbNextIterator(rpmdbMatchIterator mi); -+extern rpmts rpmtsCreate(void); -+extern rpmts rpmtsFree(rpmts ts); -+extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmDbiTagVal rpmtag, -+ const void * keyp, size_t keylen); -+ ]]), [ -+ LIBRPM_COMPAT=true -+ AC_MSG_RESULT(yes) -+ ], [ -+ LIBRPM_COMPAT=false -+ AC_MSG_RESULT(no) -+ ]) -+ CFLAGS="$save_CFLAGS" -+ ]) -+ -+ if $HAVE_DLOPEN_LIBRPM; then -+ CHECK_LIBRPM_COMPAT -+ if ! $LIBRPM_COMPAT; then -+ HAVE_DLOPEN_LIBRPM=false -+ fi -+ fi -+ -+ if $HAVE_DLOPEN_LIBRPM; then -+ DLOPEN_LIBRPM_STRING='"'"$DLOPEN_LIBRPM"'"' -+ AC_DEFINE_UNQUOTED(DLOPEN_LIBRPM, $DLOPEN_LIBRPM_STRING, [librpm version specific library name to dlopen.]) -+ AC_DEFINE(HAVE_LIBRPM, 1, [Define if librpm library is being used.]) -+ else -+ AC_MSG_RESULT(no) -+ LIBS="$save_LIBS" -+ if $DLOPEN_REQUIRE; then -+ AC_MSG_ERROR([Specific name $LIBRPM was requested but it could not be opened.]) -+ fi -+ PKG_CHECK_MODULES(RPM, rpm, [HAVE_LIBRPM=true], [HAVE_LIBRPM=false]) -+ -+ if $HAVE_LIBRPM; then -+ CHECK_LIBRPM_COMPAT -+ if ! $LIBRPM_COMPAT; then -+ HAVE_LIBRPM=false -+ RPM_PKG_ERRORS="Found $LIBRPM API is incompatibile with this GDB" -+ fi -+ fi -+ -+ if $HAVE_LIBRPM; then -+ AC_DEFINE(HAVE_LIBRPM, 1, [Define if librpm library is being used.]) -+ CFLAGS="$CFLAGS $RPM_CFLAGS" -+ LIBS="$LIBS $RPM_LIBS" -+ else -+ if $RPM_REQUIRE; then -+ AC_MSG_ERROR($RPM_PKG_ERRORS) -+ else -+ AC_MSG_WARN($RPM_PKG_ERRORS) -+ fi -+ fi -+ fi -+fi -+ - AC_CONFIG_SUBDIRS(testsuite) - - # Check whether to support alternative target configurations -diff --git a/gdb/event-top.c b/gdb/event-top.c ---- a/gdb/event-top.c -+++ b/gdb/event-top.c -@@ -43,6 +43,7 @@ - #include "async-event.h" - #include "bt-utils.h" - #include "pager.h" -+#include "symfile.h" - - /* readline include files. */ - #include "readline/readline.h" -@@ -404,6 +405,8 @@ display_gdb_prompt (const char *new_prompt) - /* Reset the nesting depth used when trace-commands is set. */ - reset_command_nest_depth (); - -+ debug_flush_missing (); -+ - /* Do not call the python hook on an explicit prompt change as - passed to this function, as this forms a secondary/local prompt, - IE, displayed but not set. */ -@@ -788,7 +791,10 @@ command_line_handler (gdb::unique_xmalloc_ptr &&rl) - command_handler (cmd); - - if (ui->prompt_state != PROMPTED) -- display_gdb_prompt (0); -+ { -+ debug_flush_missing (); -+ display_gdb_prompt (0); -+ } - } - } - -diff --git a/gdb/symfile.h b/gdb/symfile.h ---- a/gdb/symfile.h -+++ b/gdb/symfile.h -@@ -367,6 +367,7 @@ extern void generic_load (const char *args, int from_tty); - /* build-id support. */ - extern struct bfd_build_id *build_id_addr_get (CORE_ADDR addr); - extern void debug_print_missing (const char *binary, const char *debug); -+extern void debug_flush_missing (void); - #define BUILD_ID_MAIN_EXECUTABLE_FILENAME _("the main executable file") - - /* From minidebug.c. */ diff --git a/gdb-6.6-buildid-locate-solib-missing-ids.patch b/gdb-6.6-buildid-locate-solib-missing-ids.patch deleted file mode 100644 index e9ec7b5..0000000 --- a/gdb-6.6-buildid-locate-solib-missing-ids.patch +++ /dev/null @@ -1,238 +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-buildid-locate-solib-missing-ids.patch - -;; Fix loading of core files without build-ids but with build-ids in executables. -;; Load strictly build-id-checked core files only if no executable is specified -;; (Jan Kratochvil, RH BZ 1339862). -;;=push+jan - -gdb returns an incorrect back trace when applying a debuginfo -https://bugzilla.redhat.com/show_bug.cgi?id=1339862 - -diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c ---- a/gdb/solib-svr4.c -+++ b/gdb/solib-svr4.c -@@ -1320,14 +1320,28 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, - } - - { -- struct bfd_build_id *build_id; -+ struct bfd_build_id *build_id = NULL; - - strncpy (newobj->so_original_name, buffer.get (), SO_NAME_MAX_PATH_SIZE - 1); - newobj->so_original_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; - /* May get overwritten below. */ - strcpy (newobj->so_name, newobj->so_original_name); - -- build_id = build_id_addr_get (((lm_info_svr4 *) newobj->lm_info)->l_ld); -+ /* In the case the main executable was found according to its build-id -+ (from a core file) prevent loading a different build of a library -+ with accidentally the same SO_NAME. -+ -+ It suppresses bogus backtraces (and prints "??" there instead) if -+ the on-disk files no longer match the running program version. -+ -+ If the main executable was not loaded according to its build-id do -+ not do any build-id checking of the libraries. There may be missing -+ build-ids dumped in the core file and we would map all the libraries -+ to the only existing file loaded that time - the executable. */ -+ if (current_program_space->symfile_object_file != NULL -+ && (current_program_space->symfile_object_file->flags -+ & OBJF_BUILD_ID_CORE_LOADED) != 0) -+ build_id = build_id_addr_get (li->l_ld); - if (build_id != NULL) - { - char *name, *build_id_filename; -@@ -1342,23 +1356,7 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, - xfree (name); - } - else -- { -- debug_print_missing (newobj->so_name, build_id_filename); -- -- /* In the case the main executable was found according to -- its build-id (from a core file) prevent loading -- a different build of a library with accidentally the -- same SO_NAME. -- -- It suppresses bogus backtraces (and prints "??" there -- instead) if the on-disk files no longer match the -- running program version. */ -- -- if (current_program_space->symfile_object_file != NULL -- && (current_program_space->symfile_object_file->flags -- & OBJF_BUILD_ID_CORE_LOADED) != 0) -- newobj->so_name[0] = 0; -- } -+ debug_print_missing (newobj->so_name, build_id_filename); - - xfree (build_id_filename); - xfree (build_id); -diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c -@@ -0,0 +1,21 @@ -+/* Copyright 2010 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+void -+lib (void) -+{ -+} -diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c -@@ -0,0 +1,25 @@ -+/* Copyright 2010 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+extern void lib (void); -+ -+int -+main (void) -+{ -+ lib (); -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp -@@ -0,0 +1,105 @@ -+# Copyright 2016 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+if {[skip_shlib_tests]} { -+ return 0 -+} -+ -+set testfile "gcore-buildid-exec-but-not-solib" -+set srcmainfile ${testfile}-main.c -+set srclibfile ${testfile}-lib.c -+set libfile [standard_output_file ${testfile}-lib.so] -+set objfile [standard_output_file ${testfile}-main.o] -+set executable ${testfile}-main -+set binfile [standard_output_file ${executable}] -+set gcorefile [standard_output_file ${executable}.gcore] -+set outdir [file dirname $binfile] -+ -+if { [gdb_compile_shlib ${srcdir}/${subdir}/${srclibfile} ${libfile} "debug additional_flags=-Wl,--build-id"] != "" -+ || [gdb_compile ${srcdir}/${subdir}/${srcmainfile} ${objfile} object {debug}] != "" } { -+ unsupported "-Wl,--build-id compilation failed" -+ return -1 -+} -+set opts [list debug shlib=${libfile} "additional_flags=-Wl,--build-id"] -+if { [gdb_compile ${objfile} ${binfile} executable $opts] != "" } { -+ unsupported "-Wl,--build-id compilation failed" -+ return -1 -+} -+ -+clean_restart $executable -+gdb_load_shlib $libfile -+ -+# Does this gdb support gcore? -+set test "help gcore" -+gdb_test_multiple $test $test { -+ -re "Undefined command: .gcore.*\r\n$gdb_prompt $" { -+ # gcore command not supported -- nothing to test here. -+ unsupported "gdb does not support gcore on this target" -+ return -1; -+ } -+ -re "Save a core file .*\r\n$gdb_prompt $" { -+ pass $test -+ } -+} -+ -+if { ![runto lib] } then { -+ return -1 -+} -+ -+set escapedfilename [string_to_regexp ${gcorefile}] -+ -+set test "save a corefile" -+gdb_test_multiple "gcore ${gcorefile}" $test { -+ -re "Saved corefile ${escapedfilename}\r\n$gdb_prompt $" { -+ pass $test -+ } -+ -re "Can't create a corefile\r\n$gdb_prompt $" { -+ unsupported $test -+ return -1 -+ } -+} -+ -+# Now restart gdb and load the corefile. -+ -+clean_restart $executable -+gdb_load_shlib $libfile -+ -+set buildid [build_id_debug_filename_get $libfile] -+ -+regsub {\.debug$} $buildid {} buildid -+ -+set debugdir [standard_output_file ${testfile}-debugdir] -+file delete -force -- $debugdir -+ -+file mkdir $debugdir/[file dirname $libfile] -+file copy $libfile $debugdir/${libfile} -+ -+file mkdir $debugdir/[file dirname $buildid] -+file copy $libfile $debugdir/${buildid} -+ -+remote_exec build "ln -s /lib ${debugdir}/" -+remote_exec build "ln -s /lib64 ${debugdir}/" -+# /usr is not needed, all the libs are in /lib64: libm.so.6 libc.so.6 ld-linux-x86-64.so.2 -+ -+gdb_test "set solib-absolute-prefix $debugdir" -+ -+gdb_test_no_output "set debug-file-directory $debugdir" "set debug-file-directory" -+ -+gdb_test "core ${gcorefile}" "Core was generated by .*" "re-load generated corefile" -+ -+gdb_test "frame" "#0 \[^\r\n\]* lib .*" "library got loaded" -+ -+gdb_test "bt" -+gdb_test "info shared" diff --git a/gdb-6.6-buildid-locate.patch b/gdb-6.6-buildid-locate.patch deleted file mode 100644 index 1350051..0000000 --- a/gdb-6.6-buildid-locate.patch +++ /dev/null @@ -1,1925 +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-buildid-locate.patch - -;; New locating of the matching binaries from the pure core file (build-id). -;;=push+jan - -diff --git a/bfd/libbfd-in.h b/bfd/libbfd-in.h ---- a/bfd/libbfd-in.h -+++ b/bfd/libbfd-in.h -@@ -110,7 +110,7 @@ static inline char * - bfd_strdup (const char *str) - { - size_t len = strlen (str) + 1; -- char *buf = bfd_malloc (len); -+ char *buf = (char *) bfd_malloc (len); - if (buf != NULL) - memcpy (buf, str, len); - return buf; -diff --git a/bfd/libbfd.h b/bfd/libbfd.h ---- a/bfd/libbfd.h -+++ b/bfd/libbfd.h -@@ -116,7 +116,7 @@ static inline char * - bfd_strdup (const char *str) - { - size_t len = strlen (str) + 1; -- char *buf = bfd_malloc (len); -+ char *buf = (char *) bfd_malloc (len); - if (buf != NULL) - memcpy (buf, str, len); - return buf; -diff --git a/gdb/build-id.c b/gdb/build-id.c ---- a/gdb/build-id.c -+++ b/gdb/build-id.c -@@ -24,14 +24,72 @@ - #include "gdbsupport/gdb_vecs.h" - #include "symfile.h" - #include "objfiles.h" -+#include -+#include "elf-bfd.h" -+#include "elf/common.h" -+#include "elf/external.h" -+#include "elf/internal.h" - #include "filenames.h" -+#include "gdb_bfd.h" -+#include "gdbcmd.h" - #include "gdbcore.h" - #include "cli/cli-style.h" -+#include "inferior.h" -+#include "objfiles.h" -+#include "observable.h" -+#include "symfile.h" -+ -+#define BUILD_ID_VERBOSE_NONE 0 -+#define BUILD_ID_VERBOSE_FILENAMES 1 -+#define BUILD_ID_VERBOSE_BINARY_PARSE 2 -+static int build_id_verbose = BUILD_ID_VERBOSE_FILENAMES; -+static void -+show_build_id_verbose (struct ui_file *file, int from_tty, -+ struct cmd_list_element *c, const char *value) -+{ -+ gdb_printf (file, _("Verbosity level of the build-id locator is %s.\n"), -+ value); -+} -+/* Locate NT_GNU_BUILD_ID and return its matching debug filename. -+ FIXME: NOTE decoding should be unified with the BFD core notes decoding. */ -+ -+static struct bfd_build_id * -+build_id_buf_get (bfd *templ, gdb_byte *buf, bfd_size_type size) -+{ -+ bfd_byte *p; -+ -+ p = buf; -+ while (p < buf + size) -+ { -+ /* FIXME: bad alignment assumption. */ -+ Elf_External_Note *xnp = (Elf_External_Note *) p; -+ size_t namesz = H_GET_32 (templ, xnp->namesz); -+ size_t descsz = H_GET_32 (templ, xnp->descsz); -+ bfd_byte *descdata = (gdb_byte *) xnp->name + BFD_ALIGN (namesz, 4); -+ -+ if (H_GET_32 (templ, xnp->type) == NT_GNU_BUILD_ID -+ && namesz == sizeof "GNU" -+ && memcmp (xnp->name, "GNU", sizeof "GNU") == 0) -+ { -+ size_t sz = descsz; -+ gdb_byte *data = (gdb_byte *) descdata; -+ struct bfd_build_id *retval; -+ -+ retval = (struct bfd_build_id *) xmalloc (sizeof *retval - 1 + sz); -+ retval->size = sz; -+ memcpy (retval->data, data, sz); -+ -+ return retval; -+ } -+ p = descdata + BFD_ALIGN (descsz, 4); -+ } -+ return NULL; -+} - - /* See build-id.h. */ - - const struct bfd_build_id * --build_id_bfd_get (bfd *abfd) -+build_id_bfd_shdr_get (bfd *abfd) - { - /* Dynamic objfiles such as ones created by JIT reader API - have no underlying bfd structure (that is, objfile->obfd -@@ -50,6 +108,348 @@ build_id_bfd_get (bfd *abfd) - return NULL; - } - -+/* Core files may have missing (corrupt) SHDR but PDHR is correct there. -+ bfd_elf_bfd_from_remote_memory () has too much overhead by -+ allocating/reading all the available ELF PT_LOADs. */ -+ -+static struct bfd_build_id * -+build_id_phdr_get (bfd *templ, bfd_vma loadbase, unsigned e_phnum, -+ Elf_Internal_Phdr *i_phdr) -+{ -+ int i; -+ struct bfd_build_id *retval = NULL; -+ -+ for (i = 0; i < e_phnum; i++) -+ if (i_phdr[i].p_type == PT_NOTE && i_phdr[i].p_filesz > 0) -+ { -+ Elf_Internal_Phdr *hdr = &i_phdr[i]; -+ gdb_byte *buf; -+ int err; -+ -+ buf = (gdb_byte *) xmalloc (hdr->p_filesz); -+ err = target_read_memory (loadbase + i_phdr[i].p_vaddr, buf, -+ hdr->p_filesz); -+ if (err == 0) -+ retval = build_id_buf_get (templ, buf, hdr->p_filesz); -+ else -+ retval = NULL; -+ xfree (buf); -+ if (retval != NULL) -+ break; -+ } -+ return retval; -+} -+ -+/* First we validate the file by reading in the ELF header and checking -+ the magic number. */ -+ -+static inline bfd_boolean -+elf_file_p (Elf64_External_Ehdr *x_ehdrp64) -+{ -+ gdb_assert (sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr)); -+ gdb_assert (offsetof (Elf64_External_Ehdr, e_ident) -+ == offsetof (Elf32_External_Ehdr, e_ident)); -+ gdb_assert (sizeof (((Elf64_External_Ehdr *) 0)->e_ident) -+ == sizeof (((Elf32_External_Ehdr *) 0)->e_ident)); -+ -+ return ((x_ehdrp64->e_ident[EI_MAG0] == ELFMAG0) -+ && (x_ehdrp64->e_ident[EI_MAG1] == ELFMAG1) -+ && (x_ehdrp64->e_ident[EI_MAG2] == ELFMAG2) -+ && (x_ehdrp64->e_ident[EI_MAG3] == ELFMAG3)); -+} -+ -+/* Translate an ELF file header in external format into an ELF file header in -+ internal format. */ -+ -+#define H_GET_WORD(bfd, ptr) (is64 ? H_GET_64 (bfd, (ptr)) \ -+ : H_GET_32 (bfd, (ptr))) -+#define H_GET_SIGNED_WORD(bfd, ptr) (is64 ? H_GET_S64 (bfd, (ptr)) \ -+ : H_GET_S32 (bfd, (ptr))) -+ -+static void -+elf_swap_ehdr_in (bfd *abfd, -+ const Elf64_External_Ehdr *src64, -+ Elf_Internal_Ehdr *dst) -+{ -+ int is64 = bfd_get_arch_size (abfd) == 64; -+#define SRC(field) (is64 ? src64->field \ -+ : ((const Elf32_External_Ehdr *) src64)->field) -+ -+ int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; -+ memcpy (dst->e_ident, SRC (e_ident), EI_NIDENT); -+ dst->e_type = H_GET_16 (abfd, SRC (e_type)); -+ dst->e_machine = H_GET_16 (abfd, SRC (e_machine)); -+ dst->e_version = H_GET_32 (abfd, SRC (e_version)); -+ if (signed_vma) -+ dst->e_entry = H_GET_SIGNED_WORD (abfd, SRC (e_entry)); -+ else -+ dst->e_entry = H_GET_WORD (abfd, SRC (e_entry)); -+ dst->e_phoff = H_GET_WORD (abfd, SRC (e_phoff)); -+ dst->e_shoff = H_GET_WORD (abfd, SRC (e_shoff)); -+ dst->e_flags = H_GET_32 (abfd, SRC (e_flags)); -+ dst->e_ehsize = H_GET_16 (abfd, SRC (e_ehsize)); -+ dst->e_phentsize = H_GET_16 (abfd, SRC (e_phentsize)); -+ dst->e_phnum = H_GET_16 (abfd, SRC (e_phnum)); -+ dst->e_shentsize = H_GET_16 (abfd, SRC (e_shentsize)); -+ dst->e_shnum = H_GET_16 (abfd, SRC (e_shnum)); -+ dst->e_shstrndx = H_GET_16 (abfd, SRC (e_shstrndx)); -+ -+#undef SRC -+} -+ -+/* Translate an ELF program header table entry in external format into an -+ ELF program header table entry in internal format. */ -+ -+static void -+elf_swap_phdr_in (bfd *abfd, -+ const Elf64_External_Phdr *src64, -+ Elf_Internal_Phdr *dst) -+{ -+ int is64 = bfd_get_arch_size (abfd) == 64; -+#define SRC(field) (is64 ? src64->field \ -+ : ((const Elf32_External_Phdr *) src64)->field) -+ -+ int signed_vma = get_elf_backend_data (abfd)->sign_extend_vma; -+ -+ dst->p_type = H_GET_32 (abfd, SRC (p_type)); -+ dst->p_flags = H_GET_32 (abfd, SRC (p_flags)); -+ dst->p_offset = H_GET_WORD (abfd, SRC (p_offset)); -+ if (signed_vma) -+ { -+ dst->p_vaddr = H_GET_SIGNED_WORD (abfd, SRC (p_vaddr)); -+ dst->p_paddr = H_GET_SIGNED_WORD (abfd, SRC (p_paddr)); -+ } -+ else -+ { -+ dst->p_vaddr = H_GET_WORD (abfd, SRC (p_vaddr)); -+ dst->p_paddr = H_GET_WORD (abfd, SRC (p_paddr)); -+ } -+ dst->p_filesz = H_GET_WORD (abfd, SRC (p_filesz)); -+ dst->p_memsz = H_GET_WORD (abfd, SRC (p_memsz)); -+ dst->p_align = H_GET_WORD (abfd, SRC (p_align)); -+ -+#undef SRC -+} -+ -+#undef H_GET_SIGNED_WORD -+#undef H_GET_WORD -+ -+static Elf_Internal_Phdr * -+elf_get_phdr (bfd *templ, bfd_vma ehdr_vma, unsigned *e_phnum_pointer, -+ bfd_vma *loadbase_pointer) -+{ -+ /* sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr) */ -+ Elf64_External_Ehdr x_ehdr64; /* Elf file header, external form */ -+ Elf_Internal_Ehdr i_ehdr; /* Elf file header, internal form */ -+ bfd_size_type x_phdrs_size; -+ gdb_byte *x_phdrs_ptr; -+ Elf_Internal_Phdr *i_phdrs; -+ int err; -+ unsigned int i; -+ bfd_vma loadbase; -+ int loadbase_set; -+ -+ gdb_assert (templ != NULL); -+ gdb_assert (sizeof (Elf64_External_Ehdr) >= sizeof (Elf32_External_Ehdr)); -+ -+ /* Read in the ELF header in external format. */ -+ err = target_read_memory (ehdr_vma, (bfd_byte *) &x_ehdr64, sizeof x_ehdr64); -+ if (err) -+ { -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Error reading ELF header at address 0x%lx"), -+ (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ -+ /* Now check to see if we have a valid ELF file, and one that BFD can -+ make use of. The magic number must match, the address size ('class') -+ and byte-swapping must match our XVEC entry. */ -+ -+ if (! elf_file_p (&x_ehdr64) -+ || x_ehdr64.e_ident[EI_VERSION] != EV_CURRENT -+ || !((bfd_get_arch_size (templ) == 64 -+ && x_ehdr64.e_ident[EI_CLASS] == ELFCLASS64) -+ || (bfd_get_arch_size (templ) == 32 -+ && x_ehdr64.e_ident[EI_CLASS] == ELFCLASS32))) -+ { -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Unrecognized ELF header at address 0x%lx"), -+ (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ -+ /* Check that file's byte order matches xvec's */ -+ switch (x_ehdr64.e_ident[EI_DATA]) -+ { -+ case ELFDATA2MSB: /* Big-endian */ -+ if (! bfd_header_big_endian (templ)) -+ { -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Unrecognized " -+ "big-endian ELF header at address 0x%lx"), -+ (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ break; -+ case ELFDATA2LSB: /* Little-endian */ -+ if (! bfd_header_little_endian (templ)) -+ { -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Unrecognized " -+ "little-endian ELF header at address 0x%lx"), -+ (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ break; -+ case ELFDATANONE: /* No data encoding specified */ -+ default: /* Unknown data encoding specified */ -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Unrecognized " -+ "ELF header endianity at address 0x%lx"), -+ (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ -+ elf_swap_ehdr_in (templ, &x_ehdr64, &i_ehdr); -+ -+ /* The file header tells where to find the program headers. -+ These are what we use to actually choose what to read. */ -+ -+ if (i_ehdr.e_phentsize != (bfd_get_arch_size (templ) == 64 -+ ? sizeof (Elf64_External_Phdr) -+ : sizeof (Elf32_External_Phdr)) -+ || i_ehdr.e_phnum == 0) -+ { -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Invalid ELF program headers from the ELF header " -+ "at address 0x%lx"), (unsigned long) ehdr_vma); -+ return NULL; -+ } -+ -+ x_phdrs_size = (bfd_get_arch_size (templ) == 64 ? sizeof (Elf64_External_Phdr) -+ : sizeof (Elf32_External_Phdr)); -+ -+ i_phdrs = (Elf_Internal_Phdr *) xmalloc (i_ehdr.e_phnum * (sizeof *i_phdrs + x_phdrs_size)); -+ x_phdrs_ptr = (gdb_byte *) &i_phdrs[i_ehdr.e_phnum]; -+ err = target_read_memory (ehdr_vma + i_ehdr.e_phoff, (bfd_byte *) x_phdrs_ptr, -+ i_ehdr.e_phnum * x_phdrs_size); -+ if (err) -+ { -+ free (i_phdrs); -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Error reading " -+ "ELF program headers at address 0x%lx"), -+ (unsigned long) (ehdr_vma + i_ehdr.e_phoff)); -+ return NULL; -+ } -+ -+ loadbase = ehdr_vma; -+ loadbase_set = 0; -+ for (i = 0; i < i_ehdr.e_phnum; ++i) -+ { -+ elf_swap_phdr_in (templ, (Elf64_External_Phdr *) -+ (x_phdrs_ptr + i * x_phdrs_size), &i_phdrs[i]); -+ /* IA-64 vDSO may have two mappings for one segment, where one mapping -+ is executable only, and one is read only. We must not use the -+ executable one (PF_R is the first one, PF_X the second one). */ -+ if (i_phdrs[i].p_type == PT_LOAD && (i_phdrs[i].p_flags & PF_R)) -+ { -+ /* Only the first PT_LOAD segment indicates the file bias. -+ Next segments may have P_VADDR arbitrarily higher. -+ If the first segment has P_VADDR zero any next segment must not -+ confuse us, the first one sets LOADBASE certainly enough. */ -+ if (!loadbase_set && i_phdrs[i].p_offset == 0) -+ { -+ loadbase = ehdr_vma - i_phdrs[i].p_vaddr; -+ loadbase_set = 1; -+ } -+ } -+ } -+ -+ if (build_id_verbose >= BUILD_ID_VERBOSE_BINARY_PARSE) -+ warning (_("build-id: Found ELF header at address 0x%lx, loadbase 0x%lx"), -+ (unsigned long) ehdr_vma, (unsigned long) loadbase); -+ -+ *e_phnum_pointer = i_ehdr.e_phnum; -+ *loadbase_pointer = loadbase; -+ return i_phdrs; -+} -+ -+/* BUILD_ID_ADDR_GET gets ADDR located somewhere in the object. -+ Find the first section before ADDR containing an ELF header. -+ We rely on the fact the sections from multiple files do not mix. -+ FIXME: We should check ADDR is contained _inside_ the section with possibly -+ missing content (P_FILESZ < P_MEMSZ). These omitted sections are currently -+ hidden by _BFD_ELF_MAKE_SECTION_FROM_PHDR. */ -+ -+static CORE_ADDR build_id_addr; -+struct build_id_addr_sect -+ { -+ struct build_id_addr_sect *next; -+ asection *sect; -+ }; -+static struct build_id_addr_sect *build_id_addr_sect; -+ -+static void build_id_addr_candidate (bfd *abfd, asection *sect, void *obj) -+{ -+ if (build_id_addr >= bfd_section_vma (sect)) -+ { -+ struct build_id_addr_sect *candidate; -+ -+ candidate = (struct build_id_addr_sect *) xmalloc (sizeof *candidate); -+ candidate->next = build_id_addr_sect; -+ build_id_addr_sect = candidate; -+ candidate->sect = sect; -+ } -+} -+ -+struct bfd_build_id * -+build_id_addr_get (CORE_ADDR addr) -+{ -+ struct build_id_addr_sect *candidate; -+ struct bfd_build_id *retval = NULL; -+ Elf_Internal_Phdr *i_phdr = NULL; -+ bfd_vma loadbase = 0; -+ unsigned e_phnum = 0; -+ -+ if (core_bfd == NULL) -+ return NULL; -+ -+ build_id_addr = addr; -+ gdb_assert (build_id_addr_sect == NULL); -+ bfd_map_over_sections (core_bfd, build_id_addr_candidate, NULL); -+ -+ /* Sections are sorted in the high-to-low VMAs order. -+ Stop the search on the first ELF header we find. -+ Do not continue the search even if it does not contain NT_GNU_BUILD_ID. */ -+ -+ for (candidate = build_id_addr_sect; candidate != NULL; -+ candidate = candidate->next) -+ { -+ i_phdr = elf_get_phdr (core_bfd, -+ bfd_section_vma (candidate->sect), -+ &e_phnum, &loadbase); -+ if (i_phdr != NULL) -+ break; -+ } -+ -+ if (i_phdr != NULL) -+ { -+ retval = build_id_phdr_get (core_bfd, loadbase, e_phnum, i_phdr); -+ xfree (i_phdr); -+ } -+ -+ while (build_id_addr_sect != NULL) -+ { -+ candidate = build_id_addr_sect; -+ build_id_addr_sect = candidate->next; -+ xfree (candidate); -+ } -+ -+ return retval; -+} -+ - /* See build-id.h. */ - - int -@@ -58,7 +458,7 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) - const struct bfd_build_id *found; - int retval = 0; - -- found = build_id_bfd_get (abfd); -+ found = build_id_bfd_shdr_get (abfd); - - if (found == NULL) - warning (_("File \"%s\" has no build-id, file skipped"), -@@ -73,63 +473,166 @@ build_id_verify (bfd *abfd, size_t check_len, const bfd_byte *check) - return retval; - } - -+static char * -+link_resolve (const char *symlink, int level) -+{ -+ char buf[PATH_MAX + 1], *retval; -+ gdb::unique_xmalloc_ptr target; -+ ssize_t got; -+ -+ if (level > 10) -+ return xstrdup (symlink); -+ -+ got = readlink (symlink, buf, sizeof (buf)); -+ if (got < 0 || got >= sizeof (buf)) -+ return xstrdup (symlink); -+ buf[got] = '\0'; -+ -+ if (IS_ABSOLUTE_PATH (buf)) -+ target = make_unique_xstrdup (buf); -+ else -+ { -+ const std::string dir (ldirname (symlink)); -+ -+ target = xstrprintf ("%s" -+#ifndef HAVE_DOS_BASED_FILE_SYSTEM -+ "/" -+#else /* HAVE_DOS_BASED_FILE_SYSTEM */ -+ "\\" -+#endif /* HAVE_DOS_BASED_FILE_SYSTEM */ -+ "%s", dir.c_str(), buf); -+ } -+ -+ retval = link_resolve (target.get (), level + 1); -+ return retval; -+} -+ - /* Helper for build_id_to_debug_bfd. LINK is a path to a potential - build-id-based separate debug file, potentially a symlink to the real file. - If the file exists and matches BUILD_ID, return a BFD reference to it. */ - - static gdb_bfd_ref_ptr --build_id_to_debug_bfd_1 (const std::string &link, size_t build_id_len, -- const bfd_byte *build_id) -+build_id_to_debug_bfd_1 (const std::string &orig_link, size_t build_id_len, -+ const bfd_byte *build_id, char **link_return) - { -+ gdb_bfd_ref_ptr ret_bfd = {}; -+ std::string ret_link; -+ - if (separate_debug_file_debug) - { -- gdb_printf (gdb_stdlog, _(" Trying %s..."), link.c_str ()); -- gdb_flush (gdb_stdlog); -+ gdb_printf (gdb_stdlog, _(" Trying %s..."), orig_link.c_str ()); -+ gdb_flush (gdb_stdout); - } - -- /* lrealpath() is expensive even for the usually non-existent files. */ -- gdb::unique_xmalloc_ptr filename_holder; -- const char *filename = nullptr; -- if (startswith (link, TARGET_SYSROOT_PREFIX)) -- filename = link.c_str (); -- else if (access (link.c_str (), F_OK) == 0) -+ for (unsigned seqno = 0;; seqno++) - { -- filename_holder.reset (lrealpath (link.c_str ())); -- filename = filename_holder.get (); -- } -+ std::string link = orig_link; - -- if (filename == NULL) -- { -- if (separate_debug_file_debug) -- gdb_printf (gdb_stdlog, -- _(" no, unable to compute real path\n")); -+ if (seqno > 0) -+ { -+ /* There can be multiple build-id symlinks pointing to real files -+ with the same build-id (such as hard links). Some of the real -+ files may not be installed. */ - -- return {}; -- } -+ string_appendf (link, ".%u", seqno); -+ } - -- /* We expect to be silent on the non-existing files. */ -- gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename, gnutarget); -+ ret_link = link; - -- if (debug_bfd == NULL) -- { -- if (separate_debug_file_debug) -- gdb_printf (gdb_stdlog, _(" no, unable to open.\n")); -+ struct stat statbuf_trash; -+ -+ /* `access' automatically dereferences LINK. */ -+ if (lstat (link.c_str (), &statbuf_trash) != 0) -+ { -+ /* Stop increasing SEQNO. */ -+ break; -+ } -+ -+ /* lrealpath() is expensive even for the usually non-existent files. */ -+ gdb::unique_xmalloc_ptr filename_holder; -+ const char *filename = nullptr; -+ if (startswith (link, TARGET_SYSROOT_PREFIX)) -+ filename = link.c_str (); -+ else if (access (link.c_str (), F_OK) == 0) -+ { -+ filename_holder.reset (lrealpath (link.c_str ())); -+ filename = filename_holder.get (); -+ } -+ -+ if (filename == NULL) -+ { -+ if (separate_debug_file_debug) -+ gdb_printf (gdb_stdlog, -+ _(" no, unable to compute real path\n")); -+ -+ continue; -+ } -+ -+ /* We expect to be silent on the non-existing files. */ -+ gdb_bfd_ref_ptr debug_bfd = gdb_bfd_open (filename, gnutarget); -+ -+ if (debug_bfd == NULL) -+ { -+ if (separate_debug_file_debug) -+ gdb_printf (gdb_stdlog, _(" no, unable to open.\n")); - -- return {}; -+ continue; -+ } -+ -+ if (!build_id_verify (debug_bfd.get(), build_id_len, build_id)) -+ { -+ if (separate_debug_file_debug) -+ gdb_printf (gdb_stdlog, -+ _(" no, build-id does not match.\n")); -+ -+ continue; -+ } -+ -+ ret_bfd = debug_bfd; -+ break; - } - -- if (!build_id_verify (debug_bfd.get(), build_id_len, build_id)) -+ std::string link_all; -+ -+ if (ret_bfd != NULL) - { - if (separate_debug_file_debug) -- gdb_printf (gdb_stdlog, _(" no, build-id does not match.\n")); -+ gdb_printf (gdb_stdlog, _(" yes!\n")); -+ } -+ else -+ { -+ /* If none of the real files is found report as missing file -+ always the non-.%u-suffixed file. */ -+ std::string link0 = orig_link; - -- return {}; -+ /* If the symlink has target request to install the target. -+ BASE-debuginfo.rpm contains the symlink but BASE.rpm may be missing. -+ https://bugzilla.redhat.com/show_bug.cgi?id=981154 */ -+ std::string link0_resolved (link_resolve (link0.c_str (), 0)); -+ -+ if (link_all.empty ()) -+ link_all = link0_resolved; -+ else -+ { -+ /* Use whitespace instead of DIRNAME_SEPARATOR to be compatible with -+ its possible use as an argument for installation command. */ -+ link_all += " " + link0_resolved; -+ } - } - -- if (separate_debug_file_debug) -- gdb_printf (gdb_stdlog, _(" yes!\n")); -+ if (link_return != NULL) -+ { -+ if (ret_bfd != NULL) -+ { -+ *link_return = xstrdup (ret_link.c_str ()); -+ } -+ else -+ { -+ *link_return = xstrdup (link_all.c_str ()); -+ } -+ } - -- return debug_bfd; -+ return ret_bfd; - } - - /* Common code for finding BFDs of a given build-id. This function -@@ -138,7 +641,7 @@ build_id_to_debug_bfd_1 (const std::string &link, size_t build_id_len, - - static gdb_bfd_ref_ptr - build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, -- const char *suffix) -+ const char *suffix, char **link_return) - { - /* Keep backward compatibility so that DEBUG_FILE_DIRECTORY being "" will - cause "/.build-id/..." lookups. */ -@@ -161,16 +664,17 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, - if (size > 0) - { - size--; -- string_appendf (link, "%02x/", (unsigned) *data++); -+ string_appendf (link, "%02x", (unsigned) *data++); - } -- -+ if (size > 0) -+ link += "/"; - while (size-- > 0) - string_appendf (link, "%02x", (unsigned) *data++); - - link += suffix; - - gdb_bfd_ref_ptr debug_bfd -- = build_id_to_debug_bfd_1 (link, build_id_len, build_id); -+ = build_id_to_debug_bfd_1 (link, build_id_len, build_id, link_return); - if (debug_bfd != NULL) - return debug_bfd; - -@@ -181,7 +685,7 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, - if (!gdb_sysroot.empty ()) - { - link = gdb_sysroot + link; -- debug_bfd = build_id_to_debug_bfd_1 (link, build_id_len, build_id); -+ debug_bfd = build_id_to_debug_bfd_1 (link, build_id_len, build_id, NULL); - if (debug_bfd != NULL) - return debug_bfd; - } -@@ -190,31 +694,663 @@ build_id_to_bfd_suffix (size_t build_id_len, const bfd_byte *build_id, - return {}; - } - -+char * -+build_id_to_filename (const struct bfd_build_id *build_id, char **link_return) -+{ -+ gdb_bfd_ref_ptr abfd; -+ char *result; -+ -+ abfd = build_id_to_exec_bfd (build_id->size, build_id->data, link_return); -+ if (abfd == NULL) -+ return NULL; -+ -+ result = xstrdup (bfd_get_filename (abfd.get ())); -+ return result; -+} -+ -+void debug_flush_missing (void); -+ -+#ifdef HAVE_LIBRPM -+ -+#include -+#include -+#include -+#include -+#ifdef DLOPEN_LIBRPM -+#include -+#endif -+ -+/* Workarodun https://bugzilla.redhat.com/show_bug.cgi?id=643031 -+ librpm must not exit() an application on SIGINT -+ -+ Enable or disable a signal handler. SIGNUM: signal to enable (or disable -+ if negative). HANDLER: sa_sigaction handler (or NULL to use -+ rpmsqHandler()). Returns: no. of refs, -1 on error. */ -+extern int rpmsqEnable (int signum, /* rpmsqAction_t handler */ void *handler); -+int -+rpmsqEnable (int signum, /* rpmsqAction_t handler */ void *handler) -+{ -+ return 0; -+} -+ -+/* This MISSING_RPM_HASH tracker is used to collect all the missing rpm files -+ and avoid their duplicities during a single inferior run. */ -+ -+static struct htab *missing_rpm_hash; -+ -+/* This MISSING_RPM_LIST tracker is used to collect and print as a single line -+ all the rpms right before the nearest GDB prompt. It gets cleared after -+ each such print (it is questionable if we should clear it after the print). -+ */ -+ -+struct missing_rpm -+ { -+ struct missing_rpm *next; -+ char rpm[1]; -+ }; -+static struct missing_rpm *missing_rpm_list; -+static int missing_rpm_list_entries; -+ -+/* Returns the count of newly added rpms. */ -+ -+static int -+#ifndef GDB_INDEX_VERIFY_VENDOR -+missing_rpm_enlist (const char *filename) -+#else -+missing_rpm_enlist_1 (const char *filename, int verify_vendor) -+#endif -+{ -+ static int rpm_init_done = 0; -+ rpmts ts; -+ rpmdbMatchIterator mi; -+ int count = 0; -+ -+#ifdef DLOPEN_LIBRPM -+ /* Duplicate here the declarations to verify they match. The same sanity -+ check is present also in `configure.ac'. */ -+ extern char * headerFormat(Header h, const char * fmt, errmsg_t * errmsg); -+ static char *(*headerFormat_p) (Header h, const char * fmt, errmsg_t *errmsg); -+ extern int rpmReadConfigFiles(const char * file, const char * target); -+ static int (*rpmReadConfigFiles_p) (const char * file, const char * target); -+ extern rpmdbMatchIterator rpmdbFreeIterator(rpmdbMatchIterator mi); -+ static rpmdbMatchIterator (*rpmdbFreeIterator_p) (rpmdbMatchIterator mi); -+ extern Header rpmdbNextIterator(rpmdbMatchIterator mi); -+ static Header (*rpmdbNextIterator_p) (rpmdbMatchIterator mi); -+ extern rpmts rpmtsCreate(void); -+ static rpmts (*rpmtsCreate_p) (void); -+ extern rpmts rpmtsFree(rpmts ts); -+ static rpmts (*rpmtsFree_p) (rpmts ts); -+ extern rpmdbMatchIterator rpmtsInitIterator(const rpmts ts, rpmTag rpmtag, -+ const void * keyp, size_t keylen); -+ static rpmdbMatchIterator (*rpmtsInitIterator_p) (const rpmts ts, -+ rpmTag rpmtag, -+ const void *keyp, -+ size_t keylen); -+#else /* !DLOPEN_LIBRPM */ -+# define headerFormat_p headerFormat -+# define rpmReadConfigFiles_p rpmReadConfigFiles -+# define rpmdbFreeIterator_p rpmdbFreeIterator -+# define rpmdbNextIterator_p rpmdbNextIterator -+# define rpmtsCreate_p rpmtsCreate -+# define rpmtsFree_p rpmtsFree -+# define rpmtsInitIterator_p rpmtsInitIterator -+#endif /* !DLOPEN_LIBRPM */ -+ -+ gdb_assert (filename != NULL); -+ -+ if (strcmp (filename, BUILD_ID_MAIN_EXECUTABLE_FILENAME) == 0) -+ return 0; -+ -+ if (is_target_filename (filename)) -+ return 0; -+ -+ if (filename[0] != '/') -+ { -+ warning (_("Ignoring non-absolute filename: <%s>"), filename); -+ return 0; -+ } -+ -+ if (!rpm_init_done) -+ { -+ static int init_tried; -+ -+ /* Already failed the initialization before? */ -+ if (init_tried) -+ return 0; -+ init_tried = 1; -+ -+#ifdef DLOPEN_LIBRPM -+ { -+ void *h; -+ -+ h = dlopen (DLOPEN_LIBRPM, RTLD_LAZY); -+ if (!h) -+ { -+ warning (_("Unable to open \"%s\" (%s), " -+ "missing debuginfos notifications will not be displayed"), -+ DLOPEN_LIBRPM, dlerror ()); -+ return 0; -+ } -+ -+ if (!((headerFormat_p = (char *(*) (Header h, const char * fmt, errmsg_t *errmsg)) dlsym (h, "headerFormat")) -+ && (rpmReadConfigFiles_p = (int (*) (const char * file, const char * target)) dlsym (h, "rpmReadConfigFiles")) -+ && (rpmdbFreeIterator_p = (rpmdbMatchIterator (*) (rpmdbMatchIterator mi)) dlsym (h, "rpmdbFreeIterator")) -+ && (rpmdbNextIterator_p = (Header (*) (rpmdbMatchIterator mi)) dlsym (h, "rpmdbNextIterator")) -+ && (rpmtsCreate_p = (rpmts (*) (void)) dlsym (h, "rpmtsCreate")) -+ && (rpmtsFree_p = (rpmts (*) (rpmts ts)) dlsym (h, "rpmtsFree")) -+ && (rpmtsInitIterator_p = (rpmdbMatchIterator (*) (const rpmts ts, rpmTag rpmtag, const void *keyp, size_t keylen)) dlsym (h, "rpmtsInitIterator")))) -+ { -+ warning (_("Opened library \"%s\" is incompatible (%s), " -+ "missing debuginfos notifications will not be displayed"), -+ DLOPEN_LIBRPM, dlerror ()); -+ if (dlclose (h)) -+ warning (_("Error closing library \"%s\": %s\n"), DLOPEN_LIBRPM, -+ dlerror ()); -+ return 0; -+ } -+ } -+#endif /* DLOPEN_LIBRPM */ -+ -+ if (rpmReadConfigFiles_p (NULL, NULL) != 0) -+ { -+ warning (_("Error reading the rpm configuration files")); -+ return 0; -+ } -+ -+ rpm_init_done = 1; -+ } -+ -+ ts = rpmtsCreate_p (); -+ -+ mi = rpmtsInitIterator_p (ts, RPMTAG_BASENAMES, filename, 0); -+ if (mi != NULL) -+ { -+#ifndef GDB_INDEX_VERIFY_VENDOR -+ for (;;) -+#else -+ if (!verify_vendor) for (;;) -+#endif -+ { -+ Header h; -+ char *debuginfo, **slot, *s, *s2; -+ errmsg_t err; -+ size_t srcrpmlen = sizeof (".src.rpm") - 1; -+ size_t debuginfolen = sizeof ("-debuginfo") - 1; -+ rpmdbMatchIterator mi_debuginfo; -+ -+ h = rpmdbNextIterator_p (mi); -+ if (h == NULL) -+ break; -+ -+ /* Verify the debuginfo file is not already installed. */ -+ -+ debuginfo = headerFormat_p (h, "%{sourcerpm}-debuginfo.%{arch}", -+ &err); -+ if (!debuginfo) -+ { -+ warning (_("Error querying the rpm file `%s': %s"), filename, -+ err); -+ continue; -+ } -+ /* s = `.src.rpm-debuginfo.%{arch}' */ -+ s = strrchr (debuginfo, '-') - srcrpmlen; -+ s2 = NULL; -+ if (s > debuginfo && memcmp (s, ".src.rpm", srcrpmlen) == 0) -+ { -+ /* s2 = `-%{release}.src.rpm-debuginfo.%{arch}' */ -+ s2 = (char *) memrchr (debuginfo, '-', s - debuginfo); -+ } -+ if (s2) -+ { -+ /* s2 = `-%{version}-%{release}.src.rpm-debuginfo.%{arch}' */ -+ s2 = (char *) memrchr (debuginfo, '-', s2 - debuginfo); -+ } -+ if (!s2) -+ { -+ warning (_("Error querying the rpm file `%s': %s"), filename, -+ debuginfo); -+ xfree (debuginfo); -+ continue; -+ } -+ /* s = `.src.rpm-debuginfo.%{arch}' */ -+ /* s2 = `-%{version}-%{release}.src.rpm-debuginfo.%{arch}' */ -+ memmove (s2 + debuginfolen, s2, s - s2); -+ memcpy (s2, "-debuginfo", debuginfolen); -+ /* s = `XXXX.%{arch}' */ -+ /* strlen ("XXXX") == srcrpmlen + debuginfolen */ -+ /* s2 = `-debuginfo-%{version}-%{release}XX.%{arch}' */ -+ /* strlen ("XX") == srcrpmlen */ -+ memmove (s + debuginfolen, s + srcrpmlen + debuginfolen, -+ strlen (s + srcrpmlen + debuginfolen) + 1); -+ /* s = `-debuginfo-%{version}-%{release}.%{arch}' */ -+ -+ /* RPMDBI_PACKAGES requires keylen == sizeof (int). */ -+ /* RPMDBI_LABEL is an interface for NVR-based dbiFindByLabel(). */ -+ mi_debuginfo = rpmtsInitIterator_p (ts, (rpmTag) RPMDBI_LABEL, debuginfo, 0); -+ xfree (debuginfo); -+ if (mi_debuginfo) -+ { -+ rpmdbFreeIterator_p (mi_debuginfo); -+ count = 0; -+ break; -+ } -+ -+ /* The allocated memory gets utilized below for MISSING_RPM_HASH. */ -+ debuginfo = headerFormat_p (h, -+ "%{name}-%{version}-%{release}.%{arch}", -+ &err); -+ if (!debuginfo) -+ { -+ warning (_("Error querying the rpm file `%s': %s"), filename, -+ err); -+ continue; -+ } -+ -+ /* Base package name for `debuginfo-install'. We do not use the -+ `yum' command directly as the line -+ yum --enablerepo='*debug*' install NAME-debuginfo.ARCH -+ would be more complicated than just: -+ debuginfo-install NAME-VERSION-RELEASE.ARCH -+ Do not supply the rpm base name (derived from .src.rpm name) as -+ debuginfo-install is unable to install the debuginfo package if -+ the base name PKG binary rpm is not installed while for example -+ PKG-libs would be installed (RH Bug 467901). -+ FUTURE: After multiple debuginfo versions simultaneously installed -+ get supported the support for the VERSION-RELEASE tags handling -+ may need an update. */ -+ -+ if (missing_rpm_hash == NULL) -+ { -+ /* DEL_F is passed NULL as MISSING_RPM_LIST's HTAB_DELETE -+ should not deallocate the entries. */ -+ -+ missing_rpm_hash = htab_create_alloc (64, htab_hash_string, -+ (int (*) (const void *, const void *)) streq, -+ NULL, xcalloc, xfree); -+ } -+ slot = (char **) htab_find_slot (missing_rpm_hash, debuginfo, INSERT); -+ /* XCALLOC never returns NULL. */ -+ gdb_assert (slot != NULL); -+ if (*slot == NULL) -+ { -+ struct missing_rpm *missing_rpm; -+ -+ *slot = debuginfo; -+ -+ missing_rpm = (struct missing_rpm *) xmalloc (sizeof (*missing_rpm) + strlen (debuginfo)); -+ strcpy (missing_rpm->rpm, debuginfo); -+ missing_rpm->next = missing_rpm_list; -+ missing_rpm_list = missing_rpm; -+ missing_rpm_list_entries++; -+ } -+ else -+ xfree (debuginfo); -+ count++; -+ } -+#ifdef GDB_INDEX_VERIFY_VENDOR -+ else /* verify_vendor */ -+ { -+ int vendor_pass = 0, vendor_fail = 0; -+ -+ for (;;) -+ { -+ Header h; -+ errmsg_t err; -+ char *vendor; -+ -+ h = rpmdbNextIterator_p (mi); -+ if (h == NULL) -+ break; -+ -+ vendor = headerFormat_p (h, "%{vendor}", &err); -+ if (!vendor) -+ { -+ warning (_("Error querying the rpm file `%s': %s"), filename, -+ err); -+ continue; -+ } -+ if (strcmp (vendor, "Red Hat, Inc.") == 0) -+ vendor_pass = 1; -+ else -+ vendor_fail = 1; -+ xfree (vendor); -+ } -+ count = vendor_pass != 0 && vendor_fail == 0; -+ } -+#endif -+ -+ rpmdbFreeIterator_p (mi); -+ } -+ -+ rpmtsFree_p (ts); -+ -+ return count; -+} -+ -+#ifdef GDB_INDEX_VERIFY_VENDOR -+missing_rpm_enlist (const char *filename) -+{ -+ return missing_rpm_enlist_1 (filename, 0); -+} -+ -+extern int rpm_verify_vendor (const char *filename); -+int -+rpm_verify_vendor (const char *filename) -+{ -+ return missing_rpm_enlist_1 (filename, 1); -+} -+#endif -+ -+static bool -+missing_rpm_list_compar (const char *ap, const char *bp) -+{ -+ return strcoll (ap, bp) < 0; -+} -+ -+/* It returns a NULL-terminated array of strings needing to be FREEd. It may -+ also return only NULL. */ -+ -+static void -+missing_rpm_list_print (void) -+{ -+ struct missing_rpm *list_iter; -+ -+ if (missing_rpm_list_entries == 0) -+ return; -+ -+ std::vector array (missing_rpm_list_entries); -+ size_t idx = 0; -+ -+ for (list_iter = missing_rpm_list; list_iter != NULL; -+ list_iter = list_iter->next) -+ { -+ array[idx++] = list_iter->rpm; -+ } -+ gdb_assert (idx == missing_rpm_list_entries); -+ -+ std::sort (array.begin (), array.end (), missing_rpm_list_compar); -+ -+ /* We zero out the number of missing RPMs here because of a nasty -+ bug (see RHBZ 1801974). -+ -+ When we call 'puts_unfiltered' below, if pagination is on and if -+ the number of missing RPMs is big enough to trigger pagination, -+ we will end up in an infinite recursion. The call chain looks -+ like this: -+ -+ missing_rpm_list_print -> puts_unfiltered -> fputs_maybe_filtered -+ -> prompt_for_continue -> display_gdb_prompt -> -+ debug_flush_missing -> missing_rpm_list_print ... -+ -+ For this reason, we make sure MISSING_RPM_LIST_ENTRIES is zero -+ *before* calling any print function. -+ -+ Note: kevinb/2023-02-22: The code below used to call -+ puts_unfiltered() and printf_unfiltered(), but calls to these -+ functions have been replaced by calls to gdb_printf(). The call -+ chain shown above (probably) used to be the case at one time and -+ hopefully something similar is still the case now that -+ gdb_printf() is being used instead. */ -+ missing_rpm_list_entries = 0; -+ -+ gdb_printf (_("Missing separate debuginfos, use: %s"), -+#ifdef DNF_DEBUGINFO_INSTALL -+ "dnf " -+#endif -+ "debuginfo-install"); -+ for (const char *el : array) -+ { -+ gdb_printf (" %s", el); -+ } -+ gdb_printf ("\n"); -+ -+ while (missing_rpm_list != NULL) -+ { -+ list_iter = missing_rpm_list; -+ missing_rpm_list = list_iter->next; -+ xfree (list_iter); -+ } -+} -+ -+static void -+missing_rpm_change (void) -+{ -+ debug_flush_missing (); -+ -+ gdb_assert (missing_rpm_list == NULL); -+ if (missing_rpm_hash != NULL) -+ { -+ htab_delete (missing_rpm_hash); -+ missing_rpm_hash = NULL; -+ } -+} -+ -+enum missing_exec -+ { -+ /* Init state. EXEC_BFD also still could be NULL. */ -+ MISSING_EXEC_NOT_TRIED, -+ /* We saw a non-NULL EXEC_BFD but RPM has no info about it. */ -+ MISSING_EXEC_NOT_FOUND, -+ /* We found EXEC_BFD by RPM and we either have its symbols (either embedded -+ or separate) or the main executable's RPM is now contained in -+ MISSING_RPM_HASH. */ -+ MISSING_EXEC_ENLISTED -+ }; -+static enum missing_exec missing_exec = MISSING_EXEC_NOT_TRIED; -+ -+#endif /* HAVE_LIBRPM */ -+ -+void -+debug_flush_missing (void) -+{ -+#ifdef HAVE_LIBRPM -+ missing_rpm_list_print (); -+#endif -+} -+ -+/* This MISSING_FILEPAIR_HASH tracker is used only for the duplicite messages -+ yum --enablerepo='*debug*' install ... -+ avoidance. */ -+ -+struct missing_filepair -+ { -+ char *binary; -+ char *debug; -+ char data[1]; -+ }; -+ -+static struct htab *missing_filepair_hash; -+static struct obstack missing_filepair_obstack; -+ -+static void * -+missing_filepair_xcalloc (size_t nmemb, size_t nmemb_size) -+{ -+ void *retval; -+ size_t size = nmemb * nmemb_size; -+ -+ retval = obstack_alloc (&missing_filepair_obstack, size); -+ memset (retval, 0, size); -+ return retval; -+} -+ -+static hashval_t -+missing_filepair_hash_func (const struct missing_filepair *elem) -+{ -+ hashval_t retval = 0; -+ -+ retval ^= htab_hash_string (elem->binary); -+ if (elem->debug != NULL) -+ retval ^= htab_hash_string (elem->debug); -+ -+ return retval; -+} -+ -+static int -+missing_filepair_eq (const struct missing_filepair *elem1, -+ const struct missing_filepair *elem2) -+{ -+ return strcmp (elem1->binary, elem2->binary) == 0 -+ && ((elem1->debug == NULL) == (elem2->debug == NULL)) -+ && (elem1->debug == NULL || strcmp (elem1->debug, elem2->debug) == 0); -+} -+ -+static void -+missing_filepair_change (void) -+{ -+ if (missing_filepair_hash != NULL) -+ { -+ obstack_free (&missing_filepair_obstack, NULL); -+ /* All their memory came just from missing_filepair_OBSTACK. */ -+ missing_filepair_hash = NULL; -+ } -+#ifdef HAVE_LIBRPM -+ missing_exec = MISSING_EXEC_NOT_TRIED; -+#endif -+} -+ -+static void -+debug_print_executable_changed (struct program_space *pspace, bool reload_p) -+{ -+#ifdef HAVE_LIBRPM -+ missing_rpm_change (); -+#endif -+ missing_filepair_change (); -+} -+ -+/* Notify user the file BINARY with (possibly NULL) associated separate debug -+ information file DEBUG is missing. DEBUG may or may not be the build-id -+ file such as would be: -+ /usr/lib/debug/.build-id/dd/b1d2ce632721c47bb9e8679f369e2295ce71be.debug -+ */ -+ -+void -+debug_print_missing (const char *binary, const char *debug) -+{ -+ size_t binary_len0 = strlen (binary) + 1; -+ size_t debug_len0 = debug ? strlen (debug) + 1 : 0; -+ struct missing_filepair missing_filepair_find; -+ struct missing_filepair *missing_filepair; -+ struct missing_filepair **slot; -+ -+ if (build_id_verbose < BUILD_ID_VERBOSE_FILENAMES) -+ return; -+ -+ if (missing_filepair_hash == NULL) -+ { -+ obstack_init (&missing_filepair_obstack); -+ missing_filepair_hash = htab_create_alloc (64, -+ (hashval_t (*) (const void *)) missing_filepair_hash_func, -+ (int (*) (const void *, const void *)) missing_filepair_eq, NULL, -+ missing_filepair_xcalloc, NULL); -+ } -+ -+ /* Use MISSING_FILEPAIR_FIND first instead of calling obstack_alloc with -+ obstack_free in the case of a (rare) match. The problem is ALLOC_F for -+ MISSING_FILEPAIR_HASH allocates from MISSING_FILEPAIR_OBSTACK maintenance -+ structures for MISSING_FILEPAIR_HASH. Calling obstack_free would possibly -+ not to free only MISSING_FILEPAIR but also some such structures (allocated -+ during the htab_find_slot call). */ -+ -+ missing_filepair_find.binary = (char *) binary; -+ missing_filepair_find.debug = (char *) debug; -+ slot = (struct missing_filepair **) htab_find_slot (missing_filepair_hash, -+ &missing_filepair_find, -+ INSERT); -+ -+ /* While it may be still printed duplicitely with the missing debuginfo file -+ * it is due to once printing about the binary file build-id link and once -+ * about the .debug file build-id link as both the build-id symlinks are -+ * located in the debuginfo package. */ -+ -+ if (*slot != NULL) -+ return; -+ -+ missing_filepair = (struct missing_filepair *) obstack_alloc (&missing_filepair_obstack, -+ sizeof (*missing_filepair) - 1 -+ + binary_len0 + debug_len0); -+ missing_filepair->binary = missing_filepair->data; -+ memcpy (missing_filepair->binary, binary, binary_len0); -+ if (debug != NULL) -+ { -+ missing_filepair->debug = missing_filepair->binary + binary_len0; -+ memcpy (missing_filepair->debug, debug, debug_len0); -+ } -+ else -+ missing_filepair->debug = NULL; -+ -+ *slot = missing_filepair; -+ -+#ifdef HAVE_LIBRPM -+ if (missing_exec == MISSING_EXEC_NOT_TRIED) -+ { -+ const char *execfilename = get_exec_file (0); -+ -+ if (execfilename != NULL) -+ { -+ if (missing_rpm_enlist (execfilename) == 0) -+ missing_exec = MISSING_EXEC_NOT_FOUND; -+ else -+ missing_exec = MISSING_EXEC_ENLISTED; -+ } -+ } -+ if (missing_exec != MISSING_EXEC_ENLISTED) -+ if ((binary[0] == 0 || missing_rpm_enlist (binary) == 0) -+ && (debug == NULL || missing_rpm_enlist (debug) == 0)) -+#endif /* HAVE_LIBRPM */ -+ { -+ /* We do not collect and flush these messages as each such message -+ already requires its own separate lines. */ -+ -+ gdb_printf (gdb_stdlog, -+ _("Missing separate debuginfo for %s.\n"), binary); -+ if (debug != NULL) -+ { -+ if (access (debug, F_OK) == 0) { -+ gdb_printf (gdb_stdlog, _("Try: %s %s\n"), -+#ifdef DNF_DEBUGINFO_INSTALL -+ "dnf" -+#else -+ "yum" -+#endif -+ " --enablerepo='*debug*' install", debug); -+ } else -+ gdb_printf (gdb_stdlog, _("The debuginfo package for this file is probably broken.\n")); -+ } -+ } -+} -+ - /* See build-id.h. */ - - gdb_bfd_ref_ptr --build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id) -+build_id_to_debug_bfd (size_t build_id_len, const bfd_byte *build_id, -+ char **link_return) - { -- return build_id_to_bfd_suffix (build_id_len, build_id, ".debug"); -+ return build_id_to_bfd_suffix (build_id_len, build_id, ".debug", -+ link_return); - } - - /* See build-id.h. */ - - gdb_bfd_ref_ptr --build_id_to_exec_bfd (size_t build_id_len, const bfd_byte *build_id) -+build_id_to_exec_bfd (size_t build_id_len, const bfd_byte *build_id, -+ char **link_return) - { -- return build_id_to_bfd_suffix (build_id_len, build_id, ""); -+ return build_id_to_bfd_suffix (build_id_len, build_id, "", link_return); - } - - /* See build-id.h. */ - - std::string - find_separate_debug_file_by_buildid (struct objfile *objfile, -- deferred_warnings *warnings) -+ deferred_warnings *warnings, -+ gdb::unique_xmalloc_ptr *build_id_filename_return) - { - const struct bfd_build_id *build_id; - -- build_id = build_id_bfd_get (objfile->obfd.get ()); -+ if (build_id_filename_return) -+ *build_id_filename_return = NULL; -+ -+ build_id = build_id_bfd_shdr_get (objfile->obfd.get ()); - if (build_id != NULL) - { - if (separate_debug_file_debug) -@@ -222,8 +1358,21 @@ find_separate_debug_file_by_buildid (struct objfile *objfile, - _("\nLooking for separate debug info (build-id) for " - "%s\n"), objfile_name (objfile)); - -+ char *build_id_filename_cstr = NULL; - gdb_bfd_ref_ptr abfd (build_id_to_debug_bfd (build_id->size, -- build_id->data)); -+ build_id->data, -+ (!build_id_filename_return ? NULL : &build_id_filename_cstr))); -+ if (build_id_filename_return) -+ { -+ if (!build_id_filename_cstr) -+ gdb_assert (!*build_id_filename_return); -+ else -+ { -+ *build_id_filename_return = gdb::unique_xmalloc_ptr (build_id_filename_cstr); -+ build_id_filename_cstr = NULL; -+ } -+ } -+ - /* Prevent looping on a stripped .debug file. */ - if (abfd != NULL - && filename_cmp (bfd_get_filename (abfd.get ()), -@@ -243,3 +1392,22 @@ find_separate_debug_file_by_buildid (struct objfile *objfile, - - return std::string (); - } -+ -+void _initialize_build_id (); -+ -+void -+_initialize_build_id () -+{ -+ add_setshow_zinteger_cmd ("build-id-verbose", no_class, &build_id_verbose, -+ _("\ -+Set debugging level of the build-id locator."), _("\ -+Show debugging level of the build-id locator."), _("\ -+Level 1 (default) enables printing the missing debug filenames,\n\ -+level 2 also prints the parsing of binaries to find the identificators."), -+ NULL, -+ show_build_id_verbose, -+ &setlist, &showlist); -+ -+ gdb::observers::executable_changed.attach (debug_print_executable_changed, -+ "build-id"); -+} -diff --git a/gdb/build-id.h b/gdb/build-id.h ---- a/gdb/build-id.h -+++ b/gdb/build-id.h -@@ -23,9 +23,10 @@ - #include "gdb_bfd.h" - #include "gdbsupport/rsp-low.h" - --/* Locate NT_GNU_BUILD_ID from ABFD and return its content. */ -+/* Separate debuginfo files have corrupted PHDR but SHDR is correct there. -+ Locate NT_GNU_BUILD_ID from ABFD and return its content. */ - --extern const struct bfd_build_id *build_id_bfd_get (bfd *abfd); -+extern const struct bfd_build_id *build_id_bfd_shdr_get (bfd *abfd); - - /* Return true if ABFD has NT_GNU_BUILD_ID matching the CHECK value. - Otherwise, issue a warning and return false. */ -@@ -38,14 +39,19 @@ extern int build_id_verify (bfd *abfd, - can be found, return NULL. */ - - extern gdb_bfd_ref_ptr build_id_to_debug_bfd (size_t build_id_len, -- const bfd_byte *build_id); -+ const bfd_byte *build_id, -+ char **link_return = NULL); -+ -+extern char *build_id_to_filename (const struct bfd_build_id *build_id, -+ char **link_return); - - /* Find and open a BFD for an executable file given a build-id. If no BFD - can be found, return NULL. The returned reference to the BFD must be - released by the caller. */ - - extern gdb_bfd_ref_ptr build_id_to_exec_bfd (size_t build_id_len, -- const bfd_byte *build_id); -+ const bfd_byte *build_id, -+ char **link_return); - - /* Find the separate debug file for OBJFILE, by using the build-id - associated with OBJFILE's BFD. If successful, returns the file name for the -@@ -58,7 +64,8 @@ extern gdb_bfd_ref_ptr build_id_to_exec_bfd (size_t build_id_len, - will be printed. */ - - extern std::string find_separate_debug_file_by_buildid -- (struct objfile *objfile, deferred_warnings *warnings); -+ (struct objfile *objfile, deferred_warnings *warnings, -+ gdb::unique_xmalloc_ptr *build_id_filename_return); - - /* Return an hex-string representation of BUILD_ID. */ - -diff --git a/gdb/coffread.c b/gdb/coffread.c ---- a/gdb/coffread.c -+++ b/gdb/coffread.c -@@ -729,7 +729,7 @@ coff_symfile_read (struct objfile *objfile, symfile_add_flags symfile_flags) - { - deferred_warnings warnings; - std::string debugfile -- = find_separate_debug_file_by_buildid (objfile, &warnings); -+ = find_separate_debug_file_by_buildid (objfile, &warnings, NULL); - - if (debugfile.empty ()) - debugfile -diff --git a/gdb/corelow.c b/gdb/corelow.c ---- a/gdb/corelow.c -+++ b/gdb/corelow.c -@@ -22,6 +22,10 @@ - #include - #include - #include "frame.h" -+#include "auxv.h" -+#include "build-id.h" -+#include "elf/common.h" -+#include "gdbcmd.h" - #include "inferior.h" - #include "infrun.h" - #include "symtab.h" -@@ -380,6 +384,8 @@ add_to_thread_list (asection *asect, asection *reg_sect, inferior *inf) - switch_to_thread (thr); /* Yes, make it current. */ - } - -+static bool build_id_core_loads = true; -+ - /* Issue a message saying we have no core to debug, if FROM_TTY. */ - - static void -@@ -563,12 +569,14 @@ rename_vmcore_idle_reg_sections (bfd *abfd, inferior *inf) - static void - locate_exec_from_corefile_build_id (bfd *abfd, int from_tty) - { -- const bfd_build_id *build_id = build_id_bfd_get (abfd); -+ const bfd_build_id *build_id = build_id_bfd_shdr_get (abfd); - if (build_id == nullptr) - return; - -+ char *build_id_filename; - gdb_bfd_ref_ptr execbfd -- = build_id_to_exec_bfd (build_id->size, build_id->data); -+ = build_id_to_exec_bfd (build_id->size, build_id->data, -+ &build_id_filename); - - if (execbfd == nullptr) - { -@@ -596,7 +604,12 @@ locate_exec_from_corefile_build_id (bfd *abfd, int from_tty) - exec_file_attach (bfd_get_filename (execbfd.get ()), from_tty); - symbol_file_add_main (bfd_get_filename (execbfd.get ()), - symfile_add_flag (from_tty ? SYMFILE_VERBOSE : 0)); -+ if (current_program_space->symfile_object_file != NULL) -+ current_program_space->symfile_object_file->flags |= -+ OBJF_BUILD_ID_CORE_LOADED; - } -+ else -+ debug_print_missing (BUILD_ID_MAIN_EXECUTABLE_FILENAME, build_id_filename); - } - - /* See gdbcore.h. */ -@@ -1506,4 +1519,11 @@ _initialize_corelow () - maintenance_print_core_file_backed_mappings, - _("Print core file's file-backed mappings."), - &maintenanceprintlist); -+ -+ add_setshow_boolean_cmd ("build-id-core-loads", class_files, -+ &build_id_core_loads, _("\ -+Set whether CORE-FILE loads the build-id associated files automatically."), _("\ -+Show whether CORE-FILE loads the build-id associated files automatically."), -+ NULL, NULL, NULL, -+ &setlist, &showlist); - } -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -22296,6 +22296,27 @@ information files. - - @end table - -+You can also adjust the current verbosity of the @dfn{build id} locating. -+ -+@table @code -+ -+@kindex set build-id-verbose -+@item set build-id-verbose 0 -+No additional messages are printed. -+ -+@item set build-id-verbose 1 -+Missing separate debug filenames are printed. -+ -+@item set build-id-verbose 2 -+Missing separate debug filenames are printed and also all the parsing of the -+binaries to find their @dfn{build id} content is printed. -+ -+@kindex show build-id-verbose -+@item show build-id-verbose -+Show the current verbosity value for the @dfn{build id} content locating. -+ -+@end table -+ - @cindex @code{.gnu_debuglink} sections - @cindex debug link sections - A debug link is a special section of the executable file named -diff --git a/gdb/dwarf2/index-cache.c b/gdb/dwarf2/index-cache.c ---- a/gdb/dwarf2/index-cache.c -+++ b/gdb/dwarf2/index-cache.c -@@ -96,7 +96,7 @@ index_cache_store_context::index_cache_store_context (const index_cache &ic, - return; - - /* Get build id of objfile. */ -- const bfd_build_id *build_id = build_id_bfd_get (per_bfd->obfd); -+ const bfd_build_id *build_id = build_id_bfd_shdr_get (per_bfd->obfd); - if (build_id == nullptr) - { - index_cache_debug ("objfile %s has no build id", -@@ -111,7 +111,8 @@ index_cache_store_context::index_cache_store_context (const index_cache &ic, - - if (dwz != nullptr) - { -- const bfd_build_id *dwz_build_id = build_id_bfd_get (dwz->dwz_bfd.get ()); -+ const bfd_build_id *dwz_build_id -+ = build_id_bfd_shdr_get (dwz->dwz_bfd.get ()); - - if (dwz_build_id == nullptr) - { -diff --git a/gdb/dwarf2/read.c b/gdb/dwarf2/read.c ---- a/gdb/dwarf2/read.c -+++ b/gdb/dwarf2/read.c -@@ -3355,7 +3355,7 @@ get_gdb_index_contents_from_section (objfile *obj, T *section_owner) - static gdb::array_view - get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_bfd *dwarf2_per_bfd) - { -- const bfd_build_id *build_id = build_id_bfd_get (obj->obfd.get ()); -+ const bfd_build_id *build_id = build_id_bfd_shdr_get (obj->obfd.get ()); - if (build_id == nullptr) - return {}; - -@@ -3368,7 +3368,7 @@ get_gdb_index_contents_from_cache (objfile *obj, dwarf2_per_bfd *dwarf2_per_bfd) - static gdb::array_view - get_gdb_index_contents_from_cache_dwz (objfile *obj, dwz_file *dwz) - { -- const bfd_build_id *build_id = build_id_bfd_get (dwz->dwz_bfd.get ()); -+ const bfd_build_id *build_id = build_id_bfd_shdr_get (dwz->dwz_bfd.get ()); - if (build_id == nullptr) - return {}; - -diff --git a/gdb/elfread.c b/gdb/elfread.c ---- a/gdb/elfread.c -+++ b/gdb/elfread.c -@@ -1220,8 +1220,10 @@ elf_symfile_read_dwarf2 (struct objfile *objfile, - { - deferred_warnings warnings; - -+ gdb::unique_xmalloc_ptr build_id_filename; - std::string debugfile -- = find_separate_debug_file_by_buildid (objfile, &warnings); -+ = find_separate_debug_file_by_buildid (objfile, &warnings, -+ &build_id_filename); - - if (debugfile.empty ()) - debugfile = find_separate_debug_file_by_debuglink (objfile, &warnings); -@@ -1239,7 +1241,7 @@ elf_symfile_read_dwarf2 (struct objfile *objfile, - { - has_dwarf2 = false; - const struct bfd_build_id *build_id -- = build_id_bfd_get (objfile->obfd.get ()); -+ = build_id_bfd_shdr_get (objfile->obfd.get ()); - const char *filename = bfd_get_filename (objfile->obfd.get ()); - - if (build_id != nullptr) -@@ -1265,6 +1267,11 @@ elf_symfile_read_dwarf2 (struct objfile *objfile, - has_dwarf2 = true; - } - } -+ /* Check if any separate debug info has been extracted out. */ -+ else if (bfd_get_section_by_name (objfile->obfd.get (), -+ ".gnu_debuglink") -+ != NULL) -+ debug_print_missing (objfile_name (objfile), build_id_filename.get ()); - } - } - /* If all the methods to collect the debuginfo failed, print the -diff --git a/gdb/exec.c b/gdb/exec.c ---- a/gdb/exec.c -+++ b/gdb/exec.c -@@ -237,7 +237,7 @@ validate_exec_file (int from_tty) - current_exec_file = get_exec_file (0); - - const bfd_build_id *exec_file_build_id -- = build_id_bfd_get (current_program_space->exec_bfd ()); -+ = build_id_bfd_shdr_get (current_program_space->exec_bfd ()); - if (exec_file_build_id != nullptr) - { - /* Prepend the target prefix, to force gdb_bfd_open to open the -@@ -250,7 +250,7 @@ validate_exec_file (int from_tty) - if (abfd != nullptr) - { - const bfd_build_id *target_exec_file_build_id -- = build_id_bfd_get (abfd.get ()); -+ = build_id_bfd_shdr_get (abfd.get ()); - - if (target_exec_file_build_id != nullptr) - { -diff --git a/gdb/objfiles.h b/gdb/objfiles.h ---- a/gdb/objfiles.h -+++ b/gdb/objfiles.h -@@ -884,6 +884,10 @@ struct objfile - bool object_format_has_copy_relocs = false; - }; - -+/* This file was loaded according to the BUILD_ID_CORE_LOADS rules. */ -+ -+#define OBJF_BUILD_ID_CORE_LOADED static_cast(1 << 12) -+ - /* A deleter for objfile. */ - - struct objfile_deleter -diff --git a/gdb/python/py-objfile.c b/gdb/python/py-objfile.c ---- a/gdb/python/py-objfile.c -+++ b/gdb/python/py-objfile.c -@@ -158,7 +158,7 @@ objfpy_get_build_id (PyObject *self, void *closure) - - try - { -- build_id = build_id_bfd_get (objfile->obfd.get ()); -+ build_id = build_id_bfd_shdr_get (objfile->obfd.get ()); - } - catch (const gdb_exception &except) - { -@@ -629,7 +629,7 @@ gdbpy_lookup_objfile (PyObject *self, PyObject *args, PyObject *kw) - if (obfd == nullptr) - return 0; - -- const bfd_build_id *obfd_build_id = build_id_bfd_get (obfd); -+ const bfd_build_id *obfd_build_id = build_id_bfd_shdr_get (obfd); - if (obfd_build_id == nullptr) - return 0; - -diff --git a/gdb/solib-svr4.c b/gdb/solib-svr4.c ---- a/gdb/solib-svr4.c -+++ b/gdb/solib-svr4.c -@@ -44,6 +44,7 @@ - #include "auxv.h" - #include "gdb_bfd.h" - #include "probe.h" -+#include "build-id.h" - - #include - -@@ -1318,9 +1319,51 @@ svr4_read_so_list (svr4_info *info, CORE_ADDR lm, CORE_ADDR prev_lm, - continue; - } - -- strncpy (newobj->so_name, buffer.get (), SO_NAME_MAX_PATH_SIZE - 1); -- newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; -- strcpy (newobj->so_original_name, newobj->so_name); -+ { -+ struct bfd_build_id *build_id; -+ -+ strncpy (newobj->so_original_name, buffer.get (), SO_NAME_MAX_PATH_SIZE - 1); -+ newobj->so_original_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; -+ /* May get overwritten below. */ -+ strcpy (newobj->so_name, newobj->so_original_name); -+ -+ build_id = build_id_addr_get (((lm_info_svr4 *) newobj->lm_info)->l_ld); -+ if (build_id != NULL) -+ { -+ char *name, *build_id_filename; -+ -+ /* Missing the build-id matching separate debug info file -+ would be handled while SO_NAME gets loaded. */ -+ name = build_id_to_filename (build_id, &build_id_filename); -+ if (name != NULL) -+ { -+ strncpy (newobj->so_name, name, SO_NAME_MAX_PATH_SIZE - 1); -+ newobj->so_name[SO_NAME_MAX_PATH_SIZE - 1] = '\0'; -+ xfree (name); -+ } -+ else -+ { -+ debug_print_missing (newobj->so_name, build_id_filename); -+ -+ /* In the case the main executable was found according to -+ its build-id (from a core file) prevent loading -+ a different build of a library with accidentally the -+ same SO_NAME. -+ -+ It suppresses bogus backtraces (and prints "??" there -+ instead) if the on-disk files no longer match the -+ running program version. */ -+ -+ if (current_program_space->symfile_object_file != NULL -+ && (current_program_space->symfile_object_file->flags -+ & OBJF_BUILD_ID_CORE_LOADED) != 0) -+ newobj->so_name[0] = 0; -+ } -+ -+ xfree (build_id_filename); -+ xfree (build_id); -+ } -+ } - - /* If this entry has no name, or its name matches the name - for the main executable, don't include it in the list. */ -diff --git a/gdb/source.c b/gdb/source.c ---- a/gdb/source.c -+++ b/gdb/source.c -@@ -1167,7 +1167,7 @@ open_source_file (struct symtab *s) - } - - const struct bfd_build_id *build_id -- = build_id_bfd_get (ofp->obfd.get ()); -+ = build_id_bfd_shdr_get (ofp->obfd.get ()); - - /* Query debuginfod for the source file. */ - if (build_id != nullptr && !srcpath.empty ()) -diff --git a/gdb/symfile.h b/gdb/symfile.h ---- a/gdb/symfile.h -+++ b/gdb/symfile.h -@@ -357,12 +357,18 @@ bool expand_symtabs_matching - void map_symbol_filenames (gdb::function_view fun, - bool need_fullname); - -+ - /* Target-agnostic function to load the sections of an executable into memory. - - ARGS should be in the form "EXECUTABLE [OFFSET]", where OFFSET is an - optional offset to apply to each section. */ - extern void generic_load (const char *args, int from_tty); - -+/* build-id support. */ -+extern struct bfd_build_id *build_id_addr_get (CORE_ADDR addr); -+extern void debug_print_missing (const char *binary, const char *debug); -+#define BUILD_ID_MAIN_EXECUTABLE_FILENAME _("the main executable file") -+ - /* From minidebug.c. */ - - extern gdb_bfd_ref_ptr find_separate_debug_file_in_section (struct objfile *); -diff --git a/gdb/testsuite/gdb.base/corefile.exp b/gdb/testsuite/gdb.base/corefile.exp ---- a/gdb/testsuite/gdb.base/corefile.exp -+++ b/gdb/testsuite/gdb.base/corefile.exp -@@ -347,3 +347,33 @@ gdb_test_multiple "core-file $corefile" $test { - pass $test - } - } -+ -+ -+# Test auto-loading of binary files through build-id from the core file. -+set buildid [build_id_debug_filename_get $binfile] -+set wholetest "binfile found by build-id" -+if {$buildid == ""} { -+ untested "$wholetest (binary has no build-id)" -+} else { -+ gdb_exit -+ gdb_start -+ -+ regsub {\.debug$} $buildid {} buildid -+ set debugdir [standard_output_file ${testfile}-debugdir] -+ file delete -force -- $debugdir -+ file mkdir $debugdir/[file dirname $buildid] -+ file copy $binfile $debugdir/$buildid -+ -+ set test "show debug-file-directory" -+ gdb_test_multiple $test $test { -+ -re "The directory where separate debug symbols are searched for is \"(.*)\"\\.\r\n$gdb_prompt $" { -+ set debugdir_orig $expect_out(1,string) -+ pass $test -+ } -+ } -+ gdb_test_no_output "set debug-file-directory $debugdir:$debugdir_orig" "set debug-file-directory" -+ gdb_test "show build-id-core-loads" {Whether CORE-FILE loads the build-id associated files automatically is on\.} -+ gdb_test "core-file $corefile" "\r\nProgram terminated with .*" "core-file without executable" -+ gdb_test "info files" "Local exec file:\r\n\[ \t\]*`[string_to_regexp $debugdir/$buildid]', file type .*" -+ pass $wholetest -+} -diff --git a/gdb/testsuite/gdb.base/gdbinit-history.exp b/gdb/testsuite/gdb.base/gdbinit-history.exp ---- a/gdb/testsuite/gdb.base/gdbinit-history.exp -+++ b/gdb/testsuite/gdb.base/gdbinit-history.exp -@@ -179,7 +179,8 @@ proc test_empty_history_filename { } { - global env - global gdb_prompt - -- set common_history [list "set height 0" "set width 0"] -+ set common_history [list "set height 0" "set width 0" \ -+ "set build-id-verbose 0"] - - set test_dir [standard_output_file history_test] - remote_exec host "mkdir -p $test_dir" -diff --git a/gdb/testsuite/gdb.base/new-ui-pending-input.exp b/gdb/testsuite/gdb.base/new-ui-pending-input.exp ---- a/gdb/testsuite/gdb.base/new-ui-pending-input.exp -+++ b/gdb/testsuite/gdb.base/new-ui-pending-input.exp -@@ -62,6 +62,7 @@ proc test_command_line_new_ui_pending_input {} { - set options "" - append options " -iex \"set height 0\"" - append options " -iex \"set width 0\"" -+ append options " -iex \"set build-id-verbose 0\"" - append options " -iex \"new-ui console $extra_tty_name\"" - append options " -ex \"b $bpline\"" - append options " -ex \"run\"" -diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp ---- a/gdb/testsuite/lib/gdb.exp -+++ b/gdb/testsuite/lib/gdb.exp -@@ -226,7 +226,8 @@ if ![info exists INTERNAL_GDBFLAGS] { - "-nx" \ - "-q" \ - {-iex "set height 0"} \ -- {-iex "set width 0"}]] -+ {-iex "set width 0"} \ -+ {-iex "set build-id-verbose 0"}]] - - # If DEBUGINFOD_URLS is set, gdb will try to download sources and - # debug info for f.i. system libraries. Prevent this. -@@ -2434,6 +2435,17 @@ proc default_gdb_start { } { - } - } - -+ # Turn off the missing warnings as the testsuite does not expect it. -+ send_gdb "set build-id-verbose 0\n" -+ gdb_expect 10 { -+ -re "$gdb_prompt $" { -+ verbose "Disabled the missing debug infos warnings." 2 -+ } -+ timeout { -+ warning "Could not disable the missing debug infos warnings.." -+ } -+ } -+ - gdb_debug_init - return 0 - } -diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp ---- a/gdb/testsuite/lib/mi-support.exp -+++ b/gdb/testsuite/lib/mi-support.exp -@@ -321,6 +321,16 @@ proc default_mi_gdb_start { { flags {} } } { - warning "Couldn't set the width to 0." - } - } -+ # Turn off the missing warnings as the testsuite does not expect it. -+ send_gdb "190-gdb-set build-id-verbose 0\n" -+ gdb_expect 10 { -+ -re ".*190-gdb-set build-id-verbose 0\r\n190\\\^done\r\n$mi_gdb_prompt$" { -+ verbose "Disabled the missing debug infos warnings." 2 -+ } -+ timeout { -+ warning "Could not disable the missing debug infos warnings.." -+ } -+ } - - if { $separate_inferior_pty } { - mi_create_inferior_pty diff --git a/gdb-6.6-bz229517-gcore-without-terminal.patch b/gdb-6.6-bz229517-gcore-without-terminal.patch deleted file mode 100644 index 2c127cc..0000000 --- a/gdb-6.6-bz229517-gcore-without-terminal.patch +++ /dev/null @@ -1,188 +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.6-bz229517-gcore-without-terminal.patch - -;; Allow running `/usr/bin/gcore' with provided but inaccessible tty (BZ 229517). -;;=fedoratest - -2007-04-22 Jan Kratochvil - - * gdb_gcore.sh: Redirect GDB from ` - - * gdb.base/gcorebg.exp, gdb.base/gcorebg.c: New files. - -diff --git a/gdb/testsuite/gdb.base/gcorebg.c b/gdb/testsuite/gdb.base/gcorebg.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gcorebg.c -@@ -0,0 +1,49 @@ -+#include -+#include -+#include -+#include -+#include -+#include -+#include -+ -+int main (int argc, char **argv) -+{ -+ pid_t pid = 0; -+ pid_t ppid; -+ char buf[1024*2 + 500]; -+ int gotint; -+ -+ if (argc != 4) -+ { -+ fprintf (stderr, "Syntax: %s {standard|detached} \n", -+ argv[0]); -+ exit (1); -+ } -+ -+ pid = fork (); -+ -+ switch (pid) -+ { -+ case 0: -+ if (strcmp (argv[1], "detached") == 0) -+ setpgrp (); -+ ppid = getppid (); -+ gotint = snprintf (buf, sizeof (buf), "sh %s -o %s %d", argv[2], argv[3], (int) ppid); -+ assert (gotint < sizeof (buf)); -+ system (buf); -+ fprintf (stderr, "Killing parent PID %d\n", ppid); -+ kill (ppid, SIGTERM); -+ break; -+ -+ case -1: -+ perror ("fork err\n"); -+ exit (1); -+ break; -+ -+ default: -+ fprintf (stderr,"Sleeping as PID %d\n", getpid ()); -+ sleep (60); -+ } -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/gcorebg.exp b/gdb/testsuite/gdb.base/gcorebg.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gcorebg.exp -@@ -0,0 +1,113 @@ -+# Copyright 2007 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 2 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program; if not, write to the Free Software -+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. -+ -+# Please email any bugs, comments, and/or additions to this file to: -+# bug-gdb@prep.ai.mit.edu -+ -+# This file was written by Jan Kratochvil . -+# This is a test for `gdb_gcore.sh' functionality. -+# It also tests a regression with `gdb_gcore.sh' being run without its -+# accessible terminal. -+ -+if ![info exists GCORE] { -+ set GCORE "[standard_output_file ../../../../gcore]" -+} -+verbose "using GCORE = $GCORE" 2 -+ -+set testfile "gcorebg" -+set srcfile ${testfile}.c -+set binfile [standard_output_file ${testfile}] -+set corefile [standard_output_file ${testfile}.test] -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { -+ untested gcorebg.exp -+ return -1 -+} -+ -+# Cleanup. -+ -+proc core_clean {} { -+ global corefile -+ -+ foreach file [glob -nocomplain [join [list $corefile *] ""]] { -+ verbose "Delete file $file" 1 -+ remote_file target delete $file -+ } -+} -+core_clean -+remote_file target delete "./gdb" -+ -+# Generate the core file. -+ -+# Provide `./gdb' for `gdb_gcore.sh' running it as a bare `gdb' command. -+# Setup also `$PATH' appropriately. -+# If GDB was not found let `gdb_gcore.sh' to find the system GDB by `$PATH'. -+if {$GDB != "gdb"} { -+ file link ./gdb $GDB -+} -+global env -+set oldpath $env(PATH) -+set env(PATH) [join [list . $env(PATH)] ":"] -+verbose "PATH = $env(PATH)" 2 -+ -+# Test file body. -+# $detached == "standard" || $detached == "detached" -+ -+proc test_body { detached } { -+ global binfile -+ global GCORE -+ global corefile -+ -+ set res [remote_spawn target "$binfile $detached $GCORE $corefile"] -+ if { $res < 0 || $res == "" } { -+ fail "Spawning $detached gcore" -+ return 1 -+ } -+ pass "Spawning $detached gcore" -+ remote_expect target 20 { -+ timeout { -+ fail "Spawned $detached gcore finished (timeout)" -+ remote_exec target "kill -9 -[exp_pid -i $res]" -+ return 1 -+ } -+ "Saved corefile .*\r\nKilling parent PID " { -+ pass "Spawned $detached gcore finished" -+ remote_wait target 20 -+ } -+ } -+ -+ if {1 == [llength [glob -nocomplain [join [list $corefile *] ""]]]} { -+ pass "Core file generated by $detached gcore" -+ } else { -+ fail "Core file generated by $detached gcore" -+ } -+ core_clean -+} -+ -+# First a general `gdb_gcore.sh' spawn with its controlling terminal available. -+ -+test_body standard -+ -+# And now `gdb_gcore.sh' spawn without its controlling terminal available. -+# It is spawned through `gcorebg.c' using setpgrp (). -+ -+test_body detached -+ -+ -+# Cleanup. -+ -+set env(PATH) $oldpath -+remote_file target delete "./gdb" diff --git a/gdb-6.6-testsuite-timeouts.patch b/gdb-6.6-testsuite-timeouts.patch deleted file mode 100644 index 9a31a5b..0000000 --- a/gdb-6.6-testsuite-timeouts.patch +++ /dev/null @@ -1,32 +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-testsuite-timeouts.patch - -;; Avoid too long timeouts on failing cases of "annota1.exp annota3.exp". -;;=fedoratest - -diff --git a/gdb/testsuite/gdb.base/annota1.exp b/gdb/testsuite/gdb.base/annota1.exp ---- a/gdb/testsuite/gdb.base/annota1.exp -+++ b/gdb/testsuite/gdb.base/annota1.exp -@@ -37,6 +37,8 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb - - clean_restart ${binfile} - -+gdb_test "set breakpoint pending off" "" "Avoid lockup on nonexisting functions" -+ - # The commands we test here produce many lines of output; disable "press - # to continue" prompts. - gdb_test_no_output "set height 0" -diff --git a/gdb/testsuite/gdb.base/annota3.exp b/gdb/testsuite/gdb.base/annota3.exp ---- a/gdb/testsuite/gdb.base/annota3.exp -+++ b/gdb/testsuite/gdb.base/annota3.exp -@@ -36,6 +36,8 @@ if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {deb - - clean_restart ${binfile} - -+gdb_test "set breakpoint pending off" "" "Avoid lockup on nonexisting functions" -+ - # The commands we test here produce many lines of output; disable "press - # to continue" prompts. - gdb_test_no_output "set height 0" diff --git a/gdb-6.7-ppc-clobbered-registers-O2-test.patch b/gdb-6.7-ppc-clobbered-registers-O2-test.patch deleted file mode 100644 index 08ee2f9..0000000 --- a/gdb-6.7-ppc-clobbered-registers-O2-test.patch +++ /dev/null @@ -1,108 +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.7-ppc-clobbered-registers-O2-test.patch - -;; Test PPC hiding of call-volatile parameter register. -;;=fedoratest - -2007-11-04 Jan Kratochvil - - * gdb.arch/ppc-clobbered-registers-O2.exp: `powerpc64' changed to - `powerpc*'. - -Testcase for: - -http://sourceware.org/ml/gdb-patches/2007-09/msg00228.html - -2007-10-21 Luis Machado - - * rs6000-tdep.c (ppc_dwarf2_frame_init_reg): New function. - * (rs6000_gdbarch_init): Install ppc_dwarf2_frame_init_reg as - default dwarf2_frame_set_init_reg function. - -diff --git a/gdb/testsuite/gdb.arch/ppc-clobbered-registers-O2.c b/gdb/testsuite/gdb.arch/ppc-clobbered-registers-O2.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/ppc-clobbered-registers-O2.c -@@ -0,0 +1,21 @@ -+ -+unsigned * __attribute__((noinline)) -+start_sequence (unsigned * x, unsigned * y) -+{ -+ return (unsigned *)0xdeadbeef; -+}; -+ -+unsigned __attribute__((noinline)) -+gen_movsd (unsigned * operand0, unsigned * operand1) -+{ -+ return *start_sequence(operand0, operand1); -+} -+ -+int main(void) -+{ -+ unsigned x, y; -+ -+ x = 13; -+ y = 14; -+ return (int)gen_movsd (&x, &y); -+} -diff --git a/gdb/testsuite/gdb.arch/ppc-clobbered-registers-O2.exp b/gdb/testsuite/gdb.arch/ppc-clobbered-registers-O2.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.arch/ppc-clobbered-registers-O2.exp -@@ -0,0 +1,54 @@ -+# 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. -+# -+# This file is part of the gdb testsuite. -+ -+# Test displaying call clobbered registers in optimized binaries for ppc. -+# GDB should not show incorrect values. -+ -+if ![istarget "powerpc*-*"] then { -+ verbose "Skipping powerpc* call clobbered registers testing." -+ return -+} -+ -+set testfile "ppc-clobbered-registers-O2" -+set srcfile ${testfile}.c -+set binfile [standard_output_file ${testfile}] -+set compile_flags "debug additional_flags=-O2" -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable ${compile_flags}] != "" } { -+ unsupported "Testcase compile failed." -+ return -1 -+} -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+gdb_load ${binfile} -+ -+if ![runto_main] then { -+ perror "Couldn't run to breakpoint" -+ continue -+} -+ -+gdb_test "b start_sequence" ".*Breakpoint 2 at.*line 6.*" \ -+ "Insert breakpoint at problematic function" -+ -+gdb_test continue ".*Breakpoint 2.*in start_sequence.*" \ -+ "Run until problematic function" -+ -+gdb_test backtrace ".*operand0=.*operand1=.*" \ -+ "Check value of call clobbered registers" diff --git a/gdb-add-rpm-suggestion-script.patch b/gdb-add-rpm-suggestion-script.patch new file mode 100644 index 0000000..1eccb30 --- /dev/null +++ b/gdb-add-rpm-suggestion-script.patch @@ -0,0 +1,1009 @@ +From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 +From: Andrew Burgess +Date: Thu, 7 Mar 2024 15:14:23 +0000 +Subject: gdb-add-rpm-suggestion-script.patch + +;; Not a backport. Add a new script which hooks into GDB and suggests +;; RPMs to install when GDB finds an objfile with no debug info. + +gdb: add script which will suggest debuginfo RPMs to install + +This script hooks into GDB's missing debug info Python API and +suggests debuginfo RPMs to install. + +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 +@@ -92,6 +92,7 @@ PYTHON_FILE_LIST = \ + gdb/command/missing_files.py \ + gdb/command/pretty_printers.py \ + gdb/command/prompt.py \ ++ gdb/command/rpm-suggestions.py \ + gdb/command/type_printers.py \ + gdb/command/unwinders.py \ + gdb/command/xmethods.py \ +diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo +--- a/gdb/doc/gdb.texinfo ++++ b/gdb/doc/gdb.texinfo +@@ -186,6 +186,7 @@ software in general. We will miss him. + * Trace File Format:: @value{GDBN} trace file format + * Index Section Format:: .gdb_index section format + * Debuginfod:: Download debugging resources with @code{debuginfod} ++* RPM Suggestions:: RPM Suggestions from GDB + * Man Pages:: Manual pages + * Copying:: GNU General Public License says + how you can copy and share @value{GDBN} +@@ -50588,6 +50589,111 @@ Show the current verbosity setting. + + @end table + ++@node RPM Suggestions ++@appendix Receiving RPM installation suggestions ++@cindex rpm suggestions ++ ++When @value{GDBN} loads an executable, or shared library, and cannot ++find the corresponding debug information, @value{GDBN} will check to ++see if an RPM is available which could provide the missing debug ++information. If a suitable RPM is found then @value{GDBN} will print ++a hint before the next prompt is displayed: ++ ++@smallexample ++(@value{GDBP}) file /bin/ls ++Reading symbols from /bin/ls... ++Reading symbols from .gnu_debugdata for /usr/bin/ls... ++(No debugging symbols found in .gnu_debugdata for /usr/bin/ls) ++Missing rpms, try: dnf --enablerepo='*debug*' install coreutils-debuginfo-9.3-7.fc39.x86_64 ++(@value{GDBP}) ++@end smallexample ++ ++In this case, installing @file{coreutils-debuginfo-9.3-7.fc39.x86_64} ++will provide the missing debug information for @file{/bin/ls}. It is ++up to you to install the suggested package, if possible, and after ++that reload the executable in @value{GDBN} so that the newly installed ++debug information can be found. ++ ++The RPM suggestion feature can be disabled: ++ ++@table @code ++@kindex set rpm-suggestion enabled ++@kindex show rpm-suggestion enabled ++@cindex rpm suggestions, disabling ++@item set rpm-suggestion enabled @r{[}on@r{|}off@r{]} ++@itemx show rpm-suggestion enabled ++When @samp{on} @value{GDBN} will make RPM suggestions where possible. ++When @samp{off} all RPM suggestion will be disabled. ++@end table ++ ++When opening a core file (@pxref{core-file command}), it may be the ++case that not only is the debug information missing, but the ++corresponding executable itself is missing. For example, if a core ++file is copied from one machine to another in order to debug. ++ ++In this case @value{GDBN} is able to suggest a command which will ++install the missing executable based on the build-id of the ++executable. For example: ++ ++@smallexample ++(@value{GDBP}) core-file /tmp/core.5489 ++warning: Can't open file /usr/bin/sl during file-backed mapping note processing ++[New LWP 5489] ++Core was generated by `sl'. ++Program terminated with signal SIGQUIT, Quit. ++#0 0x00007f1b41ced1a7 in ?? () ++Missing file(s), try: dnf --enablerepo='*debug*' install /usr/lib/.build-id/33/2f1a8e56693960e3beb2d70cd79ddfec451cc3 /usr/lib/debug/.build-id/33/2f1a8e56693960e3beb2d70cd79ddfec451cc3.debug ++(@value{GDBP}) ++@end smallexample ++ ++The core file was generated from the @file{/usr/bin/sl} binary, which ++is not present on the machine opening the core file. @value{GDBN} has ++suggested a command, based on the build-id of the binary, which was ++extracted from the core file, that would install both the missing ++binary, and the corresponding debug information. ++ ++Unfortunately, @value{GDBN} doesn't know if the suggested command will ++actually find a matching RPM or not. Querying the RPM database to see ++which packages, if any, will provide a file with the given build-id, ++is rather slow. As @file{/usr/bin/sl} is available in an RPM, then ++the above command will succeed. ++ ++It is possible to have @value{GDBN} check to see if there is a package ++available before making the suggestion, but this is significantly ++slower. To enable this mode use the following command: ++ ++@table @code ++@kindex set rpm-suggestion build-id-mode ++@kindex show rpm-suggestion build-id-mode ++@cindex rpm suggestions, build-id-mode ++@item set rpm-suggestion build-id-mode @r{[}fast@r{|}slow@r{]} ++@itemx show rpm-suggestion build-id-mode ++When set to @samp{fast}, which is the default, @value{GDBN} will offer ++suggestions based on the build-id of any missing executables or shared ++libraries while opening a core file. This is fast, but @value{GDBN} ++has not checked if there is a package available that can supply the ++required file, so running the suggested command might not install any ++packages. ++ ++When set to @samp{slow}, each time @value{GDBN} encounters an ++executable, or shared library, that is missing, @value{GDBN} will ++check to see if there is an RPM available that will supply the missing ++binary. If a suitable RPM is found then @value{GDBN} will offer a ++command which will install the missing RPM. If no suitable RPM is ++found then @value{GDBN} will make no suggestions. ++@end table ++ ++It is possible to review all of the previous RPM suggestions that ++@value{GDBN} has made using the following command: ++ ++@table @code ++@kindex info rpm-suggestions ++@cindex rpm suggestions, listing ++@item info rpm-suggestions ++List all of the RPM suggestions @value{GDBN} has made since the ++executable was last changed. ++@end table ++ + @node Man Pages + @appendix Manual pages + @cindex Man pages +diff --git a/gdb/python/lib/gdb/command/rpm-suggestions.py b/gdb/python/lib/gdb/command/rpm-suggestions.py +new file mode 100644 +--- /dev/null ++++ b/gdb/python/lib/gdb/command/rpm-suggestions.py +@@ -0,0 +1,525 @@ ++# Copyright 2023 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++import gdb ++import gdb.missing_debug ++import gdb.missing_objfile ++ ++# These modules are all system modules, and should be available on any ++# correctly setup Python install. ++import sys ++import os ++import subprocess ++import re ++from threading import Thread ++import time ++ ++try: ++ import rpm ++except ModuleNotFoundError: ++ # The "RPM suggestions" mechanism will not work without the (python) ++ # rpm module. Inform the user of this, but wait to do so until ++ # just prior to printing the GDB prompt. If we do it right away, ++ # the message typically appears before the version and copyright ++ # info, which is easily missed by many users. Additionally, it ++ # seems that several other packages which parse GDB version info ++ # are confused by an early error message regarding a missing ++ # python3-rpm package, so waiting to print the error allows those ++ # applications to work as they used to. ++ def before_prompt(): ++ print( ++ ("\nUnable to load the Python 'rpm' module. Lack of this module disables\n" ++ "the RPM suggestions mechanism which recommends shell commands for\n" ++ "installing missing debuginfo packages. To enable this functionality,\n" ++ "please install the python3-rpm package."), ++ file=sys.stderr ++ ) ++ gdb.events.before_prompt.disconnect(before_prompt) ++ ++ gdb.events.before_prompt.connect(before_prompt) ++ ++ # Implement 'info rpm-suggestions' when the 'rpm' module is not ++ # available. Just throws an error. ++ def info_rpm_suggestions(): ++ raise gdb.GdbError("rpm-suggestions are disabled as the Python 'rpm' module is not installed") ++else: ++ # Track all the RPMs suggested during a single debug session so we ++ # don't suggest the same RPM twice. This is only cleared when the ++ # main executable is changed. ++ __missing_rpms = {} ++ ++ # Track any missing RPMs that have been discovered since the last time ++ # the prompt was displayed. RPMs in here are also present in the ++ # __MISSING_RPMS dictionary, but this dictionary is cleared each time ++ # the prompt is shown. ++ __suggest_rpms = {} ++ ++ # Track all the build-ids suggested during a single debug session so we ++ # don't suggest installing using the same build-id twice. This is only ++ # cleared when the main executable is changed. ++ __missing_build_ids = {} ++ ++ # Track any build-ids that have been discovered missing since the last ++ # time the prompt was displayed. Build-ids in here are also present in ++ # the __MISSING_BUILD_IDS dictionary, but this dictionary is cleared ++ # each time the prompt is shown. ++ __suggest_build_ids = {} ++ ++ # The build-id to RPM lookup is very slow. This cache maps ++ # build-ids to the set of RPM we can suggest installing. The key ++ # is the build-id string, and the value is a list of RPM names, or ++ # None if there was an error with the build-id to RPM lookup. ++ # ++ # This cache is never cleared, even when the executable is ++ # changed. The build-ids should be unique, so a build-id lookup ++ # should be good for the lifetime of the session. ++ __build_id_lookup_cache = {} ++ ++ # When searching for an RPM given a build-id, if the search takes ++ # too long, then a message is printed to the user. We only print ++ # the message once between each GDB prompt. This flag is set True ++ # when the message is printed, and reset to False when a prompt is ++ # displayed. ++ __searching_message_printed = False ++ ++ # Add a suggestion to install RPM_NAME (the full name of an RPM) ++ # to the list of suggestions to make the next time a prompt is ++ # displayed. ++ def add_rpm_suggestion(rpm_name): ++ global __missing_rpms ++ global __suggest_rpms ++ ++ if not rpm_name in __missing_rpms: ++ __suggest_rpms[rpm_name] = True ++ __missing_rpms[rpm_name] = True ++ ++ # Return True if RPM_NAME is installed, where RPM_NAME is the full ++ # name of an RPM. ++ def is_rpm_installed(ts, rpm_name): ++ res = ts.dbMatch(rpm.RPMDBI_LABEL, rpm_name) ++ return len(res) > 0 ++ ++ # Add a suggestion to install RPMs based on BUILD_ID, a string ++ # containing a build-id, to the list of suggestions to make the next ++ # time a prompt is displayed. ++ def add_build_id_suggestion(build_id): ++ global __missing_build_ids ++ global __suggest_build_ids ++ ++ if not build_id in __missing_build_ids: ++ __suggest_build_ids[build_id] = True ++ __missing_build_ids[build_id] = True ++ ++ # Return true if '/usr/lib' is in the debug-file-directory list. ++ # System packages install their debug information into /usr/lib, ++ # so if GDB isn't looking in that directory, then there's no ++ # reason to try and figure out a suitable RPM to install. ++ def using_suitable_debug_file_directory(): ++ debug_file_directories = gdb.parameter("debug-file-directory") ++ for d in debug_file_directories.split(os.pathsep): ++ if d[:8] == "/usr/lib": ++ return True ++ return False ++ ++ # Return True if rpm-suggestion is disabled for any reason. ++ def rpm_suggestion_is_disabled(): ++ # If /usr/lib/ is not being used to find debug information ++ # then there's no point offering any RPMs as GDB would not ++ # find the newly installed content. ++ if not using_suitable_debug_file_directory(): ++ return True ++ ++ # Is 'rpm-suggestion enabled' set to 'off'? ++ if not param_rpm_suggestion_enabled.value: ++ return True ++ ++ return False ++ ++ ++ # Lookup RPMs that might provide the debug information for FILENAME, ++ # which is a string containing the path to an object file GDB could ++ # not find any debug information for. ++ # ++ # If a possible RPM is found then this is added to the globals ++ # __MISSING_RPMS and __SUGGEST_RPMS, which are used elsewhere in this ++ # script. ++ def find_debug_suggestions(filename): ++ if rpm_suggestion_is_disabled(): ++ return ++ ++ ts = rpm.TransactionSet() ++ mi = ts.dbMatch(rpm.RPMDBI_BASENAMES, filename) ++ for h in mi: ++ # Build the debuginfo package name. ++ obj = h.format("%{name}-debuginfo-%{version}-%{release}.%{arch}") ++ rpm_name = str(obj) ++ ++ # Check to see if the package is installed. ++ if is_rpm_installed(ts, rpm_name): ++ continue ++ ++ add_rpm_suggestion(rpm_name) ++ ++ ++ # Return a string which is the filename of the filename ++ # corresponding to BUILD_ID in one of the two locations under ++ # /usr/lib. ++ # ++ # When DEBUG_P is True, return a filename within: ++ # /usr/lib/debug/.build-id/ and when DEBUG_P is False, return a ++ # filename within: /usr/lib/.build-id/. ++ # ++ # The SUFFIX string is appended to the generated filename. ++ def build_id_to_usr_lib_filename(build_id, debug_p, suffix = ""): ++ key = build_id[:2] ++ rst = build_id[2:] ++ ++ filename = '/usr/lib' ++ if debug_p: ++ filename += '/debug' ++ filename += '/.build-id/' + key + '/' + rst + suffix ++ ++ return filename ++ ++ # A regexp object used to match against the output of `dnf`. This ++ # is initialised the first time it is needed. ++ find_objfile_suggestions_re = None ++ ++ # Given BUILD_ID, a string containing a build-id, run a `dnf` ++ # command to figure out if any RPMs can provide a file with that ++ # build-id. ++ # ++ # If any suitable RPMs are found then `add_rpm_suggestion` is called ++ # to register the suggestion. ++ # ++ # This function is pretty slow, which is a shame, as the results ++ # returned are much nicer than just telling the user to try the ++ # lookup command for themselves. ++ def find_objfile_suggestions_in_thread(build_id): ++ global find_objfile_suggestions_re ++ ++ if find_objfile_suggestions_re is None: ++ find_objfile_suggestions_re = re.compile("^(.*)-debuginfo-(.*) : Debug information for package (.*)$") ++ ++ result = subprocess.run(['dnf', "--enablerepo=*debug*", '--nogpgcheck', '-C', 'provides', ++ build_id_to_usr_lib_filename(build_id, True)], ++ capture_output=True, timeout=30) ++ ++ lines = result.stdout.decode('utf-8').splitlines() ++ ts = rpm.TransactionSet() ++ ++ for l in lines: ++ m = find_objfile_suggestions_re.match(l) ++ if not m: ++ continue ++ if m.group(1) != m.group(3): ++ return ++ ++ main_rpm = m.group(1) + '-' + m.group(2) ++ dbg_rpm = m.group(1) + '-debuginfo-' + m.group(2) ++ ++ if not is_rpm_installed(ts, main_rpm): ++ add_rpm_suggestion(main_rpm) ++ ++ if not is_rpm_installed(ts, dbg_rpm): ++ add_rpm_suggestion(dbg_rpm) ++ ++ return ++ ++ # Call `find_objfile_suggestions_in_thread` is a separate thread, ++ # then wait for the thread to complete. Don't touch any shared ++ # state while waiting for the thread to complete. There's no ++ # locking on any of our caches, and the worker thread will add RPM ++ # suggestions as it wants. ++ # ++ # If thre thread takes too long to complete then print a message ++ # to the user telling them what's going on. ++ def find_objfile_suggestions_slow_core(build_id): ++ global __searching_message_printed ++ ++ thread = Thread(target = find_objfile_suggestions_in_thread, args = (build_id, )) ++ thread.start() ++ start = time.time_ns() ++ ++ while thread.is_alive (): ++ time.sleep(0.05) ++ now = time.time_ns () ++ if not __searching_message_printed and (now - start > 1000000000): ++ print("Searching for packages to install that could improve debugging...") ++ __searching_message_printed = True ++ ++ thread.join() ++ ++ ++ # Given BUILD_ID, a string containing a build-id, lookup suitable ++ # RPMs that could be installed to provide a file with the required ++ # build-id. ++ # ++ # Any suitable RPMs are recorded by calling `add_rpm_suggestion`, and ++ # will be printed before the next prompt. ++ def find_objfile_suggestions_slow(build_id): ++ global __build_id_lookup_cache ++ global __suggest_rpms ++ ++ # The code to lookup an RPM given only a build-id is pretty ++ # slow. Cache the results to try and reduce the UI delays. ++ if build_id in __build_id_lookup_cache: ++ rpms = __build_id_lookup_cache[build_id] ++ if rpms is not None: ++ for r in rpms: ++ add_rpm_suggestion(r) ++ return ++ ++ # Make sure the cache entry exists before we do the lookup. ++ # If, for any reason, the lookup raises an exception, then ++ # having a cache entry will prevent us retrying this lookup in ++ # the future. ++ __build_id_lookup_cache[build_id] = None ++ ++ # Now do the lookup. This is the slow part. ++ find_objfile_suggestions_slow_core(build_id) ++ ++ # Fill in the cache, for a given build-id which RPMs were ++ # suggested. ++ rpms = [] ++ for r in __suggest_rpms: ++ rpms.append(r) ++ __build_id_lookup_cache[build_id] = rpms ++ ++ ++ # Given BUILD_ID, a string containing a build-id, just record that we ++ # should advise the user to try installing RPMs based on this build-id. ++ def find_objfile_suggestions_fast(build_id): ++ add_build_id_suggestion(build_id) ++ ++ # Given BUILD_ID, a string containing a build-id, which GDB has failed ++ # to find, possibly record some information so that we can, at the next ++ # prompt, give some RPM installation advice to the user. ++ # ++ # We have two different strategies for RPM lookup based on a build-id, ++ # one approach is that we actually lookup the RPMs and only suggest ++ # something if there is a suitable RPM. However, this is pretty slow, ++ # and users will probably find this annoying. ++ # ++ # So we also have a fast way. With this approach we just record the ++ # build-id that was missing and tell the user to try installing based on ++ # the build-id. The downside with this is that if there is no RPM for ++ # that build-id, then the user will try the command, but nothing will ++ # install. ++ def find_objfile_suggestions(build_id): ++ if rpm_suggestion_is_disabled(): ++ return ++ ++ if param_rpm_suggestion_build_id_mode.fast_mode(): ++ find_objfile_suggestions_fast(build_id) ++ else: ++ find_objfile_suggestions_slow(build_id) ++ ++ # A missing debug handler class. Just forwards the name of the ++ # objfile for which we are missing debug information to ++ # find_debug_suggestions. ++ class RPM_MissingDebugHandler(gdb.missing_debug.MissingDebugHandler): ++ def __init__(self): ++ super().__init__("rpm-suggestions") ++ ++ def __call__(self, objfile): ++ find_debug_suggestions(objfile.filename) ++ return False ++ ++ # A missing objfile handler class. Just forwards the build-id of ++ # the objfile that is missing to find_objfile_suggestions. ++ class RPM_MissingObjfileHandler(gdb.missing_objfile.MissingObjfileHandler): ++ def __init__(self): ++ super().__init__("rpm-suggestions") ++ ++ def __call__(self, pspace, build_id, filename): ++ find_objfile_suggestions(build_id) ++ return False ++ ++ # Take a non-empty list of RPM names and print a command line a ++ # user could run to install these RPMs. ++ def print_rpm_suggestions(rpm_name_list): ++ print("Missing rpms, try: dnf --enablerepo='*debug*' install " + ' '.join(rpm_name_list)) ++ ++ # Take a non-empty list of build-id strings and print a series of ++ # lines that a user could run to instll the RPMs that provide ++ # files with this build-id. ++ # ++ # The printed commands will also install the corresponding debug ++ # packages for the executable with the given build-id. ++ def print_build_id_suggestions(build_id_list): ++ for build_id in build_id_list: ++ print("Missing file(s), try: dnf --enablerepo='*debug*' install " ++ + build_id_to_usr_lib_filename(build_id, False) ++ + ' ' ++ + build_id_to_usr_lib_filename(build_id, True, ".debug")) ++ ++ # Called before GDB displays its prompt. If the global __SUGGEST_RPMS ++ # dictionary is not empty, then this hook prints the keys of this ++ # dictionary as strings which are the names of RPMs. This hook formats ++ # each RPM name into a suggested 'dnf install' command and suggests this ++ # to the user. ++ # ++ # Additionally, if the global __SUGGEST_BUILD_IDS dictionary is not ++ # empty, then this hook uses the keys of this dictionary as build-ids ++ # that were found to be missing, and formats these into some file based ++ # 'dnf install' suggestions to the user. ++ def before_prompt(): ++ global __suggest_rpms ++ global __suggest_build_ids ++ global __searching_message_printed ++ ++ # We allow the searching message to be printed just once ++ # between prompts. ++ __searching_message_printed = False ++ ++ if len(__suggest_rpms) > 0: ++ print_rpm_suggestions(__suggest_rpms.keys()) ++ __suggest_rpms = {} ++ ++ if len(__suggest_build_ids) > 0: ++ print_build_id_suggestions(__suggest_build_ids.keys()) ++ __suggest_build_ids = {} ++ ++ # Called when the executable within a progrm space is changed. Clear ++ # the lists of RPM suggestions. We only clear the previous suggestion ++ # list when the executable really changes. If the user simply ++ # recompiles the executable, then we don't both clearing this list. ++ def executable_changed_handler(event): ++ global __missing_rpms ++ global __suggest_rpms ++ global __suggest_build_ids ++ global __missing_build_ids ++ ++ if not event.reload: ++ __missing_rpms = {} ++ __suggest_rpms = {} ++ __missing_build_ids = {} ++ __suggest_build_ids = {} ++ ++ ++ # Attach to the required GDB events. ++ gdb.events.executable_changed.connect(executable_changed_handler) ++ gdb.events.before_prompt.connect(before_prompt) ++ ++ # Register the missing debug and missing objfile handlers with GDB. ++ gdb.missing_debug.register_handler(None, RPM_MissingDebugHandler()) ++ gdb.missing_objfile.register_handler(None, RPM_MissingObjfileHandler()) ++ ++ # Implement the core of 'info rpm-suggestions'. Reprint all rpm ++ # suggestions. ++ def info_rpm_suggestions(): ++ global __missing_rpms ++ global __missing_build_ids ++ ++ if len(__missing_rpms) == 0 and len(__missing_build_ids) == 0: ++ print("No RPM suggestions have been made so far.") ++ return ++ ++ if len(__missing_rpms) > 0: ++ print_rpm_suggestions(__missing_rpms.keys()) ++ if len(__missing_build_ids) > 0: ++ print_build_id_suggestions(__missing_build_ids.keys()) ++ ++#################################################################### ++# The following code is outside the 'else' block of the attempt to # ++# load the 'rpm' module. Nothing after this point depends on the # ++# 'rpm' module. # ++#################################################################### ++ ++# The 'set rpm-suggestion' prefix command. ++class rpm_suggestion_set_prefix(gdb.Command): ++ """Prefix command for 'set' rpm-suggestion related commands.""" ++ ++ def __init__(self): ++ super().__init__("set rpm-suggestion", gdb.COMMAND_NONE, ++ gdb.COMPLETE_NONE, True) ++ ++# The 'show rpm-suggestion' prefix command. ++class rpm_suggestion_show_prefix(gdb.Command): ++ """Prefix command for 'show' rpm-suggestion related commands.""" ++ ++ def __init__(self): ++ super().__init__("show rpm-suggestion", gdb.COMMAND_NONE, ++ gdb.COMPLETE_NONE, True) ++ ++# The 'set/show rpm-suggestion enabled' command. ++class rpm_suggestion_enabled(gdb.Parameter): ++ """ ++ When 'on' GDB will search for RPMS that might provide additional ++ debug information, or provide missing executables or shared ++ libraries (when opening a core file), and will make suggestions ++ about what should be installed. ++ ++ When 'off' GDB will not make these suggestions. ++ """ ++ ++ set_doc = "Set whether to perform rpm-suggestion." ++ show_doc = "Show whether rpm-suggestion is enabled." ++ ++ def __init__(self): ++ super().__init__("rpm-suggestion enabled", gdb.COMMAND_NONE, gdb.PARAM_BOOLEAN) ++ self.value = True ++ ++# The 'set/show rpm-suggestion enabled' command. ++class rpm_suggestion_build_id_mode(gdb.Parameter): ++ """ ++ When set to 'fast' (the default), GDB doesn't try to map a build-id to ++ an actual RPM, instead, GDB just suggests a command based on the ++ build-id which might install some RPMs, if there are any RPMs that ++ supply that build-id. However, it is equally possible that there are no ++ suitable RPMs, and nothing will install. This approach has almost zero ++ overhead. ++ ++ When set to 'slow', GDB first does the build-id to RPM check itself, and ++ only if something is found are RPMs installation commands suggested. ++ The suggested command will include the name of the RPM to install. This ++ approach is considerably slower as querying the RPM database for the RPM ++ that supplies a specific file is slow. ++ """ ++ ++ set_doc = "Set how build-id based rpm suggestions should be performed." ++ show_doc = "Show how build-id based rpm suggestions shoud be performed." ++ ++ def __init__(self): ++ super().__init__("rpm-suggestion build-id-mode", ++ gdb.COMMAND_NONE, gdb.PARAM_ENUM, ["fast", "slow"]) ++ self.value = "fast" ++ ++ def fast_mode(self): ++ return self.value == "fast" ++ ++# The 'info rpm-suggestions' command. ++class rpm_suggestion_info(gdb.Command): ++ """Relist any RPM installation suggestions that have been made ++ since the executable was last changed.""" ++ def __init__(self): ++ super().__init__("info rpm-suggestions", gdb.COMMAND_NONE, gdb.COMPLETE_NONE) ++ ++ def invoke(self, args, from_tty): ++ if args != "": ++ raise gdb.GdbError("unexpected arguments: %s" % args) ++ ++ info_rpm_suggestions () ++ ++ ++# Create the 'set/show rpm-suggestion' commands. ++rpm_suggestion_set_prefix() ++rpm_suggestion_show_prefix() ++param_rpm_suggestion_enabled = rpm_suggestion_enabled() ++param_rpm_suggestion_build_id_mode = rpm_suggestion_build_id_mode() ++ ++# Create the 'info rpm-suggestions' commands. ++rpm_suggestion_info() +diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-lib.c +@@ -0,0 +1,21 @@ ++/* Copyright 2010 Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++void ++lib (void) ++{ ++} +diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib-main.c +@@ -0,0 +1,25 @@ ++/* Copyright 2010 Free Software Foundation, Inc. ++ ++ This file is part of GDB. ++ ++ This program is free software; you can redistribute it and/or modify ++ it under the terms of the GNU General Public License as published by ++ the Free Software Foundation; either version 3 of the License, or ++ (at your option) any later version. ++ ++ This program is distributed in the hope that it will be useful, ++ but WITHOUT ANY WARRANTY; without even the implied warranty of ++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++ GNU General Public License for more details. ++ ++ You should have received a copy of the GNU General Public License ++ along with this program. If not, see . */ ++ ++extern void lib (void); ++ ++int ++main (void) ++{ ++ lib (); ++ return 0; ++} +diff --git a/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp +new file mode 100644 +--- /dev/null ++++ b/gdb/testsuite/gdb.base/gcore-buildid-exec-but-not-solib.exp +@@ -0,0 +1,104 @@ ++# Copyright 2016 Free Software Foundation, Inc. ++ ++# This program is free software; you can redistribute it and/or modify ++# it under the terms of the GNU General Public License as published by ++# the Free Software Foundation; either version 3 of the License, or ++# (at your option) any later version. ++# ++# This program is distributed in the hope that it will be useful, ++# but WITHOUT ANY WARRANTY; without even the implied warranty of ++# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ++# GNU General Public License for more details. ++# ++# You should have received a copy of the GNU General Public License ++# along with this program. If not, see . ++ ++require allow_shlib_tests ++ ++set testfile "gcore-buildid-exec-but-not-solib" ++set srcmainfile ${testfile}-main.c ++set srclibfile ${testfile}-lib.c ++set libfile [standard_output_file ${testfile}-lib.so] ++set objfile [standard_output_file ${testfile}-main.o] ++set executable ${testfile}-main ++set binfile [standard_output_file ${executable}] ++set gcorefile [standard_output_file ${executable}.gcore] ++set outdir [file dirname $binfile] ++ ++if { [gdb_compile_shlib ${srcdir}/${subdir}/${srclibfile} ${libfile} "debug additional_flags=-Wl,--build-id"] != "" ++ || [gdb_compile ${srcdir}/${subdir}/${srcmainfile} ${objfile} object {debug}] != "" } { ++ unsupported "-Wl,--build-id compilation failed" ++ return -1 ++} ++set opts [list debug shlib=${libfile} "additional_flags=-Wl,--build-id"] ++if { [gdb_compile ${objfile} ${binfile} executable $opts] != "" } { ++ unsupported "-Wl,--build-id compilation failed" ++ return -1 ++} ++ ++clean_restart $executable ++gdb_load_shlib $libfile ++ ++# Does this gdb support gcore? ++set test "help gcore" ++gdb_test_multiple $test $test { ++ -re "Undefined command: .gcore.*\r\n$gdb_prompt $" { ++ # gcore command not supported -- nothing to test here. ++ unsupported "gdb does not support gcore on this target" ++ return -1; ++ } ++ -re "Save a core file .*\r\n$gdb_prompt $" { ++ pass $test ++ } ++} ++ ++if { ![runto lib] } then { ++ return -1 ++} ++ ++set escapedfilename [string_to_regexp ${gcorefile}] ++ ++set test "save a corefile" ++gdb_test_multiple "gcore ${gcorefile}" $test { ++ -re "Saved corefile ${escapedfilename}\r\n$gdb_prompt $" { ++ pass $test ++ } ++ -re "Can't create a corefile\r\n$gdb_prompt $" { ++ unsupported $test ++ return -1 ++ } ++} ++ ++# Now restart gdb and load the corefile. ++ ++clean_restart $executable ++gdb_load_shlib $libfile ++ ++set buildid [build_id_debug_filename_get $libfile] ++ ++regsub {\.debug$} $buildid {} buildid ++ ++set debugdir [standard_output_file ${testfile}-debugdir] ++file delete -force -- $debugdir ++ ++file mkdir $debugdir/[file dirname $libfile] ++file copy $libfile $debugdir/${libfile} ++ ++file mkdir $debugdir/[file dirname $buildid] ++file copy $libfile $debugdir/${buildid} ++ ++remote_exec build "ln -s /lib ${debugdir}/" ++remote_exec build "ln -s /lib64 ${debugdir}/" ++# /usr is not needed, all the libs are in /lib64: libm.so.6 libc.so.6 ld-linux-x86-64.so.2 ++ ++gdb_test_no_output "set solib-absolute-prefix $debugdir" \ ++ "set solib-absolute-prefix" ++ ++gdb_test_no_output "set debug-file-directory $debugdir" "set debug-file-directory" ++ ++gdb_test "core ${gcorefile}" "Core was generated by .*" "re-load generated corefile" ++ ++gdb_test "frame" "#0 \[^\r\n\]* lib .*" "library got loaded" ++ ++gdb_test "bt" ++gdb_test "info shared" +diff --git a/gdb/testsuite/gdb.base/gdbinit-history.exp b/gdb/testsuite/gdb.base/gdbinit-history.exp +--- a/gdb/testsuite/gdb.base/gdbinit-history.exp ++++ b/gdb/testsuite/gdb.base/gdbinit-history.exp +@@ -179,7 +179,8 @@ proc test_empty_history_filename { } { + global env + global gdb_prompt + +- set common_history [list "set height 0" "set width 0"] ++ set common_history [list "set height 0" "set width 0" \ ++ "set rpm-suggestion enabled off"] + + set test_dir [standard_output_file history_test] + remote_exec host "mkdir -p $test_dir" +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 ++++ b/gdb/testsuite/gdb.base/rhbz981154-misleading-yum-install-warning.exp +@@ -0,0 +1,60 @@ ++# 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 . ++ ++# Create a core file, then hide the executable. Restart GDB and load ++# the core file. Check GDB gives a message suggesting a 'dnf' command ++# to try and install the executable based on its build-id. ++ ++standard_testfile "normal.c" ++ ++if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { ++ return -1 ++} ++ ++# Get the build-id of the file. ++set build_id_debug_file [build_id_debug_filename_get $binfile] ++regsub -all ".debug$" $build_id_debug_file "" build_id_without_debug ++ ++# Run to main. ++if { ![runto_main] } { ++ return -1 ++} ++ ++# We first need to generate a corefile. ++set corefilename "[standard_output_file gcore.test]" ++if { ![gdb_gcore_cmd "$corefilename" "save corefile"] } { ++ untested "could not generate a corefile" ++ return -1 ++} ++ ++# Move the binfile to a temporary name. ++remote_exec build "mv $binfile ${binfile}.old" ++ ++# Reinitialize GDB and see if we get a dnf suggestion. ++clean_restart ++ ++gdb_test "set rpm-suggestion enabled on" "" \ ++ "turn on rpm-suggestion feature" ++ ++# GDB only makes build-id based RPM suggestions if /usr/lib is in ++# the debug-file-directory list, the reason being that system RPMs ++# will always install under this location. If GDB is not looking ++# here then there's no point making suggestions. ++gdb_test "set debug-file-directory /usr/lib/" "" \ ++ "set debug-file-directory" ++ ++gdb_test "core-file [standard_output_file gcore.test]" \ ++ "Missing file\\(s\\), try: dnf --enablerepo='\\*debug\\*' install [string_to_regexp /usr/lib/$build_id_without_debug] [string_to_regexp /usr/lib/debug/$build_id_debug_file]" \ ++ "test first yum/dnf warning" +diff --git a/gdb/testsuite/gdb.python/py-missing-debug.py b/gdb/testsuite/gdb.python/py-missing-debug.py +--- a/gdb/testsuite/gdb.python/py-missing-debug.py ++++ b/gdb/testsuite/gdb.python/py-missing-debug.py +@@ -19,6 +19,13 @@ from enum import Enum + import gdb + from gdb.missing_debug import MissingDebugHandler + ++# This is a RHEL/Fedora work around: There's already a ++# missing-debug-info handler registered for these versions of GDB. ++# Discard the handler now so that the tests will pass (the tests ++# assume no handler is currently registered). ++gdb.missing_debug_handlers = [] ++ ++ + # A global log that is filled in by instances of the LOG_HANDLER class + # when they are called. + handler_call_log = [] +@@ -118,4 +125,7 @@ def register(name, locus=None): + rhandler = exception_handler() + handler_obj = handler() + ++# Discard the rpm-suggestion handler. ++gdb.missing_file_handlers = [] ++ + print("Success") +diff --git a/gdb/testsuite/gdb.python/py-missing-objfile.py b/gdb/testsuite/gdb.python/py-missing-objfile.py +--- a/gdb/testsuite/gdb.python/py-missing-objfile.py ++++ b/gdb/testsuite/gdb.python/py-missing-objfile.py +@@ -164,4 +164,7 @@ def register(name, locus=None): + rhandler = exception_handler() + handler_obj = handler() + ++# Discard the rpm-suggestion handler. ++gdb.missing_file_handlers = [] ++ + print("Success") +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 +@@ -255,7 +255,8 @@ if ![info exists INTERNAL_GDBFLAGS] { + "-nx" \ + "-q" \ + {-iex "set height 0"} \ +- {-iex "set width 0"}]] ++ {-iex "set width 0"} \ ++ {-iex "set rpm-suggestion enabled off"}]] + + # If DEBUGINFOD_URLS is set, gdb will try to download sources and + # debug info for f.i. system libraries. Prevent this. +@@ -2610,6 +2611,18 @@ proc default_gdb_start { } { + } + } + ++ # Turn off the missing debug info messages as the testsuite does ++ # not expect them. ++ send_gdb "set rpm-suggestion enabled off\n" ++ gdb_expect 10 { ++ -re "$gdb_prompt $" { ++ verbose "Disabled the missing debug info messages." 2 ++ } ++ timeout { ++ warning "Could not disable the missing debug info messages." ++ } ++ } ++ + gdb_debug_init + return 0 + } +diff --git a/gdb/testsuite/lib/mi-support.exp b/gdb/testsuite/lib/mi-support.exp +--- a/gdb/testsuite/lib/mi-support.exp ++++ b/gdb/testsuite/lib/mi-support.exp +@@ -321,6 +321,17 @@ proc default_mi_gdb_start { { flags {} } } { + warning "Couldn't set the width to 0." + } + } ++ # Turn off the missing debug info messages as the testsuite does ++ # not expect them. ++ send_gdb "190-gdb-set rpm-suggestion enabled off\n" ++ gdb_expect 10 { ++ -re ".*190-gdb-set rpm-suggestion enabled off\r\n190\\\^done\r\n$mi_gdb_prompt$" { ++ verbose "Disabled the missing debug info messages." 2 ++ } ++ timeout { ++ warning "Could not disable the missing debug info messages." ++ } ++ } + + if { $separate_inferior_pty } { + mi_create_inferior_pty diff --git a/gdb-archer-next-over-throw-cxx-exec.patch b/gdb-archer-next-over-throw-cxx-exec.patch index ba71cd3..c5d58b3 100644 --- a/gdb-archer-next-over-throw-cxx-exec.patch +++ b/gdb-archer-next-over-throw-cxx-exec.patch @@ -59,7 +59,7 @@ new file mode 100644 +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + -+if { [skip_cplus_tests] } { continue } ++require allow_cplus_tests + +set testfile cxxexec +if { [prepare_for_testing ${testfile}.exp ${testfile} ${testfile}.cc {c++ debug}] } { diff --git a/gdb-bz634108-solib_address.patch b/gdb-bz634108-solib_address.patch deleted file mode 100644 index 58b473f..0000000 --- a/gdb-bz634108-solib_address.patch +++ /dev/null @@ -1,41 +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-bz634108-solib_address.patch - -;; Verify GDB Python built-in function gdb.solib_address exists (BZ # 634108). -;;=fedoratest - -Fix gdb.solib_address (fix by Phil Muldoon). - -s/solib_address/solib_name/ during upstreaming. - -diff --git a/gdb/testsuite/gdb.python/rh634108-solib_address.exp b/gdb/testsuite/gdb.python/rh634108-solib_address.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.python/rh634108-solib_address.exp -@@ -0,0 +1,24 @@ -+# Copyright (C) 2008, 2009, 2010 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# https://bugzilla.redhat.com/show_bug.cgi?id=634108 -+ -+gdb_exit -+gdb_start -+ -+# Skip all tests if Python scripting is not enabled. -+if { [skip_python_tests] } { continue } -+ -+gdb_test "python print (gdb.solib_name(-1))" "None" "gdb.solib_name exists" diff --git a/gdb-container-rh-pkg.patch b/gdb-container-rh-pkg.patch deleted file mode 100644 index 7107e5d..0000000 --- a/gdb-container-rh-pkg.patch +++ /dev/null @@ -1,30 +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-container-rh-pkg.patch - -;; Add messages suggesting more recent RHEL gdbserver (RH BZ 1321114). -;;=fedora - -diff --git a/gdb/remote.c b/gdb/remote.c ---- a/gdb/remote.c -+++ b/gdb/remote.c -@@ -14742,7 +14742,17 @@ remote_target::pid_to_exec_file (int pid) - char *annex = NULL; - - if (m_features.packet_support (PACKET_qXfer_exec_file) != PACKET_ENABLE) -- return NULL; -+ { -+ warning (_("Remote gdbserver does not support determining executable " -+ "automatically.\n" -+"RHEL <=6.8 and <=7.2 versions of gdbserver do not support such automatic executable detection.\n" -+"The following versions of gdbserver support it:\n" -+"- Upstream version of gdbserver (unsupported) 7.10 or later\n" -+"- Red Hat Developer Toolset (DTS) version of gdbserver from DTS 4.0 or later (only on x86_64)\n" -+"- RHEL-7.3 versions of gdbserver (on any architecture)" -+)); -+ return NULL; -+ } - - inferior *inf = find_inferior_pid (this, pid); - if (inf == NULL) diff --git a/gdb-core-open-vdso-warning.patch b/gdb-core-open-vdso-warning.patch deleted file mode 100644 index fdd06fb..0000000 --- a/gdb-core-open-vdso-warning.patch +++ /dev/null @@ -1,58 +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-core-open-vdso-warning.patch - -;; Fix GNU/Linux core open: Can't read pathname for load map: Input/output error. -;; Fix regression of undisplayed missing shared libraries caused by a fix for. -;;=fedoratest: It should be in glibc: libc-alpha: <20091004161706.GA27450@.*> - -http://sourceware.org/ml/gdb-patches/2009-10/msg00142.html -Subject: [patch] Fix GNU/Linux core open: Can't read pathname for load map: Input/output error. - -[ New patch variant. ] - -commit 7d760051ffb8a23cdc51342d4e6243fbc462f73f -Author: Ulrich Weigand -Date: Wed Sep 25 11:52:50 2013 +0000 - -diff --git a/gdb/testsuite/gdb.base/solib-symbol.exp b/gdb/testsuite/gdb.base/solib-symbol.exp ---- a/gdb/testsuite/gdb.base/solib-symbol.exp -+++ b/gdb/testsuite/gdb.base/solib-symbol.exp -@@ -27,6 +27,7 @@ set testfile "solib-symbol-main" - set srcfile ${srcdir}/${subdir}/${testfile}.c - set binfile [standard_output_file ${testfile}] - set bin_flags [list debug shlib=${binfile_lib}] -+set executable ${testfile} - - if { [gdb_compile_shlib ${srcfile_lib} ${binfile_lib} $lib_flags] != "" - || [gdb_compile ${srcfile} ${binfile} executable $bin_flags] != "" } { -@@ -61,4 +62,28 @@ gdb_test "br foo2" \ - "Breakpoint.*: foo2. .2 locations..*" \ - "foo2 in mdlib" - -+# Test GDB warns for shared libraris which have not been found. -+ -+gdb_test "info sharedlibrary" "/${libname}.*" -+ -+clean_restart ${executable} -+gdb_breakpoint "main" -+gdb_run_cmd -+set test "no warning for missing libraries" -+gdb_test_multiple "" $test { -+ -re "warning: Could not load shared library symbols for \[0-9\]+ libraries,.*\r\n$gdb_prompt $" { -+ fail $test -+ } -+ -re "Breakpoint \[0-9\]+, main .*\r\n$gdb_prompt $" { -+ pass $test -+ } -+} -+ -+clean_restart ${executable} -+gdb_test_no_output "set solib-absolute-prefix /doESnotEXIST" -+gdb_breakpoint "main" -+gdb_run_cmd -+gdb_test "" "warning: Could not load shared library symbols for \[0-9\]+ libraries,.*\r\nBreakpoint \[0-9\]+, main .*" \ -+ "warning for missing libraries" -+ - gdb_exit diff --git a/gdb-fedora-libncursesw.patch b/gdb-fedora-libncursesw.patch deleted file mode 100644 index 1bb640d..0000000 --- a/gdb-fedora-libncursesw.patch +++ /dev/null @@ -1,333 +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-fedora-libncursesw.patch - -;; Force libncursesw over libncurses to match the includes (RH BZ 1270534). -;;=push+jan - -Fedora: Force libncursesw over libncurses to match the includes. -https://bugzilla.redhat.com/show_bug.cgi?id=1270534 - -diff --git a/gdb/configure b/gdb/configure ---- a/gdb/configure -+++ b/gdb/configure -@@ -780,9 +780,6 @@ ENABLE_BFD_64_BIT_TRUE - subdirs - RPM_LIBS - RPM_CFLAGS --PKG_CONFIG_LIBDIR --PKG_CONFIG_PATH --PKG_CONFIG - GDB_DATADIR - DEBUGDIR - MAKEINFO_EXTRA_FLAGS -@@ -990,12 +987,12 @@ PKG_CONFIG_PATH - PKG_CONFIG_LIBDIR - MAKEINFO - MAKEINFOFLAGS -+RPM_CFLAGS -+RPM_LIBS - AMD_DBGAPI_CFLAGS - AMD_DBGAPI_LIBS - DEBUGINFOD_CFLAGS - DEBUGINFOD_LIBS --RPM_CFLAGS --RPM_LIBS - YACC - YFLAGS - ZSTD_CFLAGS -@@ -1684,11 +1681,11 @@ Optional Packages: - [--with-auto-load-dir] - --without-auto-load-safe-path - do not restrict auto-loaded files locations -+ --with-rpm query rpm database for missing debuginfos (yes/no, -+ def. auto=librpm.so) - --with-amd-dbgapi support for the amd-dbgapi target (yes / no / auto) - --with-debuginfod Enable debuginfo lookups with debuginfod - (auto/yes/no) -- --with-rpm query rpm database for missing debuginfos (yes/no, -- def. auto=librpm.so) - --with-libunwind-ia64 use libunwind frame unwinding for ia64 targets - --with-curses use the curses library instead of the termcap - library -@@ -1761,6 +1758,8 @@ Some influential environment variables: - MAKEINFO Parent configure detects if it is of sufficient version. - MAKEINFOFLAGS - Parameters for MAKEINFO. -+ RPM_CFLAGS C compiler flags for RPM, overriding pkg-config -+ RPM_LIBS linker flags for RPM, overriding pkg-config - AMD_DBGAPI_CFLAGS - C compiler flags for AMD_DBGAPI, overriding pkg-config - AMD_DBGAPI_LIBS -@@ -1769,8 +1768,6 @@ Some influential environment variables: - C compiler flags for DEBUGINFOD, overriding pkg-config - DEBUGINFOD_LIBS - linker flags for DEBUGINFOD, overriding pkg-config -- RPM_CFLAGS C compiler flags for RPM, overriding pkg-config -- RPM_LIBS linker flags for RPM, overriding pkg-config - YACC The `Yet Another Compiler Compiler' implementation to use. - Defaults to the first program found out of: `bison -y', `byacc', - `yacc'. -@@ -11495,7 +11492,7 @@ else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF --#line 11486 "configure" -+#line 11495 "configure" - #include "confdefs.h" - - #if HAVE_DLFCN_H -@@ -11601,7 +11598,7 @@ else - lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2 - lt_status=$lt_dlunknown - cat > conftest.$ac_ext <<_LT_EOF --#line 11592 "configure" -+#line 11601 "configure" - #include "confdefs.h" - - #if HAVE_DLFCN_H -@@ -18102,8 +18099,8 @@ $as_echo_n "checking specific librpm version... " >&6; } - if test "$cross_compiling" = yes; then : - { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 - $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} --as_fn_error "cannot run test program while cross compiling --See \`config.log' for more details." "$LINENO" 5; } -+as_fn_error $? "cannot run test program while cross compiling -+See \`config.log' for more details" "$LINENO" 5; } - else - cat confdefs.h - <<_ACEOF >conftest.$ac_ext - /* end confdefs.h. */ -@@ -18275,132 +18272,12 @@ $as_echo "#define HAVE_LIBRPM 1" >>confdefs.h - $as_echo "no" >&6; } - LIBS="$save_LIBS" - if $DLOPEN_REQUIRE; then -- as_fn_error "Specific name $LIBRPM was requested but it could not be opened." "$LINENO" 5 -+ as_fn_error $? "Specific name $LIBRPM was requested but it could not be opened." "$LINENO" 5 - fi - -- -- -- -- -- -- --if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then -- if test -n "$ac_tool_prefix"; then -- # Extract the first word of "${ac_tool_prefix}pkg-config", so it can be a program name with args. --set dummy ${ac_tool_prefix}pkg-config; ac_word=$2 --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 --$as_echo_n "checking for $ac_word... " >&6; } --if test "${ac_cv_path_PKG_CONFIG+set}" = set; then : -- $as_echo_n "(cached) " >&6 --else -- case $PKG_CONFIG in -- [\\/]* | ?:[\\/]*) -- ac_cv_path_PKG_CONFIG="$PKG_CONFIG" # Let the user override the test with a path. -- ;; -- *) -- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR --for as_dir in $PATH --do -- IFS=$as_save_IFS -- test -z "$as_dir" && as_dir=. -- for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -- ac_cv_path_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" -- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -- break 2 -- fi --done -- done --IFS=$as_save_IFS -- -- ;; --esac --fi --PKG_CONFIG=$ac_cv_path_PKG_CONFIG --if test -n "$PKG_CONFIG"; then -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $PKG_CONFIG" >&5 --$as_echo "$PKG_CONFIG" >&6; } --else -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 --$as_echo "no" >&6; } --fi -- -- --fi --if test -z "$ac_cv_path_PKG_CONFIG"; then -- ac_pt_PKG_CONFIG=$PKG_CONFIG -- # Extract the first word of "pkg-config", so it can be a program name with args. --set dummy pkg-config; ac_word=$2 --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 --$as_echo_n "checking for $ac_word... " >&6; } --if test "${ac_cv_path_ac_pt_PKG_CONFIG+set}" = set; then : -- $as_echo_n "(cached) " >&6 --else -- case $ac_pt_PKG_CONFIG in -- [\\/]* | ?:[\\/]*) -- ac_cv_path_ac_pt_PKG_CONFIG="$ac_pt_PKG_CONFIG" # Let the user override the test with a path. -- ;; -- *) -- as_save_IFS=$IFS; IFS=$PATH_SEPARATOR --for as_dir in $PATH --do -- IFS=$as_save_IFS -- test -z "$as_dir" && as_dir=. -- for ac_exec_ext in '' $ac_executable_extensions; do -- if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then -- ac_cv_path_ac_pt_PKG_CONFIG="$as_dir/$ac_word$ac_exec_ext" -- $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 -- break 2 -- fi --done -- done --IFS=$as_save_IFS -- -- ;; --esac --fi --ac_pt_PKG_CONFIG=$ac_cv_path_ac_pt_PKG_CONFIG --if test -n "$ac_pt_PKG_CONFIG"; then -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_PKG_CONFIG" >&5 --$as_echo "$ac_pt_PKG_CONFIG" >&6; } --else -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 --$as_echo "no" >&6; } --fi -- -- if test "x$ac_pt_PKG_CONFIG" = x; then -- PKG_CONFIG="" -- else -- case $cross_compiling:$ac_tool_warned in --yes:) --{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 --$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} --ac_tool_warned=yes ;; --esac -- PKG_CONFIG=$ac_pt_PKG_CONFIG -- fi --else -- PKG_CONFIG="$ac_cv_path_PKG_CONFIG" --fi -- --fi --if test -n "$PKG_CONFIG"; then -- _pkg_min_version=0.9.0 -- { $as_echo "$as_me:${as_lineno-$LINENO}: checking pkg-config is at least version $_pkg_min_version" >&5 --$as_echo_n "checking pkg-config is at least version $_pkg_min_version... " >&6; } -- if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 --$as_echo "yes" >&6; } -- else -- { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 --$as_echo "no" >&6; } -- PKG_CONFIG="" -- fi --fi -- - pkg_failed=no --{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for RPM" >&5 --$as_echo_n "checking for RPM... " >&6; } -+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for rpm" >&5 -+$as_echo_n "checking for rpm... " >&6; } - - if test -n "$RPM_CFLAGS"; then - pkg_cv_RPM_CFLAGS="$RPM_CFLAGS" -@@ -18437,6 +18314,30 @@ fi - pkg_failed=untried - fi - -+if test $pkg_failed = no; then -+ pkg_save_LDFLAGS="$LDFLAGS" -+ LDFLAGS="$LDFLAGS $pkg_cv_RPM_LIBS" -+ cat confdefs.h - <<_ACEOF >conftest.$ac_ext -+/* end confdefs.h. */ -+ -+int -+main () -+{ -+ -+ ; -+ return 0; -+} -+_ACEOF -+if ac_fn_c_try_link "$LINENO"; then : -+ -+else -+ pkg_failed=yes -+fi -+rm -f core conftest.err conftest.$ac_objext \ -+ conftest$ac_exeext conftest.$ac_ext -+ LDFLAGS=$pkg_save_LDFLAGS -+fi -+ - - - if test $pkg_failed = yes; then -@@ -18531,7 +18432,7 @@ $as_echo "#define HAVE_LIBRPM 1" >>confdefs.h - LIBS="$LIBS $RPM_LIBS" - else - if $RPM_REQUIRE; then -- as_fn_error "$RPM_PKG_ERRORS" "$LINENO" 5 -+ as_fn_error $? "$RPM_PKG_ERRORS" "$LINENO" 5 - else - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $RPM_PKG_ERRORS" >&5 - $as_echo "$as_me: WARNING: $RPM_PKG_ERRORS" >&2;} -@@ -21164,6 +21065,7 @@ if test x"$prefer_curses" = xyes; then - # search /usr/local/include, if ncurses is installed in /usr/local. A - # default installation of ncurses on alpha*-dec-osf* will lead to such - # a situation. -+ # Fedora: Force libncursesw over libncurses to match the includes. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing waddstr" >&5 - $as_echo_n "checking for library containing waddstr... " >&6; } - if ${ac_cv_search_waddstr+:} false; then : -@@ -21188,7 +21090,7 @@ return waddstr (); - return 0; - } - _ACEOF --for ac_lib in '' ncursesw ncurses cursesX curses; do -+for ac_lib in '' ncursesw; do - if test -z "$ac_lib"; then - ac_res="none required" - else -@@ -21260,6 +21162,7 @@ case $host_os in - esac - - # These are the libraries checked by Readline. -+# Fedora: Force libncursesw over libncurses to match the includes. - { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing tgetent" >&5 - $as_echo_n "checking for library containing tgetent... " >&6; } - if ${ac_cv_search_tgetent+:} false; then : -@@ -21284,7 +21187,7 @@ return tgetent (); - return 0; - } - _ACEOF --for ac_lib in '' termcap tinfow tinfo curses ncursesw ncurses; do -+for ac_lib in '' ncursesw; do - if test -z "$ac_lib"; then - ac_res="none required" - else -diff --git a/gdb/configure.ac b/gdb/configure.ac ---- a/gdb/configure.ac -+++ b/gdb/configure.ac -@@ -749,7 +749,8 @@ if test x"$prefer_curses" = xyes; then - # search /usr/local/include, if ncurses is installed in /usr/local. A - # default installation of ncurses on alpha*-dec-osf* will lead to such - # a situation. -- AC_SEARCH_LIBS(waddstr, [ncursesw ncurses cursesX curses], -+ # Fedora: Force libncursesw over libncurses to match the includes. -+ AC_SEARCH_LIBS(waddstr, [ncursesw], - [curses_found=yes - AC_DEFINE([HAVE_LIBCURSES], [1], - [Define to 1 if curses is enabled.]) -@@ -789,7 +790,8 @@ case $host_os in - esac - - # These are the libraries checked by Readline. --AC_SEARCH_LIBS(tgetent, [termcap tinfow tinfo curses ncursesw ncurses]) -+# Fedora: Force libncursesw over libncurses to match the includes. -+AC_SEARCH_LIBS(tgetent, [ncursesw]) - - if test "$ac_cv_search_tgetent" = no; then - CONFIG_OBS="$CONFIG_OBS stub-termcap.o" diff --git a/gdb-ftbs-swapped-calloc-args.patch b/gdb-ftbs-swapped-calloc-args.patch deleted file mode 100644 index 3486c8e..0000000 --- a/gdb-ftbs-swapped-calloc-args.patch +++ /dev/null @@ -1,42 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Kevin Buettner -Date: Wed, 17 Jan 2024 12:53:53 -0700 -Subject: gdb-ftbs-swapped-calloc-args.patch - -Backport upstream commit 54195469c18ec9873cc5ba6907f768509473fa9b -which fixes a build problem in which arguments to calloc were swapped. - -[opcodes] ARC + PPC: Fix -Walloc-size warnings - -Recently, -Walloc-size warnings started to kick in. Fix these two -calloc() calls to match the intended usage pattern. - -opcodes/ChangeLog: - - * arc-dis.c (init_arc_disasm_info): Fix calloc() call. - * ppc-dis.c (powerpc_init_dialect): Ditto. - -diff --git a/opcodes/arc-dis.c b/opcodes/arc-dis.c ---- a/opcodes/arc-dis.c -+++ b/opcodes/arc-dis.c -@@ -147,7 +147,7 @@ static bool - init_arc_disasm_info (struct disassemble_info *info) - { - struct arc_disassemble_info *arc_infop -- = calloc (sizeof (*arc_infop), 1); -+ = calloc (1, sizeof (*arc_infop)); - - if (arc_infop == NULL) - return false; -diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c ---- a/opcodes/ppc-dis.c -+++ b/opcodes/ppc-dis.c -@@ -348,7 +348,7 @@ powerpc_init_dialect (struct disassemble_info *info) - { - ppc_cpu_t dialect = 0; - ppc_cpu_t sticky = 0; -- struct dis_private *priv = calloc (sizeof (*priv), 1); -+ struct dis_private *priv = calloc (1, sizeof (*priv)); - - if (priv == NULL) - return; diff --git a/gdb-glibc-strstr-workaround.patch b/gdb-glibc-strstr-workaround.patch deleted file mode 100644 index da9c5de..0000000 --- a/gdb-glibc-strstr-workaround.patch +++ /dev/null @@ -1,132 +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-glibc-strstr-workaround.patch - -;; Workaround PR libc/14166 for inferior calls of strstr. -;;=fedoratest: Compatibility with RHELs (unchecked which ones). - -diff --git a/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp b/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gnu-ifunc-strstr-workaround.exp -@@ -0,0 +1,119 @@ -+# Copyright (C) 2012 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Workaround for: -+# invalid IFUNC DW_AT_linkage_name: memmove strstr time -+# http://sourceware.org/bugzilla/show_bug.cgi?id=14166 -+ -+if {[skip_shlib_tests]} { -+ return 0 -+} -+ -+set testfile "gnu-ifunc-strstr-workaround" -+set executable ${testfile} -+set srcfile start.c -+set binfile [standard_output_file ${executable}] -+ -+if [prepare_for_testing ${testfile}.exp $executable $srcfile] { -+ return -1 -+} -+ -+if ![runto_main] { -+ return 0 -+} -+ -+set test "ptype atoi" -+gdb_test_multiple $test $test { -+ -re "type = int \\(const char \\*\\)\r\n$gdb_prompt $" { -+ pass $test -+ } -+ -re "type = int \\(\\)\r\n$gdb_prompt $" { -+ untested "$test (no DWARF)" -+ return 0 -+ } -+ -re "type = \\(\\)\r\n$gdb_prompt $" { -+ untested "$test (no DWARF)" -+ return 0 -+ } -+} -+ -+set addr "" -+set test "print strstr" -+gdb_test_multiple $test $test { -+ -re " = {} (0x\[0-9a-f\]+) \r\n$gdb_prompt $" { -+ set addr $expect_out(1,string) -+ pass $test -+ } -+ -re " = {} (0x\[0-9a-f\]+) <__strstr>\r\n$gdb_prompt $" { -+ set addr $expect_out(1,string) -+ pass "$test (GDB workaround)" -+ } -+ -re " = {} (0x\[0-9a-f\]+) <__libc_strstr>\r\n$gdb_prompt $" { -+ set addr $expect_out(1,string) -+ pass "$test (fixed glibc)" -+ } -+ -re " = {} (0x\[0-9a-f\]+) <__libc_strstr_ifunc>\r\n$gdb_prompt $" { -+ set addr $expect_out(1,string) -+ pass "$test (fixed glibc)" -+ } -+ -re " = {char \\*\\(const char \\*, const char \\*\\)} 0x\[0-9a-f\]+ \r\n$gdb_prompt $" { -+ untested "$test (gnu-ifunc not in use by glibc)" -+ return 0 -+ } -+} -+ -+set test "info sym" -+gdb_test_multiple "info sym $addr" $test { -+ -re "strstr in section \\.text of /lib\[^/\]*/libc.so.6\r\n$gdb_prompt $" { -+ pass $test -+ } -+ -re " = {char \\*\\(const char \\*, const char \\*\\)} 0x\[0-9a-f\]+ \r\n$gdb_prompt $" { -+ # unexpected -+ xfail "$test (not in libc.so.6)" -+ return 0 -+ } -+} -+ -+set test "info addr strstr" -+gdb_test_multiple $test $test { -+ -re "Symbol \"strstr\" is a function at address $addr\\.\r\n$gdb_prompt $" { -+ fail "$test (DWARF for strstr)" -+ } -+ -re "Symbol \"strstr\" is at $addr in a file compiled without debugging\\.\r\n$gdb_prompt $" { -+ pass "$test" -+ } -+} -+ -+set test "print strstr second time" -+gdb_test_multiple "print strstr" $test { -+ -re " = {} $addr \r\n$gdb_prompt $" { -+ pass $test -+ } -+ -re " = {} $addr <__strstr>\r\n$gdb_prompt $" { -+ pass "$test (GDB workaround)" -+ } -+ -re " = {} $addr <__libc_strstr>\r\n$gdb_prompt $" { -+ pass "$test (fixed glibc)" -+ } -+ -re " = {} $addr <__libc_strstr_ifunc>\r\n$gdb_prompt $" { -+ pass "$test (fixed glibc)" -+ } -+ -re " = {void \\*\\(void\\)} 0x\[0-9a-f\]+ \r\n$gdb_prompt $" { -+ fail $test -+ } -+} -+ -+gdb_test {print (char *)strstr("abc","b")} { = 0x[0-9a-f]+ "bc"} -+gdb_test {print (char *)strstr("def","e")} { = 0x[0-9a-f]+ "ef"} diff --git a/gdb-linux_perf-bundle.patch b/gdb-linux_perf-bundle.patch deleted file mode 100644 index bb6fb6a..0000000 --- a/gdb-linux_perf-bundle.patch +++ /dev/null @@ -1,226 +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-linux_perf-bundle.patch - -;; [dts+el7] [x86*] Bundle linux_perf.h for libipt (RH BZ 1256513). -;;=fedora - -diff --git a/gdb/gdb.c b/gdb/gdb.c ---- a/gdb/gdb.c -+++ b/gdb/gdb.c -@@ -21,6 +21,10 @@ - #include "interps.h" - #include "run-on-main-thread.h" - -+#ifdef PERF_ATTR_SIZE_VER5_BUNDLE -+extern "C" void __libipt_init(void); -+#endif -+ - int - main (int argc, char **argv) - { -@@ -32,6 +36,10 @@ main (int argc, char **argv) - - struct captured_main_args args; - -+#ifdef PERF_ATTR_SIZE_VER5_BUNDLE -+ __libipt_init(); -+#endif -+ - memset (&args, 0, sizeof args); - args.argc = argc; - args.argv = argv; -diff --git a/gdb/nat/linux-btrace.h b/gdb/nat/linux-btrace.h ---- a/gdb/nat/linux-btrace.h -+++ b/gdb/nat/linux-btrace.h -@@ -28,6 +28,177 @@ - # include - #endif - -+#ifdef PERF_ATTR_SIZE_VER5_BUNDLE -+#ifndef HAVE_LINUX_PERF_EVENT_H -+# error "PERF_ATTR_SIZE_VER5_BUNDLE && !HAVE_LINUX_PERF_EVENT_H" -+#endif -+#ifndef PERF_ATTR_SIZE_VER5 -+#define PERF_ATTR_SIZE_VER5 -+#define perf_event_mmap_page perf_event_mmap_page_bundle -+// kernel-headers-3.10.0-493.el7.x86_64/usr/include/linux/perf_event.h -+/* -+ * Structure of the page that can be mapped via mmap -+ */ -+struct perf_event_mmap_page { -+ __u32 version; /* version number of this structure */ -+ __u32 compat_version; /* lowest version this is compat with */ -+ -+ /* -+ * Bits needed to read the hw events in user-space. -+ * -+ * u32 seq, time_mult, time_shift, index, width; -+ * u64 count, enabled, running; -+ * u64 cyc, time_offset; -+ * s64 pmc = 0; -+ * -+ * do { -+ * seq = pc->lock; -+ * barrier() -+ * -+ * enabled = pc->time_enabled; -+ * running = pc->time_running; -+ * -+ * if (pc->cap_usr_time && enabled != running) { -+ * cyc = rdtsc(); -+ * time_offset = pc->time_offset; -+ * time_mult = pc->time_mult; -+ * time_shift = pc->time_shift; -+ * } -+ * -+ * index = pc->index; -+ * count = pc->offset; -+ * if (pc->cap_user_rdpmc && index) { -+ * width = pc->pmc_width; -+ * pmc = rdpmc(index - 1); -+ * } -+ * -+ * barrier(); -+ * } while (pc->lock != seq); -+ * -+ * NOTE: for obvious reason this only works on self-monitoring -+ * processes. -+ */ -+ __u32 lock; /* seqlock for synchronization */ -+ __u32 index; /* hardware event identifier */ -+ __s64 offset; /* add to hardware event value */ -+ __u64 time_enabled; /* time event active */ -+ __u64 time_running; /* time event on cpu */ -+ union { -+ __u64 capabilities; -+ struct { -+ __u64 cap_bit0 : 1, /* Always 0, deprecated, see commit 860f085b74e9 */ -+ cap_bit0_is_deprecated : 1, /* Always 1, signals that bit 0 is zero */ -+ -+ cap_user_rdpmc : 1, /* The RDPMC instruction can be used to read counts */ -+ cap_user_time : 1, /* The time_* fields are used */ -+ cap_user_time_zero : 1, /* The time_zero field is used */ -+ cap_____res : 59; -+ }; -+ }; -+ -+ /* -+ * If cap_user_rdpmc this field provides the bit-width of the value -+ * read using the rdpmc() or equivalent instruction. This can be used -+ * to sign extend the result like: -+ * -+ * pmc <<= 64 - width; -+ * pmc >>= 64 - width; // signed shift right -+ * count += pmc; -+ */ -+ __u16 pmc_width; -+ -+ /* -+ * If cap_usr_time the below fields can be used to compute the time -+ * delta since time_enabled (in ns) using rdtsc or similar. -+ * -+ * u64 quot, rem; -+ * u64 delta; -+ * -+ * quot = (cyc >> time_shift); -+ * rem = cyc & (((u64)1 << time_shift) - 1); -+ * delta = time_offset + quot * time_mult + -+ * ((rem * time_mult) >> time_shift); -+ * -+ * Where time_offset,time_mult,time_shift and cyc are read in the -+ * seqcount loop described above. This delta can then be added to -+ * enabled and possible running (if index), improving the scaling: -+ * -+ * enabled += delta; -+ * if (index) -+ * running += delta; -+ * -+ * quot = count / running; -+ * rem = count % running; -+ * count = quot * enabled + (rem * enabled) / running; -+ */ -+ __u16 time_shift; -+ __u32 time_mult; -+ __u64 time_offset; -+ /* -+ * If cap_usr_time_zero, the hardware clock (e.g. TSC) can be calculated -+ * from sample timestamps. -+ * -+ * time = timestamp - time_zero; -+ * quot = time / time_mult; -+ * rem = time % time_mult; -+ * cyc = (quot << time_shift) + (rem << time_shift) / time_mult; -+ * -+ * And vice versa: -+ * -+ * quot = cyc >> time_shift; -+ * rem = cyc & (((u64)1 << time_shift) - 1); -+ * timestamp = time_zero + quot * time_mult + -+ * ((rem * time_mult) >> time_shift); -+ */ -+ __u64 time_zero; -+ __u32 size; /* Header size up to __reserved[] fields. */ -+ -+ /* -+ * Hole for extension of the self monitor capabilities -+ */ -+ -+ __u8 __reserved[118*8+4]; /* align to 1k. */ -+ -+ /* -+ * Control data for the mmap() data buffer. -+ * -+ * User-space reading the @data_head value should issue an smp_rmb(), -+ * after reading this value. -+ * -+ * When the mapping is PROT_WRITE the @data_tail value should be -+ * written by userspace to reflect the last read data, after issueing -+ * an smp_mb() to separate the data read from the ->data_tail store. -+ * In this case the kernel will not over-write unread data. -+ * -+ * See perf_output_put_handle() for the data ordering. -+ * -+ * data_{offset,size} indicate the location and size of the perf record -+ * buffer within the mmapped area. -+ */ -+ __u64 data_head; /* head in the data section */ -+ __u64 data_tail; /* user-space written tail */ -+ __u64 data_offset; /* where the buffer starts */ -+ __u64 data_size; /* data buffer size */ -+ -+ /* -+ * AUX area is defined by aux_{offset,size} fields that should be set -+ * by the userspace, so that -+ * -+ * aux_offset >= data_offset + data_size -+ * -+ * prior to mmap()ing it. Size of the mmap()ed area should be aux_size. -+ * -+ * Ring buffer pointers aux_{head,tail} have the same semantics as -+ * data_{head,tail} and same ordering rules apply. -+ */ -+ __u64 aux_head; -+ __u64 aux_tail; -+ __u64 aux_offset; -+ __u64 aux_size; -+}; -+#endif // PERF_ATTR_SIZE_VER5 -+#endif // PERF_ATTR_SIZE_VER5_BUNDLE -+ - struct target_ops; - - #if HAVE_LINUX_PERF_EVENT_H -diff --git a/gdbsupport/common.m4 b/gdbsupport/common.m4 ---- a/gdbsupport/common.m4 -+++ b/gdbsupport/common.m4 -@@ -168,7 +168,7 @@ AC_DEFUN([GDB_AC_COMMON], [ - AC_PREPROC_IFELSE([AC_LANG_SOURCE([[ - #include - #ifndef PERF_ATTR_SIZE_VER5 -- # error -+ // error // PERF_ATTR_SIZE_VER5_BUNDLE is not available here - Fedora+RHEL - #endif - ]])], [perf_event=yes], [perf_event=no]) - if test "$perf_event" != yes; then diff --git a/gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch b/gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch deleted file mode 100644 index 1d6e1fb..0000000 --- a/gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch +++ /dev/null @@ -1,264 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andrew Burgess -Date: Sat, 25 Nov 2023 10:35:37 +0000 -Subject: gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch - -;; Back-port upstream commit acc117b57f7 as part of a fix for -;; non-deterministic gdb-index generation (RH BZ 2232086). - -gdb: C++-ify mapped_symtab from dwarf2/index-write.c - -Make static the functions add_index_entry, find_slot, and hash_expand, -member functions of the mapped_symtab class. - -Fold an additional snippet of code from write_gdbindex into -mapped_symtab::minimize, this code relates to minimisation, so this -seems like a good home for it. - -Make the n_elements, data, and m_string_obstack member variables of -mapped_symtab private. Provide a new obstack() member function to -provide access to the obstack when needed, and also add member -functions begin(), end(), cbegin(), and cend() so that the -mapped_symtab class can be treated like a contained and iterated -over. - -I've also taken this opportunity to split out the logic for whether -the hash table (m_data) needs expanding, this is the new function -hash_needs_expanding. This will be useful in a later commit. - -There should be no user visible changes after this commit. - -Approved-By: Tom Tromey - -diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c ---- a/gdb/dwarf2/index-write.c -+++ b/gdb/dwarf2/index-write.c -@@ -187,86 +187,135 @@ struct mapped_symtab - { - mapped_symtab () - { -- data.resize (1024); -+ m_data.resize (1024); - } - -- /* Minimize each entry in the symbol table, removing duplicates. */ -+ /* If there are no elements in the symbol table, then reduce the table -+ size to zero. Otherwise call symtab_index_entry::minimize each entry -+ in the symbol table. */ -+ - void minimize () - { -- for (symtab_index_entry &item : data) -+ if (m_element_count == 0) -+ m_data.resize (0); -+ -+ for (symtab_index_entry &item : m_data) - item.minimize (); - } - -- offset_type n_elements = 0; -- std::vector data; -+ /* Add an entry to SYMTAB. NAME is the name of the symbol. CU_INDEX is -+ the index of the CU in which the symbol appears. IS_STATIC is one if -+ the symbol is static, otherwise zero (global). */ -+ -+ void add_index_entry (const char *name, int is_static, -+ gdb_index_symbol_kind kind, offset_type cu_index); -+ -+ /* Access the obstack. */ -+ struct obstack *obstack () -+ { return &m_string_obstack; } -+ -+private: -+ -+ /* Find a slot in SYMTAB for the symbol NAME. Returns a reference to -+ the slot. -+ -+ Function is used only during write_hash_table so no index format -+ backward compatibility is needed. */ -+ -+ symtab_index_entry &find_slot (const char *name); -+ -+ /* Expand SYMTAB's hash table. */ -+ -+ void hash_expand (); -+ -+ /* Return true if the hash table in data needs to grow. */ -+ -+ bool hash_needs_expanding () const -+ { return 4 * m_element_count / 3 >= m_data.size (); } -+ -+ /* A vector that is used as a hash table. */ -+ std::vector m_data; -+ -+ /* The number of elements stored in the m_data hash. */ -+ offset_type m_element_count = 0; - - /* Temporary storage for names. */ - auto_obstack m_string_obstack; --}; - --/* Find a slot in SYMTAB for the symbol NAME. Returns a reference to -- the slot. -+public: -+ using iterator = decltype (m_data)::iterator; -+ using const_iterator = decltype (m_data)::const_iterator; - -- Function is used only during write_hash_table so no index format backward -- compatibility is needed. */ -+ iterator begin () -+ { return m_data.begin (); } - --static symtab_index_entry & --find_slot (struct mapped_symtab *symtab, const char *name) -+ iterator end () -+ { return m_data.end (); } -+ -+ const_iterator cbegin () -+ { return m_data.cbegin (); } -+ -+ const_iterator cend () -+ { return m_data.cend (); } -+}; -+ -+/* See class definition. */ -+ -+symtab_index_entry & -+mapped_symtab::find_slot (const char *name) - { - offset_type index, step, hash = mapped_index_string_hash (INT_MAX, name); - -- index = hash & (symtab->data.size () - 1); -- step = ((hash * 17) & (symtab->data.size () - 1)) | 1; -+ index = hash & (m_data.size () - 1); -+ step = ((hash * 17) & (m_data.size () - 1)) | 1; - - for (;;) - { -- if (symtab->data[index].name == NULL -- || strcmp (name, symtab->data[index].name) == 0) -- return symtab->data[index]; -- index = (index + step) & (symtab->data.size () - 1); -+ if (m_data[index].name == NULL -+ || strcmp (name, m_data[index].name) == 0) -+ return m_data[index]; -+ index = (index + step) & (m_data.size () - 1); - } - } - --/* Expand SYMTAB's hash table. */ -+/* See class definition. */ - --static void --hash_expand (struct mapped_symtab *symtab) -+void -+mapped_symtab::hash_expand () - { -- auto old_entries = std::move (symtab->data); -+ auto old_entries = std::move (m_data); - -- symtab->data.clear (); -- symtab->data.resize (old_entries.size () * 2); -+ gdb_assert (m_data.size () == 0); -+ m_data.resize (old_entries.size () * 2); - - for (auto &it : old_entries) - if (it.name != NULL) - { -- auto &ref = find_slot (symtab, it.name); -+ auto &ref = this->find_slot (it.name); - ref = std::move (it); - } - } - --/* Add an entry to SYMTAB. NAME is the name of the symbol. -- CU_INDEX is the index of the CU in which the symbol appears. -- IS_STATIC is one if the symbol is static, otherwise zero (global). */ -+/* See class definition. */ - --static void --add_index_entry (struct mapped_symtab *symtab, const char *name, -- int is_static, gdb_index_symbol_kind kind, -- offset_type cu_index) -+void -+mapped_symtab::add_index_entry (const char *name, int is_static, -+ gdb_index_symbol_kind kind, -+ offset_type cu_index) - { -- symtab_index_entry *slot = &find_slot (symtab, name); -+ symtab_index_entry *slot = &this->find_slot (name); - if (slot->name == NULL) - { - /* This is a new element in the hash table. */ -- ++symtab->n_elements; -+ ++this->m_element_count; - - /* We might need to grow the hash table. */ -- if (4 * symtab->n_elements / 3 >= symtab->data.size ()) -+ if (this->hash_needs_expanding ()) - { -- hash_expand (symtab); -+ this->hash_expand (); - - /* This element will have a different slot in the new table. */ -- slot = &find_slot (symtab, name); -+ slot = &this->find_slot (name); - - /* But it should still be a new element in the hash table. */ - gdb_assert (slot->name == nullptr); -@@ -387,7 +436,7 @@ write_hash_table (mapped_symtab *symtab, data_buf &output, data_buf &cpool) - - /* We add all the index vectors to the constant pool first, to - ensure alignment is ok. */ -- for (symtab_index_entry &entry : symtab->data) -+ for (symtab_index_entry &entry : *symtab) - { - if (entry.name == NULL) - continue; -@@ -416,7 +465,7 @@ write_hash_table (mapped_symtab *symtab, data_buf &output, data_buf &cpool) - - /* Now write out the hash table. */ - std::unordered_map str_table; -- for (const auto &entry : symtab->data) -+ for (const auto &entry : *symtab) - { - offset_type str_off, vec_off; - -@@ -1151,7 +1200,7 @@ write_cooked_index (cooked_index *table, - const auto it = cu_index_htab.find (entry->per_cu); - gdb_assert (it != cu_index_htab.cend ()); - -- const char *name = entry->full_name (&symtab->m_string_obstack); -+ const char *name = entry->full_name (symtab->obstack ()); - - if (entry->per_cu->lang () == language_ada) - { -@@ -1159,7 +1208,7 @@ write_cooked_index (cooked_index *table, - gdb, it has to use the encoded name, with any - suffixes stripped. */ - std::string encoded = ada_encode (name, false); -- name = obstack_strdup (&symtab->m_string_obstack, -+ name = obstack_strdup (symtab->obstack (), - encoded.c_str ()); - } - else if (entry->per_cu->lang () == language_cplus -@@ -1191,8 +1240,8 @@ write_cooked_index (cooked_index *table, - else - kind = GDB_INDEX_SYMBOL_KIND_TYPE; - -- add_index_entry (symtab, name, (entry->flags & IS_STATIC) != 0, -- kind, it->second); -+ symtab->add_index_entry (name, (entry->flags & IS_STATIC) != 0, -+ kind, it->second); - } - } - -@@ -1267,8 +1316,6 @@ write_gdbindex (dwarf2_per_bfd *per_bfd, cooked_index *table, - symtab.minimize (); - - data_buf symtab_vec, constant_pool; -- if (symtab.n_elements == 0) -- symtab.data.resize (0); - - write_hash_table (&symtab, symtab_vec, constant_pool); - diff --git a/gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch b/gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch deleted file mode 100644 index e9b0b9e..0000000 --- a/gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch +++ /dev/null @@ -1,101 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andrew Burgess -Date: Mon, 27 Nov 2023 13:19:39 +0000 -Subject: gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch - -;; Back-port upstream commit 3644f41dc80 as part of a fix for -;; non-deterministic gdb-index generation (RH BZ 2232086). - -gdb: generate dwarf-5 index identically as worker-thread count changes - -Similar to the previous commit, this commit ensures that the dwarf-5 -index files are generated identically as the number of worker-threads -changes. - -Building the dwarf-5 index makes use of a closed hash table, the -bucket_hash local within debug_names::build(). Entries are added to -bucket_hash from m_name_to_value_set, which, in turn, is populated -by calls to debug_names::insert() in write_debug_names. The insert -calls are ordered based on the entries within the cooked_index, and -the ordering within cooked_index depends on the number of worker -threads that GDB is using. - -My proposal is to sort each chain within the bucket_hash closed hash -table prior to using this to build the dwarf-5 index. - -The buckets within bucket_hash will always have the same ordering (for -a given GDB build with a given executable), and by sorting the chains -within each bucket, we can be sure that GDB will see each entry in a -deterministic order. - -I've extended the index creation test to cover this case. - -Approved-By: Tom Tromey - -diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c ---- a/gdb/dwarf2/index-write.c -+++ b/gdb/dwarf2/index-write.c -@@ -452,6 +452,11 @@ class c_str_view - return strcmp (m_cstr, other.m_cstr) == 0; - } - -+ bool operator< (const c_str_view &other) const -+ { -+ return strcmp (m_cstr, other.m_cstr) < 0; -+ } -+ - /* Return the underlying C string. Note, the returned string is - only a reference with lifetime of this object. */ - const char *c_str () const -@@ -771,10 +776,18 @@ class debug_names - } - for (size_t bucket_ix = 0; bucket_ix < bucket_hash.size (); ++bucket_ix) - { -- const std::forward_list &hashitlist -- = bucket_hash[bucket_ix]; -+ std::forward_list &hashitlist = bucket_hash[bucket_ix]; - if (hashitlist.empty ()) - continue; -+ -+ /* Sort the items within each bucket. This ensures that the -+ generated index files will be the same no matter the order in -+ which symbols were added into the index. */ -+ hashitlist.sort ([] (const hash_it_pair &a, const hash_it_pair &b) -+ { -+ return a.it->first < b.it->first; -+ }); -+ - uint32_t &bucket_slot = m_bucket_table[bucket_ix]; - /* The hashes array is indexed starting at 1. */ - store_unsigned_integer (reinterpret_cast (&bucket_slot), -diff --git a/gdb/testsuite/gdb.gdb/index-file.exp b/gdb/testsuite/gdb.gdb/index-file.exp ---- a/gdb/testsuite/gdb.gdb/index-file.exp -+++ b/gdb/testsuite/gdb.gdb/index-file.exp -@@ -47,6 +47,9 @@ remote_exec host "mkdir -p ${dir1}" - with_timeout_factor $timeout_factor { - gdb_test_no_output "save gdb-index $dir1" \ - "create gdb-index file" -+ -+ gdb_test_no_output "save gdb-index -dwarf-5 $dir1" \ -+ "create dwarf-index files" - } - - # Close GDB. -@@ -143,13 +146,16 @@ if { $worker_threads > 1 } { - with_timeout_factor $timeout_factor { - gdb_test_no_output "save gdb-index $dir2" \ - "create second gdb-index file" -+ -+ gdb_test_no_output "save gdb-index -dwarf-5 $dir2" \ -+ "create second dwarf-index files" - } - - # Close GDB. - gdb_exit - - # Now check that the index files are identical. -- foreach suffix { gdb-index } { -+ foreach suffix { gdb-index debug_names debug_str } { - set result \ - [remote_exec host \ - "cmp -s \"$dir1/${index_filename_base}.${suffix}\" \"$dir2/${index_filename_base}.${suffix}\""] diff --git a/gdb-rhbz-2232086-generate-gdb-index-consistently.patch b/gdb-rhbz-2232086-generate-gdb-index-consistently.patch deleted file mode 100644 index d6917ec..0000000 --- a/gdb-rhbz-2232086-generate-gdb-index-consistently.patch +++ /dev/null @@ -1,230 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andrew Burgess -Date: Fri, 24 Nov 2023 12:04:36 +0000 -Subject: gdb-rhbz-2232086-generate-gdb-index-consistently.patch - -;; Back-port upstream commit aff250145af as part of a fix for -;; non-deterministic gdb-index generation (RH BZ 2232086). - -gdb: generate gdb-index identically regardless of work thread count - -It was observed that changing the number of worker threads that GDB -uses (maintenance set worker-threads NUM) would have an impact on the -layout of the generated gdb-index. - -The cause seems to be how the CU are distributed between threads, and -then symbols that appear in multiple CU can be encountered earlier or -later depending on whether a particular CU moves between threads. - -I certainly found this behaviour was reproducible when generating an -index for GDB itself, like: - - gdb -q -nx -nh -batch \ - -eiex 'maint set worker-threads NUM' \ - -ex 'save gdb-index /tmp/' - -And then setting different values for NUM will change the generated -index. - -Now, the question is: does this matter? - -I would like to suggest that yes, this does matter. At Red Hat we -generate a gdb-index as part of the build process, and we would -ideally like to have reproducible builds: for the same source, -compiled with the same tool-chain, we should get the exact same output -binary. And we do .... except for the index. - -Now we could simply force GDB to only use a single worker thread when -we build the index, but, I don't think the idea of reproducible builds -is that strange, so I think we should ensure that our generated -indexes are always reproducible. - -To achieve this, I propose that we add an extra step when building the -gdb-index file. After constructing the initial symbol hash table -contents, we will pull all the symbols out of the hash, sort them, -then re-insert them in sorted order. This will ensure that the -structure of the generated hash will remain consistent (given the same -set of symbols). - -I've extended the existing index-file test to check that the generated -index doesn't change if we adjust the number of worker threads used. -Given that this test is already rather slow, I've only made one change -to the worker-thread count. Maybe this test should be changed to use -a smaller binary, which is quicker to load, and for which we could -then try many different worker thread counts. - -Approved-By: Tom Tromey - -diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c ---- a/gdb/dwarf2/index-write.c -+++ b/gdb/dwarf2/index-write.c -@@ -210,6 +210,13 @@ struct mapped_symtab - void add_index_entry (const char *name, int is_static, - gdb_index_symbol_kind kind, offset_type cu_index); - -+ /* When entries are originally added into the data hash the order will -+ vary based on the number of worker threads GDB is configured to use. -+ This function will rebuild the hash such that the final layout will be -+ deterministic regardless of the number of worker threads used. */ -+ -+ void sort (); -+ - /* Access the obstack. */ - struct obstack *obstack () - { return &m_string_obstack; } -@@ -296,6 +303,65 @@ mapped_symtab::hash_expand () - } - } - -+/* See mapped_symtab class declaration. */ -+ -+void mapped_symtab::sort () -+{ -+ /* Move contents out of this->data vector. */ -+ std::vector original_data = std::move (m_data); -+ -+ /* Restore the size of m_data, this will avoid having to expand the hash -+ table (and rehash all elements) when we reinsert after sorting. -+ However, we do reset the element count, this allows for some sanity -+ checking asserts during the reinsert phase. */ -+ gdb_assert (m_data.size () == 0); -+ m_data.resize (original_data.size ()); -+ m_element_count = 0; -+ -+ /* Remove empty entries from ORIGINAL_DATA, this makes sorting quicker. */ -+ auto it = std::remove_if (original_data.begin (), original_data.end (), -+ [] (const symtab_index_entry &entry) -> bool -+ { -+ return entry.name == nullptr; -+ }); -+ original_data.erase (it, original_data.end ()); -+ -+ /* Sort the existing contents. */ -+ std::sort (original_data.begin (), original_data.end (), -+ [] (const symtab_index_entry &a, -+ const symtab_index_entry &b) -> bool -+ { -+ /* Return true if A is before B. */ -+ gdb_assert (a.name != nullptr); -+ gdb_assert (b.name != nullptr); -+ -+ return strcmp (a.name, b.name) < 0; -+ }); -+ -+ /* Re-insert each item from the sorted list. */ -+ for (auto &entry : original_data) -+ { -+ /* We know that ORIGINAL_DATA contains no duplicates, this data was -+ taken from a hash table that de-duplicated entries for us, so -+ count this as a new item. -+ -+ As we retained the original size of m_data (see above) then we -+ should never need to grow m_data_ during this re-insertion phase, -+ assert that now. */ -+ ++m_element_count; -+ gdb_assert (!this->hash_needs_expanding ()); -+ -+ /* Lookup a slot. */ -+ symtab_index_entry &slot = this->find_slot (entry.name); -+ -+ /* As discussed above, we should not find duplicates. */ -+ gdb_assert (slot.name == nullptr); -+ -+ /* Move this item into the slot we found. */ -+ slot = std::move (entry); -+ } -+} -+ - /* See class definition. */ - - void -@@ -1311,6 +1377,9 @@ write_gdbindex (dwarf2_per_bfd *per_bfd, cooked_index *table, - for (auto map : table->get_addrmaps ()) - write_address_map (map, addr_vec, cu_index_htab); - -+ /* Ensure symbol hash is built domestically. */ -+ symtab.sort (); -+ - /* Now that we've processed all symbols we can shrink their cu_indices - lists. */ - symtab.minimize (); -diff --git a/gdb/testsuite/gdb.gdb/index-file.exp b/gdb/testsuite/gdb.gdb/index-file.exp ---- a/gdb/testsuite/gdb.gdb/index-file.exp -+++ b/gdb/testsuite/gdb.gdb/index-file.exp -@@ -38,6 +38,9 @@ with_timeout_factor $timeout_factor { - clean_restart $filename - } - -+# Record how many worker threads GDB is using. -+set worker_threads [gdb_get_worker_threads] -+ - # Generate an index file. - set dir1 [standard_output_file "index_1"] - remote_exec host "mkdir -p ${dir1}" -@@ -116,3 +119,41 @@ proc check_symbol_table_usage { filename } { - - set index_filename_base [file tail $filename] - check_symbol_table_usage "$dir1/${index_filename_base}.gdb-index" -+ -+# If GDB is using more than 1 worker thread then reduce the number of -+# worker threads, regenerate the index, and check that we get the same -+# index file back. At one point the layout of the index would vary -+# based on the number of worker threads used. -+if { $worker_threads > 1 } { -+ # Start GDB, but don't load a file yet. -+ clean_restart -+ -+ # Adjust the number of threads to use. -+ set reduced_threads [expr $worker_threads / 2] -+ gdb_test_no_output "maint set worker-threads $reduced_threads" -+ -+ with_timeout_factor $timeout_factor { -+ # Now load the test binary. -+ gdb_file_cmd $filename -+ } -+ -+ # Generate an index file. -+ set dir2 [standard_output_file "index_2"] -+ remote_exec host "mkdir -p ${dir2}" -+ with_timeout_factor $timeout_factor { -+ gdb_test_no_output "save gdb-index $dir2" \ -+ "create second gdb-index file" -+ } -+ -+ # Close GDB. -+ gdb_exit -+ -+ # Now check that the index files are identical. -+ foreach suffix { gdb-index } { -+ set result \ -+ [remote_exec host \ -+ "cmp -s \"$dir1/${index_filename_base}.${suffix}\" \"$dir2/${index_filename_base}.${suffix}\""] -+ gdb_assert { [lindex $result 0] == 0 } \ -+ "$suffix files are identical" -+ } -+} -diff --git a/gdb/testsuite/lib/gdb.exp b/gdb/testsuite/lib/gdb.exp ---- a/gdb/testsuite/lib/gdb.exp -+++ b/gdb/testsuite/lib/gdb.exp -@@ -10033,6 +10033,21 @@ proc is_target_non_stop { {testname ""} } { - return $is_non_stop - } - -+# Return the number of worker threads that GDB is currently using. -+ -+proc gdb_get_worker_threads { {testname ""} } { -+ set worker_threads "UNKNOWN" -+ gdb_test_multiple "maintenance show worker-threads" $testname { -+ -wrap -re "The number of worker threads GDB can use is unlimited \\(currently ($::decimal)\\)\\." { -+ set worker_threads $expect_out(1,string) -+ } -+ -wrap -re "The number of worker threads GDB can use is ($::decimal)\\." { -+ set worker_threads $expect_out(1,string) -+ } -+ } -+ return $worker_threads -+} -+ - # Check if the compiler emits epilogue information associated - # with the closing brace or with the last statement line. - # diff --git a/gdb-rhbz-2232086-reduce-size-of-gdb-index.patch b/gdb-rhbz-2232086-reduce-size-of-gdb-index.patch deleted file mode 100644 index 9eaf615..0000000 --- a/gdb-rhbz-2232086-reduce-size-of-gdb-index.patch +++ /dev/null @@ -1,222 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andrew Burgess -Date: Fri, 24 Nov 2023 11:50:35 +0000 -Subject: gdb-rhbz-2232086-reduce-size-of-gdb-index.patch - -;; Back-port upstream commit aa19bc1d259 as part of a fix for -;; non-deterministic gdb-index generation (RH BZ 2232086). - -gdb: reduce size of generated gdb-index file - -I noticed in passing that out algorithm for generating the gdb-index -file is incorrect. When building the hash table in add_index_entry we -count every incoming entry rehash when the number of entries gets too -large. However, some of the incoming entries will be duplicates, -which don't actually result in new items being added to the hash -table. - -As a result, we grow the gdb-index hash table far too often. - -With an unmodified GDB, generating a gdb-index for GDB, I see a file -size of 90M, with a hash usage (in the generated index file) of just -2.6%. - -With a patched GDB, generating a gdb-index for the _same_ GDB binary, -I now see a gdb-index file size of 30M, with a hash usage of 41.9%. - -This is a 67% reduction in gdb-index file size. - -Obviously, not every gdb-index file is going to see such big savings, -however, the larger a program, and the more symbols that are -duplicated between compilation units, the more GDB would over count, -and so, over-grow the index. - -The gdb-index hash table we create has a minimum size of 1024, and -then we grow the hash when it is 75% full, doubling the hash table at -that time. Given this, then we expect that either: - - a. The hash table is size 1024, and less than 75% full, or - b. The hash table is between 37.5% and 75% full. - -I've include a test that checks some of these constraints -- I've not -bothered to check the upper limit, and over full hash table isn't -really a problem here, but if the fill percentage is less than 37.5% -then this indicates that we've done something wrong (obviously, I also -check for the 1024 minimum size). - -Approved-By: Tom Tromey - -diff --git a/gdb/dwarf2/index-write.c b/gdb/dwarf2/index-write.c ---- a/gdb/dwarf2/index-write.c -+++ b/gdb/dwarf2/index-write.c -@@ -254,20 +254,29 @@ add_index_entry (struct mapped_symtab *symtab, const char *name, - int is_static, gdb_index_symbol_kind kind, - offset_type cu_index) - { -- offset_type cu_index_and_attrs; -+ symtab_index_entry *slot = &find_slot (symtab, name); -+ if (slot->name == NULL) -+ { -+ /* This is a new element in the hash table. */ -+ ++symtab->n_elements; - -- ++symtab->n_elements; -- if (4 * symtab->n_elements / 3 >= symtab->data.size ()) -- hash_expand (symtab); -+ /* We might need to grow the hash table. */ -+ if (4 * symtab->n_elements / 3 >= symtab->data.size ()) -+ { -+ hash_expand (symtab); - -- symtab_index_entry &slot = find_slot (symtab, name); -- if (slot.name == NULL) -- { -- slot.name = name; -+ /* This element will have a different slot in the new table. */ -+ slot = &find_slot (symtab, name); -+ -+ /* But it should still be a new element in the hash table. */ -+ gdb_assert (slot->name == nullptr); -+ } -+ -+ slot->name = name; - /* index_offset is set later. */ - } - -- cu_index_and_attrs = 0; -+ offset_type cu_index_and_attrs = 0; - DW2_GDB_INDEX_CU_SET_VALUE (cu_index_and_attrs, cu_index); - DW2_GDB_INDEX_SYMBOL_STATIC_SET_VALUE (cu_index_and_attrs, is_static); - DW2_GDB_INDEX_SYMBOL_KIND_SET_VALUE (cu_index_and_attrs, kind); -@@ -279,7 +288,7 @@ add_index_entry (struct mapped_symtab *symtab, const char *name, - the last entry pushed), but a symbol could have multiple kinds in one CU. - To keep things simple we don't worry about the duplication here and - sort and uniquify the list after we've processed all symbols. */ -- slot.cu_indices.push_back (cu_index_and_attrs); -+ slot->cu_indices.push_back (cu_index_and_attrs); - } - - /* See symtab_index_entry. */ -diff --git a/gdb/testsuite/gdb.gdb/index-file.exp b/gdb/testsuite/gdb.gdb/index-file.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.gdb/index-file.exp -@@ -0,0 +1,118 @@ -+# Copyright 2023 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Load the GDB executable, and then 'save gdb-index', and make some -+# checks of the generated index file. -+ -+load_lib selftest-support.exp -+ -+# Can't save an index with readnow. -+if {[readnow]} { -+ untested "cannot create an index when readnow is in use" -+ return -1 -+} -+ -+# A multiplier used to ensure slow tasks are less likely to timeout. -+set timeout_factor 20 -+ -+set filename [selftest_prepare] -+if { $filename eq "" } { -+ unsupported "${gdb_test_file_name}.exp" -+ return -1 -+} -+ -+with_timeout_factor $timeout_factor { -+ # Start GDB, load FILENAME. -+ clean_restart $filename -+} -+ -+# Generate an index file. -+set dir1 [standard_output_file "index_1"] -+remote_exec host "mkdir -p ${dir1}" -+with_timeout_factor $timeout_factor { -+ gdb_test_no_output "save gdb-index $dir1" \ -+ "create gdb-index file" -+} -+ -+# Close GDB. -+gdb_exit -+ -+# Validate that the index-file FILENAME has made efficient use of its -+# symbol hash table. Calculate the number of symbols in the hash -+# table and the total hash table size. The hash table starts with -+# 1024 entries, and then doubles each time it is filled to 75%. At -+# 75% filled, doubling the size takes it to 37.5% filled. -+# -+# Thus, the hash table is correctly filled if: -+# 1. Its size is 1024 (i.e. it has not yet had its first doubling), or -+# 2. Its filled percentage is over 37% -+# -+# We could check that it is not over filled, but I don't as that's not -+# really an issue. But we did once have a bug where the table was -+# doubled incorrectly, in which case we'd see a filled percentage of -+# around 2% in some cases, which is a huge waste of disk space. -+proc check_symbol_table_usage { filename } { -+ # Open the file in binary mode and read-only mode. -+ set fp [open $filename rb] -+ -+ # Configure the channel to use binary translation. -+ fconfigure $fp -translation binary -+ -+ # Read the first 8 bytes of the file, which contain the header of -+ # the index section. -+ set header [read $fp [expr 7 * 4]] -+ -+ # Scan the header to get the version, the CU list offset, and the -+ # types CU list offset. -+ binary scan $header iiiiii version \ -+ _ _ _ symbol_table_offset shortcut_offset -+ -+ # The length of the symbol hash table (in entries). -+ set len [expr ($shortcut_offset - $symbol_table_offset) / 8] -+ -+ # Now walk the hash table and count how many entries are in use. -+ set offset $symbol_table_offset -+ set count 0 -+ while { $offset < $shortcut_offset } { -+ seek $fp $offset -+ set entry [read $fp 8] -+ binary scan $entry ii name_ptr flags -+ if { $name_ptr != 0 } { -+ incr count -+ } -+ -+ incr offset 8 -+ } -+ -+ # Close the file. -+ close $fp -+ -+ # Calculate how full the cache is. -+ set pct [expr (100 * double($count)) / $len] -+ -+ # Write our results out to the gdb.log. -+ verbose -log "Hash table size: $len" -+ verbose -log "Hash table entries: $count" -+ verbose -log "Percentage usage: $pct%" -+ -+ # The minimum fill percentage is actually 37.5%, but we give TCL a -+ # little flexibility in case the FP maths give a result a little -+ # off. -+ gdb_assert { $len == 1024 || $pct > 37 } \ -+ "symbol hash table usage" -+} -+ -+set index_filename_base [file tail $filename] -+check_symbol_table_usage "$dir1/${index_filename_base}.gdb-index" diff --git a/gdb-rhbz1007614-memleak-infpy_read_memory-test.patch b/gdb-rhbz1007614-memleak-infpy_read_memory-test.patch deleted file mode 100644 index 4d05ba5..0000000 --- a/gdb-rhbz1007614-memleak-infpy_read_memory-test.patch +++ /dev/null @@ -1,170 +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-rhbz1007614-memleak-infpy_read_memory-test.patch - -;; Fix 'memory leak in infpy_read_memory()' (RH BZ 1007614) -;;=fedoratest - -Original message by Tom Tromey: - - - Message-ID: <871uoc1va3.fsf@fleche.redhat.com> - -Comment from Sergio Durigan Junior: - - In order to correctly test this patch, I wrote a testcase based on Jan - Kratochvil's . The - testcase, which can be seen below, tests GDB in order to see if the - amount of memory being leaked is minimal, as requested in the bugzilla. - It is hard to define what "minimum" is, so I ran the testcase on all - supported RHEL architectures and came up with an average. - -commit cc0265cdda9dc7e8665e8bfcf5b4477489daf27c -Author: Tom Tromey -Date: Wed Mar 28 17:38:08 2012 +0000 - - * python/py-inferior.c (infpy_read_memory): Remove cleanups and - explicitly free 'buffer' on exit paths. Decref 'membuf_object' - before returning. - -diff --git a/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.c b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.c -@@ -0,0 +1,27 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2014 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+static struct x -+ { -+ char unsigned u[4096]; -+ } x, *px = &x; -+ -+int -+main (int argc, char *argv[]) -+{ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.exp b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.exp -@@ -0,0 +1,68 @@ -+# Copyright 2014 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+set testfile py-gdb-rhbz1007614-memleak-infpy_read_memory -+set srcfile ${testfile}.c -+set binfile [standard_output_file ${testfile}] -+ -+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } { -+ return -1 -+} -+ -+if { [skip_python_tests] } { continue } -+ -+set pid_of_gdb [exp_pid -i [board_info host fileid]] -+ -+proc memory_v_pages_get {} { -+ global pid_of_gdb -+ set fd [open "/proc/$pid_of_gdb/statm"] -+ gets $fd line -+ close $fd -+ # number of pages of virtual memory -+ scan $line "%d" drs -+ return $drs -+} -+ -+if { ![runto_main] } { -+ untested $testfile.exp -+ return -1 -+} -+ -+set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}.py] -+ -+gdb_test "source ${remote_python_file}" "" -+ -+gdb_test "hello-world" "" -+ -+set kbytes_before [memory_v_pages_get] -+verbose -log "kbytes_before = $kbytes_before" -+ -+gdb_test "hello-world" "" -+ -+set kbytes_after [memory_v_pages_get] -+verbose -log "kbytes_after = $kbytes_after" -+ -+set kbytes_diff [expr $kbytes_after - $kbytes_before] -+verbose -log "kbytes_diff = $kbytes_diff" -+ -+# The value "1000" was calculated by running a few GDB sessions with this -+# testcase, and seeing how much (in average) the memory consumption -+# increased after the "hello-world" command issued above. The average -+# was around 500 bytes, so I chose 1000 as a high estimate. -+if { $kbytes_diff > 1000 } { -+ fail "there is a memory leak on GDB (RHBZ 1007614)" -+} else { -+ pass "there is not a memory leak on GDB (RHBZ 1007614)" -+} -diff --git a/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.py b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.py -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.python/py-gdb-rhbz1007614-memleak-infpy_read_memory.py -@@ -0,0 +1,30 @@ -+# Copyright (C) 2014 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+class HelloWorld (gdb.Command): -+ """Greet the whole world.""" -+ -+ def __init__ (self): -+ super (HelloWorld, self).__init__ ("hello-world", -+ gdb.COMMAND_OBSCURE) -+ -+ def invoke (self, arg, from_tty): -+ px = gdb.parse_and_eval("px") -+ core = gdb.inferiors()[0] -+ for i in range(256 * 1024): -+ chunk = core.read_memory(px, 4096) -+ print "Hello, World!" -+ -+HelloWorld () diff --git a/gdb-rhbz1149205-catch-syscall-after-fork-test.patch b/gdb-rhbz1149205-catch-syscall-after-fork-test.patch index 4af9e95..63c4051 100644 --- a/gdb-rhbz1149205-catch-syscall-after-fork-test.patch +++ b/gdb-rhbz1149205-catch-syscall-after-fork-test.patch @@ -8,6 +8,7 @@ Subject: gdb-rhbz1149205-catch-syscall-after-fork-test.patch ;;=fedoratest URL: +Message-ID: <1368136582.30058.7.camel@soleil> From: Philippe Waroquiers To: gdb-patches at sourceware dot org diff --git a/gdb-rhbz1156192-recursive-dlopen-test.patch b/gdb-rhbz1156192-recursive-dlopen-test.patch deleted file mode 100644 index 96b93ae..0000000 --- a/gdb-rhbz1156192-recursive-dlopen-test.patch +++ /dev/null @@ -1,371 +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-rhbz1156192-recursive-dlopen-test.patch - -;; Testcase for '[SAP] Recursive dlopen causes SAP HANA installer to -;; crash.' (RH BZ 1156192). -;;=fedoratest - -diff --git a/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen-libbar.c b/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen-libbar.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen-libbar.c -@@ -0,0 +1,30 @@ -+/* Testcase for recursive dlopen calls. -+ -+ Copyright (C) 2014 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 . */ -+ -+/* This test was copied from glibc's testcase called -+ and related files. */ -+ -+#include -+#include -+ -+void -+bar (void) -+{ -+ printf ("Called bar.\n"); -+} -diff --git a/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen-libfoo.c b/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen-libfoo.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen-libfoo.c -@@ -0,0 +1,30 @@ -+/* Testcase for recursive dlopen calls. -+ -+ Copyright (C) 2014 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 . */ -+ -+/* This test was copied from glibc's testcase called -+ and related files. */ -+ -+#include -+#include -+ -+void -+foo (void) -+{ -+ printf ("Called foo.\n"); -+} -diff --git a/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen.c b/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen.c -@@ -0,0 +1,125 @@ -+/* Testcase for recursive dlopen calls. -+ -+ Copyright (C) 2014 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 . */ -+ -+/* This test was copied from glibc's testcase called -+ and related files. */ -+ -+#include -+#include -+#include -+#include -+ -+#define DSO "gdb-rhbz1156192-recursive-dlopen-libfoo.so" -+#define FUNC "foo" -+ -+#define DSO1 "gdb-rhbz1156192-recursive-dlopen-libbar.so" -+#define FUNC1 "bar" -+ -+/* Prototype for my hook. */ -+void *custom_malloc_hook (size_t, const void *); -+ -+/* Pointer to old malloc hooks. */ -+void *(*old_malloc_hook) (size_t, const void *); -+ -+/* Call function func_name in DSO dso_name via dlopen. */ -+void -+call_func (const char *dso_name, const char *func_name) -+{ -+ int ret; -+ void *dso; -+ void (*func) (void); -+ char *err; -+ -+ /* Open the DSO. */ -+ dso = dlopen (dso_name, RTLD_NOW|RTLD_GLOBAL); -+ if (dso == NULL) -+ { -+ err = dlerror (); -+ fprintf (stderr, "%s\n", err); -+ exit (1); -+ } -+ /* Clear any errors. */ -+ dlerror (); -+ -+ /* Lookup func. */ -+ *(void **) (&func) = dlsym (dso, func_name); -+ if (func == NULL) -+ { -+ err = dlerror (); -+ if (err != NULL) -+ { -+ fprintf (stderr, "%s\n", err); -+ exit (1); -+ } -+ } -+ /* Call func twice. */ -+ (*func) (); -+ -+ /* Close the library and look for errors too. */ -+ ret = dlclose (dso); -+ if (ret != 0) -+ { -+ err = dlerror (); -+ fprintf (stderr, "%s\n", err); -+ exit (1); -+ } -+ -+} -+ -+/* Empty hook that does nothing. */ -+void * -+custom_malloc_hook (size_t size, const void *caller) -+{ -+ void *result; -+ /* Restore old hooks. */ -+ __malloc_hook = old_malloc_hook; -+ /* First call a function in another library via dlopen. */ -+ call_func (DSO1, FUNC1); -+ /* Called recursively. */ -+ result = malloc (size); -+ /* Restore new hooks. */ -+ old_malloc_hook = __malloc_hook; -+ __malloc_hook = custom_malloc_hook; -+ return result; -+} -+ -+int -+main (void) -+{ -+ -+ /* Save old hook. */ -+ old_malloc_hook = __malloc_hook; -+ /* Install new hook. */ -+ __malloc_hook = custom_malloc_hook; -+ -+ /* Attempt to dlopen a shared library. This dlopen will -+ trigger an access to the ld.so.cache, and that in turn -+ will require a malloc to duplicate data in the cache. -+ The malloc will call our malloc hook which calls dlopen -+ recursively, and upon return of this dlopen the non-ref -+ counted ld.so.cache mapping will be unmapped. We will -+ return to the original dlopen and crash trying to access -+ dlopened data. */ -+ call_func (DSO, FUNC); -+ -+ /* Restore old hook. */ -+ __malloc_hook = old_malloc_hook; -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen.exp b/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/gdb-rhbz1156192-recursive-dlopen.exp -@@ -0,0 +1,157 @@ -+# Copyright 2014 Free Software Foundation, Inc. -+# -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+if {[skip_shlib_tests]} { -+ untested "skipping shlib tests" -+ return 0 -+} elseif {[use_gdb_stub]} { -+ untested "skipping tests because of stub" -+ return 0 -+} -+ -+# Library foo -+set libname1 "gdb-rhbz1156192-recursive-dlopen-libfoo" -+set srcfile_lib1 ${srcdir}/${subdir}/${libname1}.c -+set binfile_lib1 [standard_output_file ${libname1}.so] -+# Library bar -+set libname2 "gdb-rhbz1156192-recursive-dlopen-libbar" -+set srcfile_lib2 ${srcdir}/${subdir}/${libname2}.c -+set binfile_lib2 [standard_output_file ${libname2}.so] -+ -+set testfile "gdb-rhbz1156192-recursive-dlopen" -+set srcfile ${testfile}.c -+set executable ${testfile} -+set binfile [standard_output_file ${executable}] -+ -+if { [gdb_compile_shlib ${srcfile_lib1} ${binfile_lib1} \ -+ { debug "additional_flags=-fPIC" }] != "" } { -+ untested "Could not compile ${binfile_lib1}" -+ return -1 -+} -+ -+if { [gdb_compile_shlib ${srcfile_lib2} ${binfile_lib2} \ -+ { debug "additional_flags=-fPIC" }] != "" } { -+ untested "Could not compile ${binfile_lib2}" -+ return -1 -+} -+ -+if { [prepare_for_testing ${testfile}.exp ${executable} ${srcfile} \ -+ [ list debug shlib_load "additional_flags=-Wno-deprecated-declarations" ]] } { -+ untested "Could not compile ${executable}" -+ return -1 -+} -+ -+set supported 0 -+gdb_test_multiple "run" "initial trial run" { -+ -re -wrap "exited normally.*" { -+ set supported 1 -+ pass $gdb_test_name -+ } -+ -re -wrap "exited with code.*" { -+ untested "failed at $gdb_test_name" -+ } -+} -+ -+if { $supported == 0 } { -+ return -1 -+} -+ -+proc do_test { has_libfoo has_libbar } { -+ global hex binfile_lib2 binfile_lib1 gdb_prompt -+ set libbar_match "[string_to_regexp $binfile_lib2]" -+ set libfoo_match "[string_to_regexp $binfile_lib1]" -+ -+ gdb_test_multiple "info shared" "info shared" { -+ -re ".*$libfoo_match\r\n.*$libbar_match\(\r\n.*Shared library is missing\)?.*\r\n${gdb_prompt} $" { -+ if { $has_libfoo && $has_libbar } { -+ pass "matched libfoo and libbar" -+ } else { -+ fail "matched libfoo and libbar (has_libfoo = $has_libfoo, has_libbar = $has_libbar)" -+ } -+ } -+ -re ".*$libfoo_match\(\r\n.*Shared library is missing\)?.*\r\n${gdb_prompt} $" { -+ if { $has_libfoo && !$has_libbar } { -+ pass "matched libfoo" -+ } else { -+ fail "matched libfoo (has_libfoo = $has_libfoo, has_libbar = $has_libbar)" -+ } -+ } -+ -re ".*$libbar_match\(\r\n.*Shared library is missing\)?.*\r\n${gdb_prompt} $" { -+ if { $has_libbar && !$has_libfoo } { -+ pass "matched libbar" -+ } else { -+ fail "matched libbar (has_libfoo = $has_libfoo, has_libbar = $has_libbar)" -+ } -+ } -+ "\r\n${gdb_prompt} $" { -+ if { !$has_libfoo && !$has_libbar } { -+ pass "did not match libfoo nor libbar" -+ } else { -+ fail "did not match libfoo nor libbar (has_libfoo = $has_libfoo, has_libbar = $has_libbar)" -+ } -+ } -+ } -+} -+ -+proc test_stop_on_solib_events { } { -+ set pass 0 -+ # This variable holds the information about whether libfoo and -+ # libbar (respectively) are expected in the "info shared" output. -+ set solib_event_order { { 0 0 } { 0 0 } { 0 0 } { 0 1 } \ -+ { 0 1 } { 0 0 } { 0 0 } { 0 1 } \ -+ { 0 1 } { 0 0 } { 0 0 } { 0 1 } \ -+ { 0 1 } { 0 0 } { 0 0 1 } { 1 1 } \ -+ { 1 1 } { 1 0 } { 1 0 } { 1 1 } \ -+ { 1 1 } { 1 0 1 } { 1 0 } { 1 0 } } -+ -+ with_test_prefix "stop-on-solib-events" { -+ gdb_test_no_output "set stop-on-solib-events 1" "setting stop-on-solib-events" -+ -+ gdb_run_cmd -+ gdb_test "" "Wait for first prompt" -+ foreach l $solib_event_order { -+ incr pass -+ with_test_prefix "pass #$pass" { -+ set should_be_corrupted [expr 0+0[lindex $l 2]] -+ do_test [lindex $l 0] [lindex $l 1] -+ set test "continue" -+ global gdb_prompt -+ gdb_test_multiple $test $test { -+ -re "\r\nwarning: Corrupted shared library list:.*\r\nStopped due to shared library event.*\r\n$gdb_prompt $" { -+ set corrupted 1 -+ pass $test -+ } -+ -re "\r\nStopped due to shared library event.*\r\n$gdb_prompt $" { -+ set corrupted 0 -+ pass $test -+ } -+ } -+ set test "corrupted=$corrupted but should_be_corrupted=$should_be_corrupted" -+ if {$corrupted == $should_be_corrupted} { -+ pass $test -+ } else { -+ fail $test -+ } -+ } -+ } -+ # In the last pass we do not expect to see libfoo or libbar. -+ incr pass -+ with_test_prefix "pass #$pass" { -+ do_test 0 0 -+ } -+ } -+} -+ -+test_stop_on_solib_events diff --git a/gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch b/gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch deleted file mode 100644 index a0eb440..0000000 --- a/gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch +++ /dev/null @@ -1,104 +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-rhbz1261564-aarch64-hw-watchpoint-test.patch - -;; [aarch64] Fix hardware watchpoints (RH BZ 1261564). -;;=fedoratest - -diff --git a/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.c b/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.c -@@ -0,0 +1,33 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2016 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+__attribute__((aligned(16))) struct -+{ -+ int var0, var4, var8; -+} aligned; -+ -+int -+main (void) -+{ -+ aligned.var0 = 1; -+ aligned.var4 = 2; -+ aligned.var8 = 3; -+ -+ aligned.var4 = aligned.var0; -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.exp b/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/rhbz1261564-aarch64-watchpoint.exp -@@ -0,0 +1,53 @@ -+# Copyright (C) 2016 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+if { [prepare_for_testing rhbz1261564-aarch64-watchpoint.exp "rhbz1261564-aarch64-watchpoint"] } { -+ return -1 -+} -+ -+if { ! [ runto main ] } then { return 0 } -+ -+set test "rwatch aligned.var4" -+if [istarget "s390*-*-*"] { -+ gdb_test $test {Target does not support this type of hardware watchpoint\.} -+ untested "s390* does not support hw read watchpoint" -+ return -+} -+gdb_test $test "Hardware read watchpoint \[0-9\]+: aligned.var4" -+ -+proc checkvar { address } { -+ global gdb_prompt -+ -+ set test "p &aligned.var$address" -+ gdb_test_multiple $test $test { -+ -re " = \\(int \\*\\) 0x\[0-9a-f\]+$address \r\n$gdb_prompt $" { -+ pass $test -+ } -+ -re "\r\n$gdb_prompt $" { -+ untested "$test (unexpected ELF layout)" -+ return 0 -+ } -+ } -+ return 1 -+} -+if ![checkvar "0"] { return } -+if ![checkvar "4"] { return } -+if ![checkvar "8"] { return } -+ -+# Assumes: PPC_PTRACE_GETHWDBGINFO::data_bp_alignment == 8 -+# 'lwz' does read only 4 bytes but the hw watchpoint is 8 bytes wide. -+setup_xfail "powerpc*-*-*" -+ -+gdb_continue_to_end diff --git a/gdb-rhbz2232086-refactor-selftest-support.patch b/gdb-rhbz2232086-refactor-selftest-support.patch deleted file mode 100644 index e9febf7..0000000 --- a/gdb-rhbz2232086-refactor-selftest-support.patch +++ /dev/null @@ -1,77 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andrew Burgess -Date: Fri, 24 Nov 2023 11:10:08 +0000 -Subject: gdb-rhbz2232086-refactor-selftest-support.patch - -;; Back-port upstream commit 1f0fab7ff86 as part of a fix for -;; non-deterministic gdb-index generation (RH BZ 2232086). - -gdb/testsuite: small refactor in selftest-support.exp - -Split out the code that makes a copy of the GDB executable ready for -self testing into a new proc. A later commit in this series wants to -load the GDB executable into GDB (for creating an on-disk debug -index), but doesn't need to make use of the full do_self_tests proc. - -There should be no changes in what is tested after this commit. - -Approved-By: Tom Tromey - -diff --git a/gdb/testsuite/lib/selftest-support.exp b/gdb/testsuite/lib/selftest-support.exp ---- a/gdb/testsuite/lib/selftest-support.exp -+++ b/gdb/testsuite/lib/selftest-support.exp -@@ -92,11 +92,13 @@ proc selftest_setup { executable function } { - return 0 - } - --# A simple way to run some self-tests. -- --proc do_self_tests {function body} { -- global GDB tool -- -+# Prepare for running a self-test by moving the GDB executable to a -+# location where we can use it as the inferior. Return the filename -+# of the new location. -+# -+# If the current testing setup is not suitable for running a -+# self-test, then return an empty string. -+proc selftest_prepare {} { - # Are we testing with a remote board? In that case, the target - # won't have access to the GDB's auxilliary data files - # (data-directory, etc.). It's simpler to just skip. -@@ -120,19 +122,31 @@ proc do_self_tests {function body} { - # Run the test with self. Copy the file executable file in case - # this OS doesn't like to edit its own text space. - -- set GDB_FULLPATH [find_gdb $GDB] -+ set gdb_fullpath [find_gdb $::GDB] - - if {[is_remote host]} { -- set xgdb x$tool -+ set xgdb x$::tool - } else { -- set xgdb [standard_output_file x$tool] -+ set xgdb [standard_output_file x$::tool] - } - - # Remove any old copy lying around. - remote_file host delete $xgdb - -+ set filename [remote_download host $gdb_fullpath $xgdb] -+ -+ return $filename -+} -+ -+# A simple way to run some self-tests. -+ -+proc do_self_tests {function body} { -+ set file [selftest_prepare] -+ if { $file eq "" } { -+ return -+ } -+ - gdb_start -- set file [remote_download host $GDB_FULLPATH $xgdb] - - # When debugging GDB with GDB, some operations can take a relatively long - # time, especially if the build is non-optimized. Bump the timeout for the diff --git a/gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch b/gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch deleted file mode 100644 index 1997ef9..0000000 --- a/gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch +++ /dev/null @@ -1,48 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= -Date: Mon, 8 Jan 2024 13:24:05 +0100 -Subject: gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch - -gdb/python: avoid use of _PyOS_ReadlineTState - -In python/py-gdb-readline.c we make use of _PyOS_ReadlineTState, -however, this variable is no longer public in Python 3.13, and so GDB -no longer builds. - -We are making use of _PyOS_ReadlineTState in order to re-acquire the -Python Global Interpreter Lock (GIL). The _PyOS_ReadlineTState -variable is set in Python's outer readline code prior to calling the -user (GDB) supplied readline callback function, which for us is -gdbpy_readline_wrapper. The gdbpy_readline_wrapper function is called -without the GIL held. - -Instead of using _PyOS_ReadlineTState, I propose that we switch to -calling PyGILState_Ensure() and PyGILState_Release(). These functions -will acquire the GIL based on the current thread. I think this should -be sufficient; I can't imagine why we'd be running -gdbpy_readline_wrapper on one thread on behalf of a different Python -thread.... that would be unexpected I think. - -Approved-By: Tom Tromey - -diff --git a/gdb/python/py-gdb-readline.c b/gdb/python/py-gdb-readline.c ---- a/gdb/python/py-gdb-readline.c -+++ b/gdb/python/py-gdb-readline.c -@@ -56,13 +56,11 @@ gdbpy_readline_wrapper (FILE *sys_stdin, FILE *sys_stdout, - if (except.reason == RETURN_QUIT) - return NULL; - -- /* The thread state is nulled during gdbpy_readline_wrapper, -- with the original value saved in the following undocumented -- variable (see Python's Parser/myreadline.c and -- Modules/readline.c). */ -- PyEval_RestoreThread (_PyOS_ReadlineTState); -+ -+ /* This readline callback is called without the GIL held. */ -+ gdbpy_gil gil; -+ - gdbpy_convert_exception (except); -- PyEval_SaveThread (); - return NULL; - } - diff --git a/gdb-rhbz2250652-gdbpy_gil.patch b/gdb-rhbz2250652-gdbpy_gil.patch deleted file mode 100644 index a72c350..0000000 --- a/gdb-rhbz2250652-gdbpy_gil.patch +++ /dev/null @@ -1,81 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: =?UTF-8?q?Alexandra=20H=C3=A1jkov=C3=A1?= -Date: Mon, 8 Jan 2024 13:12:15 +0100 -Subject: gdb-rhbz2250652-gdbpy_gil.patch - -gdb: move gdbpy_gil into python-internal.h - -Move gdbpy_gil class into python-internal.h, the next -commit wants to make use of this class from a file other -than python.c. - -Approved-By: Tom Tromey - -diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h ---- a/gdb/python/python-internal.h -+++ b/gdb/python/python-internal.h -@@ -754,6 +754,30 @@ class gdbpy_allow_threads - PyThreadState *m_save; - }; - -+/* A helper class to save and restore the GIL, but without touching -+ the other globals that are handled by gdbpy_enter. */ -+ -+class gdbpy_gil -+{ -+public: -+ -+ gdbpy_gil () -+ : m_state (PyGILState_Ensure ()) -+ { -+ } -+ -+ ~gdbpy_gil () -+ { -+ PyGILState_Release (m_state); -+ } -+ -+ DISABLE_COPY_AND_ASSIGN (gdbpy_gil); -+ -+private: -+ -+ PyGILState_STATE m_state; -+}; -+ - /* Use this after a TRY_EXCEPT to throw the appropriate Python - exception. */ - #define GDB_PY_HANDLE_EXCEPTION(Exception) \ -diff --git a/gdb/python/python.c b/gdb/python/python.c ---- a/gdb/python/python.c -+++ b/gdb/python/python.c -@@ -257,30 +257,6 @@ gdbpy_enter::finalize () - python_gdbarch = target_gdbarch (); - } - --/* A helper class to save and restore the GIL, but without touching -- the other globals that are handled by gdbpy_enter. */ -- --class gdbpy_gil --{ --public: -- -- gdbpy_gil () -- : m_state (PyGILState_Ensure ()) -- { -- } -- -- ~gdbpy_gil () -- { -- PyGILState_Release (m_state); -- } -- -- DISABLE_COPY_AND_ASSIGN (gdbpy_gil); -- --private: -- -- PyGILState_STATE m_state; --}; -- - /* Set the quit flag. */ - - static void diff --git a/gdb-rhbz2261580-intrusive_list-assertion-fix.patch b/gdb-rhbz2261580-intrusive_list-assertion-fix.patch deleted file mode 100644 index adb8eb7..0000000 --- a/gdb-rhbz2261580-intrusive_list-assertion-fix.patch +++ /dev/null @@ -1,55 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Kevin Buettner -Date: Mon, 29 Jan 2024 14:51:22 -0700 -Subject: gdb-rhbz2261580-intrusive_list-assertion-fix.patch - -;; Backport upstream workaround for GCC 14 problem which cause assertion -;; failures in GDB. - -[gdb/build] Workaround gcc PR113599 - -Since gcc commit d3f48f68227 ("c++: non-dependent .* operand folding -[PR112427]"), with gdb we run into PR gcc/113599 [1], a wrong-code bug, as -reported in PR build/31281. - -Work around this by flipping inherit order: -... --class thread_info : public refcounted_object, -- public intrusive_list_node -+class thread_info : public intrusive_list_node, -+ public refcounted_object -... - -An argument could be made that this isn't necessary, because this occurred in -an unreleased gcc version. - -However, I think it could be useful when bisecting gcc for other problems in -building gdb. Having this workaround means the bisect won't reintroduce the -problem. Furthermore, the workaround is harmless. - -Tested on Fedora rawhide x86_64. - -Approved-By: Tom Tromey - -Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=31281 - -[1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=113599 - -diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h ---- a/gdb/gdbthread.h -+++ b/gdb/gdbthread.h -@@ -242,10 +242,11 @@ using private_thread_info_up = std::unique_ptr; - strong reference, and is thus not accounted for in the thread's - refcount. - -- The intrusive_list_node base links threads in a per-inferior list. */ -+ The intrusive_list_node base links threads in a per-inferior list. -+ We place it first in the inherit order to work around PR gcc/113599. */ - --class thread_info : public refcounted_object, -- public intrusive_list_node -+class thread_info : public intrusive_list_node, -+ public refcounted_object - { - public: - explicit thread_info (inferior *inf, ptid_t ptid); diff --git a/gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch b/gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch deleted file mode 100644 index 0df5ee5..0000000 --- a/gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch +++ /dev/null @@ -1,147 +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-rhbz947564-findvar-assertion-frame-failed-testcase.patch - -;; Import regression test for `gdb/findvar.c:417: internal-error: -;; read_var_value: Assertion `frame' failed.' (RH BZ 947564) from RHEL 6.5. -;;=fedoratest - -diff --git a/gdb/testsuite/gdb.threads/tls-rhbz947564.cc b/gdb/testsuite/gdb.threads/tls-rhbz947564.cc -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/tls-rhbz947564.cc -@@ -0,0 +1,53 @@ -+#include -+#include -+ -+class x -+ { -+ public: -+ int n; -+ -+ x() : n(0) {} -+ }; -+ -+class y -+ { -+ public: -+ int v; -+ -+ y() : v(0) {} -+ static __thread x *xp; -+ }; -+ -+__thread x *y::xp; -+ -+static void -+foo (y *yp) -+{ -+ yp->v = 1; /* foo_marker */ -+} -+ -+static void * -+bar (void *unused) -+{ -+ x xinst; -+ y::xp= &xinst; -+ -+ y yy; -+ foo(&yy); -+ -+ return NULL; -+} -+ -+int -+main(int argc, char *argv[]) -+{ -+ pthread_t t[2]; -+ -+ pthread_create (&t[0], NULL, bar, NULL); -+ pthread_create (&t[1], NULL, bar, NULL); -+ -+ pthread_join (t[0], NULL); -+ pthread_join (t[1], NULL); -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.threads/tls-rhbz947564.exp b/gdb/testsuite/gdb.threads/tls-rhbz947564.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/tls-rhbz947564.exp -@@ -0,0 +1,75 @@ -+# Copyright (C) 2013 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . */ -+ -+set testfile tls-rhbz947564 -+set srcfile ${testfile}.cc -+set binfile [standard_output_file ${testfile}] -+ -+if [istarget "*-*-linux"] then { -+ set target_cflags "-D_MIT_POSIX_THREADS" -+} else { -+ set target_cflags "" -+} -+ -+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable [list c++ debug]] != "" } { -+ return -1 -+} -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+ -+gdb_load ${binfile} -+ -+if { ![runto_main] } { -+ fail "Can't run to function main" -+ return 0 -+} -+ -+gdb_breakpoint "foo" -+gdb_continue_to_breakpoint "foo" ".* foo_marker .*" -+ -+proc get_xp_val {try} { -+ global expect_out -+ global gdb_prompt -+ global hex -+ -+ set xp_val "" -+ gdb_test_multiple "print *yp" "print yp value" { -+ -re { = \{v = 0, static xp = (0x[0-9a-f]+)\}.* } { -+ pass "print $try value of *yp" -+ set xp_val $expect_out(1,string) -+ } -+ -re "$gdb_prompt $" { -+ fail "print $try value of *yp" -+ } -+ timeout { -+ fail "print $try value of *yp (timeout)" -+ } -+ } -+ return $xp_val -+} -+ -+set first_run [get_xp_val "first"] -+ -+gdb_test "continue" "Breakpoint \[0-9\]+, foo \\\(yp=$hex\\\) at.*" -+ -+set second_run [get_xp_val "second"] -+ -+if { $first_run != $second_run } { -+ pass "different values for TLS variable" -+} else { -+ fail "different values for TLS variable" -+} diff --git a/gdb-rhel-13298-inferior-funcall-bp-condition-1-of-5.patch b/gdb-rhel-13298-inferior-funcall-bp-condition-1-of-5.patch deleted file mode 100644 index fbecc59..0000000 --- a/gdb-rhel-13298-inferior-funcall-bp-condition-1-of-5.patch +++ /dev/null @@ -1,70 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andrew Burgess -Date: Mon, 9 May 2022 17:51:54 +0100 -Subject: gdb-rhel-13298-inferior-funcall-bp-condition-1-of-5.patch - -;;Revert "gdb: remove unnecessary parameter wait_ptid from do_target_wait" -;;(Andrew Burgess, RHEL-13298) - -This reverts commit ac0d67ed1dcf470bad6a3bc4800c2ddc9bedecca. - -There was nothing wrong with the commit which I'm reverting here, but -it removed some functionality that will be needed for a later commit; -that is, the ability for GDB to ask for events from a specific ptid_t -via the do_target_wait function. - -In a follow up commit, this functionality will be used to implement -inferior function calls in multi-threaded inferiors. - -This is not a straight revert of the above commit. Reverting the -above commit replaces a 'nullptr' with 'NULL', I've gone in and -changed that, preserving the 'nullptr'. - -Reviewed-By: Tankut Baris Aktemur -Tested-By: Luis Machado -Tested-By: Keith Seitz - -diff --git a/gdb/infrun.c b/gdb/infrun.c ---- a/gdb/infrun.c -+++ b/gdb/infrun.c -@@ -3946,7 +3946,8 @@ do_target_wait_1 (inferior *inf, ptid_t ptid, - more events. Polls for events from all inferiors/targets. */ - - static bool --do_target_wait (execution_control_state *ecs, target_wait_flags options) -+do_target_wait (ptid_t wait_ptid, execution_control_state *ecs, -+ target_wait_flags options) - { - int num_inferiors = 0; - int random_selector; -@@ -3956,9 +3957,10 @@ do_target_wait (execution_control_state *ecs, target_wait_flags options) - polling the rest of the inferior list starting from that one in a - circular fashion until the whole list is polled once. */ - -- auto inferior_matches = [] (inferior *inf) -+ auto inferior_matches = [&wait_ptid] (inferior *inf) - { -- return inf->process_target () != nullptr; -+ return (inf->process_target () != nullptr -+ && ptid_t (inf->pid).matches (wait_ptid)); - }; - - /* First see how many matching inferiors we have. */ -@@ -3997,7 +3999,7 @@ do_target_wait (execution_control_state *ecs, target_wait_flags options) - - auto do_wait = [&] (inferior *inf) - { -- ecs->ptid = do_target_wait_1 (inf, minus_one_ptid, &ecs->ws, options); -+ ecs->ptid = do_target_wait_1 (inf, wait_ptid, &ecs->ws, options); - ecs->target = inf->process_target (); - return (ecs->ws.kind () != TARGET_WAITKIND_IGNORE); - }; -@@ -4427,7 +4429,7 @@ fetch_inferior_event () - the event. */ - scoped_disable_commit_resumed disable_commit_resumed ("handling event"); - -- if (!do_target_wait (&ecs, TARGET_WNOHANG)) -+ if (!do_target_wait (minus_one_ptid, &ecs, TARGET_WNOHANG)) - { - infrun_debug_printf ("do_target_wait returned no event"); - disable_commit_resumed.reset_and_commit (); diff --git a/gdb-rhel-13298-inferior-funcall-bp-condition-2-of-5.patch b/gdb-rhel-13298-inferior-funcall-bp-condition-2-of-5.patch deleted file mode 100644 index f582130..0000000 --- a/gdb-rhel-13298-inferior-funcall-bp-condition-2-of-5.patch +++ /dev/null @@ -1,1274 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andrew Burgess -Date: Fri, 9 Oct 2020 13:27:13 +0200 -Subject: gdb-rhel-13298-inferior-funcall-bp-condition-2-of-5.patch - -;;gdb: fix b/p conditions with infcalls in multi-threaded inferiors -;;(Andrew Burgess, RHEL-13298) - -This commit fixes bug PR 28942, that is, creating a conditional -breakpoint in a multi-threaded inferior, where the breakpoint -condition includes an inferior function call. - -Currently, when a user tries to create such a breakpoint, then GDB -will fail with: - - (gdb) break infcall-from-bp-cond-single.c:61 if (return_true ()) - Breakpoint 2 at 0x4011fa: file /tmp/build/gdb/testsuite/../../../src/gdb/testsuite/gdb.threads/infcall-from-bp-cond-single.c, line 61. - (gdb) continue - Continuing. - [New Thread 0x7ffff7c5d700 (LWP 2460150)] - [New Thread 0x7ffff745c700 (LWP 2460151)] - [New Thread 0x7ffff6c5b700 (LWP 2460152)] - [New Thread 0x7ffff645a700 (LWP 2460153)] - [New Thread 0x7ffff5c59700 (LWP 2460154)] - Error in testing breakpoint condition: - Couldn't get registers: No such process. - An error occurred while in a function called from GDB. - Evaluation of the expression containing the function - (return_true) will be abandoned. - When the function is done executing, GDB will silently stop. - Selected thread is running. - (gdb) - -Or, in some cases, like this: - - (gdb) break infcall-from-bp-cond-simple.c:56 if (is_matching_tid (arg, 1)) - Breakpoint 2 at 0x401194: file /tmp/build/gdb/testsuite/../../../src/gdb/testsuite/gdb.threads/infcall-from-bp-cond-simple.c, line 56. - (gdb) continue - Continuing. - [New Thread 0x7ffff7c5d700 (LWP 2461106)] - [New Thread 0x7ffff745c700 (LWP 2461107)] - ../../src.release/gdb/nat/x86-linux-dregs.c:146: internal-error: x86_linux_update_debug_registers: Assertion `lwp_is_stopped (lwp)' failed. - A problem internal to GDB has been detected, - further debugging may prove unreliable. - -The precise error depends on the exact thread state; so there's race -conditions depending on which threads have fully started, and which -have not. But the underlying problem is always the same; when GDB -tries to execute the inferior function call from within the breakpoint -condition, GDB will, incorrectly, try to resume threads that are -already running - GDB doesn't realise that some threads might already -be running. - -The solution proposed in this patch requires an additional member -variable thread_info::in_cond_eval. This flag is set to true (in -breakpoint.c) when GDB is evaluating a breakpoint condition. - -In user_visible_resume_ptid (infrun.c), when the in_cond_eval flag is -true, then GDB will only try to resume the current thread, that is, -the thread for which the breakpoint condition is being evaluated. -This solves the problem of GDB trying to resume threads that are -already running. - -The next problem is that inferior function calls are assumed to be -synchronous, that is, GDB doesn't expect to start an inferior function -call in thread #1, then receive a stop from thread #2 for some other, -unrelated reason. To prevent GDB responding to an event from another -thread, we update fetch_inferior_event and do_target_wait in infrun.c, -so that, when an inferior function call (on behalf of a breakpoint -condition) is in progress, we only wait for events from the current -thread (the one evaluating the condition). - -In do_target_wait I had to change the inferior_matches lambda -function, which is used to select which inferior to wait on. -Previously the logic was this: - - auto inferior_matches = [&wait_ptid] (inferior *inf) - { - return (inf->process_target () != nullptr - && ptid_t (inf->pid).matches (wait_ptid)); - }; - -This compares the pid of the inferior against the complete ptid we -want to wait on. Before this commit wait_ptid was only ever -minus_one_ptid (which is special, and means any process), and so every -inferior would match. - -After this commit though wait_ptid might represent a specific thread -in a specific inferior. If we compare the pid of the inferior to a -specific ptid then these will not match. The fix is to compare -against the pid extracted from the wait_ptid, not against the complete -wait_ptid itself. - -In fetch_inferior_event, after receiving the event, we only want to -stop all the other threads, and call inferior_event_handler with -INF_EXEC_COMPLETE, if we are not evaluating a conditional breakpoint. -If we are, then all the other threads should be left doing whatever -they were before. The inferior_event_handler call will be performed -once the breakpoint condition has finished being evaluated, and GDB -decides to stop or not. - -The final problem that needs solving relates to GDB's commit-resume -mechanism, which allows GDB to collect resume requests into a single -packet in order to reduce traffic to a remote target. - -The problem is that the commit-resume mechanism will not send any -resume requests for an inferior if there are already events pending on -the GDB side. - -Imagine an inferior with two threads. Both threads hit a breakpoint, -maybe the same conditional breakpoint. At this point there are two -pending events, one for each thread. - -GDB selects one of the events and spots that this is a conditional -breakpoint, GDB evaluates the condition. - -The condition includes an inferior function call, so GDB sets up for -the call and resumes the one thread, the resume request is added to -the commit-resume queue. - -When the commit-resume queue is committed GDB sees that there is a -pending event from another thread, and so doesn't send any resume -requests to the actual target, GDB is assuming that when we wait we -will select the event from the other thread. - -However, as this is an inferior function call for a condition -evaluation, we will not select the event from the other thread, we -only care about events from the thread that is evaluating the -condition - and the resume for this thread was never sent to the -target. - -And so, GDB hangs, waiting for an event from a thread that was never -fully resumed. - -To fix this issue I have added the concept of "forcing" the -commit-resume queue. When enabling commit resume, if the force flag -is true, then any resumes will be committed to the target, even if -there are other threads with pending events. - -A note on authorship: this patch was based on some work done by -Natalia Saiapova and Tankut Baris Aktemur from Intel[1]. I have made -some changes to their work in this version. - -Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=28942 - -[1] https://sourceware.org/pipermail/gdb-patches/2020-October/172454.html - -Co-authored-by: Natalia Saiapova -Co-authored-by: Tankut Baris Aktemur -Reviewed-By: Tankut Baris Aktemur -Tested-By: Luis Machado -Tested-By: Keith Seitz - -diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c ---- a/gdb/breakpoint.c -+++ b/gdb/breakpoint.c -@@ -5679,6 +5679,8 @@ bpstat_check_breakpoint_conditions (bpstat *bs, thread_info *thread) - { - try - { -+ scoped_restore reset_in_cond_eval -+ = make_scoped_restore (&thread->control.in_cond_eval, true); - condition_result = breakpoint_cond_eval (cond); - } - catch (const gdb_exception_error &ex) -diff --git a/gdb/gdbthread.h b/gdb/gdbthread.h ---- a/gdb/gdbthread.h -+++ b/gdb/gdbthread.h -@@ -171,6 +171,9 @@ struct thread_control_state - command. This is used to decide whether "set scheduler-locking - step" behaves like "on" or "off". */ - int stepping_command = 0; -+ -+ /* True if the thread is evaluating a BP condition. */ -+ bool in_cond_eval = false; - }; - - /* Inferior thread specific part of `struct infcall_suspend_state'. */ -diff --git a/gdb/infcall.c b/gdb/infcall.c ---- a/gdb/infcall.c -+++ b/gdb/infcall.c -@@ -672,6 +672,12 @@ run_inferior_call (std::unique_ptr sm, - - proceed (real_pc, GDB_SIGNAL_0); - -+ /* Enable commit resume, but pass true for the force flag. This -+ ensures any thread we set running in proceed will actually be -+ committed to the target, even if some other thread in the current -+ target has a pending event. */ -+ scoped_enable_commit_resumed enable ("infcall", true); -+ - infrun_debug_show_threads ("non-exited threads after proceed for inferior-call", - all_non_exited_threads ()); - -diff --git a/gdb/infrun.c b/gdb/infrun.c ---- a/gdb/infrun.c -+++ b/gdb/infrun.c -@@ -2292,6 +2292,14 @@ user_visible_resume_ptid (int step) - mode. */ - resume_ptid = inferior_ptid; - } -+ else if (inferior_ptid != null_ptid -+ && inferior_thread ()->control.in_cond_eval) -+ { -+ /* The inferior thread is evaluating a BP condition. Other threads -+ might be stopped or running and we do not want to change their -+ state, thus, resume only the current thread. */ -+ resume_ptid = inferior_ptid; -+ } - else if (!sched_multi && target_supports_multi_process ()) - { - /* Resume all threads of the current process (and none of other -@@ -3020,12 +3028,24 @@ schedlock_applies (struct thread_info *tp) - execution_direction))); - } - --/* Set process_stratum_target::COMMIT_RESUMED_STATE in all target -- stacks that have threads executing and don't have threads with -- pending events. */ -+/* When FORCE_P is false, set process_stratum_target::COMMIT_RESUMED_STATE -+ in all target stacks that have threads executing and don't have threads -+ with pending events. -+ -+ When FORCE_P is true, set process_stratum_target::COMMIT_RESUMED_STATE -+ in all target stacks that have threads executing regardless of whether -+ there are pending events or not. -+ -+ Passing FORCE_P as false makes sense when GDB is going to wait for -+ events from all threads and will therefore spot the pending events. -+ However, if GDB is only going to wait for events from select threads -+ (i.e. when performing an inferior call) then a pending event on some -+ other thread will not be spotted, and if we fail to commit the resume -+ state for the thread performing the inferior call, then the inferior -+ call will never complete (or even start). */ - - static void --maybe_set_commit_resumed_all_targets () -+maybe_set_commit_resumed_all_targets (bool force_p) - { - scoped_restore_current_thread restore_thread; - -@@ -3054,7 +3074,7 @@ maybe_set_commit_resumed_all_targets () - status to report, handle it before requiring the target to - commit its resumed threads: handling the status might lead to - resuming more threads. */ -- if (proc_target->has_resumed_with_pending_wait_status ()) -+ if (!force_p && proc_target->has_resumed_with_pending_wait_status ()) - { - infrun_debug_printf ("not requesting commit-resumed for target %s, a" - " thread has a pending waitstatus", -@@ -3064,7 +3084,7 @@ maybe_set_commit_resumed_all_targets () - - switch_to_inferior_no_thread (inf); - -- if (target_has_pending_events ()) -+ if (!force_p && target_has_pending_events ()) - { - infrun_debug_printf ("not requesting commit-resumed for target %s, " - "target has pending events", -@@ -3157,7 +3177,7 @@ scoped_disable_commit_resumed::reset () - { - /* This is the outermost instance, re-enable - COMMIT_RESUMED_STATE on the targets where it's possible. */ -- maybe_set_commit_resumed_all_targets (); -+ maybe_set_commit_resumed_all_targets (false); - } - else - { -@@ -3190,7 +3210,7 @@ scoped_disable_commit_resumed::reset_and_commit () - /* See infrun.h. */ - - scoped_enable_commit_resumed::scoped_enable_commit_resumed -- (const char *reason) -+ (const char *reason, bool force_p) - : m_reason (reason), - m_prev_enable_commit_resumed (enable_commit_resumed) - { -@@ -3202,7 +3222,7 @@ scoped_enable_commit_resumed::scoped_enable_commit_resumed - - /* Re-enable COMMIT_RESUMED_STATE on the targets where it's - possible. */ -- maybe_set_commit_resumed_all_targets (); -+ maybe_set_commit_resumed_all_targets (force_p); - - maybe_call_commit_resumed_all_targets (); - } -@@ -3957,10 +3977,11 @@ do_target_wait (ptid_t wait_ptid, execution_control_state *ecs, - polling the rest of the inferior list starting from that one in a - circular fashion until the whole list is polled once. */ - -- auto inferior_matches = [&wait_ptid] (inferior *inf) -+ ptid_t wait_ptid_pid {wait_ptid.pid ()}; -+ auto inferior_matches = [&wait_ptid_pid] (inferior *inf) - { - return (inf->process_target () != nullptr -- && ptid_t (inf->pid).matches (wait_ptid)); -+ && ptid_t (inf->pid).matches (wait_ptid_pid)); - }; - - /* First see how many matching inferiors we have. */ -@@ -4429,7 +4450,17 @@ fetch_inferior_event () - the event. */ - scoped_disable_commit_resumed disable_commit_resumed ("handling event"); - -- if (!do_target_wait (minus_one_ptid, &ecs, TARGET_WNOHANG)) -+ /* Is the current thread performing an inferior function call as part -+ of a breakpoint condition evaluation? */ -+ bool in_cond_eval = (inferior_ptid != null_ptid -+ && inferior_thread ()->control.in_cond_eval); -+ -+ /* If the thread is in the middle of the condition evaluation, wait for -+ an event from the current thread. Otherwise, wait for an event from -+ any thread. */ -+ ptid_t waiton_ptid = in_cond_eval ? inferior_ptid : minus_one_ptid; -+ -+ if (!do_target_wait (waiton_ptid, &ecs, TARGET_WNOHANG)) - { - infrun_debug_printf ("do_target_wait returned no event"); - disable_commit_resumed.reset_and_commit (); -@@ -4487,7 +4518,12 @@ fetch_inferior_event () - bool should_notify_stop = true; - bool proceeded = false; - -- stop_all_threads_if_all_stop_mode (); -+ /* If the thread that stopped just completed an inferior -+ function call as part of a condition evaluation, then we -+ don't want to stop all the other threads. */ -+ if (ecs.event_thread == nullptr -+ || !ecs.event_thread->control.in_cond_eval) -+ stop_all_threads_if_all_stop_mode (); - - clean_up_just_stopped_threads_fsms (&ecs); - -@@ -4514,7 +4550,7 @@ fetch_inferior_event () - proceeded = normal_stop (); - } - -- if (!proceeded) -+ if (!proceeded && !in_cond_eval) - { - inferior_event_handler (INF_EXEC_COMPLETE); - cmd_done = 1; -diff --git a/gdb/infrun.h b/gdb/infrun.h ---- a/gdb/infrun.h -+++ b/gdb/infrun.h -@@ -406,7 +406,8 @@ extern void maybe_call_commit_resumed_all_targets (); - - struct scoped_enable_commit_resumed - { -- explicit scoped_enable_commit_resumed (const char *reason); -+ explicit scoped_enable_commit_resumed (const char *reason, -+ bool force_p = false); - ~scoped_enable_commit_resumed (); - - DISABLE_COPY_AND_ASSIGN (scoped_enable_commit_resumed); -diff --git a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-other-thread-event.c b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-other-thread-event.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-other-thread-event.c -@@ -0,0 +1,135 @@ -+/* Copyright 2022-2024 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include -+#include -+#include -+#include -+ -+#define NUM_THREADS 2 -+ -+pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; -+ -+/* Some global variables to poke, just for something to do. */ -+volatile int global_var_0 = 0; -+volatile int global_var_1 = 0; -+ -+/* This flag is updated from GDB. */ -+volatile int raise_signal = 0; -+ -+/* Implement the breakpoint condition function. Release the other thread -+ and try to give the other thread a chance to run. Then return ANSWER. */ -+int -+condition_core_func (int answer) -+{ -+ /* This unlock should release the other thread. */ -+ if (pthread_mutex_unlock (&mutex) != 0) -+ abort (); -+ -+ /* And this yield and sleep should (hopefully) give the other thread a -+ chance to run. This isn't guaranteed of course, but once the other -+ thread does run it should hit a breakpoint, which GDB should -+ (temporarily) ignore, so there's no easy way for us to know the other -+ thread has done what it needs to, thus, yielding and sleeping is the -+ best we can do. */ -+ sched_yield (); -+ sleep (2); -+ -+ return answer; -+} -+ -+void -+stop_marker () -+{ -+ int a = 100; /* Final breakpoint here. */ -+} -+ -+/* A breakpoint condition function that always returns true. */ -+int -+condition_true_func () -+{ -+ return condition_core_func (1); -+} -+ -+/* A breakpoint condition function that always returns false. */ -+int -+condition_false_func () -+{ -+ return condition_core_func (0); -+} -+ -+void * -+worker_func (void *arg) -+{ -+ volatile int *ptr = 0; -+ int tid = *((int *) arg); -+ -+ switch (tid) -+ { -+ case 0: -+ global_var_0 = 11; /* First thread breakpoint. */ -+ break; -+ -+ case 1: -+ if (pthread_mutex_lock (&mutex) != 0) -+ abort (); -+ if (raise_signal) -+ global_var_1 = *ptr; /* Signal here. */ -+ else -+ global_var_1 = 99; /* Other thread breakpoint. */ -+ break; -+ -+ default: -+ abort (); -+ } -+ -+ return NULL; -+} -+ -+int -+main () -+{ -+ pthread_t threads[NUM_THREADS]; -+ int args[NUM_THREADS]; -+ -+ /* Set an alarm, just in case the test deadlocks. */ -+ alarm (300); -+ -+ /* We want the mutex to start locked. */ -+ if (pthread_mutex_lock (&mutex) != 0) -+ abort (); -+ -+ for (int i = 0; i < NUM_THREADS; i++) -+ { -+ args[i] = i; -+ pthread_create (&threads[i], NULL, worker_func, &args[i]); -+ } -+ -+ for (int i = 0; i < NUM_THREADS; i++) -+ { -+ void *retval; -+ pthread_join (threads[i], &retval); -+ } -+ -+ /* Unlock once we're done, just for cleanliness. */ -+ if (pthread_mutex_unlock (&mutex) != 0) -+ abort (); -+ -+ stop_marker (); -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-other-thread-event.exp b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-other-thread-event.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-other-thread-event.exp -@@ -0,0 +1,174 @@ -+# Copyright 2022-2024 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Test for conditional breakpoints where the breakpoint condition includes -+# an inferior function call. -+# -+# The tests in this script are testing what happens when an event arrives in -+# another thread while GDB is waiting for the inferior function call (in the -+# breakpoint condition) to finish. -+# -+# The expectation is that GDB will queue events for other threads and wait -+# for the inferior function call to complete, if the condition is true, then -+# the conditional breakpoint should be reported first. The other thread -+# event should of course, not get lost, and should be reported as soon as -+# the user tries to continue the inferior. -+# -+# If the conditional breakpoint ends up not being taken (the condition is -+# false), then the other thread event should be reported immediately. -+# -+# This script tests what happens when the other thread event is (a) the -+# other thread hitting a breakpoint, and (b) the other thread taking a -+# signal (SIGSEGV in this case). -+ -+standard_testfile -+ -+if { [build_executable "failed to prepare" ${binfile} "${srcfile}" \ -+ {debug pthreads}] == -1 } { -+ return -+} -+ -+set cond_bp_line [gdb_get_line_number "First thread breakpoint"] -+set other_bp_line [gdb_get_line_number "Other thread breakpoint"] -+set final_bp_line [gdb_get_line_number "Final breakpoint here"] -+set signal_line [gdb_get_line_number "Signal here"] -+ -+# Start GDB based on TARGET_ASYNC and TARGET_NON_STOP, and then runto main. -+proc start_gdb_and_runto_main { target_async target_non_stop } { -+ save_vars { ::GDBFLAGS } { -+ append ::GDBFLAGS \ -+ " -ex \"maint set target-non-stop $target_non_stop\"" -+ append ::GDBFLAGS \ -+ " -ex \"maintenance set target-async ${target_async}\"" -+ -+ clean_restart ${::binfile} -+ } -+ -+ if { ![runto_main] } { -+ return -1 -+ } -+ -+ return 0 -+} -+ -+# Run a test of GDB's conditional breakpoints, where the conditions include -+# inferior function calls. While the inferior function call is executing -+# another thread will hit a breakpoint (when OTHER_THREAD_SIGNAL is false), -+# or receive a signal (when OTHER_THREAD_SIGNAL is true). GDB should report -+# the conditional breakpoint first (if the condition is true), and then -+# report the second thread event once the inferior is continued again. -+# -+# When STOP_AT_COND is true then the conditional breakpoint will have a -+# condition that evaluates to true (and GDB will stop at the breakpoint), -+# otherwise, the condition will evaluate to false (and GDB will not stop at -+# the breakpoint). -+proc run_condition_test { stop_at_cond other_thread_signal \ -+ target_async target_non_stop } { -+ if { [start_gdb_and_runto_main $target_async \ -+ $target_non_stop] == -1 } { -+ return -+ } -+ -+ # Setup the conditional breakpoint. -+ if { $stop_at_cond } { -+ set cond_func "condition_true_func" -+ } else { -+ set cond_func "condition_false_func" -+ } -+ gdb_breakpoint \ -+ "${::srcfile}:${::cond_bp_line} if (${cond_func} ())" -+ set cond_bp_num [get_integer_valueof "\$bpnum" "*UNKNOWN*" \ -+ "get number for conditional breakpoint"] -+ -+ if { $other_thread_signal } { -+ # Arrange for the other thread to raise a signal while GDB is -+ # evaluating the breakpoint condition. -+ gdb_test_no_output "set raise_signal = 1" -+ } else { -+ # And a breakpoint that will be hit by another thread only once the -+ # breakpoint condition starts to be evaluated. -+ gdb_breakpoint "${::srcfile}:${::other_bp_line}" -+ set other_bp_num [get_integer_valueof "\$bpnum" "*UNKNOWN*" \ -+ "get number for other breakpoint"] -+ } -+ -+ # A final breakpoint once the test has completed. -+ gdb_breakpoint "${::srcfile}:${::final_bp_line}" -+ set final_bp_num [get_integer_valueof "\$bpnum" "*UNKNOWN*" \ -+ "get number for final breakpoint"] -+ -+ if { $stop_at_cond } { -+ # Continue. The first breakpoint we hit should be the conditional -+ # breakpoint. The other thread will have hit its breakpoint, but -+ # that will have been deferred until the conditional breakpoint is -+ # reported. -+ gdb_test "continue" \ -+ [multi_line \ -+ "Continuing\\." \ -+ ".*" \ -+ "" \ -+ "Thread ${::decimal} \"\[^\"\r\n\]+\" hit Breakpoint ${cond_bp_num}, worker_func \[^\r\n\]+:${::cond_bp_line}" \ -+ "${::decimal}\\s+\[^\r\n\]+First thread breakpoint\[^\r\n\]+"] \ -+ "hit the conditional breakpoint" -+ } -+ -+ if { $other_thread_signal } { -+ # Now continue again, the other thread will now report that it -+ # received a signal. -+ gdb_test "continue" \ -+ [multi_line \ -+ "Continuing\\." \ -+ ".*" \ -+ "Thread ${::decimal} \"\[^\"\r\n\]+\" received signal SIGSEGV, Segmentation fault\\." \ -+ "\\\[Switching to Thread \[^\r\n\]+\\\]" \ -+ "${::hex} in worker_func \[^\r\n\]+:${::signal_line}" \ -+ "${::decimal}\\s+\[^\r\n\]+Signal here\[^\r\n\]+"] \ -+ "received signal in other thread" -+ } else { -+ # Now continue again, the other thread will now report its -+ # breakpoint. -+ gdb_test "continue" \ -+ [multi_line \ -+ "Continuing\\." \ -+ ".*" \ -+ "" \ -+ "Thread ${::decimal} \"\[^\"\r\n\]+\" hit Breakpoint ${other_bp_num}, worker_func \[^\r\n\]+:${::other_bp_line}" \ -+ "${::decimal}\\s+\[^\r\n\]+Other thread breakpoint\[^\r\n\]+"] \ -+ "hit the breakpoint in other thread" -+ -+ # Run to the stop marker. -+ gdb_test "continue" \ -+ [multi_line \ -+ "Continuing\\." \ -+ ".*" \ -+ "" \ -+ "Thread ${::decimal} \"\[^\"\r\n\]+\" hit Breakpoint ${final_bp_num}, stop_marker \[^\r\n\]+:${::final_bp_line}" \ -+ "${::decimal}\\s+\[^\r\n\]+Final breakpoint here\[^\r\n\]+"] \ -+ "hit the final breakpoint" -+ } -+ -+ gdb_exit -+} -+ -+foreach_with_prefix target_async { "on" "off" } { -+ foreach_with_prefix target_non_stop { "on" "off" } { -+ foreach_with_prefix other_thread_signal { true false } { -+ foreach_with_prefix stop_at_cond { true false } { -+ run_condition_test $stop_at_cond $other_thread_signal \ -+ $target_async $target_non_stop -+ } -+ } -+ } -+} -diff --git a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-simple.c b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-simple.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-simple.c -@@ -0,0 +1,89 @@ -+/* Copyright 2022-2024 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include -+#include -+ -+#define NUM_THREADS 3 -+ -+int -+is_matching_tid (int *tid_ptr, int tid_value) -+{ -+ return *tid_ptr == tid_value; -+} -+ -+int -+return_true () -+{ -+ return 1; -+} -+ -+int -+return_false () -+{ -+ return 0; -+} -+ -+int -+function_that_segfaults () -+{ -+ int *p = 0; -+ *p = 1; /* Segfault happens here. */ -+} -+ -+int -+function_with_breakpoint () -+{ -+ return 1; /* Nested breakpoint. */ -+} -+ -+void * -+worker_func (void *arg) -+{ -+ int a = 42; /* Breakpoint here. */ -+} -+ -+void -+stop_marker () -+{ -+ int b = 99; /* Stop marker. */ -+} -+ -+int -+main () -+{ -+ pthread_t threads[NUM_THREADS]; -+ int args[NUM_THREADS]; -+ -+ alarm (300); -+ -+ for (int i = 0; i < NUM_THREADS; i++) -+ { -+ args[i] = i; -+ pthread_create (&threads[i], NULL, worker_func, &args[i]); -+ } -+ -+ for (int i = 0; i < NUM_THREADS; i++) -+ { -+ void *retval; -+ pthread_join (threads[i], &retval); -+ } -+ -+ stop_marker (); -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-simple.exp b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-simple.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-simple.exp -@@ -0,0 +1,235 @@ -+# Copyright 2022-2024 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Some simple tests of inferior function calls from breakpoint -+# conditions, in multi-threaded inferiors. -+# -+# This test sets up a multi-threaded inferior, and places a breakpoint -+# at a location that many of the threads will reach. We repeat the -+# test with different conditions, sometimes a single thread should -+# stop at the breakpoint, sometimes multiple threads should stop, and -+# sometimes no threads should stop. -+ -+standard_testfile -+ -+if { [build_executable "failed to prepare" ${binfile} "${srcfile}" \ -+ {debug pthreads}] == -1 } { -+ return -+} -+ -+set cond_bp_line [gdb_get_line_number "Breakpoint here"] -+set stop_bp_line [gdb_get_line_number "Stop marker"] -+set nested_bp_line [gdb_get_line_number "Nested breakpoint"] -+set segv_line [gdb_get_line_number "Segfault happens here"] -+ -+# Start GDB based on TARGET_ASYNC and TARGET_NON_STOP, and then runto main. -+proc start_gdb_and_runto_main { target_async target_non_stop } { -+ save_vars { ::GDBFLAGS } { -+ append ::GDBFLAGS \ -+ " -ex \"maint set target-non-stop $target_non_stop\"" -+ append ::GDBFLAGS \ -+ " -ex \"maintenance set target-async ${target_async}\"" -+ -+ clean_restart ${::binfile} -+ } -+ -+ if { ![runto_main] } { -+ return -1 -+ } -+ -+ return 0 -+} -+ -+# Run a test of GDB's conditional breakpoints, where the conditions include -+# inferior function calls. -+# -+# CONDITION is the expression to be used as the breakpoint condition. -+# -+# N_EXPECTED_HITS is the number of threads that we expect to stop due to -+# CONDITON. -+# -+# MESSAGE is used as a test name prefix. -+proc run_condition_test { message n_expected_hits condition \ -+ target_async target_non_stop } { -+ with_test_prefix $message { -+ -+ if { [start_gdb_and_runto_main $target_async \ -+ $target_non_stop] == -1 } { -+ return -+ } -+ -+ # Use this convenience variable to track how often the -+ # breakpoint condition has been evaluated. This should be -+ # once per thread. -+ gdb_test "set \$n_cond_eval = 0" -+ -+ # Setup the conditional breakpoint. -+ gdb_breakpoint \ -+ "${::srcfile}:${::cond_bp_line} if ((++\$n_cond_eval) && (${condition}))" -+ -+ # And a breakpoint that we hit when the test is over, this one is -+ # not conditional. Only the main thread gets here once all the -+ # other threads have finished. -+ gdb_breakpoint "${::srcfile}:${::stop_bp_line}" -+ -+ # The number of times we stop at the conditional breakpoint. -+ set n_hit_condition 0 -+ -+ # Now keep 'continue'-ing GDB until all the threads have finished -+ # and we reach the stop_marker breakpoint. -+ gdb_test_multiple "continue" "spot all breakpoint hits" { -+ -re " worker_func \[^\r\n\]+${::srcfile}:${::cond_bp_line}\r\n${::decimal}\\s+\[^\r\n\]+Breakpoint here\[^\r\n\]+\r\n${::gdb_prompt} $" { -+ incr n_hit_condition -+ send_gdb "continue\n" -+ exp_continue -+ } -+ -+ -re " stop_marker \[^\r\n\]+${::srcfile}:${::stop_bp_line}\r\n${::decimal}\\s+\[^\r\n\]+Stop marker\[^\r\n\]+\r\n${::gdb_prompt} $" { -+ pass $gdb_test_name -+ } -+ } -+ -+ gdb_assert { $n_hit_condition == $n_expected_hits } \ -+ "stopped at breakpoint the expected number of times" -+ -+ # Ensure the breakpoint condition was evaluated once per thread. -+ gdb_test "print \$n_cond_eval" "= 3" \ -+ "condition was evaluated in each thread" -+ } -+} -+ -+# Check that after handling a conditional breakpoint (where the condition -+# includes an inferior call), it is still possible to kill the running -+# inferior, and then restart the inferior. -+# -+# At once point doing this would result in GDB giving an assertion error. -+proc_with_prefix run_kill_and_restart_test { target_async target_non_stop } { -+ # This test relies on the 'start' command, which is not possible with -+ # the plain 'remote' target. -+ if { [target_info gdb_protocol] == "remote" } { -+ return -+ } -+ -+ if { [start_gdb_and_runto_main $target_async \ -+ $target_non_stop] == -1 } { -+ return -+ } -+ -+ # Setup the conditional breakpoint. -+ gdb_breakpoint \ -+ "${::srcfile}:${::cond_bp_line} if (is_matching_tid (arg, 1))" -+ gdb_continue_to_breakpoint "worker_func" -+ -+ # Now kill the program being debugged. -+ gdb_test "kill" "" "kill process" \ -+ "Kill the program being debugged.*y or n. $" "y" -+ -+ # Check we can restart the inferior. At one point this would trigger an -+ # assertion. -+ gdb_start_cmd -+} -+ -+# Create a conditional breakpoint which includes a call to a function that -+# segfaults. Run GDB and check what happens when the inferior segfaults -+# during the inferior call. -+proc_with_prefix run_bp_cond_segfaults { target_async target_non_stop } { -+ if { [start_gdb_and_runto_main $target_async \ -+ $target_non_stop] == -1 } { -+ return -+ } -+ -+ # This test relies on the inferior segfaulting when trying to -+ # access address zero. -+ if { [is_address_zero_readable] } { -+ return -+ } -+ -+ # Setup the conditional breakpoint, include a call to -+ # 'function_that_segfaults', which triggers the segfault. -+ gdb_breakpoint \ -+ "${::srcfile}:${::cond_bp_line} if (is_matching_tid (arg, 0) && function_that_segfaults ())" -+ set bp_1_num [get_integer_valueof "\$bpnum" "*UNKNOWN*" \ -+ "get number of conditional breakpoint"] -+ -+ gdb_test "continue" \ -+ [multi_line \ -+ "Continuing\\." \ -+ ".*" \ -+ "Thread ${::decimal} \"infcall-from-bp\" received signal SIGSEGV, Segmentation fault\\." \ -+ "${::hex} in function_that_segfaults \\(\\) at \[^\r\n\]+:${::segv_line}" \ -+ "${::decimal}\\s+\[^\r\n\]+Segfault happens here\[^\r\n\]+" \ -+ "Error in testing condition for breakpoint ${bp_1_num}:" \ -+ "The program being debugged was signaled while in a function called from GDB\\." \ -+ "GDB remains in the frame where the signal was received\\." \ -+ "To change this behavior use \"set unwindonsignal on\"\\." \ -+ "Evaluation of the expression containing the function" \ -+ "\\(function_that_segfaults\\) will be abandoned\\." \ -+ "When the function is done executing, GDB will silently stop\\."] -+} -+ -+# Create a conditional breakpoint which includes a call to a function that -+# itself has a breakpoint set within it. Run GDB and check what happens -+# when GDB hits the nested breakpoint. -+proc_with_prefix run_bp_cond_hits_breakpoint { target_async target_non_stop } { -+ if { [start_gdb_and_runto_main $target_async \ -+ $target_non_stop] == -1 } { -+ return -+ } -+ -+ # Setup the conditional breakpoint, include a call to -+ # 'function_with_breakpoint' in which we will shortly place a -+ # breakpoint. -+ gdb_breakpoint \ -+ "${::srcfile}:${::cond_bp_line} if (is_matching_tid (arg, 0) && function_with_breakpoint ())" -+ set bp_1_num [get_integer_valueof "\$bpnum" "*UNKNOWN*" \ -+ "get number of conditional breakpoint"] -+ -+ gdb_breakpoint "${::srcfile}:${::nested_bp_line}" -+ set bp_2_num [get_integer_valueof "\$bpnum" "*UNKNOWN*" \ -+ "get number of nested breakpoint"] -+ -+ gdb_test "continue" \ -+ [multi_line \ -+ "Continuing\\." \ -+ ".*" \ -+ "Thread ${::decimal} \"infcall-from-bp\" hit Breakpoint ${bp_2_num}, function_with_breakpoint \\(\\) at \[^\r\n\]+:${::nested_bp_line}" \ -+ "${::decimal}\\s+\[^\r\n\]+Nested breakpoint\[^\r\n\]+" \ -+ "Error in testing condition for breakpoint ${bp_1_num}:" \ -+ "The program being debugged stopped while in a function called from GDB\\." \ -+ "Evaluation of the expression containing the function" \ -+ "\\(function_with_breakpoint\\) will be abandoned\\." \ -+ "When the function is done executing, GDB will silently stop\\."] -+} -+ -+foreach_with_prefix target_async { "on" "off" } { -+ foreach_with_prefix target_non_stop { "on" "off" } { -+ run_condition_test "exactly one thread is hit" \ -+ 1 "is_matching_tid (arg, 1)" \ -+ $target_async $target_non_stop -+ run_condition_test "exactly two threads are hit" \ -+ 2 "(is_matching_tid (arg, 0) || is_matching_tid (arg, 2))" \ -+ $target_async $target_non_stop -+ run_condition_test "all three threads are hit" \ -+ 3 "return_true ()" \ -+ $target_async $target_non_stop -+ run_condition_test "no thread is hit" \ -+ 0 "return_false ()" \ -+ $target_async $target_non_stop -+ -+ run_kill_and_restart_test $target_async $target_non_stop -+ run_bp_cond_segfaults $target_async $target_non_stop -+ run_bp_cond_hits_breakpoint $target_async $target_non_stop -+ } -+} -diff --git a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-single.c b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-single.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-single.c -@@ -0,0 +1,139 @@ -+/* Copyright 2022-2024 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include -+#include -+#include -+#include -+ -+#define NUM_THREADS 5 -+ -+/* Semaphores, used to track when threads have started, and to control -+ when the threads finish. */ -+sem_t startup_semaphore; -+sem_t finish_semaphore; -+ -+/* Mutex to control when the first worker thread hit a breakpoint -+ location. */ -+pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; -+ -+/* Global variable to poke, just so threads have something to do. */ -+volatile int global_var = 0; -+ -+int -+return_true () -+{ -+ return 1; -+} -+ -+int -+return_false () -+{ -+ return 0; -+} -+ -+void * -+worker_func (void *arg) -+{ -+ int tid = *((int *) arg); -+ -+ switch (tid) -+ { -+ case 0: -+ /* Wait for MUTEX to become available, then pass through the -+ conditional breakpoint location. */ -+ if (pthread_mutex_lock (&mutex) != 0) -+ abort (); -+ global_var = 99; /* Conditional breakpoint here. */ -+ if (pthread_mutex_unlock (&mutex) != 0) -+ abort (); -+ break; -+ -+ default: -+ /* Notify the main thread that the thread has started, then wait for -+ the main thread to tell us to finish. */ -+ sem_post (&startup_semaphore); -+ if (sem_wait (&finish_semaphore) != 0) -+ abort (); -+ break; -+ } -+} -+ -+void -+stop_marker () -+{ -+ global_var = 99; /* Stop marker. */ -+} -+ -+int -+main () -+{ -+ pthread_t threads[NUM_THREADS]; -+ int args[NUM_THREADS]; -+ void *retval; -+ -+ /* An alarm, just in case the thread deadlocks. */ -+ alarm (300); -+ -+ /* Semaphore initialization. */ -+ if (sem_init (&startup_semaphore, 0, 0) != 0) -+ abort (); -+ if (sem_init (&finish_semaphore, 0, 0) != 0) -+ abort (); -+ -+ /* Lock MUTEX, this prevents the first worker thread from rushing ahead. */ -+ if (pthread_mutex_lock (&mutex) != 0) -+ abort (); -+ -+ /* Worker thread creation. */ -+ for (int i = 0; i < NUM_THREADS; i++) -+ { -+ args[i] = i; -+ pthread_create (&threads[i], NULL, worker_func, &args[i]); -+ } -+ -+ /* Wait for every thread (other than the first) to tell us it has started -+ up. */ -+ for (int i = 1; i < NUM_THREADS; i++) -+ { -+ if (sem_wait (&startup_semaphore) != 0) -+ abort (); -+ } -+ -+ /* Unlock the first thread so it can proceed. */ -+ if (pthread_mutex_unlock (&mutex) != 0) -+ abort (); -+ -+ /* Wait for the first thread only. */ -+ pthread_join (threads[0], &retval); -+ -+ /* Now post FINISH_SEMAPHORE to allow all the other threads to finish. */ -+ for (int i = 1; i < NUM_THREADS; i++) -+ sem_post (&finish_semaphore); -+ -+ /* Now wait for the remaining threads to complete. */ -+ for (int i = 1; i < NUM_THREADS; i++) -+ pthread_join (threads[i], &retval); -+ -+ /* Semaphore cleanup. */ -+ sem_destroy (&finish_semaphore); -+ sem_destroy (&startup_semaphore); -+ -+ stop_marker (); -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-single.exp b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-single.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-single.exp -@@ -0,0 +1,117 @@ -+# Copyright 2022-2024 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# This test reprocuces bug gdb/28942, performing an inferior function -+# call from a breakpoint condition in a multi-threaded inferior. -+# -+# The important part of this test is that, when the conditional -+# breakpoint is hit, and the condition (which includes an inferior -+# function call) is evaluated, the other threads are running. -+ -+standard_testfile -+ -+if { [build_executable "failed to prepare" ${binfile} "${srcfile}" \ -+ {debug pthreads}] == -1 } { -+ return -+} -+ -+set cond_bp_line [gdb_get_line_number "Conditional breakpoint here"] -+set final_bp_line [gdb_get_line_number "Stop marker"] -+ -+# Start GDB based on TARGET_ASYNC and TARGET_NON_STOP, and then runto main. -+proc start_gdb_and_runto_main { target_async target_non_stop } { -+ save_vars { ::GDBFLAGS } { -+ append ::GDBFLAGS \ -+ " -ex \"maint set target-non-stop $target_non_stop\"" -+ append ::GDBFLAGS \ -+ " -ex \"maintenance set target-async ${target_async}\"" -+ -+ clean_restart ${::binfile} -+ } -+ -+ if { ![runto_main] } { -+ return -1 -+ } -+ -+ return 0 -+} -+ -+# Run a test of GDB's conditional breakpoints, where the conditions include -+# inferior function calls. -+# -+# TARGET_ASYNC and TARGET_NON_STOP are used when starting up GDB. -+# -+# When STOP_AT_COND is true the breakpoint condtion will evaluate to -+# true, and GDB will stop at the breakpoint. Otherwise, the -+# breakpoint condition will evaluate to false and GDB will not stop at -+# the breakpoint. -+proc run_condition_test { stop_at_cond \ -+ target_async target_non_stop } { -+ if { [start_gdb_and_runto_main $target_async \ -+ $target_non_stop] == -1 } { -+ return -+ } -+ -+ # Setup the conditional breakpoint. -+ if { $stop_at_cond } { -+ set cond_func "return_true" -+ } else { -+ set cond_func "return_false" -+ } -+ gdb_breakpoint \ -+ "${::srcfile}:${::cond_bp_line} if (${cond_func} ())" -+ set cond_bp_num [get_integer_valueof "\$bpnum" "*UNKNOWN*" \ -+ "get number for conditional breakpoint"] -+ -+ # And a breakpoint that we hit when the test is over, this one is -+ # not conditional. -+ gdb_breakpoint "${::srcfile}:${::final_bp_line}" -+ set final_bp_num [get_integer_valueof "\$bpnum" "*UNKNOWN*" \ -+ "get number for final breakpoint"] -+ -+ if { $stop_at_cond } { -+ # Continue. The first breakpoint we hit should be the conditional -+ # breakpoint. The other thread will have hit its breakpoint, but -+ # that will have been deferred until the conditional breakpoint is -+ # reported. -+ gdb_test "continue" \ -+ [multi_line \ -+ "Continuing\\." \ -+ ".*" \ -+ "" \ -+ "Thread ${::decimal} \"\[^\"\r\n\]+\" hit Breakpoint ${cond_bp_num}, worker_func \[^\r\n\]+:${::cond_bp_line}" \ -+ "${::decimal}\\s+\[^\r\n\]+Conditional breakpoint here\[^\r\n\]+"] \ -+ "hit the conditional breakpoint" -+ } -+ -+ # Run to the stop marker. -+ gdb_test "continue" \ -+ [multi_line \ -+ "Continuing\\." \ -+ ".*" \ -+ "" \ -+ "Thread ${::decimal} \"\[^\"\r\n\]+\" hit Breakpoint ${final_bp_num}, stop_marker \[^\r\n\]+:${::final_bp_line}" \ -+ "${::decimal}\\s+\[^\r\n\]+Stop marker\[^\r\n\]+"] \ -+ "hit the final breakpoint" -+} -+ -+foreach_with_prefix target_async { "on" "off" } { -+ foreach_with_prefix target_non_stop { "on" "off" } { -+ foreach_with_prefix stop_at_cond { true false } { -+ run_condition_test $stop_at_cond \ -+ $target_async $target_non_stop -+ } -+ } -+} diff --git a/gdb-rhel-13298-inferior-funcall-bp-condition-3-of-5.patch b/gdb-rhel-13298-inferior-funcall-bp-condition-3-of-5.patch deleted file mode 100644 index 3087f1d..0000000 --- a/gdb-rhel-13298-inferior-funcall-bp-condition-3-of-5.patch +++ /dev/null @@ -1,1148 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andrew Burgess -Date: Fri, 7 Oct 2022 12:39:07 +0100 -Subject: gdb-rhel-13298-inferior-funcall-bp-condition-3-of-5.patch - -;;gdb: add timeouts for inferior function calls -;;(Andrew Burgess, RHEL-13298) - -In the previous commits I have been working on improving inferior -function call support. One thing that worries me about using inferior -function calls from a conditional breakpoint is: what happens if the -inferior function call fails? - -If the failure is obvious, e.g. the thread performing the call -crashes, or hits a breakpoint, then this case is already well handled, -and the error is reported to the user. - -But what if the thread performing the inferior call just deadlocks? -If the user made the call from a 'print' or 'call' command, then the -user might have some expectation of when the function call should -complete, and, when this time limit is exceeded, the user -will (hopefully) interrupt GDB and regain control of the debug -session. - -But, when the inferior function call is from a breakpoint condition it -is much harder to understand that GDB is deadlocked within an inferior -call. Maybe the breakpoint hasn't been hit yet? Or maybe the -condition was always false? Or maybe GDB is deadlocked in an inferior -call? The only way to know for sure is for the user to periodically -interrupt the inferior, check on the state of all the threads, and -then continue. - -Additionally, the focus of the previous commit was inferior function -calls, from a conditional breakpoint, in a multi-threaded inferior. -This opens up a whole new set of potential failure conditions. For -example, what if the function called relies on interaction with some -other thread, and the other thread crashes? Or hits a breakpoint? -Given how inferior function calls work (in a synchronous manner), a -stop event in some other thread is going to be ignored while the -inferior function call is being executed as part of a breakpoint -condition, and this means that GDB could get stuck waiting for the -original condition thread, which will now never complete. - -In this commit I propose a solution to this problem. A timeout. For -targets that support async-mode we can install an event-loop timer -before starting the inferior function call. When the timer expires we -will stop the thread performing the inferior function call. With this -mechanism in place a user can be sure that any inferior call they make -will either complete, or timeout eventually. - -Adding a timer like this is obviously a change in behaviour for the -more common 'call' and 'print' uses of inferior function calls, so, in -this patch, I propose having two different timers. One I call the -'direct-call-timeout', which is used for 'call' and 'print' commands. -This timeout is by default set to unlimited, which, not surprisingly, -means there is no timeout in place. - -A second timer, which I've called 'indirect-call-timeout', is used for -inferior function calls from breakpoint conditions. This timeout has -a default value of 30 seconds. This is a reasonably long time to -wait, and hopefully should be enough in most cases to allow the -inferior call to complete. An inferior call that takes more than 30 -seconds, which is installed on a breakpoint condition is really going -to slow down the debug session, so hopefully this is not a common use -case. - -The user is, of course, free to reduce, or increase the timeout value, -and can always use Ctrl-c to interrupt an inferior function call, but -this timeout will ensure that GDB will stop at some point. - -The new commands added by this commit are: - - set direct-call-timeout SECONDS - show direct-call-timeout - set indirect-call-timeout SECONDS - show indirect-call-timeout - -These new timeouts do depend on async-mode, so, if async-mode is -disabled (maint set target-async off), or not supported (e.g. target -sim), then the timeout is treated as unlimited (that is, no timeout is -set). - -For targets that "fake" non-async mode, e.g. Linux native, where -non-async mode is really just async mode, but then we park the target -in a sissuspend, we could easily fix things so that the timeouts still -work, however, for targets that really are not async aware, like the -simulator, fixing things so that timeouts work correctly would be a -much bigger task - that effort would be better spent just making the -target async-aware. And so, I'm happy for now that this feature will -only work on async targets. - -The two new show commands will display slightly different text if the -current target is a non-async target, which should allow users to -understand what's going on. - -There's a somewhat random test adjustment needed in gdb.base/help.exp, -the test uses a regexp with the apropos command, and expects to find a -single result. Turns out the new settings I added also matched the -regexp, which broke the test. I've updated the regexp a little to -exclude my new settings. - -Reviewed-By: Tankut Baris Aktemur -Reviewed-By: Eli Zaretskii -Tested-By: Luis Machado -Tested-By: Keith Seitz - -diff --git a/gdb/NEWS b/gdb/NEWS ---- a/gdb/NEWS -+++ b/gdb/NEWS -@@ -1,6 +1,179 @@ - What has changed in GDB? - (Organized release by release) - -+*** Changes since GDB 14 -+ -+* The MPX commands "show/set mpx bound" have been deprecated, as Intel -+ listed MPX as removed in 2019. -+ -+* Building GDB and GDBserver now requires a C++17 compiler. -+ For example, GCC 9 or later. -+ -+* GDB index now contains information about the main function. This speeds up -+ startup when it is being used for some large binaries. -+ -+* On hosts where threading is available, DWARF reading is now done in -+ the background, resulting in faster startup. This can be controlled -+ using "maint set dwarf synchronous". -+ -+* Changed commands -+ -+disassemble -+ Attempting to use both the 'r' and 'b' flags with the disassemble -+ command will now give an error. Previously the 'b' flag would -+ always override the 'r' flag. -+ -+gcore -+generate-core-file -+ GDB now generates sparse core files, on systems that support it. -+ -+maintenance info line-table -+ Add an EPILOGUE-BEGIN column to the output of the command. It indicates -+ if the line is considered the start of the epilgoue, and thus a point at -+ which the frame can be considered destroyed. -+ -+* New commands -+ -+info missing-debug-handler -+ List all the registered missing debug handlers. -+ -+enable missing-debug-handler LOCUS HANDLER -+disable missing-debug-handler LOCUS HANDLER -+ Enable or disable a missing debug handler with a name matching the -+ regular expression HANDLER, in LOCUS. -+ -+ LOCUS can be 'global' to operate on global missing debug handler, -+ 'progspace' to operate on handlers within the current program space, -+ or can be a regular expression which is matched against the filename -+ of the primary executable in each program space. -+ -+maintenance info linux-lwps -+ List all LWPs under control of the linux-nat target. -+ -+set remote thread-options-packet -+show remote thread-options-packet -+ Set/show the use of the thread options packet. -+ -+set direct-call-timeout SECONDS -+show direct-call-timeout -+set indirect-call-timeout SECONDS -+show indirect-call-timeout -+ These new settings can be used to limit how long GDB will wait for -+ an inferior function call to complete. The direct timeout is used -+ for inferior function calls from e.g. 'call' and 'print' commands, -+ while the indirect timeout is used for inferior function calls from -+ within a conditional breakpoint expression. -+ -+ The default for the direct timeout is unlimited, while the default -+ for the indirect timeout is 30 seconds. -+ -+ These timeouts will only have an effect for targets that are -+ operating in async mode. For non-async targets the timeouts are -+ ignored, GDB will wait indefinitely for an inferior function to -+ complete, unless interrupted by the user using Ctrl-C. -+ -+* New features in the GDB remote stub, GDBserver -+ -+ ** The --remote-debug and --event-loop-debug command line options -+ have been removed. -+ -+ ** The --debug command line option now takes an optional comma -+ separated list of components to emit debug for. The currently -+ supported components are: all, threads, event-loop, and remote. -+ If no components are given then threads is assumed. -+ -+ ** The 'monitor set remote-debug' and 'monitor set event-loop-debug' -+ command have been removed. -+ -+ ** The 'monitor set debug 0|1' command has been extended to take a -+ component name, e.g.: 'monitor set debug COMPONENT off|on'. -+ Possible component names are: all, threads, event-loop, and -+ remote. -+ -+* Python API -+ -+ ** New function gdb.notify_mi(NAME, DATA), that emits custom -+ GDB/MI async notification. -+ -+ ** New read/write attribute gdb.Value.bytes that contains a bytes -+ object holding the contents of this value. -+ -+ ** New module gdb.missing_debug that facilitates dealing with -+ objfiles that are missing any debug information. -+ -+ ** New function gdb.missing_debug.register_handler that can register -+ an instance of a sub-class of gdb.missing_debug.MissingDebugInfo -+ as a handler for objfiles that are missing debug information. -+ -+ ** New class gdb.missing_debug.MissingDebugInfo which can be -+ sub-classed to create handlers for objfiles with missing debug -+ information. -+ -+ ** Stop events now have a "details" attribute that holds a -+ dictionary that carries the same information as an MI "*stopped" -+ event. -+ -+ ** New function gdb.interrupt(), that interrupts GDB as if the user -+ typed control-c. -+ -+ ** New gdb.InferiorThread.ptid_string attribute. This read-only -+ attribute contains the string that appears in the 'Target Id' -+ column of the 'info threads' command output. -+ -+ ** It is no longer possible to create new gdb.Progspace object using -+ 'gdb.Progspace()', this will result in a TypeError. Progspace -+ objects can still be obtained through calling other API -+ functions, for example 'gdb.current_progspace()'. -+ -+ ** User defined attributes can be added to a gdb.Inferior object, -+ these will be stored in the object's new Inferior.__dict__ -+ attribute. -+ -+ ** User defined attributes can be added to a gdb.InferiorThread -+ object, these will be stored in the object's new -+ InferiorThread.__dict__ attribute. -+ -+ ** New constants gdb.SYMBOL_TYPE_DOMAIN, gdb.SYMBOL_FUNCTION_DOMAIN, -+ and gdb.SEARCH_*_DOMAIN corresponding to all the existing symbol -+ domains. Symbol lookup can now search in multiple domains at -+ once, and can also narrowly search for just a type or function. -+ -+* Debugger Adapter Protocol changes -+ -+ ** GDB now emits the "process" event. -+ -+ ** GDB now supports the "cancel" request. -+ -+ ** The "attach" request now supports specifying the program. -+ -+ ** New command "set debug dap-log-level" controls DAP logging. -+ -+ ** The "set debug dap-log-file" command is now documented. This -+ command was available in GDB 14 but not documented. -+ -+* Guile API -+ -+ ** New constants SYMBOL_TYPE_DOMAIN, SYMBOL_FUNCTION_DOMAIN, and -+ SEARCH_*_DOMAIN corresponding to all the existing symbol domains. -+ Symbol lookup can now search in multiple domains at once, and can -+ also narrowly search for just a type or function. -+ -+* New remote packets -+ -+New stop reason: clone -+ Indicates that a clone system call was executed. -+ -+QThreadOptions -+ Enable/disable optional event reporting, on a per-thread basis. -+ Currently supported options are GDB_THREAD_OPTION_CLONE, to enable -+ clone event reporting, and GDB_THREAD_OPTION_EXIT to enable thread -+ exit event reporting. -+ -+QThreadOptions in qSupported -+ The qSupported packet allows GDB to inform the stub it supports the -+ QThreadOptions packet, and the qSupported response can contain the -+ set of thread options the remote stub supports. -+ - *** Changes in GDB 14 - - * GDB now supports the AArch64 Scalable Matrix Extension 2 (SME2), which -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -20987,6 +20987,72 @@ to resume the inferior (using commands like @code{continue}, - @code{step}, etc). In this case, when the inferior finally returns to - the dummy-frame, @value{GDBN} will once again halt the inferior. - -+On targets that support asynchronous execution (@pxref{Background -+Execution}) @value{GDBN} can place a timeout on any functions called -+from @value{GDBN}. If the timeout expires and the function call is -+still ongoing, then @value{GDBN} will interrupt the program. -+ -+For targets that don't support asynchronous execution -+(@pxref{Background Execution}) then timeouts for functions called from -+@value{GDBN} are not supported, the timeout settings described below -+will be treated as @code{unlimited}, meaning @value{GDBN} will wait -+indefinitely for function call to complete, unless interrupted by the -+user using @kbd{Ctrl-C}. -+ -+@table @code -+@item set direct-call-timeout @var{seconds} -+@kindex set direct-call-timeout -+@cindex timeout for called functions -+Set the timeout used when calling functions in the program to -+@var{seconds}, which should be an integer greater than zero, or the -+special value @code{unlimited}, which indicates no timeout should be -+used. The default for this setting is @code{unlimited}. -+ -+This setting is used when the user calls a function directly from the -+command prompt, for example with a @code{call} or @code{print} -+command. -+ -+This setting only works for targets that support asynchronous -+execution (@pxref{Background Execution}), for any other target the -+setting is treated as @code{unlimited}. -+ -+@item show direct-call-timeout -+@kindex show direct-call-timeout -+@cindex timeout for called functions -+Show the timeout used when calling functions in the program with a -+@code{call} or @code{print} command. -+@end table -+ -+It is also possible to call functions within the program from the -+condition of a conditional breakpoint (@pxref{Conditions, ,Break -+Conditions}). A different setting controls the timeout used for -+function calls made from a breakpoint condition. -+ -+@table @code -+@item set indirect-call-timeout @var{seconds} -+@kindex set indirect-call-timeout -+@cindex timeout for called functions -+Set the timeout used when calling functions in the program from a -+breakpoint or watchpoint condition to @var{seconds}, which should be -+an integer greater than zero, or the special value @code{unlimited}, -+which indicates no timeout should be used. The default for this -+setting is @code{30} seconds. -+ -+This setting only works for targets that support asynchronous -+execution (@pxref{Background Execution}), for any other target the -+setting is treated as @code{unlimited}. -+ -+If a function called from a breakpoint or watchpoint condition times -+out, then @value{GDBN} will stop at the point where the timeout -+occurred. The breakpoint condition evaluation will be abandoned. -+ -+@item show indirect-call-timeout -+@kindex show indirect-call-timeout -+@cindex timeout for called functions -+Show the timeout used when calling functions in the program from a -+breakpoint or watchpoint condition. -+@end table -+ - @subsection Calling functions with no debug info - - @cindex no debug info functions -diff --git a/gdb/infcall.c b/gdb/infcall.c ---- a/gdb/infcall.c -+++ b/gdb/infcall.c -@@ -96,6 +96,53 @@ show_may_call_functions_p (struct ui_file *file, int from_tty, - value); - } - -+/* A timeout (in seconds) for direct inferior calls. A direct inferior -+ call is one the user triggers from the prompt, e.g. with a 'call' or -+ 'print' command. Compare with the definition of indirect calls below. */ -+ -+static unsigned int direct_call_timeout = UINT_MAX; -+ -+/* Implement 'show direct-call-timeout'. */ -+ -+static void -+show_direct_call_timeout (struct ui_file *file, int from_tty, -+ struct cmd_list_element *c, const char *value) -+{ -+ if (target_has_execution () && !target_can_async_p ()) -+ gdb_printf (file, _("Current target does not support async mode, timeout " -+ "for direct inferior calls is \"unlimited\".\n")); -+ else if (direct_call_timeout == UINT_MAX) -+ gdb_printf (file, _("Timeout for direct inferior function calls " -+ "is \"unlimited\".\n")); -+ else -+ gdb_printf (file, _("Timeout for direct inferior function calls " -+ "is \"%s seconds\".\n"), value); -+} -+ -+/* A timeout (in seconds) for indirect inferior calls. An indirect inferior -+ call is one that originates from within GDB, for example, when -+ evaluating an expression for a conditional breakpoint. Compare with -+ the definition of direct calls above. */ -+ -+static unsigned int indirect_call_timeout = 30; -+ -+/* Implement 'show indirect-call-timeout'. */ -+ -+static void -+show_indirect_call_timeout (struct ui_file *file, int from_tty, -+ struct cmd_list_element *c, const char *value) -+{ -+ if (target_has_execution () && !target_can_async_p ()) -+ gdb_printf (file, _("Current target does not support async mode, timeout " -+ "for indirect inferior calls is \"unlimited\".\n")); -+ else if (indirect_call_timeout == UINT_MAX) -+ gdb_printf (file, _("Timeout for indirect inferior function calls " -+ "is \"unlimited\".\n")); -+ else -+ gdb_printf (file, _("Timeout for indirect inferior function calls " -+ "is \"%s seconds\".\n"), value); -+} -+ - /* How you should pass arguments to a function depends on whether it - was defined in K&R style or prototype style. If you define a - function using the K&R syntax that takes a `float' argument, then -@@ -620,6 +667,85 @@ call_thread_fsm::should_notify_stop () - return true; - } - -+/* A class to control creation of a timer that will interrupt a thread -+ during an inferior call. */ -+struct infcall_timer_controller -+{ -+ /* Setup an event-loop timer that will interrupt PTID if the inferior -+ call takes too long. DIRECT_CALL_P is true when this inferior call is -+ a result of the user using a 'print' or 'call' command, and false when -+ this inferior call is a result of e.g. a conditional breakpoint -+ expression, this is used to select which timeout to use. */ -+ infcall_timer_controller (thread_info *thr, bool direct_call_p) -+ : m_thread (thr) -+ { -+ unsigned int timeout -+ = direct_call_p ? direct_call_timeout : indirect_call_timeout; -+ if (timeout < UINT_MAX && target_can_async_p ()) -+ { -+ int ms = timeout * 1000; -+ int id = create_timer (ms, infcall_timer_controller::timed_out, this); -+ m_timer_id.emplace (id); -+ infcall_debug_printf ("Setting up infcall timeout timer for " -+ "ptid %s: %d milliseconds", -+ m_thread->ptid.to_string ().c_str (), ms); -+ } -+ } -+ -+ /* Destructor. Ensure that the timer is removed from the event loop. */ -+ ~infcall_timer_controller () -+ { -+ /* If the timer has already triggered, then it will have already been -+ deleted from the event loop. If the timer has not triggered, then -+ delete it now. */ -+ if (m_timer_id.has_value () && !m_triggered) -+ delete_timer (*m_timer_id); -+ -+ /* Just for clarity, discard the timer id now. */ -+ m_timer_id.reset (); -+ } -+ -+ /* Return true if there was a timer in place, and the timer triggered, -+ otherwise, return false. */ -+ bool triggered_p () -+ { -+ gdb_assert (!m_triggered || m_timer_id.has_value ()); -+ return m_triggered; -+ } -+ -+private: -+ /* The thread we should interrupt. */ -+ thread_info *m_thread; -+ -+ /* Set true when the timer is triggered. */ -+ bool m_triggered = false; -+ -+ /* Given a value when a timer is in place. */ -+ gdb::optional m_timer_id; -+ -+ /* Callback for the timer, forwards to ::trigger below. */ -+ static void -+ timed_out (gdb_client_data context) -+ { -+ infcall_timer_controller *ctrl -+ = static_cast (context); -+ ctrl->trigger (); -+ } -+ -+ /* Called when the timer goes off. Stop thread M_THREAD. */ -+ void -+ trigger () -+ { -+ m_triggered = true; -+ -+ scoped_disable_commit_resumed disable_commit_resumed ("infcall timeout"); -+ -+ infcall_debug_printf ("Stopping thread %s", -+ m_thread->ptid.to_string ().c_str ()); -+ target_stop (m_thread->ptid); -+ } -+}; -+ - /* Subroutine of call_function_by_hand to simplify it. - Start up the inferior and wait for it to stop. - Return the exception if there's an error, or an exception with -@@ -630,13 +756,15 @@ call_thread_fsm::should_notify_stop () - - static struct gdb_exception - run_inferior_call (std::unique_ptr sm, -- struct thread_info *call_thread, CORE_ADDR real_pc) -+ struct thread_info *call_thread, CORE_ADDR real_pc, -+ bool *timed_out_p) - { - INFCALL_SCOPED_DEBUG_ENTER_EXIT; - - struct gdb_exception caught_error; - ptid_t call_thread_ptid = call_thread->ptid; - int was_running = call_thread->state == THREAD_RUNNING; -+ *timed_out_p = false; - - infcall_debug_printf ("call function at %s in thread %s, was_running = %d", - core_addr_to_string (real_pc), -@@ -681,11 +809,23 @@ run_inferior_call (std::unique_ptr sm, - infrun_debug_show_threads ("non-exited threads after proceed for inferior-call", - all_non_exited_threads ()); - -+ /* Setup a timer (if possible, and if the settings allow) to prevent -+ the inferior call running forever. */ -+ bool direct_call_p = !call_thread->control.in_cond_eval; -+ infcall_timer_controller infcall_timer (call_thread, direct_call_p); -+ - /* Inferior function calls are always synchronous, even if the - target supports asynchronous execution. */ - wait_sync_command_done (); - -- infcall_debug_printf ("inferior call completed successfully"); -+ /* If the timer triggered then the inferior call failed. */ -+ if (infcall_timer.triggered_p ()) -+ { -+ infcall_debug_printf ("inferior call timed out"); -+ *timed_out_p = true; -+ } -+ else -+ infcall_debug_printf ("inferior call completed successfully"); - } - catch (gdb_exception &e) - { -@@ -1357,6 +1497,10 @@ call_function_by_hand_dummy (struct value *function, - scoped_restore restore_stopped_by_random_signal - = make_scoped_restore (&stopped_by_random_signal, 0); - -+ /* Set to true by the call to run_inferior_call below if the inferior -+ call is artificially interrupted by GDB due to taking too long. */ -+ bool timed_out_p = false; -+ - /* - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - SNIP - - If you're looking to implement asynchronous dummy-frames, then - just below is the place to chop this function in two.. */ -@@ -1383,7 +1527,8 @@ call_function_by_hand_dummy (struct value *function, - struct_addr); - { - std::unique_ptr sm_up (sm); -- e = run_inferior_call (std::move (sm_up), call_thread.get (), real_pc); -+ e = run_inferior_call (std::move (sm_up), call_thread.get (), real_pc, -+ &timed_out_p); - } - - if (e.reason < 0) -@@ -1535,7 +1680,10 @@ When the function is done executing, GDB will silently stop."), - std::string name = get_function_name (funaddr, name_buf, - sizeof (name_buf)); - -- if (stopped_by_random_signal) -+ /* If the inferior call timed out then it will have been interrupted -+ by a signal, but we want to report this differently to the user, -+ which is done later in this function. */ -+ if (stopped_by_random_signal && !timed_out_p) - { - /* We stopped inside the FUNCTION because of a random - signal. Further execution of the FUNCTION is not -@@ -1586,6 +1734,36 @@ GDB remains in the frame where the signal was received.\n\ - To change this behavior use \"set unwindonsignal on\".\n\ - Evaluation of the expression containing the function\n\ - (%s) will be abandoned.\n\ -+When the function is done executing, GDB will silently stop."), -+ name.c_str ()); -+ } -+ } -+ -+ if (timed_out_p) -+ { -+ /* A timeout results in a signal being sent to the inferior. */ -+ gdb_assert (stopped_by_random_signal); -+ -+ /* Indentation is weird here. A later patch is going to move the -+ following block into an if/else, so I'm leaving the indentation -+ here to minimise the later patch. -+ -+ Also, the error message used below refers to 'set -+ unwind-on-timeout' which doesn't exist yet. This will be added -+ in a later commit, I'm leaving this in for now to minimise the -+ churn caused by the commit that adds unwind-on-timeout. */ -+ { -+ /* The user wants to stay in the frame where we stopped -+ (default). Discard inferior status, we're not at the same -+ point we started at. */ -+ discard_infcall_control_state (inf_status.release ()); -+ -+ error (_("\ -+The program being debugged timed out while in a function called from GDB.\n\ -+GDB remains in the frame where the timeout occurred.\n\ -+To change this behavior use \"set unwind-on-timeout on\".\n\ -+Evaluation of the expression containing the function\n\ -+(%s) will be abandoned.\n\ - When the function is done executing, GDB will silently stop."), - name.c_str ()); - } -@@ -1699,6 +1877,30 @@ The default is to unwind the frame."), - show_unwind_on_terminating_exception_p, - &setlist, &showlist); - -+ add_setshow_uinteger_cmd ("direct-call-timeout", no_class, -+ &direct_call_timeout, _("\ -+Set the timeout, for direct calls to inferior function calls."), _("\ -+Show the timeout, for direct calls to inferior function calls."), _("\ -+If running on a target that supports, and is running in, async mode\n\ -+then this timeout is used for any inferior function calls triggered\n\ -+directly from the prompt, i.e. from a 'call' or 'print' command. The\n\ -+timeout is specified in seconds."), -+ nullptr, -+ show_direct_call_timeout, -+ &setlist, &showlist); -+ -+ add_setshow_uinteger_cmd ("indirect-call-timeout", no_class, -+ &indirect_call_timeout, _("\ -+Set the timeout, for indirect calls to inferior function calls."), _("\ -+Show the timeout, for indirect calls to inferior function calls."), _("\ -+If running on a target that supports, and is running in, async mode\n\ -+then this timeout is used for any inferior function calls triggered\n\ -+indirectly, i.e. being made as part of a breakpoint, or watchpoint,\n\ -+condition expression. The timeout is specified in seconds."), -+ nullptr, -+ show_indirect_call_timeout, -+ &setlist, &showlist); -+ - add_setshow_boolean_cmd - ("infcall", class_maintenance, &debug_infcall, - _("Set inferior call debugging."), -diff --git a/gdb/testsuite/gdb.base/help.exp b/gdb/testsuite/gdb.base/help.exp ---- a/gdb/testsuite/gdb.base/help.exp -+++ b/gdb/testsuite/gdb.base/help.exp -@@ -121,7 +121,7 @@ gdb_test "help info bogus-gdb-command" "Undefined info command: \"bogus-gdb-comm - gdb_test "help gotcha" "Undefined command: \"gotcha\"\. Try \"help\"\." - - # Test apropos regex. --gdb_test "apropos \\\(print\[\^\[ bsiedf\\\".-\]\\\)" "handle -- Specify how to handle signals\." -+gdb_test "apropos \\\(print\[\^\[ bsiedf\\\"'.-\]\\\)" "handle -- Specify how to handle signals\." - # Test apropos >1 word string. - gdb_test "apropos handle signal" "handle -- Specify how to handle signals\." - # Test apropos apropos. -diff --git a/gdb/testsuite/gdb.base/infcall-timeout.c b/gdb/testsuite/gdb.base/infcall-timeout.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/infcall-timeout.c -@@ -0,0 +1,36 @@ -+/* Copyright 2022-2024 Free Software Foundation, Inc. -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include -+ -+/* This function is called from GDB. */ -+int -+function_that_never_returns () -+{ -+ while (1) -+ sleep (1); -+ -+ return 0; -+} -+ -+int -+main () -+{ -+ alarm (300); -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/infcall-timeout.exp b/gdb/testsuite/gdb.base/infcall-timeout.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/infcall-timeout.exp -@@ -0,0 +1,94 @@ -+# Copyright 2022-2024 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Test GDB's direct-call-timeout setting, that is, ensure that if an -+# inferior function call, invoked from e.g. a 'print' command, takes -+# too long, then GDB can interrupt it, and return control to the user. -+ -+standard_testfile -+ -+if { [build_executable "failed to prepare" ${binfile} "${srcfile}" \ -+ {debug}] == -1 } { -+ return -+} -+ -+# Start GDB according to TARGET_ASYNC, TARGET_NON_STOP, and NON_STOP, -+# then adjust the direct-call-timeout, and make an inferior function -+# call that will never return. GDB should eventually timeout and stop -+# the inferior. -+proc run_test { target_async target_non_stop non_stop } { -+ save_vars { ::GDBFLAGS } { -+ append ::GDBFLAGS \ -+ " -ex \"maint set target-non-stop $target_non_stop\"" -+ append ::GDBFLAGS \ -+ " -ex \"set non-stop $non_stop\"" -+ append ::GDBFLAGS \ -+ " -ex \"maintenance set target-async ${target_async}\"" -+ -+ clean_restart ${::binfile} -+ } -+ -+ if {![runto_main]} { -+ return -+ } -+ -+ gdb_test_no_output "set direct-call-timeout 5" -+ -+ # When non-stop mode is off we get slightly different output from GDB. -+ if { ([target_info gdb_protocol] == "remote" -+ || [target_info gdb_protocol] == "extended-remote") -+ && !$target_non_stop } { -+ set stopped_line_pattern "Program received signal SIGINT, Interrupt\\." -+ } else { -+ set stopped_line_pattern "Program stopped\\." -+ } -+ -+ gdb_test "print function_that_never_returns ()" \ -+ [multi_line \ -+ $stopped_line_pattern \ -+ ".*" \ -+ "The program being debugged timed out while in a function called from GDB\\." \ -+ "GDB remains in the frame where the timeout occurred\\." \ -+ "To change this behavior use \"set unwind-on-timeout on\"\\." \ -+ "Evaluation of the expression containing the function" \ -+ "\\(function_that_never_returns\\) will be abandoned\\." \ -+ "When the function is done executing, GDB will silently stop\\."] -+ -+ gdb_test "bt" ".* function_that_never_returns .*.*" -+} -+ -+foreach_with_prefix target_async { "on" "off" } { -+ -+ if { !$target_async } { -+ # GDB can't timeout while waiting for a thread if the target -+ # runs with async-mode turned off; once the target is running -+ # GDB is effectively blocked until the target stops for some -+ # reason. -+ continue -+ } -+ -+ foreach_with_prefix target_non_stop { "on" "off" } { -+ foreach_with_prefix non_stop { "on" "off" } { -+ if { $non_stop && !$target_non_stop } { -+ # It doesn't make sense to operate GDB in non-stop -+ # mode when the target has (in theory) non-stop mode -+ # disabled. -+ continue -+ } -+ -+ run_test $target_async $target_non_stop $non_stop -+ } -+ } -+} -diff --git a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-timeout.c b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-timeout.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-timeout.c -@@ -0,0 +1,169 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2022-2024 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+#include -+#include -+#include -+#include -+#include -+#include -+ -+#define NUM_THREADS 5 -+ -+/* Semaphores, used to track when threads have started, and to control -+ when the threads finish. */ -+sem_t startup_semaphore; -+sem_t finish_semaphore; -+sem_t thread_1_semaphore; -+sem_t thread_2_semaphore; -+ -+/* Mutex to control when the first worker thread hit a breakpoint -+ location. */ -+pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; -+ -+/* Global variable to poke, just so threads have something to do. */ -+volatile int global_var = 0; -+ -+int -+condition_func () -+{ -+ /* Let thread 2 run. */ -+ if (sem_post (&thread_2_semaphore) != 0) -+ abort (); -+ -+ /* Wait for thread 2 to complete its actions. */ -+ if (sem_wait (&thread_1_semaphore) != 0) -+ abort (); -+ -+ return 1; -+} -+ -+void -+do_segfault () -+{ -+ volatile int *p = 0; -+ *p = 0; /* Segfault here. */ -+} -+ -+void * -+worker_func (void *arg) -+{ -+ int tid = *((int *) arg); -+ -+ /* Let the main thread know that this worker has started. */ -+ if (sem_post (&startup_semaphore) != 0) -+ abort (); -+ -+ switch (tid) -+ { -+ case 0: -+ /* Wait for MUTEX to become available, then pass through the -+ conditional breakpoint location. */ -+ if (pthread_mutex_lock (&mutex) != 0) -+ abort (); -+ global_var = 99; /* Conditional breakpoint here. */ -+ if (pthread_mutex_unlock (&mutex) != 0) -+ abort (); -+ break; -+ -+ case 1: -+ if (sem_wait (&thread_2_semaphore) != 0) -+ abort (); -+ do_segfault (); -+ if (sem_post (&thread_1_semaphore) != 0) -+ abort (); -+ -+ /* Fall through. */ -+ default: -+ /* Wait until we are allowed to finish. */ -+ if (sem_wait (&finish_semaphore) != 0) -+ abort (); -+ break; -+ } -+} -+ -+void -+stop_marker () -+{ -+ global_var = 99; /* Stop marker. */ -+} -+ -+/* The main program entry point. */ -+ -+int -+main () -+{ -+ pthread_t threads[NUM_THREADS]; -+ int args[NUM_THREADS]; -+ void *retval; -+ -+ /* An alarm, just in case the thread deadlocks. */ -+ alarm (300); -+ -+ /* Semaphore initialization. */ -+ if (sem_init (&startup_semaphore, 0, 0) != 0) -+ abort (); -+ if (sem_init (&finish_semaphore, 0, 0) != 0) -+ abort (); -+ if (sem_init (&thread_1_semaphore, 0, 0) != 0) -+ abort (); -+ if (sem_init (&thread_2_semaphore, 0, 0) != 0) -+ abort (); -+ -+ /* Lock MUTEX, this prevents the first worker thread from rushing ahead. */ -+ if (pthread_mutex_lock (&mutex) != 0) -+ abort (); -+ -+ /* Worker thread creation. */ -+ for (int i = 0; i < NUM_THREADS; i++) -+ { -+ args[i] = i; -+ pthread_create (&threads[i], NULL, worker_func, &args[i]); -+ } -+ -+ /* Wait for every thread to start. */ -+ for (int i = 0; i < NUM_THREADS; i++) -+ { -+ if (sem_wait (&startup_semaphore) != 0) -+ abort (); -+ } -+ -+ /* Unlock the first thread so it can proceed. */ -+ if (pthread_mutex_unlock (&mutex) != 0) -+ abort (); -+ -+ /* Wait for the first thread only. */ -+ pthread_join (threads[0], &retval); -+ -+ /* Now post FINISH_SEMAPHORE to allow all the other threads to finish. */ -+ for (int i = 1; i < NUM_THREADS; i++) -+ sem_post (&finish_semaphore); -+ -+ /* Now wait for the remaining threads to complete. */ -+ for (int i = 1; i < NUM_THREADS; i++) -+ pthread_join (threads[i], &retval); -+ -+ /* Semaphore cleanup. */ -+ sem_destroy (&finish_semaphore); -+ sem_destroy (&startup_semaphore); -+ sem_destroy (&thread_1_semaphore); -+ sem_destroy (&thread_2_semaphore); -+ -+ stop_marker (); -+ -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-timeout.exp b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-timeout.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-timeout.exp -@@ -0,0 +1,166 @@ -+# Copyright 2022-2024 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Tests inferior calls executed from a breakpoint condition in -+# a multi-threaded program. -+# -+# This test has the inferior function call timeout, and checks how GDB -+# handles this situation. -+ -+standard_testfile -+ -+if { [build_executable "failed to prepare" ${binfile} "${srcfile}" \ -+ {debug pthreads}] } { -+ return -+} -+ -+set cond_bp_line [gdb_get_line_number "Conditional breakpoint here"] -+set final_bp_line [gdb_get_line_number "Stop marker"] -+set segfault_line [gdb_get_line_number "Segfault here"] -+ -+# Setup GDB based on TARGET_ASYNC, TARGET_NON_STOP, and NON_STOP. -+# Setup some breakpoints in the inferior, one of which has an inferior -+# call within its condition. -+# -+# Continue GDB, the breakpoint with inferior call will be hit, but the -+# inferior call will never return. We expect GDB to timeout. -+# -+# The reason that the inferior call never completes is that a second -+# thread, on which the inferior call relies, either hits a breakpoint -+# (when OTHER_THREAD_BP is true), or crashes (when OTHER_THREAD_BP is -+# false). -+proc run_test { target_async target_non_stop non_stop other_thread_bp } { -+ save_vars { ::GDBFLAGS } { -+ append ::GDBFLAGS " -ex \"maint set target-non-stop $target_non_stop\"" -+ append ::GDBFLAGS " -ex \"maint non-stop $non_stop\"" -+ append ::GDBFLAGS " -ex \"maintenance set target-async ${target_async}\"" -+ -+ clean_restart ${::binfile} -+ } -+ -+ if {![runto_main]} { -+ return -+ } -+ -+ # The default timeout for indirect inferior calls (e.g. inferior -+ # calls for conditional breakpoint expressions) is pretty high. -+ # We don't want the test to take too long, so reduce this. -+ # -+ # However, the test relies on a second thread hitting some event -+ # (either a breakpoint or signal) before this timeout expires. -+ # -+ # There is a chance that on a really slow system this might not -+ # happen, in which case the test might fail. -+ # -+ # However, we still allocate 5 seconds, which feels like it should -+ # be enough time in most cases, but maybe we need to do something -+ # smarter here? Possibly we could have some initial run where the -+ # inferior doesn't timeout, but does perform the same interaction -+ # between threads, we could time that, and use that as the basis -+ # for this timeout. For now though, we just hope 5 seconds is -+ # enough. -+ gdb_test_no_output "set indirect-call-timeout 5" -+ -+ gdb_breakpoint \ -+ "${::srcfile}:${::cond_bp_line} if (condition_func ())" -+ set bp_num [get_integer_valueof "\$bpnum" "*UNKNOWN*" \ -+ "get number for conditional breakpoint"] -+ -+ gdb_breakpoint "${::srcfile}:${::final_bp_line}" -+ set final_bp_num [get_integer_valueof "\$bpnum" "*UNKNOWN*" \ -+ "get number for final breakpoint"] -+ -+ # The thread performing an inferior call relies on a second -+ # thread. The second thread will segfault unless it hits a -+ # breakpoint first. In either case the initial thread will not -+ # complete its inferior call. -+ if { $other_thread_bp } { -+ gdb_breakpoint "${::srcfile}:${::segfault_line}" -+ set segfault_bp_num [get_integer_valueof "\$bpnum" "*UNKNOWN*" \ -+ "get number for segfault breakpoint"] -+ } -+ -+ # When non-stop mode is off we get slightly different output from GDB. -+ if { ([target_info gdb_protocol] == "remote" -+ || [target_info gdb_protocol] == "extended-remote") -+ && !$target_non_stop} { -+ set stopped_line_pattern "Thread ${::decimal} \"\[^\r\n\"\]+\" received signal SIGINT, Interrupt\\." -+ } else { -+ set stopped_line_pattern "Thread ${::decimal} \"\[^\r\n\"\]+\" stopped\\." -+ } -+ -+ gdb_test "continue" \ -+ [multi_line \ -+ $stopped_line_pattern \ -+ ".*" \ -+ "Error in testing condition for breakpoint ${bp_num}:" \ -+ "The program being debugged timed out while in a function called from GDB\\." \ -+ "GDB remains in the frame where the timeout occurred\\." \ -+ "To change this behavior use \"set unwind-on-timeout on\"\\." \ -+ "Evaluation of the expression containing the function" \ -+ "\\(condition_func\\) will be abandoned\\." \ -+ "When the function is done executing, GDB will silently stop\\."] \ -+ "expected timeout waiting for inferior call to complete" -+ -+ # Remember that other thread that either crashed (with a segfault) -+ # or hit a breakpoint? Now that the inferior call has timed out, -+ # if we try to resume then we should see the pending event from -+ # that other thread. -+ if { $other_thread_bp } { -+ gdb_test "continue" \ -+ [multi_line \ -+ "Continuing\\." \ -+ ".*" \ -+ "" \ -+ "Thread ${::decimal} \"\[^\"\r\n\]+\" hit Breakpoint ${segfault_bp_num}, do_segfault \[^\r\n\]+:${::segfault_line}" \ -+ "${::decimal}\\s+\[^\r\n\]+Segfault here\[^\r\n\]+"] \ -+ "hit the segfault breakpoint" -+ } else { -+ gdb_test "continue" \ -+ [multi_line \ -+ "Continuing\\." \ -+ ".*" \ -+ "Thread ${::decimal} \"infcall-from-bp\" received signal SIGSEGV, Segmentation fault\\." \ -+ "\\\[Switching to Thread \[^\r\n\]+\\\]" \ -+ "${::hex} in do_segfault \\(\\) at \[^\r\n\]+:${::segfault_line}" \ -+ "${::decimal}\\s+\[^\r\n\]+Segfault here\[^\r\n\]+"] \ -+ "hit the segfault" -+ } -+} -+ -+foreach_with_prefix target_async {"on" "off" } { -+ -+ if { !$target_async } { -+ # GDB can't timeout while waiting for a thread if the target -+ # runs with async-mode turned off; once the target is running -+ # GDB is effectively blocked until the target stops for some -+ # reason. -+ continue -+ } -+ -+ foreach_with_prefix target_non_stop {"off" "on"} { -+ foreach_with_prefix non_stop {"off" "on"} { -+ if { $non_stop && !$target_non_stop } { -+ # It doesn't make sense to operate GDB in non-stop -+ # mode when the target has (in theory) non-stop mode -+ # disabled. -+ continue -+ } -+ foreach_with_prefix other_thread_bp { true false } { -+ run_test $target_async $target_non_stop $non_stop $other_thread_bp -+ } -+ } -+ } -+} diff --git a/gdb-rhel-13298-inferior-funcall-bp-condition-4-of-5.patch b/gdb-rhel-13298-inferior-funcall-bp-condition-4-of-5.patch deleted file mode 100644 index 579e2f5..0000000 --- a/gdb-rhel-13298-inferior-funcall-bp-condition-4-of-5.patch +++ /dev/null @@ -1,413 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andrew Burgess -Date: Wed, 18 Jan 2023 10:17:57 +0000 -Subject: gdb-rhel-13298-inferior-funcall-bp-condition-4-of-5.patch - -;;gdb: introduce unwind-on-timeout setting -;;(Andrew Burgess, RHEL-13298) - -Now that inferior function calls can timeout (see the recent -introduction of direct-call-timeout and indirect-call-timeout), this -commit adds a new setting unwind-on-timeout. - -This new setting is just like the existing unwindonsignal and -unwind-on-terminating-exception, but the new setting will cause GDB to -unwind the stack if an inferior function call times out. - -The existing inferior function call timeout tests have been updated to -cover the new setting. - -Reviewed-By: Eli Zaretskii -Tested-By: Luis Machado -Tested-By: Keith Seitz - -diff --git a/gdb/NEWS b/gdb/NEWS ---- a/gdb/NEWS -+++ b/gdb/NEWS -@@ -72,6 +72,15 @@ show indirect-call-timeout - ignored, GDB will wait indefinitely for an inferior function to - complete, unless interrupted by the user using Ctrl-C. - -+set unwind-on-timeout on|off -+show unwind-on-timeout -+ These commands control whether GDB should unwind the stack when a -+ timeout occurs during an inferior function call. The default is -+ off, in which case the inferior will remain in the frame where the -+ timeout occurred. When on, GDB will unwind the stack removing the -+ dummy frame that was added for the inferior call, and restoring the -+ inferior state to how it was before the inferior call started. -+ - * New features in the GDB remote stub, GDBserver - - ** The --remote-debug and --event-loop-debug command line options -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -20932,6 +20932,22 @@ the default C@t{++} exception handler and the inferior terminated. - Show the current setting of stack unwinding in the functions called by - @value{GDBN}. - -+@anchor{set unwind-on-timeout} -+@item set unwind-on-timeout -+@kindex set unwind-on-timeout -+@cindex unwind stack in called functions when timing out -+@cindex call dummy stack unwinding on timeout. -+Set unwinding of the stack if a function called from @value{GDBN} -+times out. If set to @code{off} (the default), @value{GDBN} stops in -+the frame where the timeout occurred. If set to @code{on}, -+@value{GDBN} unwinds the stack it created for the call and restores -+the context to what it was before the call. -+ -+@item show unwind-on-timeout -+@kindex show unwind-on-timeout -+Show whether @value{GDBN} will unwind the stack if a function called -+from @value{GDBN} times out. -+ - @item set may-call-functions - @kindex set may-call-functions - @cindex disabling calling functions in the program -@@ -20963,11 +20979,11 @@ call by typing the interrupt character (often @kbd{Ctrl-c}). - - If a called function is interrupted for any reason, including hitting - a breakpoint, or triggering a watchpoint, and the stack is not unwound --due to @code{set unwind-on-terminating-exception on} or @code{set --unwindonsignal on} (@pxref{stack unwind settings}), --then the dummy-frame, created by @value{GDBN} to facilitate the call --to the program function, will be visible in the backtrace, for example --frame @code{#3} in the following backtrace: -+due to @code{set unwind-on-terminating-exception on}, @code{set -+unwind-on-timeout on}, or @code{set unwindonsignal on} (@pxref{stack -+unwind settings}), then the dummy-frame, created by @value{GDBN} to -+facilitate the call to the program function, will be visible in the -+backtrace, for example frame @code{#3} in the following backtrace: - - @smallexample - (@value{GDBP}) backtrace -@@ -20992,6 +21008,11 @@ Execution}) @value{GDBN} can place a timeout on any functions called - from @value{GDBN}. If the timeout expires and the function call is - still ongoing, then @value{GDBN} will interrupt the program. - -+If a function called from @value{GDBN} is interrupted by a timeout, -+then by default the inferior is left in the frame where the timeout -+occurred, this behaviour can be adjusted with @samp{set -+unwind-on-timeout} (@pxref{set unwind-on-timeout}). -+ - For targets that don't support asynchronous execution - (@pxref{Background Execution}) then timeouts for functions called from - @value{GDBN} are not supported, the timeout settings described below -diff --git a/gdb/infcall.c b/gdb/infcall.c ---- a/gdb/infcall.c -+++ b/gdb/infcall.c -@@ -218,6 +218,27 @@ show_unwind_on_terminating_exception_p (struct ui_file *file, int from_tty, - value); - } - -+/* This boolean tells GDB what to do if an inferior function, called from -+ GDB, times out. If true, GDB unwinds the stack and restores the context -+ to what it was before the call. When false, GDB leaves the thread as it -+ is at the point of the timeout. -+ -+ The default is to stop in the frame where the timeout occurred. */ -+ -+static bool unwind_on_timeout_p = false; -+ -+/* Implement 'show unwind-on-timeout'. */ -+ -+static void -+show_unwind_on_timeout_p (struct ui_file *file, int from_tty, -+ struct cmd_list_element *c, const char *value) -+{ -+ gdb_printf (file, -+ _("Unwinding of stack if a timeout occurs " -+ "while in a call dummy is %s.\n"), -+ value); -+} -+ - /* Perform the standard coercions that are specified - for arguments to be passed to C, Ada or Fortran functions. - -@@ -574,6 +595,16 @@ struct call_thread_fsm : public thread_fsm - bool should_stop (struct thread_info *thread) override; - - bool should_notify_stop () override; -+ -+ /* Record that this thread timed out while performing an infcall. */ -+ void timed_out () -+ { -+ m_timed_out = true; -+ } -+ -+private: -+ /* Set true if the thread timed out while performing an infcall. */ -+ bool m_timed_out = false; - }; - - /* Allocate a new call_thread_fsm object. */ -@@ -649,7 +680,8 @@ call_thread_fsm::should_notify_stop () - - infcall_debug_printf ("inferior call didn't complete fully"); - -- if (stopped_by_random_signal && unwind_on_signal_p) -+ if ((stopped_by_random_signal && unwind_on_signal_p) -+ || (m_timed_out && unwind_on_timeout_p)) - { - infcall_debug_printf ("unwind-on-signal is on, don't notify"); - return false; -@@ -742,6 +774,9 @@ struct infcall_timer_controller - - infcall_debug_printf ("Stopping thread %s", - m_thread->ptid.to_string ().c_str ()); -+ call_thread_fsm *fsm -+ = gdb::checked_static_cast (m_thread->thread_fsm ()); -+ fsm->timed_out (); - target_stop (m_thread->ptid); - } - }; -@@ -1744,14 +1779,27 @@ When the function is done executing, GDB will silently stop."), - /* A timeout results in a signal being sent to the inferior. */ - gdb_assert (stopped_by_random_signal); - -- /* Indentation is weird here. A later patch is going to move the -- following block into an if/else, so I'm leaving the indentation -- here to minimise the later patch. -+ if (unwind_on_timeout_p) -+ { -+ /* The user wants the context restored. */ -+ -+ /* We must get back to the frame we were before the -+ dummy call. */ -+ dummy_frame_pop (dummy_id, call_thread.get ()); - -- Also, the error message used below refers to 'set -- unwind-on-timeout' which doesn't exist yet. This will be added -- in a later commit, I'm leaving this in for now to minimise the -- churn caused by the commit that adds unwind-on-timeout. */ -+ /* We also need to restore inferior status to that before the -+ dummy call. */ -+ restore_infcall_control_state (inf_status.release ()); -+ -+ error (_("\ -+The program being debugged timed out while in a function called from GDB.\n\ -+GDB has restored the context to what it was before the call.\n\ -+To change this behavior use \"set unwind-on-timeout off\".\n\ -+Evaluation of the expression containing the function\n\ -+(%s) will be abandoned."), -+ name.c_str ()); -+ } -+ else - { - /* The user wants to stay in the frame where we stopped - (default). Discard inferior status, we're not at the same -@@ -1877,6 +1925,20 @@ The default is to unwind the frame."), - show_unwind_on_terminating_exception_p, - &setlist, &showlist); - -+ add_setshow_boolean_cmd ("unwind-on-timeout", no_class, -+ &unwind_on_timeout_p, _("\ -+Set unwinding of stack if a timeout occurs while in a call dummy."), _("\ -+Show unwinding of stack if a timeout occurs while in a call dummy."), -+ _("\ -+The unwind on timeout flag lets the user determine what gdb should do if\n\ -+gdb times out while in a function called from gdb. If set, gdb unwinds\n\ -+the stack and restores the context to what it was before the call. If\n\ -+unset, gdb leaves the inferior in the frame where the timeout occurred.\n\ -+The default is to stop in the frame where the timeout occurred."), -+ NULL, -+ show_unwind_on_timeout_p, -+ &setlist, &showlist); -+ - add_setshow_uinteger_cmd ("direct-call-timeout", no_class, - &direct_call_timeout, _("\ - Set the timeout, for direct calls to inferior function calls."), _("\ -diff --git a/gdb/testsuite/gdb.base/infcall-timeout.exp b/gdb/testsuite/gdb.base/infcall-timeout.exp ---- a/gdb/testsuite/gdb.base/infcall-timeout.exp -+++ b/gdb/testsuite/gdb.base/infcall-timeout.exp -@@ -28,7 +28,11 @@ if { [build_executable "failed to prepare" ${binfile} "${srcfile}" \ - # then adjust the direct-call-timeout, and make an inferior function - # call that will never return. GDB should eventually timeout and stop - # the inferior. --proc run_test { target_async target_non_stop non_stop } { -+# -+# When UNWIND is "off" the inferior wil be left in the frame where the -+# timeout occurs, otherwise, when UNWIND is "on", GDB should unwind -+# back to the frame where the inferior call was made. -+proc run_test { target_async target_non_stop non_stop unwind } { - save_vars { ::GDBFLAGS } { - append ::GDBFLAGS \ - " -ex \"maint set target-non-stop $target_non_stop\"" -@@ -45,28 +49,43 @@ proc run_test { target_async target_non_stop non_stop } { - } - - gdb_test_no_output "set direct-call-timeout 5" -+ gdb_test_no_output "set unwind-on-timeout $unwind" -+ -+ if { $unwind } { -+ gdb_test "print function_that_never_returns ()" \ -+ [multi_line \ -+ "The program being debugged timed out while in a function called from GDB\\." \ -+ "GDB has restored the context to what it was before the call\\." \ -+ "To change this behavior use \"set unwind-on-timeout off\"\\." \ -+ "Evaluation of the expression containing the function" \ -+ "\\(function_that_never_returns\\) will be abandoned\\."] - -- # When non-stop mode is off we get slightly different output from GDB. -- if { ([target_info gdb_protocol] == "remote" -- || [target_info gdb_protocol] == "extended-remote") -- && !$target_non_stop } { -- set stopped_line_pattern "Program received signal SIGINT, Interrupt\\." -+ gdb_test "bt" \ -+ "#0\\s+main \\(\\).*" - } else { -- set stopped_line_pattern "Program stopped\\." -- } -+ # When non-stop mode is off we get slightly different output from GDB. -+ if { ([target_info gdb_protocol] == "remote" -+ || [target_info gdb_protocol] == "extended-remote") -+ && !$target_non_stop } { -+ set stopped_line_pattern "Program received signal SIGINT, Interrupt\\." -+ } else { -+ set stopped_line_pattern "Program stopped\\." -+ } - -- gdb_test "print function_that_never_returns ()" \ -- [multi_line \ -- $stopped_line_pattern \ -- ".*" \ -- "The program being debugged timed out while in a function called from GDB\\." \ -- "GDB remains in the frame where the timeout occurred\\." \ -- "To change this behavior use \"set unwind-on-timeout on\"\\." \ -- "Evaluation of the expression containing the function" \ -- "\\(function_that_never_returns\\) will be abandoned\\." \ -- "When the function is done executing, GDB will silently stop\\."] -- -- gdb_test "bt" ".* function_that_never_returns .*.*" -+ gdb_test "print function_that_never_returns ()" \ -+ [multi_line \ -+ $stopped_line_pattern \ -+ ".*" \ -+ "The program being debugged timed out while in a function called from GDB\\." \ -+ "GDB remains in the frame where the timeout occurred\\." \ -+ "To change this behavior use \"set unwind-on-timeout on\"\\." \ -+ "Evaluation of the expression containing the function" \ -+ "\\(function_that_never_returns\\) will be abandoned\\." \ -+ "When the function is done executing, GDB will silently stop\\."] -+ -+ gdb_test "bt" \ -+ ".* function_that_never_returns .*.*" -+ } - } - - foreach_with_prefix target_async { "on" "off" } { -@@ -88,7 +107,9 @@ foreach_with_prefix target_async { "on" "off" } { - continue - } - -- run_test $target_async $target_non_stop $non_stop -+ foreach_with_prefix unwind { "on" "off" } { -+ run_test $target_async $target_non_stop $non_stop $unwind -+ } - } - } - } -diff --git a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-timeout.exp b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-timeout.exp ---- a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-timeout.exp -+++ b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-timeout.exp -@@ -41,7 +41,12 @@ set segfault_line [gdb_get_line_number "Segfault here"] - # thread, on which the inferior call relies, either hits a breakpoint - # (when OTHER_THREAD_BP is true), or crashes (when OTHER_THREAD_BP is - # false). --proc run_test { target_async target_non_stop non_stop other_thread_bp } { -+# -+# When UNWIND is "on" GDB will unwind the thread which performed the -+# inferior function call back to the state where the inferior call was -+# made (when the inferior call times out). Otherwise, when UNWIND is -+# "off", the inferior is left in the frame where the timeout occurred. -+proc run_test { target_async target_non_stop non_stop other_thread_bp unwind } { - save_vars { ::GDBFLAGS } { - append ::GDBFLAGS " -ex \"maint set target-non-stop $target_non_stop\"" - append ::GDBFLAGS " -ex \"maint non-stop $non_stop\"" -@@ -72,6 +77,7 @@ proc run_test { target_async target_non_stop non_stop other_thread_bp } { - # for this timeout. For now though, we just hope 5 seconds is - # enough. - gdb_test_no_output "set indirect-call-timeout 5" -+ gdb_test_no_output "set unwind-on-timeout $unwind" - - gdb_breakpoint \ - "${::srcfile}:${::cond_bp_line} if (condition_func ())" -@@ -92,27 +98,43 @@ proc run_test { target_async target_non_stop non_stop other_thread_bp } { - "get number for segfault breakpoint"] - } - -- # When non-stop mode is off we get slightly different output from GDB. -- if { ([target_info gdb_protocol] == "remote" -- || [target_info gdb_protocol] == "extended-remote") -- && !$target_non_stop} { -- set stopped_line_pattern "Thread ${::decimal} \"\[^\r\n\"\]+\" received signal SIGINT, Interrupt\\." -+ if { $unwind } { -+ gdb_test "continue" \ -+ [multi_line \ -+ "Error in testing condition for breakpoint ${bp_num}:" \ -+ "The program being debugged timed out while in a function called from GDB\\." \ -+ "GDB has restored the context to what it was before the call\\." \ -+ "To change this behavior use \"set unwind-on-timeout off\"\\." \ -+ "Evaluation of the expression containing the function" \ -+ "\\(condition_func\\) will be abandoned\\.(\r\n\\\[New Thread \[^\r\n\]+\\\])*" \ -+ "" \ -+ "Thread ${::decimal}\[^\r\n\]*hit Breakpoint ${bp_num}, \[^\r\n\]+" \ -+ "\[^\r\n\]+ Conditional breakpoint here\\. \[^\r\n\]+"] \ -+ "expected timeout waiting for inferior call to complete" - } else { -- set stopped_line_pattern "Thread ${::decimal} \"\[^\r\n\"\]+\" stopped\\." -- } -+ # When non-stop mode is off we get slightly different output from GDB. -+ if { ([target_info gdb_protocol] == "remote" -+ || [target_info gdb_protocol] == "extended-remote") -+ && !$target_non_stop} { -+ set stopped_line_pattern \ -+ "Thread ${::decimal} \"\[^\r\n\"\]+\" received signal SIGINT, Interrupt\\." -+ } else { -+ set stopped_line_pattern "Thread ${::decimal} \"\[^\r\n\"\]+\" stopped\\." -+ } - -- gdb_test "continue" \ -- [multi_line \ -- $stopped_line_pattern \ -- ".*" \ -- "Error in testing condition for breakpoint ${bp_num}:" \ -- "The program being debugged timed out while in a function called from GDB\\." \ -- "GDB remains in the frame where the timeout occurred\\." \ -- "To change this behavior use \"set unwind-on-timeout on\"\\." \ -- "Evaluation of the expression containing the function" \ -- "\\(condition_func\\) will be abandoned\\." \ -- "When the function is done executing, GDB will silently stop\\."] \ -- "expected timeout waiting for inferior call to complete" -+ gdb_test "continue" \ -+ [multi_line \ -+ "$stopped_line_pattern" \ -+ ".*" \ -+ "Error in testing condition for breakpoint ${bp_num}:" \ -+ "The program being debugged timed out while in a function called from GDB\\." \ -+ "GDB remains in the frame where the timeout occurred\\." \ -+ "To change this behavior use \"set unwind-on-timeout on\"\\." \ -+ "Evaluation of the expression containing the function" \ -+ "\\(condition_func\\) will be abandoned\\." \ -+ "When the function is done executing, GDB will silently stop\\."] \ -+ "expected timeout waiting for inferior call to complete" -+ } - - # Remember that other thread that either crashed (with a segfault) - # or hit a breakpoint? Now that the inferior call has timed out, -@@ -158,8 +180,11 @@ foreach_with_prefix target_async {"on" "off" } { - # disabled. - continue - } -- foreach_with_prefix other_thread_bp { true false } { -- run_test $target_async $target_non_stop $non_stop $other_thread_bp -+ foreach_with_prefix unwind {"off" "on"} { -+ foreach_with_prefix other_thread_bp { true false } { -+ run_test $target_async $target_non_stop $non_stop \ -+ $other_thread_bp $unwind -+ } - } - } - } diff --git a/gdb-rhel-13298-inferior-funcall-bp-condition-5-of-5.patch b/gdb-rhel-13298-inferior-funcall-bp-condition-5-of-5.patch deleted file mode 100644 index 9dcaeac..0000000 --- a/gdb-rhel-13298-inferior-funcall-bp-condition-5-of-5.patch +++ /dev/null @@ -1,467 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andrew Burgess -Date: Wed, 18 Jan 2023 12:09:05 +0000 -Subject: gdb-rhel-13298-inferior-funcall-bp-condition-5-of-5.patch - -;;gdb: rename unwindonsignal to unwind-on-signal -;;(Andrew Burgess, RHEL-13298) - -We now have unwind-on-timeout and unwind-on-terminating-exception, and -then the odd one out unwindonsignal. - -I'm not a great fan of these squashed together command names, so in -this commit I propose renaming this to unwind-on-signal. - -Obviously I've added the hidden alias unwindonsignal so any existing -GDB scripts will keep working. - -There's one test that I've extended to test the alias works, but in -most of the other test scripts I've changed over to use the new name. - -The docs are updated to reference the new name. - -Reviewed-By: Eli Zaretskii -Tested-By: Luis Machado -Tested-By: Keith Seitz - -diff --git a/gdb/NEWS b/gdb/NEWS ---- a/gdb/NEWS -+++ b/gdb/NEWS -@@ -32,6 +32,10 @@ maintenance info line-table - if the line is considered the start of the epilgoue, and thus a point at - which the frame can be considered destroyed. - -+set unwindonsignal on|off -+show unwindonsignal -+ These commands are now aliases for the new set/show unwind-on-signal. -+ - * New commands - - info missing-debug-handler -@@ -81,6 +85,11 @@ show unwind-on-timeout - dummy frame that was added for the inferior call, and restoring the - inferior state to how it was before the inferior call started. - -+set unwind-on-signal on|off -+show unwind-on-signal -+ These new commands replaces the existing set/show unwindonsignal. The -+ old command is maintained as an alias. -+ - * New features in the GDB remote stub, GDBserver - - ** The --remote-debug and --event-loop-debug command line options -diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo ---- a/gdb/doc/gdb.texinfo -+++ b/gdb/doc/gdb.texinfo -@@ -20886,7 +20886,7 @@ value history. - It is possible for the function you call via the @code{print} or - @code{call} command to generate a signal (e.g., if there's a bug in - the function, or if you passed it incorrect arguments). What happens --in that case is controlled by the @code{set unwindonsignal} command. -+in that case is controlled by the @code{set unwind-on-signal} command. - - Similarly, with a C@t{++} program it is possible for the function you - call via the @code{print} or @code{call} command to generate an -@@ -20900,7 +20900,8 @@ in that case is controlled by the - - @anchor{stack unwind settings} - @table @code --@item set unwindonsignal -+@item set unwind-on-signal -+@kindex set unwind-on-signal - @kindex set unwindonsignal - @cindex unwind stack in called functions - @cindex call dummy stack unwinding -@@ -20911,11 +20912,18 @@ the context to what it was before the call. If set to off (the - default), @value{GDBN} stops in the frame where the signal was - received. - --@item show unwindonsignal -+The command @code{set unwindonsignal} is an alias for this command, -+and is maintained for backward compatibility. -+ -+@item show unwind-on-signal -+@kindex show unwind-on-signal - @kindex show unwindonsignal - Show the current setting of stack unwinding in the functions called by - @value{GDBN}. - -+The command @code{show unwindonsignal} is an alias for this command, -+and is maintained for backward compatibility. -+ - @item set unwind-on-terminating-exception - @kindex set unwind-on-terminating-exception - @cindex unwind stack in called functions with unhandled exceptions -@@ -20980,7 +20988,7 @@ call by typing the interrupt character (often @kbd{Ctrl-c}). - If a called function is interrupted for any reason, including hitting - a breakpoint, or triggering a watchpoint, and the stack is not unwound - due to @code{set unwind-on-terminating-exception on}, @code{set --unwind-on-timeout on}, or @code{set unwindonsignal on} (@pxref{stack -+unwind-on-timeout on}, or @code{set unwind-on-signal on} (@pxref{stack - unwind settings}), then the dummy-frame, created by @value{GDBN} to - facilitate the call to the program function, will be visible in the - backtrace, for example frame @code{#3} in the following backtrace: -diff --git a/gdb/infcall.c b/gdb/infcall.c ---- a/gdb/infcall.c -+++ b/gdb/infcall.c -@@ -1747,7 +1747,7 @@ When the function is done executing, GDB will silently stop."), - The program being debugged received signal %s, %s\n\ - while in a function called from GDB. GDB has restored the context\n\ - to what it was before the call. To change this behavior use\n\ --\"set unwindonsignal off\". Evaluation of the expression containing\n\ -+\"set unwind-on-signal off\". Evaluation of the expression containing\n\ - the function (%s) will be abandoned."), - gdb_signal_to_name (stop_signal), - gdb_signal_to_string (stop_signal), -@@ -1766,7 +1766,7 @@ the function (%s) will be abandoned."), - error (_("\ - The program being debugged was signaled while in a function called from GDB.\n\ - GDB remains in the frame where the signal was received.\n\ --To change this behavior use \"set unwindonsignal on\".\n\ -+To change this behavior use \"set unwind-on-signal on\".\n\ - Evaluation of the expression containing the function\n\ - (%s) will be abandoned.\n\ - When the function is done executing, GDB will silently stop."), -@@ -1898,17 +1898,22 @@ The default is to perform the conversion."), - show_coerce_float_to_double_p, - &setlist, &showlist); - -- add_setshow_boolean_cmd ("unwindonsignal", no_class, -- &unwind_on_signal_p, _("\ -+ set_show_commands setshow_unwind_on_signal_cmds -+ = add_setshow_boolean_cmd ("unwind-on-signal", no_class, -+ &unwind_on_signal_p, _("\ - Set unwinding of stack if a signal is received while in a call dummy."), _("\ - Show unwinding of stack if a signal is received while in a call dummy."), _("\ --The unwindonsignal lets the user determine what gdb should do if a signal\n\ -+The unwind-on-signal lets the user determine what gdb should do if a signal\n\ - is received while in a function called from gdb (call dummy). If set, gdb\n\ - unwinds the stack and restore the context to what as it was before the call.\n\ - The default is to stop in the frame where the signal was received."), -- NULL, -- show_unwind_on_signal_p, -- &setlist, &showlist); -+ NULL, -+ show_unwind_on_signal_p, -+ &setlist, &showlist); -+ add_alias_cmd ("unwindonsignal", setshow_unwind_on_signal_cmds.set, -+ no_class, 1, &setlist); -+ add_alias_cmd ("unwindonsignal", setshow_unwind_on_signal_cmds.show, -+ no_class, 1, &showlist); - - add_setshow_boolean_cmd ("unwind-on-terminating-exception", no_class, - &unwind_on_terminating_exception_p, _("\ -diff --git a/gdb/testsuite/gdb.base/callfuncs.exp b/gdb/testsuite/gdb.base/callfuncs.exp ---- a/gdb/testsuite/gdb.base/callfuncs.exp -+++ b/gdb/testsuite/gdb.base/callfuncs.exp -@@ -46,7 +46,7 @@ proc do_function_calls {prototypes} { - - # If any of these calls segv we don't want to affect subsequent tests. - # E.g., we want to ensure register values are restored. -- gdb_test_no_output "set unwindonsignal on" -+ gdb_test_no_output "set unwind-on-signal on" - - gdb_test "p t_char_values(0,0)" " = 0" - gdb_test "p t_char_values('a','b')" " = 1" -@@ -237,7 +237,7 @@ proc do_function_calls {prototypes} { - "call inferior func with struct - returns char *" - - # Restore default value. -- gdb_test_no_output "set unwindonsignal off" -+ gdb_test_no_output "set unwind-on-signal off" - } - - # Procedure to get current content of all registers. -diff --git a/gdb/testsuite/gdb.base/infcall-failure.exp b/gdb/testsuite/gdb.base/infcall-failure.exp ---- a/gdb/testsuite/gdb.base/infcall-failure.exp -+++ b/gdb/testsuite/gdb.base/infcall-failure.exp -@@ -137,7 +137,7 @@ proc_with_prefix run_cond_hits_segfault_test { async_p non_stop_p } { - "Error in testing condition for breakpoint ${bp_1_num}:" \ - "The program being debugged was signaled while in a function called from GDB\\." \ - "GDB remains in the frame where the signal was received\\." \ -- "To change this behavior use \"set unwindonsignal on\"\\." \ -+ "To change this behavior use \"set unwind-on-signal on\"\\." \ - "Evaluation of the expression containing the function" \ - "\\(func_segfault\\) will be abandoned\\." \ - "When the function is done executing, GDB will silently stop\\."] -@@ -166,7 +166,7 @@ proc_with_prefix run_call_hits_segfault_test { async_p non_stop_p } { - "${::decimal}\\s+\[^\r\n\]+Segfault here\[^\r\n\]+" \ - "The program being debugged was signaled while in a function called from GDB\\." \ - "GDB remains in the frame where the signal was received\\." \ -- "To change this behavior use \"set unwindonsignal on\"\\." \ -+ "To change this behavior use \"set unwind-on-signal on\"\\." \ - "Evaluation of the expression containing the function" \ - "\\(func_segfault\\) will be abandoned\\." \ - "When the function is done executing, GDB will silently stop\\."] -diff --git a/gdb/testsuite/gdb.base/unwindonsignal.exp b/gdb/testsuite/gdb.base/unwindonsignal.exp ---- a/gdb/testsuite/gdb.base/unwindonsignal.exp -+++ b/gdb/testsuite/gdb.base/unwindonsignal.exp -@@ -34,13 +34,29 @@ gdb_test "break stop_here" "Breakpoint \[0-9\]* at .*" - gdb_test "continue" "Continuing.*Breakpoint \[0-9\]*, stop_here.*" \ - "continue to breakpoint at stop_here" - --# Turn on unwindonsignal. --gdb_test_no_output "set unwindonsignal on" \ -- "setting unwindonsignal" -+# Turn on unwind-on-signal. -+gdb_test_no_output "set unwind-on-signal on" \ -+ "setting unwind-on-signal" - --gdb_test "show unwindonsignal" \ -+gdb_test "show unwind-on-signal" \ - "Unwinding of stack .* is on." \ -- "showing unwindonsignal" -+ "showing unwind-on-signal" -+ -+# For backward compatibility we maintain a 'unwindonsignal' alias for -+# 'unwind-on-signal', check it now. -+gdb_test "show unwindonsignal" \ -+ "Unwinding of stack .* is on\\." \ -+ "showing unwindonsignal alias" -+ -+gdb_test_no_output "set unwindonsignal off" \ -+ "setting unwindonsignal alias to off" -+ -+gdb_test "show unwind-on-signal" \ -+ "Unwinding of stack .* is off\\." \ -+ "showing unwind-on-signal after setting via alias" -+ -+gdb_test_no_output "set unwindonsignal on" \ -+ "setting unwindonsignal alias to on" - - # Call function (causing the program to get a signal), and see if gdb handles - # it properly. -@@ -49,7 +65,7 @@ if {[gdb_test "call gen_signal ()" \ - "The program being debugged received signal SIGABRT, Aborted" \ - "while in a function called from GDB\\. GDB has restored the context" \ - "to what it was before the call\\. To change this behavior use" \ -- "\"set unwindonsignal off\"\\. Evaluation of the expression containing" \ -+ "\"set unwind-on-signal off\"\\. Evaluation of the expression containing" \ - "the function \\(gen_signal\\) will be abandoned\\."] \ - "unwindonsignal, inferior function call signaled"] != 0} { - return 0 -@@ -58,15 +74,15 @@ if {[gdb_test "call gen_signal ()" \ - # Verify the stack got unwound. - gdb_test "bt" \ - "#0 *\[x0-9a-f in\]*stop_here \\(.*\\) at .*#1 *\[x0-9a-f in\]*main \\(.*\\) at .*" \ -- "unwindonsignal, stack unwound" -+ "stack unwound" - - # Verify the dummy frame got removed from dummy_frame_stack. - gdb_test_multiple "maint print dummy-frames" \ -- "unwindonsignal, dummy frame removed" { -+ "unwind-on-signal, dummy frame removed" { - -re "\[\r\n\]*.*stack=.*code=.*\[\r\n\]+$gdb_prompt $" { -- fail "unwindonsignal, dummy frame removed" -+ fail $gdb_test_name - } - -re "\[\r\n\]+$gdb_prompt $" { -- pass "unwindonsignal, dummy frame removed" -+ pass $gdb_test_name - } - } -diff --git a/gdb/testsuite/gdb.compile/compile-cplus.exp b/gdb/testsuite/gdb.compile/compile-cplus.exp ---- a/gdb/testsuite/gdb.compile/compile-cplus.exp -+++ b/gdb/testsuite/gdb.compile/compile-cplus.exp -@@ -131,13 +131,13 @@ gdb_test "return" "\r\n#0 main .*" "return" \ - "Make _gdb_expr\\(__gdb_regs\\*\\) return now\\? \\(y or n\\) " "y" - gdb_test "info sym $infcall_pc" "\r\nNo symbol matches .*" "info sym not found" - --gdb_test_no_output "set unwindonsignal on" -+gdb_test_no_output "set unwind-on-signal on" - gdb_test "compile code *(volatile int *) 0 = 0;" \ - [multi_line \ - "The program being debugged received signal SIGSEGV, Segmentation fault" \ - "while in a function called from GDB\\. GDB has restored the context" \ - "to what it was before the call\\. To change this behavior use" \ -- "\"set unwindonsignal off\"\\. Evaluation of the expression containing" \ -+ "\"set unwind-on-signal off\"\\. Evaluation of the expression containing" \ - "the function \\(_gdb_expr\\(__gdb_regs\\*\\)\\) will be abandoned\\."] \ - "compile code segfault second" - -@@ -313,7 +313,7 @@ gdb_test "compile code static const int readonly = 1; *(int *) &readonly = 2;" \ - "The program being debugged received signal SIGSEGV, Segmentation fault" \ - "while in a function called from GDB\\. GDB has restored the context" \ - "to what it was before the call\\. To change this behavior use" \ -- "\"set unwindonsignal off\"\\. Evaluation of the expression containing" \ -+ "\"set unwind-on-signal off\"\\. Evaluation of the expression containing" \ - "the function \\(_gdb_expr\\(__gdb_regs\\*\\)\\) will be abandoned\\."] - gdb_test_no_output "set debug compile off" - -diff --git a/gdb/testsuite/gdb.compile/compile.exp b/gdb/testsuite/gdb.compile/compile.exp ---- a/gdb/testsuite/gdb.compile/compile.exp -+++ b/gdb/testsuite/gdb.compile/compile.exp -@@ -157,13 +157,13 @@ gdb_test "return" "\r\n#0 main .*" "return" \ - "Make _gdb_expr return now\\? \\(y or n\\) " "y" - gdb_test "info sym $infcall_pc" "\r\nNo symbol matches .*" "info sym not found" - --gdb_test_no_output "set unwindonsignal on" -+gdb_test_no_output "set unwind-on-signal on" - gdb_test "compile code *(volatile int *) 0 = 0;" \ - [multi_line \ - "The program being debugged received signal SIGSEGV, Segmentation fault" \ - "while in a function called from GDB\\. GDB has restored the context" \ - "to what it was before the call\\. To change this behavior use" \ -- "\"set unwindonsignal off\"\\. Evaluation of the expression containing" \ -+ "\"set unwind-on-signal off\"\\. Evaluation of the expression containing" \ - "the function \\(_gdb_expr\\) will be abandoned\\."] \ - "compile code segfault second" - -@@ -321,7 +321,7 @@ gdb_test "compile code static const int readonly = 1; *(int *) &readonly = 2;" \ - "The program being debugged received signal SIGSEGV, Segmentation fault" \ - "while in a function called from GDB\\. GDB has restored the context" \ - "to what it was before the call\\. To change this behavior use" \ -- "\"set unwindonsignal off\"\\. Evaluation of the expression containing" \ -+ "\"set unwind-on-signal off\"\\. Evaluation of the expression containing" \ - "the function \\(_gdb_expr\\) will be abandoned\\."] - gdb_test_no_output "set debug compile off" - -diff --git a/gdb/testsuite/gdb.cp/gdb2495.exp b/gdb/testsuite/gdb.cp/gdb2495.exp ---- a/gdb/testsuite/gdb.cp/gdb2495.exp -+++ b/gdb/testsuite/gdb.cp/gdb2495.exp -@@ -98,10 +98,10 @@ if {![runto_main]} { - # behaviour; it should not. Test both on and off states. - - # Turn on unwind on signal behaviour. --gdb_test_no_output "set unwindonsignal on" -+gdb_test_no_output "set unwind-on-signal on" - - # Check that it is turned on. --gdb_test "show unwindonsignal" \ -+gdb_test "show unwind-on-signal" \ - "signal is received while in a call dummy is on.*" \ - "turn on unwind on signal" - -@@ -112,20 +112,20 @@ gdb_test "p exceptions.raise_signal(1)" \ - "The program being debugged received signal SIGABRT, Aborted" \ - "while in a function called from GDB\\. GDB has restored the context" \ - "to what it was before the call\\. To change this behavior use" \ -- "\"set unwindonsignal off\"\\. Evaluation of the expression containing" \ -+ "\"set unwind-on-signal off\"\\. Evaluation of the expression containing" \ - "the function \\(SimpleException::raise_signal\\(int\\)\\) will be abandoned\\."]\ -- "check for unwindonsignal off message" -+ "check for unwind-on-signal off message" - - # And reverse - turn off again. --gdb_test_no_output "set unwindonsignal off" -+gdb_test_no_output "set unwind-on-signal off" - - # Check that it is actually turned off. --gdb_test "show unwindonsignal" \ -+gdb_test "show unwind-on-signal" \ - "signal is received while in a call dummy is off.*" \ - "turn off unwind on signal" - - # Check to see if new behaviour interferes with - # normal signal handling in inferior function calls. - gdb_test "p exceptions.raise_signal(1)" \ -- "To change this behavior use \"set unwindonsignal on\".*" \ -- "check for unwindonsignal on message" -+ "To change this behavior use \"set unwind-on-signal on\".*" \ -+ "check for unwind-on-signal on message" -diff --git a/gdb/testsuite/gdb.fortran/function-calls.exp b/gdb/testsuite/gdb.fortran/function-calls.exp ---- a/gdb/testsuite/gdb.fortran/function-calls.exp -+++ b/gdb/testsuite/gdb.fortran/function-calls.exp -@@ -44,7 +44,7 @@ if {![runto [gdb_get_line_number "post_init"]]} { - } - - # Use inspired by gdb.base/callfuncs.exp. --gdb_test_no_output "set unwindonsignal on" -+gdb_test_no_output "set unwind-on-signal on" - - # Baseline: function and subroutine call with no arguments. - gdb_test "p no_arg()" " = .TRUE." -diff --git a/gdb/testsuite/gdb.mi/mi-condbreak-fail.exp b/gdb/testsuite/gdb.mi/mi-condbreak-fail.exp ---- a/gdb/testsuite/gdb.mi/mi-condbreak-fail.exp -+++ b/gdb/testsuite/gdb.mi/mi-condbreak-fail.exp -@@ -43,7 +43,7 @@ proc run_test { unwind_on_signal } { - return - } - -- mi_gdb_test "-gdb-set unwindonsignal ${unwind_on_signal}" {\^done} \ -+ mi_gdb_test "-gdb-set unwind-on-signal ${unwind_on_signal}" {\^done} \ - "set unwind-on-signal" - - # Create the conditional breakpoint. -@@ -70,7 +70,7 @@ proc run_test { unwind_on_signal } { - "&\"The program being debugged received signal SIGSEGV, Segmentation fault\\\\n\"" \ - "&\"while in a function called from GDB\\. GDB has restored the context\\\\n\"" \ - "&\"to what it was before the call\\. To change this behavior use\\\\n\"" \ -- "&\"\\\\\"set unwindonsignal off\\\\\"\\. Evaluation of the expression containing\\\\n\"" \ -+ "&\"\\\\\"set unwind-on-signal off\\\\\"\\. Evaluation of the expression containing\\\\n\"" \ - "&\"the function \\(cond_fail\\) will be abandoned\\.\\\\n\"" \ - "=breakpoint-modified,bkpt={number=\"$bpnum\",type=\"breakpoint\",\[^\r\n\]+times=\"1\",\[^\r\n\]+}" \ - "~\"\\\\n\"" \ -@@ -92,7 +92,7 @@ proc run_test { unwind_on_signal } { - "&\"Error in testing condition for breakpoint $bpnum:\\\\n\"" \ - "&\"The program being debugged was signaled while in a function called from GDB\\.\\\\n\"" \ - "&\"GDB remains in the frame where the signal was received\\.\\\\n\"" \ -- "&\"To change this behavior use \\\\\"set unwindonsignal on\\\\\"\\.\\\\n\"" \ -+ "&\"To change this behavior use \\\\\"set unwind-on-signal on\\\\\"\\.\\\\n\"" \ - "&\"Evaluation of the expression containing the function\\\\n\"" \ - "&\"\\(cond_fail\\) will be abandoned\\.\\\\n\"" \ - "&\"When the function is done executing, GDB will silently stop\\.\\\\n\"" \ -diff --git a/gdb/testsuite/gdb.mi/mi-condbreak-throw.exp b/gdb/testsuite/gdb.mi/mi-condbreak-throw.exp ---- a/gdb/testsuite/gdb.mi/mi-condbreak-throw.exp -+++ b/gdb/testsuite/gdb.mi/mi-condbreak-throw.exp -@@ -103,7 +103,7 @@ proc run_test { unwind_on_exception } { - "&\"Error in testing condition for breakpoint $bpnum:\\\\n\"" \ - "&\"The program being debugged was signaled while in a function called from GDB\\.\\\\n\"" \ - "&\"GDB remains in the frame where the signal was received\\.\\\\n\"" \ -- "&\"To change this behavior use \\\\\"set unwindonsignal on\\\\\"\\.\\\\n\"" \ -+ "&\"To change this behavior use \\\\\"set unwind-on-signal on\\\\\"\\.\\\\n\"" \ - "&\"Evaluation of the expression containing the function\\\\n\"" \ - "&\"\\(cond_throw\\(\\)\\) will be abandoned\\.\\\\n\"" \ - "&\"When the function is done executing, GDB will silently stop\\.\\\\n\"" \ -diff --git a/gdb/testsuite/gdb.mi/mi-syn-frame.exp b/gdb/testsuite/gdb.mi/mi-syn-frame.exp ---- a/gdb/testsuite/gdb.mi/mi-syn-frame.exp -+++ b/gdb/testsuite/gdb.mi/mi-syn-frame.exp -@@ -94,7 +94,7 @@ mi_gdb_test "409-stack-list-frames 0 0" \ - # - - mi_gdb_test "410-data-evaluate-expression bar()" \ -- ".*410\\^error,msg=\"The program being debugged was signaled while in a function called from GDB.\\\\nGDB remains in the frame where the signal was received.\\\\nTo change this behavior use \\\\\"set unwindonsignal on\\\\\".\\\\nEvaluation of the expression containing the function\\\\n\\(bar\\) will be abandoned.\\\\nWhen the function is done executing, GDB will silently stop.\"" \ -+ ".*410\\^error,msg=\"The program being debugged was signaled while in a function called from GDB.\\\\nGDB remains in the frame where the signal was received.\\\\nTo change this behavior use \\\\\"set unwind-on-signal on\\\\\".\\\\nEvaluation of the expression containing the function\\\\n\\(bar\\) will be abandoned.\\\\nWhen the function is done executing, GDB will silently stop.\"" \ - "call inferior function which raises exception" - - mi_gdb_test "411-stack-list-frames" "411\\^done,stack=\\\[frame=\{level=\"0\",addr=\"$hex\",func=\"bar\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\",arch=\"$any\"},frame=\{level=\"1\",addr=\"$hex\",func=\"\"\},frame=\{level=\"2\",addr=\"$hex\",func=\"main\",file=\".*mi-syn-frame.c\",fullname=\"${fullname_syntax}${srcfile}\",line=\"$decimal\",arch=\"$any\"}.*\\\]" "backtrace from inferior function at exception" -diff --git a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-simple.exp b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-simple.exp ---- a/gdb/testsuite/gdb.threads/infcall-from-bp-cond-simple.exp -+++ b/gdb/testsuite/gdb.threads/infcall-from-bp-cond-simple.exp -@@ -173,7 +173,7 @@ proc_with_prefix run_bp_cond_segfaults { target_async target_non_stop } { - "Error in testing condition for breakpoint ${bp_1_num}:" \ - "The program being debugged was signaled while in a function called from GDB\\." \ - "GDB remains in the frame where the signal was received\\." \ -- "To change this behavior use \"set unwindonsignal on\"\\." \ -+ "To change this behavior use \"set unwind-on-signal on\"\\." \ - "Evaluation of the expression containing the function" \ - "\\(function_that_segfaults\\) will be abandoned\\." \ - "When the function is done executing, GDB will silently stop\\."] -diff --git a/gdb/testsuite/gdb.threads/thread-unwindonsignal.exp b/gdb/testsuite/gdb.threads/thread-unwindonsignal.exp ---- a/gdb/testsuite/gdb.threads/thread-unwindonsignal.exp -+++ b/gdb/testsuite/gdb.threads/thread-unwindonsignal.exp -@@ -13,7 +13,7 @@ - # You should have received a copy of the GNU General Public License - # along with this program. If not, see . - --# Test use of unwindonsignal when a hand function call that gets interrupted -+# Test use of unwind-on-signal when a hand function call that gets interrupted - # by a signal in another thread. - - set NR_THREADS 4 -@@ -49,12 +49,12 @@ gdb_test "continue" \ - # We want the main thread (hand_call_with_signal) and - # thread 1 (sigabrt_handler) to both run. - --# Do turn on unwindonsignal. -+# Do turn on unwind-on-signal. - # We want to test gdb handling of the current thread changing when - # unwindonsignal is in effect. --gdb_test_no_output "set unwindonsignal on" \ -+gdb_test_no_output "set unwind-on-signal on" \ - "setting unwindonsignal" --gdb_test "show unwindonsignal" \ -+gdb_test "show unwind-on-signal" \ - "Unwinding of stack .* is on." \ - "showing unwindonsignal" - diff --git a/gdb-rhel-19390-pc-not-saved.patch b/gdb-rhel-19390-pc-not-saved.patch deleted file mode 100644 index 3bfd212..0000000 --- a/gdb-rhel-19390-pc-not-saved.patch +++ /dev/null @@ -1,379 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andrew Burgess -Date: Wed, 24 Jan 2024 13:52:59 +0000 -Subject: gdb-rhel-19390-pc-not-saved.patch - -;;gdb/unwinders: better support for $pc not saved -;;(Andrew Burgess, RHEL-19390) - -This started with a Red Hat bug report which can be seen here: - - https://bugzilla.redhat.com/show_bug.cgi?id=1850710 - -The problem reported here was using GDB on GNU/Linux for S390, the -user stepped into JIT generated code. As they enter the JIT code GDB -would report 'PC not saved', and this same message would be reported -after each step/stepi. - -Additionally, the user had 'set disassemble-next-line on', and once -they entered the JIT code this output was not displayed, nor were any -'display' directives displayed. - -The user is not making use of the JIT plugin API to provide debug -information. But that's OK, they aren't expecting any source level -debug here, they are happy to use 'stepi', but the missing 'display' -directives are a problem, as is the constant 'PC not saved' (error) -message. - -What is happening here is that as GDB is failing to find any debug -information for the JIT generated code, it is falling back on to the -S390 prologue unwinder to try and unwind frame #0. Unfortunately, -without being able to identify the function boundaries, the S390 -prologue scanner can't help much, in fact, it doesn't even suggest an -arbitrary previous $pc value (some targets that use a link-register -will, by default, assume the link-register contains the previous $pc), -instead the S390 will just say, "sorry, I have no previous $pc value". - -The result of this is that when GDB tries to find frame #1 we end -throwing an error from frame_unwind_pc (the 'PC not saved' error). -This error is not caught anywhere except at the top-level interpreter -loop, and so we end up skipping all the 'display' directive handling. - -While thinking about this, I wondered, could I trigger the same error -using the Python Unwinder API? What happens if a Python unwinder -claims a frame, but then fails to provide a previous $pc value? - -Turns out that exactly the same thing happens, which is great, as that -means we now have a way to reproduce this bug on any target. And so -the test included with this patch does just this. I have a Python -unwinder that claims a frame, but doesn't provide any previous -register values. - -I then do two tests, first I stop in the claimed frame (i.e. frame #0 -is the frame that can't be unwound), I perform a few steps, and check -the backtrace. And second, I stop in a child of the problem -frame (i.e. frame #1 is the frame that can't be unwound), and from -here I check the backtrace. - -While all this is going on I have a 'display' directive in place, and -each time GDB stops I check that the display directive triggers. - -Additionally, when checking the backtrace, I am checking that the -backtrace finishes with the message 'Backtrace stopped: frame did not -save the PC'. - -As for the fix I chose to add a call to frame_unwind_pc directly to -get_prev_frame_always_1. Calling frame_unwind_pc will cache the -unwound $pc value, so this doesn't add much additional work as -immediately after the new frame_unwind_pc call, we call -get_prev_frame_maybe_check_cycle, which actually generates the -previous frame, which will always (I think) require a call to -frame_unwind_pc anyway. - -The reason for adding the frame_unwind_pc call into -get_prev_frame_always_1, is that if the frame_unwind_pc call fails we -want to set the frames 'stop_reason', and get_prev_frame_always_1 -seems to be the place where this is done, so I wanted to keep the new -stop_reason setting code next to all the existing stop_reason setting -code. - -Additionally, once we enter get_prev_frame_maybe_check_cycle we -actually create the previous frame, then, if it turns out that the -previous frame can't be created we need to remove the frame .. this -seemed more complex than just making the check in -get_prev_frame_always_1. - -With this fix in place the original S390 bug is fixed, and also the -test added in this commit, that uses the Python API, is also fixed. - -Reviewed-By: Kevin Buettner - -diff --git a/gdb/frame.c b/gdb/frame.c ---- a/gdb/frame.c -+++ b/gdb/frame.c -@@ -2422,6 +2422,38 @@ get_prev_frame_always_1 (frame_info_ptr this_frame) - } - } - -+ /* Ensure we can unwind the program counter of THIS_FRAME. */ -+ try -+ { -+ /* Calling frame_unwind_pc for the sentinel frame relies on the -+ current_frame being set, which at this point it might not be if we -+ are in the process of setting the current_frame after a stop (see -+ get_current_frame). -+ -+ The point of this check is to ensure that the unwinder for -+ THIS_FRAME can actually unwind the $pc, which we assume the -+ sentinel frame unwinder can always do (it's just a read from the -+ machine state), so we only call frame_unwind_pc for frames other -+ than the sentinel (level -1) frame. -+ -+ Additionally, we don't actually care about the value of the -+ unwound $pc, just that the call completed successfully. */ -+ if (this_frame->level >= 0) -+ frame_unwind_pc (this_frame); -+ } -+ catch (const gdb_exception_error &ex) -+ { -+ if (ex.error == NOT_AVAILABLE_ERROR || ex.error == OPTIMIZED_OUT_ERROR) -+ { -+ frame_debug_printf (" -> nullptr // no saved PC"); -+ this_frame->stop_reason = UNWIND_NO_SAVED_PC; -+ this_frame->prev = nullptr; -+ return nullptr; -+ } -+ -+ throw; -+ } -+ - return get_prev_frame_maybe_check_cycle (this_frame); - } - -diff --git a/gdb/testsuite/gdb.base/pc-not-saved.c b/gdb/testsuite/gdb.base/pc-not-saved.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/pc-not-saved.c -@@ -0,0 +1,48 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2024 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+volatile int global_var = 0; -+ -+void -+other_func (void) -+{ -+ /* Nothing. */ -+} -+ -+void -+break_bt_here (void) -+{ -+ /* This is all nonsense; just filler so this function has a body. */ -+ if (global_var != 99) -+ global_var++; -+ if (global_var != 98) -+ global_var++; -+ if (global_var != 97) -+ global_var++; -+ if (global_var != 96) -+ global_var++; -+ other_func (); -+ if (global_var != 95) -+ global_var++; -+} -+ -+int -+main (void) -+{ -+ break_bt_here (); -+ return 0; -+} -diff --git a/gdb/testsuite/gdb.base/pc-not-saved.exp b/gdb/testsuite/gdb.base/pc-not-saved.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/pc-not-saved.exp -@@ -0,0 +1,113 @@ -+# Copyright 2024 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Test how GDB handles a frame in which the previous-pc value is not -+# available. Specifically, check that the backtrace correctly reports -+# why the backtrace is truncated, and ensure that 'display' directives -+# still work when 'stepi'-ing through the frame. -+# -+# We do this by registering a Python unwinder which doesn't provide -+# any previous register values. -+ -+require allow_python_tests -+ -+standard_testfile -+ -+if { [prepare_for_testing "failed to prepare" ${testfile} ${srcfile}] } { -+ return -+} -+ -+set remote_python_file \ -+ [gdb_remote_download host "${srcdir}/${subdir}/${testfile}.py"] -+ -+if { ![runto "break_bt_here"] } { -+ return -+} -+ -+# Figuring out the correct frame-id from a Python unwinder is hard. -+# We need to know the function's start address (not too hard), and the -+# stack address on entry to the function, which is much harder to -+# figure out in a cross-target way. -+# -+# So instead we run without any Python unwinder in place and use -+# 'maint print frame-id' to record the frame-id. We then restart GDB, -+# load the Python unwinder, and tell it to use the frame-id we -+# recorded here. -+set pc unknown -+set cfa unknown -+gdb_test_multiple "maintenance print frame-id" "store break_bt_here frame-id" { -+ -re -wrap "frame-id for frame #0: \\{stack=($hex),code=($hex),\[^\}\]+\\}" { -+ set cfa $expect_out(1,string) -+ set pc $expect_out(1,string) -+ } -+} -+gdb_assert { ![string equal $cfa unknown] } \ -+ "check we read the frame's CFA" -+ -+gdb_assert { ![string equal $pc unknown] } \ -+ "check we read the frame's PC" -+ -+# Restart and load the Python unwinder script. -+clean_restart $binfile -+gdb_test_no_output "source ${remote_python_file}" "load python file" -+ -+# Tell the Python unwinder to use the frame-id we cached above. -+gdb_test_no_output "python set_break_bt_here_frame_id($pc, $cfa)" -+ -+# Run up to the function which the unwinder will claim. -+if { ![runto "break_bt_here"] } { -+ return -+} -+ -+# Print the backtrace. Check that the reason for stopping the -+# backtrace is that the previous $pc is not available. -+gdb_test "bt" \ -+ [multi_line \ -+ "^#0 break_bt_here \\(\\) at \[^\r\n\]+" \ -+ "Backtrace stopped: frame did not save the PC"] \ -+ "backtrace from break_bt_here function" -+ -+# Ensure we can stepi. -+gdb_test "stepi" \ -+ "(:?$hex\\s+)?$decimal\\s+\[^\r\n\]+" \ -+ "stepi without a display in place" -+ -+# Setup a 'display' directive. -+gdb_test "display/i \$pc" \ -+ [multi_line \ -+ "^1: x/i \\\$pc" \ -+ "=> $hex :\\s+\[^\r\n\]+"] -+ -+# Step again, check the 'display' directive is shown. -+gdb_test "stepi" \ -+ [multi_line \ -+ "(:?$hex\\s+)?$decimal\\s+\[^\r\n\]+" \ -+ "1: x/i \\\$pc" \ -+ "=> $hex :\\s+\[^\r\n\]+"] \ -+ "stepi with a display in place" -+ -+# Continue to a function that is called from within break_bt_here. -+# The Python unwinder will then be claiming frame #1. -+gdb_breakpoint other_func -+gdb_continue_to_breakpoint "continue to other_func" -+ -+# Print the backtrace and check that the reason for stopping the -+# backtrace is that the previous $pc is not available. -+gdb_test "bt" \ -+ [multi_line \ -+ "#0 other_func \\(\\) at \[^\r\n\]+" \ -+ "#1 (:?$hex in )?break_bt_here \\(\\) at \[^\r\n\]+" \ -+ "Backtrace stopped: frame did not save the PC"] \ -+ "backtrace from other_func function" -diff --git a/gdb/testsuite/gdb.base/pc-not-saved.py b/gdb/testsuite/gdb.base/pc-not-saved.py -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/pc-not-saved.py -@@ -0,0 +1,71 @@ -+# Copyright (C) 2024 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+import gdb -+from gdb.unwinder import Unwinder, FrameId -+ -+# Cached FrameId. See set_break_bt_here_frame_id for details. -+break_bt_here_frame_id = None -+ -+ -+def set_break_bt_here_frame_id(pc, cfa): -+ """Call this to pre-calculate the FrameId for the frame our unwinder -+ is going to claim, this avoids us having to actually figure out a -+ frame-id within the unwinder, something which is going to be hard -+ to do in a cross-target way. -+ -+ Instead we first run the test without the Python unwinder in -+ place, use 'maint print frame-id' to record the frame-id, then, -+ after loading this Python script, we all this function to record -+ the frame-id that the unwinder should use.""" -+ global break_bt_here_frame_id -+ break_bt_here_frame_id = FrameId(cfa, pc) -+ -+ -+class break_unwinding(Unwinder): -+ -+ """An unwinder for the function 'break_bt_here'. This unwinder will -+ claim any frame for the function in question, but doesn't provide -+ any unwound register values. Importantly, we don't provide a -+ previous $pc value, this means that if we are stopped in -+ 'break_bt_here' then we should fail to unwind beyond frame #0.""" -+ -+ def __init__(self): -+ Unwinder.__init__(self, "break unwinding") -+ -+ def __call__(self, pending_frame): -+ pc_desc = pending_frame.architecture().registers().find("pc") -+ pc = pending_frame.read_register(pc_desc) -+ -+ if pc.is_optimized_out: -+ return None -+ -+ block = gdb.block_for_pc(pc) -+ if block == None: -+ return None -+ func = block.function -+ if func == None: -+ return None -+ if str(func) != "break_bt_here": -+ return None -+ -+ global break_bt_here_frame_id -+ if break_bt_here_frame_id is None: -+ return None -+ -+ return pending_frame.create_unwind_info(break_bt_here_frame_id) -+ -+ -+gdb.unwinder.register_unwinder(None, break_unwinding(), True) diff --git a/gdb-rhel-36225-add-arch14-record.patch b/gdb-rhel-36225-add-arch14-record.patch deleted file mode 100644 index 31c15f9..0000000 --- a/gdb-rhel-36225-add-arch14-record.patch +++ /dev/null @@ -1,46 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andreas Arnez -Date: Tue, 13 Feb 2024 18:55:29 +0100 -Subject: gdb-rhel-36225-add-arch14-record.patch - -;; Backport "gdb: s390: Add arch14 record/replay support" -;; (Andreas Arnez, RHEL-36225) - -Enable recording of the new "arch14" instructions on z/Architecture -targets, except for the specialized-function-assist instruction NNPA. - -diff --git a/gdb/s390-tdep.c b/gdb/s390-tdep.c ---- a/gdb/s390-tdep.c -+++ b/gdb/s390-tdep.c -@@ -5534,6 +5534,14 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, - case 0xe635: /* VLRL - vector load rightmost with immed. length */ - case 0xe637: /* VLRLR - vector load rightmost with length */ - case 0xe649: /* VLIP - vector load immediate decimal */ -+ case 0xe656: /* VCLFNH - vector fp convert and lengthen from NNP high */ -+ case 0xe65e: /* VCLFNL - vector fp convert and lengthen from NNP low */ -+ case 0xe655: /* VCNF - vector fp convert to NNP */ -+ case 0xe65d: /* VCFN - vector fp convert from NNP */ -+ case 0xe674: /* VSCHP - decimal scale and convert to HFP */ -+ case 0xe675: /* VCRNF - vector fp convert and round to NNP */ -+ case 0xe67c: /* VSCSHP - decimal scale and convert and split to HFP */ -+ case 0xe67d: /* VCSPH - vector convert HFP to scaled decimal */ - case 0xe700: /* VLEB - vector load element */ - case 0xe701: /* VLEH - vector load element */ - case 0xe702: /* VLEG - vector load element */ -@@ -5791,11 +5799,16 @@ s390_process_record (struct gdbarch *gdbarch, struct regcache *regcache, - - /* 0xe747-0xe749 undefined */ - -+ case 0xe651: /* VCLZDP - vector count leading zero digits */ -+ case 0xe654: /* VUPKZH - vector unpack zoned high */ - case 0xe658: /* VCVD - vector convert to decimal 32 bit */ - case 0xe659: /* VSRP - vector shift and round decimal */ - case 0xe65a: /* VCVDG - vector convert to decimal 64 bit*/ - case 0xe65b: /* VPSOP - vector perform sign operation decimal */ -+ case 0xe65c: /* VUPKZL - vector unpack zoned low */ -+ case 0xe670: /* VPKZR - vector pack zoned register */ - case 0xe671: /* VAP - vector add decimal */ -+ case 0xe672: /* VSRPR - vector shift and round decimal register */ - case 0xe673: /* VSP - vector subtract decimal */ - case 0xe678: /* VMP - vector multiply decimal */ - case 0xe679: /* VMSP - vector multiply decimal */ diff --git a/gdb-rhel-36518-add-power11-support.patch b/gdb-rhel-36518-add-power11-support.patch deleted file mode 100644 index 805a868..0000000 --- a/gdb-rhel-36518-add-power11-support.patch +++ /dev/null @@ -1,48 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Peter Bergner -Date: Fri, 9 Feb 2024 10:51:30 -0600 -Subject: gdb-rhel-36518-add-power11-support.patch - -;; Backport "PowerPC: Add support for Power11 options" -;; (Peter Bergner, RHEL-36518) - -opcodes/ - * ppc-dis.c (ppc_opts): Add "power11" and "pwr11" entries. - (powerpc_init_dialect): Default to "power11". - -diff --git a/opcodes/ppc-dis.c b/opcodes/ppc-dis.c ---- a/opcodes/ppc-dis.c -+++ b/opcodes/ppc-dis.c -@@ -208,6 +208,11 @@ struct ppc_mopt ppc_opts[] = { - | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 - | PPC_OPCODE_POWER10 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX), - 0 }, -+ { "power11", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64 -+ | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 -+ | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 -+ | PPC_OPCODE_POWER10 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX), -+ 0 }, - { "libresoc",(PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64 - | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 - | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 -@@ -267,6 +272,11 @@ struct ppc_mopt ppc_opts[] = { - | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 - | PPC_OPCODE_POWER10 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX), - 0 }, -+ { "pwr11", (PPC_OPCODE_PPC | PPC_OPCODE_ISEL | PPC_OPCODE_64 -+ | PPC_OPCODE_POWER4 | PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 -+ | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 -+ | PPC_OPCODE_POWER10 | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX), -+ 0 }, - { "pwrx", PPC_OPCODE_POWER | PPC_OPCODE_POWER2, - 0 }, - { "raw", PPC_OPCODE_PPC, -@@ -396,7 +406,7 @@ powerpc_init_dialect (struct disassemble_info *info) - break; - default: - if (info->arch == bfd_arch_powerpc) -- dialect = ppc_parse_cpu (dialect, &sticky, "power10") | PPC_OPCODE_ANY; -+ dialect = ppc_parse_cpu (dialect, &sticky, "power11") | PPC_OPCODE_ANY; - else - dialect = ppc_parse_cpu (dialect, &sticky, "pwr"); - break; diff --git a/gdb-rhel-36527-apx-disasm.patch b/gdb-rhel-36527-apx-disasm.patch deleted file mode 100644 index e143e99..0000000 --- a/gdb-rhel-36527-apx-disasm.patch +++ /dev/null @@ -1,7834 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Keith Seitz -Date: Wed, 15 May 2024 09:59:51 -0700 -Subject: gdb-rhel-36527-apx-disasm.patch - -;; Update x86 disassembler - -Update x86 disassembler with APX improvements by syncing -with gdb-15.1 release candidate. - -Resolves: RHEL-36527 - -diff --git a/include/opcode/i386.h b/include/opcode/i386.h ---- a/include/opcode/i386.h -+++ b/include/opcode/i386.h -@@ -1,5 +1,5 @@ - /* opcode/i386.h -- Intel 80386 opcode macros -- Copyright (C) 1989-2023 Free Software Foundation, Inc. -+ Copyright (C) 1989-2024 Free Software Foundation, Inc. - - This file is part of GAS, the GNU Assembler, and GDB, the GNU Debugger. - -@@ -112,9 +112,13 @@ - /* x86-64 extension prefix. */ - #define REX_OPCODE 0x40 - -+#define REX2_OPCODE 0xd5 -+ - /* Non-zero if OPCODE is the rex prefix. */ - #define REX_PREFIX_P(opcode) (((opcode) & 0xf0) == REX_OPCODE) - -+/* M0 in rex2 prefix represents map0 or map1. */ -+#define REX2_M 0x8 - /* Indicates 64 bit operand size. */ - #define REX_W 8 - /* High extension to reg field of modrm byte. */ -diff --git a/opcodes/i386-dis-evex-mod.h b/opcodes/i386-dis-evex-mod.h ---- a/opcodes/i386-dis-evex-mod.h -+++ b/opcodes/i386-dis-evex-mod.h -@@ -1 +1,10 @@ --/* Nothing at present. */ -+ /* MOD_EVEX_MAP4_F8_P1 */ -+ { -+ { "enqcmds", { Gva, M }, 0 }, -+ { VEX_W_TABLE (EVEX_W_MAP4_F8_P1_M_1) }, -+ }, -+ /* MOD_EVEX_MAP4_F8_P3 */ -+ { -+ { "enqcmd", { Gva, M }, 0 }, -+ { VEX_W_TABLE (EVEX_W_MAP4_F8_P3_M_1) }, -+ }, -diff --git a/opcodes/i386-dis-evex-prefix.h b/opcodes/i386-dis-evex-prefix.h ---- a/opcodes/i386-dis-evex-prefix.h -+++ b/opcodes/i386-dis-evex-prefix.h -@@ -338,6 +338,29 @@ - { "vcmpp%XH", { MaskG, Vex, EXxh, EXxEVexS, CMP }, 0 }, - { "vcmps%XH", { MaskG, VexScalar, EXw, EXxEVexS, CMP }, 0 }, - }, -+ /* PREFIX_EVEX_MAP4_F0 */ -+ { -+ { "crc32A", { Gdq, Eb }, 0 }, -+ { "invept", { Gm, Mo }, 0 }, -+ }, -+ /* PREFIX_EVEX_MAP4_F1 */ -+ { -+ { "crc32Q", { Gdq, Ev }, 0 }, -+ { "invvpid", { Gm, Mo }, 0 }, -+ { "crc32Q", { Gdq, Ev }, 0 }, -+ }, -+ /* PREFIX_EVEX_MAP4_F2 */ -+ { -+ { Bad_Opcode }, -+ { "invpcid", { Gm, M }, 0 }, -+ }, -+ /* PREFIX_EVEX_MAP4_F8 */ -+ { -+ { Bad_Opcode }, -+ { MOD_TABLE (MOD_EVEX_MAP4_F8_P_1) }, -+ { "movdir64b", { Gva, M }, 0 }, -+ { MOD_TABLE (MOD_EVEX_MAP4_F8_P_3) }, -+ }, - /* PREFIX_EVEX_MAP5_10 */ - { - { Bad_Opcode }, -diff --git a/opcodes/i386-dis-evex-reg.h b/opcodes/i386-dis-evex-reg.h ---- a/opcodes/i386-dis-evex-reg.h -+++ b/opcodes/i386-dis-evex-reg.h -@@ -49,3 +49,74 @@ - { "vscatterpf0qp%XW", { MVexVSIBQWpX }, PREFIX_DATA }, - { "vscatterpf1qp%XW", { MVexVSIBQWpX }, PREFIX_DATA }, - }, -+ /* REG_EVEX_MAP4_80 */ -+ { -+ { "%NFaddA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "%NForA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "adcA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "sbbA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "%NFandA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "%NFsubA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "%NFxorA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ }, -+ /* REG_EVEX_MAP4_81 */ -+ { -+ { "%NFaddQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA }, -+ { "%NForQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA }, -+ { "adcQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA }, -+ { "sbbQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA }, -+ { "%NFandQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA }, -+ { "%NFsubQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA }, -+ { "%NFxorQ", { VexGv, Ev, Iv }, PREFIX_NP_OR_DATA }, -+ }, -+ /* REG_EVEX_MAP4_83 */ -+ { -+ { "%NFaddQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA }, -+ { "%NForQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA }, -+ { "adcQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA }, -+ { "sbbQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA }, -+ { "%NFandQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA }, -+ { "%NFsubQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA }, -+ { "%NFxorQ", { VexGv, Ev, sIb }, PREFIX_NP_OR_DATA }, -+ }, -+ /* REG_EVEX_MAP4_8F */ -+ { -+ { VEX_W_TABLE (EVEX_W_MAP4_8F_R_0) }, -+ }, -+ /* REG_EVEX_MAP4_F6 */ -+ { -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { "notA", { VexGb, Eb }, NO_PREFIX }, -+ { "%NFnegA", { VexGb, Eb }, NO_PREFIX }, -+ { "%NFmulA", { Eb }, NO_PREFIX }, -+ { "%NFimulA", { Eb }, NO_PREFIX }, -+ { "%NFdivA", { Eb }, NO_PREFIX }, -+ { "%NFidivA", { Eb }, NO_PREFIX }, -+ }, -+ /* REG_EVEX_MAP4_F7 */ -+ { -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { "notQ", { VexGv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%NFnegQ", { VexGv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%NFmulQ", { Ev }, PREFIX_NP_OR_DATA }, -+ { "%NFimulQ", { Ev }, PREFIX_NP_OR_DATA }, -+ { "%NFdivQ", { Ev }, PREFIX_NP_OR_DATA }, -+ { "%NFidivQ", { Ev }, PREFIX_NP_OR_DATA }, -+ }, -+ /* REG_EVEX_MAP4_FE */ -+ { -+ { "%NFincA", { VexGb, Eb }, NO_PREFIX }, -+ { "%NFdecA", { VexGb, Eb }, NO_PREFIX }, -+ }, -+ /* REG_EVEX_MAP4_FF */ -+ { -+ { "%NFincQ", { VexGv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%NFdecQ", { VexGv, Ev }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { VEX_W_TABLE (EVEX_W_MAP4_FF_R_6) }, -+ }, -diff --git a/opcodes/i386-dis-evex-w.h b/opcodes/i386-dis-evex-w.h ---- a/opcodes/i386-dis-evex-w.h -+++ b/opcodes/i386-dis-evex-w.h -@@ -442,6 +442,24 @@ - { Bad_Opcode }, - { "vpshrdw", { XM, Vex, EXx, Ib }, 0 }, - }, -+ /* EVEX_W_MAP4_8F_R_0 */ -+ { -+ { "pop2", { { PUSH2_POP2_Fixup, q_mode}, Eq }, NO_PREFIX }, -+ { "pop2p", { { PUSH2_POP2_Fixup, q_mode}, Eq }, NO_PREFIX }, -+ }, -+ /* EVEX_W_MAP4_F8_P1_M_1 */ -+ { -+ { "uwrmsr", { Gq, Eq }, 0 }, -+ }, -+ /* EVEX_W_MAP4_F8_P3_M_1 */ -+ { -+ { "urdmsr", { Eq, Gq }, 0 }, -+ }, -+ /* EVEX_W_MAP4_FF_R_6 */ -+ { -+ { "push2", { { PUSH2_POP2_Fixup, q_mode}, Eq }, 0 }, -+ { "push2p", { { PUSH2_POP2_Fixup, q_mode}, Eq }, 0 }, -+ }, - /* EVEX_W_MAP5_5B_P_0 */ - { - { "vcvtdq2ph%XY", { XMxmmq, EXx, EXxEVexR }, 0 }, -diff --git a/opcodes/i386-dis-evex.h b/opcodes/i386-dis-evex.h ---- a/opcodes/i386-dis-evex.h -+++ b/opcodes/i386-dis-evex.h -@@ -164,10 +164,10 @@ static const struct dis386 evex_table[][256] = { - { Bad_Opcode }, - { Bad_Opcode }, - /* 90 */ -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -+ { X86_64_EVEX_W_TABLE (VEX_W_0F90_L_0) }, -+ { X86_64_EVEX_W_TABLE (VEX_W_0F91_L_0) }, -+ { X86_64_EVEX_W_TABLE (VEX_W_0F92_L_0) }, -+ { X86_64_EVEX_W_TABLE (VEX_W_0F93_L_0) }, - { Bad_Opcode }, - { Bad_Opcode }, - { Bad_Opcode }, -@@ -375,9 +375,9 @@ static const struct dis386 evex_table[][256] = { - { "vpsllv%DQ", { XM, Vex, EXx }, PREFIX_DATA }, - /* 48 */ - { Bad_Opcode }, -+ { X86_64_EVEX_MEM_W_TABLE (VEX_W_0F3849_X86_64_L_0) }, - { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -+ { X86_64_EVEX_MEM_W_TABLE (VEX_W_0F384B_X86_64_L_0) }, - { "vrcp14p%XW", { XM, EXx }, PREFIX_DATA }, - { "vrcp14s%XW", { XMScalar, VexScalar, EXdq }, PREFIX_DATA }, - { "vrsqrt14p%XW", { XM, EXx }, 0 }, -@@ -545,32 +545,32 @@ static const struct dis386 evex_table[][256] = { - { "%XEvaesdecY", { XM, Vex, EXx }, PREFIX_DATA }, - { "%XEvaesdeclastY", { XM, Vex, EXx }, PREFIX_DATA }, - /* E0 */ -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38E0) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38E1) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38E2) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38E3) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38E4) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38E5) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38E6) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38E7) }, - /* E8 */ -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38E8) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38E9) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38EA) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38EB) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38EC) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38ED) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38EE) }, -+ { X86_64_EVEX_FROM_VEX_TABLE (X86_64_VEX_0F38EF) }, - /* F0 */ - { Bad_Opcode }, - { Bad_Opcode }, -+ { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F38F2_L_0) }, -+ { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F38F3_L_0) }, - { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -- { Bad_Opcode }, -+ { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F38F5_L_0) }, -+ { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F38F6_L_0) }, -+ { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F38F7_L_0) }, - /* F8 */ - { Bad_Opcode }, - { Bad_Opcode }, -@@ -854,7 +854,7 @@ static const struct dis386 evex_table[][256] = { - { Bad_Opcode }, - { Bad_Opcode }, - /* F0 */ -- { Bad_Opcode }, -+ { X86_64_EVEX_PFX_TABLE (PREFIX_VEX_0F3AF0_L_0) }, - { Bad_Opcode }, - { Bad_Opcode }, - { Bad_Opcode }, -@@ -872,6 +872,297 @@ static const struct dis386 evex_table[][256] = { - { Bad_Opcode }, - { Bad_Opcode }, - }, -+ /* EVEX_MAP4_ */ -+ { -+ /* 00 */ -+ { "%NFaddB", { VexGb, Eb, Gb }, NO_PREFIX }, -+ { "%NFaddS", { VexGv, Ev, Gv }, PREFIX_NP_OR_DATA }, -+ { "%NFaddB", { VexGb, Gb, EbS }, NO_PREFIX }, -+ { "%NFaddS", { VexGv, Gv, EvS }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 08 */ -+ { "%NForB", { VexGb, Eb, Gb }, NO_PREFIX }, -+ { "%NForS", { VexGv, Ev, Gv }, PREFIX_NP_OR_DATA }, -+ { "%NForB", { VexGb, Gb, EbS }, NO_PREFIX }, -+ { "%NForS", { VexGv, Gv, EvS }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 10 */ -+ { "adcB", { VexGb, Eb, Gb }, NO_PREFIX }, -+ { "adcS", { VexGv, Ev, Gv }, PREFIX_NP_OR_DATA }, -+ { "adcB", { VexGb, Gb, EbS }, NO_PREFIX }, -+ { "adcS", { VexGv, Gv, EvS }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 18 */ -+ { "sbbB", { VexGb, Eb, Gb }, NO_PREFIX }, -+ { "sbbS", { VexGv, Ev, Gv }, PREFIX_NP_OR_DATA }, -+ { "sbbB", { VexGb, Gb, EbS }, NO_PREFIX }, -+ { "sbbS", { VexGv, Gv, EvS }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 20 */ -+ { "%NFandB", { VexGb, Eb, Gb }, NO_PREFIX }, -+ { "%NFandS", { VexGv, Ev, Gv }, PREFIX_NP_OR_DATA }, -+ { "%NFandB", { VexGb, Gb, EbS }, NO_PREFIX }, -+ { "%NFandS", { VexGv, Gv, EvS }, PREFIX_NP_OR_DATA }, -+ { "%NFshldS", { VexGv, Ev, Gv, Ib }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 28 */ -+ { "%NFsubB", { VexGb, Eb, Gb }, NO_PREFIX }, -+ { "%NFsubS", { VexGv, Ev, Gv }, PREFIX_NP_OR_DATA }, -+ { "%NFsubB", { VexGb, Gb, EbS }, NO_PREFIX }, -+ { "%NFsubS", { VexGv, Gv, EvS }, PREFIX_NP_OR_DATA }, -+ { "%NFshrdS", { VexGv, Ev, Gv, Ib }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 30 */ -+ { "%NFxorB", { VexGb, Eb, Gb }, NO_PREFIX }, -+ { "%NFxorS", { VexGv, Ev, Gv }, PREFIX_NP_OR_DATA }, -+ { "%NFxorB", { VexGb, Gb, EbS }, NO_PREFIX }, -+ { "%NFxorS", { VexGv, Gv, EvS }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 38 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 40 */ -+ { "%CFcmovoS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovnoS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovbS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovaeS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmoveS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovneS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovbeS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovaS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ /* 48 */ -+ { "%CFcmovsS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovnsS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovpS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovnpS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovlS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovgeS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovleS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%CFcmovgS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ /* 50 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 58 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 60 */ -+ { "%MEmovbeS", { Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%MEmovbeS", { Ev, Gv }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { "wrussK", { M, Gdq }, PREFIX_DATA }, -+ { PREFIX_TABLE (PREFIX_0F38F6) }, -+ { Bad_Opcode }, -+ /* 68 */ -+ { Bad_Opcode }, -+ { "%NFimulS", { Gv, Ev, Iv }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { "%NFimulS", { Gv, Ev, sIb }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 70 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 78 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 80 */ -+ { REG_TABLE (REG_EVEX_MAP4_80) }, -+ { REG_TABLE (REG_EVEX_MAP4_81) }, -+ { Bad_Opcode }, -+ { REG_TABLE (REG_EVEX_MAP4_83) }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 88 */ -+ { "%NFpopcntS", { Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { REG_TABLE (REG_EVEX_MAP4_8F) }, -+ /* 90 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* 98 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* A0 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { "%NFshldS", { VexGv, Ev, Gv, CL }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* A8 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { "%NFshrdS", { VexGv, Ev, Gv, CL }, PREFIX_NP_OR_DATA }, -+ { Bad_Opcode }, -+ { "%NFimulS", { VexGv, Gv, Ev }, PREFIX_NP_OR_DATA }, -+ /* B0 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* B8 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* C0 */ -+ { REG_TABLE (REG_C0) }, -+ { REG_TABLE (REG_C1) }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* C8 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* D0 */ -+ { REG_TABLE (REG_D0) }, -+ { REG_TABLE (REG_D1) }, -+ { REG_TABLE (REG_D2) }, -+ { REG_TABLE (REG_D3) }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* D8 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* E0 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* E8 */ -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ /* F0 */ -+ { PREFIX_TABLE (PREFIX_EVEX_MAP4_F0) }, -+ { PREFIX_TABLE (PREFIX_EVEX_MAP4_F1) }, -+ { PREFIX_TABLE (PREFIX_EVEX_MAP4_F2) }, -+ { Bad_Opcode }, -+ { "%NFtzcntS", { Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { "%NFlzcntS", { Gv, Ev }, PREFIX_NP_OR_DATA }, -+ { REG_TABLE (REG_EVEX_MAP4_F6) }, -+ { REG_TABLE (REG_EVEX_MAP4_F7) }, -+ /* F8 */ -+ { PREFIX_TABLE (PREFIX_EVEX_MAP4_F8) }, -+ { "movdiri", { Mdq, Gdq }, NO_PREFIX }, -+ { Bad_Opcode }, -+ { Bad_Opcode }, -+ { PREFIX_TABLE (PREFIX_0F38FC) }, -+ { Bad_Opcode }, -+ { REG_TABLE (REG_EVEX_MAP4_FE) }, -+ { REG_TABLE (REG_EVEX_MAP4_FF) }, -+ }, - /* EVEX_MAP5_ */ - { - /* 00 */ -diff --git a/opcodes/i386-dis.c b/opcodes/i386-dis.c ---- a/opcodes/i386-dis.c -+++ b/opcodes/i386-dis.c -@@ -1,5 +1,5 @@ - /* Print i386 instructions for GDB, the GNU debugger. -- Copyright (C) 1988-2023 Free Software Foundation, Inc. -+ Copyright (C) 1988-2024 Free Software Foundation, Inc. - - This file is part of the GNU opcodes library. - -@@ -105,6 +105,8 @@ static bool FXSAVE_Fixup (instr_info *, int, int); - static bool MOVSXD_Fixup (instr_info *, int, int); - static bool DistinctDest_Fixup (instr_info *, int, int); - static bool PREFETCHI_Fixup (instr_info *, int, int); -+static bool PUSH2_POP2_Fixup (instr_info *, int, int); -+static bool JMPABS_Fixup (instr_info *, int, int); - - static void ATTRIBUTE_PRINTF_3 i386_dis_printf (const disassemble_info *, - enum disassembler_style, -@@ -132,6 +134,13 @@ enum x86_64_isa - intel64 - }; - -+enum evex_type -+{ -+ evex_default = 0, -+ evex_from_legacy, -+ evex_from_vex, -+}; -+ - struct instr_info - { - enum address_mode address_mode; -@@ -144,6 +153,12 @@ struct instr_info - /* Bits of REX we've already used. */ - uint8_t rex_used; - -+ /* Record W R4 X4 B4 bits for rex2. */ -+ unsigned char rex2; -+ /* Bits of rex2 we've already used. */ -+ unsigned char rex2_used; -+ unsigned char rex2_payload; -+ - bool need_modrm; - unsigned char need_vex; - bool has_sib; -@@ -169,6 +184,7 @@ struct instr_info - signed char last_data_prefix; - signed char last_addr_prefix; - signed char last_rex_prefix; -+ signed char last_rex2_prefix; - signed char last_seg_prefix; - signed char fwait_prefix; - /* The active segment register prefix. */ -@@ -205,14 +221,19 @@ struct instr_info - int ll; - bool w; - bool evex; -- bool r; - bool v; - bool zeroing; - bool b; - bool no_broadcast; -+ bool nf; - } - vex; - -+/* For APX EVEX-promoted prefix, EVEX.ND shares the same bit as vex.b. */ -+#define nd b -+ -+ enum evex_type evex_type; -+ - /* Remember if the current op is a jump instruction. */ - bool op_is_jump; - -@@ -221,6 +242,9 @@ struct instr_info - /* Record whether EVEX masking is used incorrectly. */ - bool illegal_masking; - -+ /* Record whether the modrm byte has been skipped. */ -+ bool has_skipped_modrm; -+ - unsigned char op_ad; - signed char op_index[MAX_OPERANDS]; - bool op_riprel[MAX_OPERANDS]; -@@ -262,8 +286,13 @@ struct dis_private { - { \ - if (value) \ - { \ -- if ((ins->rex & value)) \ -+ if (ins->rex & value) \ - ins->rex_used |= (value) | REX_OPCODE; \ -+ if (ins->rex2 & value) \ -+ { \ -+ ins->rex2_used |= (value); \ -+ ins->rex_used |= REX_OPCODE; \ -+ } \ - } \ - else \ - ins->rex_used |= REX_OPCODE; \ -@@ -273,6 +302,10 @@ struct dis_private { - #define EVEX_b_used 1 - #define EVEX_len_used 2 - -+ -+/* {rex2} is not printed when the REX2_SPECIAL is set. */ -+#define REX2_SPECIAL 16 -+ - /* Flags stored in PREFIXES. */ - #define PREFIX_REPZ 1 - #define PREFIX_REPNZ 2 -@@ -286,6 +319,9 @@ struct dis_private { - #define PREFIX_DATA 0x200 - #define PREFIX_ADDR 0x400 - #define PREFIX_FWAIT 0x800 -+#define PREFIX_REX2 0x1000 -+#define PREFIX_NP_OR_DATA 0x2000 -+#define NO_PREFIX 0x4000 - - /* Make sure that bytes from INFO->PRIVATE_DATA->BUFFER (inclusive) - to ADDR (exclusive) are valid. Returns true for success, false -@@ -367,6 +403,7 @@ fetch_error (const instr_info *ins) - #define PREFIX_IGNORED_DATA (PREFIX_DATA << PREFIX_IGNORED_SHIFT) - #define PREFIX_IGNORED_ADDR (PREFIX_ADDR << PREFIX_IGNORED_SHIFT) - #define PREFIX_IGNORED_LOCK (PREFIX_LOCK << PREFIX_IGNORED_SHIFT) -+#define PREFIX_REX2_ILLEGAL (PREFIX_REX2 << PREFIX_IGNORED_SHIFT) - - /* Opcode prefixes. */ - #define PREFIX_OPCODE (PREFIX_REPZ \ -@@ -418,6 +455,7 @@ fetch_error (const instr_info *ins) - #define Gv { OP_G, v_mode } - #define Gd { OP_G, d_mode } - #define Gdq { OP_G, dq_mode } -+#define Gq { OP_G, q_mode } - #define Gm { OP_G, m_mode } - #define Gva { OP_G, va_mode } - #define Gw { OP_G, w_mode } -@@ -527,7 +565,8 @@ fetch_error (const instr_info *ins) - #define EXEvexXNoBcst { OP_EX, evex_x_nobcst_mode } - #define Rd { OP_R, d_mode } - #define Rdq { OP_R, dq_mode } --#define Nq { OP_R, q_mode } -+#define Rq { OP_R, q_mode } -+#define Nq { OP_R, q_mm_mode } - #define Ux { OP_R, x_mode } - #define Uxmm { OP_R, xmm_mode } - #define Rxmmq { OP_R, xmmq_mode } -@@ -548,6 +587,8 @@ fetch_error (const instr_info *ins) - #define VexGatherD { OP_VEX, vex_vsib_d_w_dq_mode } - #define VexGatherQ { OP_VEX, vex_vsib_q_w_dq_mode } - #define VexGdq { OP_VEX, dq_mode } -+#define VexGb { OP_VEX, b_mode } -+#define VexGv { OP_VEX, v_mode } - #define VexTmm { OP_VEX, tmm_mode } - #define XMVexI4 { OP_REG_VexI4, x_mode } - #define XMVexScalarI4 { OP_REG_VexI4, scalar_mode } -@@ -624,6 +665,8 @@ enum - d_swap_mode, - /* quad word operand */ - q_mode, -+ /* 8-byte MM operand */ -+ q_mm_mode, - /* quad word operand with operand swapped */ - q_swap_mode, - /* ten-byte operand */ -@@ -778,6 +821,10 @@ enum - USE_RM_TABLE, - USE_PREFIX_TABLE, - USE_X86_64_TABLE, -+ USE_X86_64_EVEX_FROM_VEX_TABLE, -+ USE_X86_64_EVEX_PFX_TABLE, -+ USE_X86_64_EVEX_W_TABLE, -+ USE_X86_64_EVEX_MEM_W_TABLE, - USE_3BYTE_TABLE, - USE_XOP_8F_TABLE, - USE_VEX_C4_TABLE, -@@ -796,6 +843,11 @@ enum - #define RM_TABLE(I) DIS386 (USE_RM_TABLE, (I)) - #define PREFIX_TABLE(I) DIS386 (USE_PREFIX_TABLE, (I)) - #define X86_64_TABLE(I) DIS386 (USE_X86_64_TABLE, (I)) -+#define X86_64_EVEX_FROM_VEX_TABLE(I) \ -+ DIS386 (USE_X86_64_EVEX_FROM_VEX_TABLE, (I)) -+#define X86_64_EVEX_PFX_TABLE(I) DIS386 (USE_X86_64_EVEX_PFX_TABLE, (I)) -+#define X86_64_EVEX_W_TABLE(I) DIS386 (USE_X86_64_EVEX_W_TABLE, (I)) -+#define X86_64_EVEX_MEM_W_TABLE(I) DIS386 (USE_X86_64_EVEX_MEM_W_TABLE, (I)) - #define THREE_BYTE_TABLE(I) DIS386 (USE_3BYTE_TABLE, (I)) - #define XOP_8F_TABLE() DIS386 (USE_XOP_8F_TABLE, 0) - #define VEX_C4_TABLE() DIS386 (USE_VEX_C4_TABLE, 0) -@@ -844,7 +896,8 @@ enum - REG_VEX_0F73, - REG_VEX_0FAE, - REG_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0, -- REG_VEX_0F38F3_L_0, -+ REG_VEX_0F38F3_L_0_P_0, -+ REG_VEX_MAP7_F8_L_0_W_0, - - REG_XOP_09_01_L_0, - REG_XOP_09_02_L_0, -@@ -855,7 +908,15 @@ enum - REG_EVEX_0F72, - REG_EVEX_0F73, - REG_EVEX_0F38C6_L_2, -- REG_EVEX_0F38C7_L_2 -+ REG_EVEX_0F38C7_L_2, -+ REG_EVEX_MAP4_80, -+ REG_EVEX_MAP4_81, -+ REG_EVEX_MAP4_83, -+ REG_EVEX_MAP4_8F, -+ REG_EVEX_MAP4_F6, -+ REG_EVEX_MAP4_F7, -+ REG_EVEX_MAP4_FE, -+ REG_EVEX_MAP4_FF, - }; - - enum -@@ -893,8 +954,12 @@ enum - MOD_0FC7_REG_6, - MOD_0FC7_REG_7, - MOD_0F38DC_PREFIX_1, -+ MOD_0F38F8, - - MOD_VEX_0F3849_X86_64_L_0_W_0, -+ -+ MOD_EVEX_MAP4_F8_P_1, -+ MOD_EVEX_MAP4_F8_P_3, - }; - - enum -@@ -1010,7 +1075,8 @@ enum - PREFIX_0F38F0, - PREFIX_0F38F1, - PREFIX_0F38F6, -- PREFIX_0F38F8, -+ PREFIX_0F38F8_M_0, -+ PREFIX_0F38F8_M_1_X86_64, - PREFIX_0F38FA, - PREFIX_0F38FB, - PREFIX_0F38FC, -@@ -1069,10 +1135,13 @@ enum - PREFIX_VEX_0F38CC, - PREFIX_VEX_0F38CD, - PREFIX_VEX_0F38DA_W_0, -+ PREFIX_VEX_0F38F2_L_0, -+ PREFIX_VEX_0F38F3_L_0, - PREFIX_VEX_0F38F5_L_0, - PREFIX_VEX_0F38F6_L_0, - PREFIX_VEX_0F38F7_L_0, - PREFIX_VEX_0F3AF0_L_0, -+ PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64, - - PREFIX_EVEX_0F5B, - PREFIX_EVEX_0F6F, -@@ -1130,6 +1199,11 @@ enum - PREFIX_EVEX_0F3A67, - PREFIX_EVEX_0F3AC2, - -+ PREFIX_EVEX_MAP4_F0, -+ PREFIX_EVEX_MAP4_F1, -+ PREFIX_EVEX_MAP4_F2, -+ PREFIX_EVEX_MAP4_F8, -+ - PREFIX_EVEX_MAP5_10, - PREFIX_EVEX_MAP5_11, - PREFIX_EVEX_MAP5_1D, -@@ -1217,6 +1291,7 @@ enum - X86_64_0F18_REG_7_MOD_0, - X86_64_0F24, - X86_64_0F26, -+ X86_64_0F38F8_M_1, - X86_64_0FC7_REG_6_MOD_3_PREFIX_1, - - X86_64_VEX_0F3849, -@@ -1240,6 +1315,8 @@ enum - X86_64_VEX_0F38ED, - X86_64_VEX_0F38EE, - X86_64_VEX_0F38EF, -+ -+ X86_64_VEX_MAP7_F8_L_0_W_0_R_0, - }; - - enum -@@ -1259,7 +1336,8 @@ enum - { - VEX_0F = 0, - VEX_0F38, -- VEX_0F3A -+ VEX_0F3A, -+ VEX_MAP7, - }; - - enum -@@ -1267,8 +1345,10 @@ enum - EVEX_0F = 0, - EVEX_0F38, - EVEX_0F3A, -+ EVEX_MAP4, - EVEX_MAP5, - EVEX_MAP6, -+ EVEX_MAP7, - }; - - enum -@@ -1350,6 +1430,7 @@ enum - VEX_LEN_0F3ADE_W_0, - VEX_LEN_0F3ADF, - VEX_LEN_0F3AF0, -+ VEX_LEN_MAP7_F8, - VEX_LEN_XOP_08_85, - VEX_LEN_XOP_08_86, - VEX_LEN_XOP_08_87, -@@ -1510,6 +1591,7 @@ enum - VEX_W_0F3ACE, - VEX_W_0F3ACF, - VEX_W_0F3ADE, -+ VEX_W_MAP7_F8_L_0, - - VEX_W_XOP_08_85_L_0, - VEX_W_XOP_08_86_L_0, -@@ -1656,6 +1738,11 @@ enum - EVEX_W_0F3A70, - EVEX_W_0F3A72, - -+ EVEX_W_MAP4_8F_R_0, -+ EVEX_W_MAP4_F8_P1_M_1, -+ EVEX_W_MAP4_F8_P3_M_1, -+ EVEX_W_MAP4_FF_R_6, -+ - EVEX_W_MAP5_5B_P_0, - EVEX_W_MAP5_7A_P_3, - }; -@@ -1673,7 +1760,7 @@ struct dis386 { - }; - - /* Upper case letters in the instruction names here are macros. -- 'A' => print 'b' if no register operands or suffix_always is true -+ 'A' => print 'b' if no (suitable) register operand or suffix_always is true - 'B' => print 'b' if suffix_always is true - 'C' => print 's' or 'l' ('w' or 'd' in Intel mode) depending on operand - size prefix -@@ -1686,14 +1773,14 @@ struct dis386 { - 'I' unused. - 'J' unused. - 'K' => print 'd' or 'q' if rex prefix is present. -- 'L' unused. -+ 'L' => print 'l' or 'q' if suffix_always is true - 'M' => print 'r' if intel_mnemonic is false. - 'N' => print 'n' if instruction has no wait "prefix" - 'O' => print 'd' or 'o' (or 'q' in Intel mode) - 'P' => behave as 'T' except with register operand outside of suffix_always - mode -- 'Q' => print 'w', 'l' or 'q' for memory operand or suffix_always -- is true -+ 'Q' => print 'w', 'l' or 'q' if no (suitable) register operand or -+ suffix_always is true - 'R' => print 'w', 'l' or 'q' ('d' for 'l' and 'e' in Intel mode) - 'S' => print 'w', 'l' or 'q' if suffix_always is true - 'T' => print 'w', 'l'/'d', or 'q' if instruction has an operand size -@@ -1724,6 +1811,11 @@ struct dis386 { - "XV" => print "{vex} " pseudo prefix - "XE" => print "{evex} " pseudo prefix if no EVEX-specific functionality is - is used by an EVEX-encoded (AVX512VL) instruction. -+ "ME" => print "{evex} " pseudo prefix for ins->modrm.mod != 3,if no -+ EVEX-specific functionality is used by an EVEX-encoded (AVX512VL) -+ instruction. -+ "NF" => print "{nf} " pseudo prefix when EVEX.NF = 1 and print "{evex} " -+ pseudo prefix when instructions without NF, EGPR and VVVV, - "YK" keep unused, to avoid ambiguity with the combined use of Y and K. - "YX" keep unused, to avoid ambiguity with the combined use of Y and X. - "LQ" => print 'l' ('d' in Intel mode) or 'q' for memory operand, cond -@@ -1836,23 +1928,23 @@ static const struct dis386 dis386[] = { - { "dec{S|}", { RMeSI }, 0 }, - { "dec{S|}", { RMeDI }, 0 }, - /* 50 */ -- { "push{!P|}", { RMrAX }, 0 }, -- { "push{!P|}", { RMrCX }, 0 }, -- { "push{!P|}", { RMrDX }, 0 }, -- { "push{!P|}", { RMrBX }, 0 }, -- { "push{!P|}", { RMrSP }, 0 }, -- { "push{!P|}", { RMrBP }, 0 }, -- { "push{!P|}", { RMrSI }, 0 }, -- { "push{!P|}", { RMrDI }, 0 }, -+ { "push!P", { RMrAX }, 0 }, -+ { "push!P", { RMrCX }, 0 }, -+ { "push!P", { RMrDX }, 0 }, -+ { "push!P", { RMrBX }, 0 }, -+ { "push!P", { RMrSP }, 0 }, -+ { "push!P", { RMrBP }, 0 }, -+ { "push!P", { RMrSI }, 0 }, -+ { "push!P", { RMrDI }, 0 }, - /* 58 */ -- { "pop{!P|}", { RMrAX }, 0 }, -- { "pop{!P|}", { RMrCX }, 0 }, -- { "pop{!P|}", { RMrDX }, 0 }, -- { "pop{!P|}", { RMrBX }, 0 }, -- { "pop{!P|}", { RMrSP }, 0 }, -- { "pop{!P|}", { RMrBP }, 0 }, -- { "pop{!P|}", { RMrSI }, 0 }, -- { "pop{!P|}", { RMrDI }, 0 }, -+ { "pop!P", { RMrAX }, 0 }, -+ { "pop!P", { RMrCX }, 0 }, -+ { "pop!P", { RMrDX }, 0 }, -+ { "pop!P", { RMrBX }, 0 }, -+ { "pop!P", { RMrSP }, 0 }, -+ { "pop!P", { RMrBP }, 0 }, -+ { "pop!P", { RMrSI }, 0 }, -+ { "pop!P", { RMrDI }, 0 }, - /* 60 */ - { X86_64_TABLE (X86_64_60) }, - { X86_64_TABLE (X86_64_61) }, -@@ -1872,23 +1964,23 @@ static const struct dis386 dis386[] = { - { "outs{b|}", { indirDXr, Xb }, 0 }, - { X86_64_TABLE (X86_64_6F) }, - /* 70 */ -- { "joH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jnoH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jbH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jaeH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jeH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jneH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jbeH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jaH", { Jb, BND, cond_jump_flag }, 0 }, -+ { "joH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jnoH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jbH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jaeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jneH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jbeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jaH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, - /* 78 */ -- { "jsH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jnsH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jpH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jnpH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jlH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jgeH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jleH", { Jb, BND, cond_jump_flag }, 0 }, -- { "jgH", { Jb, BND, cond_jump_flag }, 0 }, -+ { "jsH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jnsH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jpH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jnpH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jlH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jgeH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jleH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jgH", { Jb, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, - /* 80 */ - { REG_TABLE (REG_80) }, - { REG_TABLE (REG_81) }, -@@ -1926,23 +2018,23 @@ static const struct dis386 dis386[] = { - { "sahf", { XX }, 0 }, - { "lahf", { XX }, 0 }, - /* a0 */ -- { "mov%LB", { AL, Ob }, 0 }, -- { "mov%LS", { eAX, Ov }, 0 }, -- { "mov%LB", { Ob, AL }, 0 }, -- { "mov%LS", { Ov, eAX }, 0 }, -- { "movs{b|}", { Ybr, Xb }, 0 }, -- { "movs{R|}", { Yvr, Xv }, 0 }, -- { "cmps{b|}", { Xb, Yb }, 0 }, -- { "cmps{R|}", { Xv, Yv }, 0 }, -+ { "mov%LB", { AL, Ob }, PREFIX_REX2_ILLEGAL }, -+ { "mov%LS", { { JMPABS_Fixup, eAX_reg }, { JMPABS_Fixup, v_mode } }, PREFIX_REX2_ILLEGAL }, -+ { "mov%LB", { Ob, AL }, PREFIX_REX2_ILLEGAL }, -+ { "mov%LS", { Ov, eAX }, PREFIX_REX2_ILLEGAL }, -+ { "movs{b|}", { Ybr, Xb }, PREFIX_REX2_ILLEGAL }, -+ { "movs{R|}", { Yvr, Xv }, PREFIX_REX2_ILLEGAL }, -+ { "cmps{b|}", { Xb, Yb }, PREFIX_REX2_ILLEGAL }, -+ { "cmps{R|}", { Xv, Yv }, PREFIX_REX2_ILLEGAL }, - /* a8 */ -- { "testB", { AL, Ib }, 0 }, -- { "testS", { eAX, Iv }, 0 }, -- { "stosB", { Ybr, AL }, 0 }, -- { "stosS", { Yvr, eAX }, 0 }, -- { "lodsB", { ALr, Xb }, 0 }, -- { "lodsS", { eAXr, Xv }, 0 }, -- { "scasB", { AL, Yb }, 0 }, -- { "scasS", { eAX, Yv }, 0 }, -+ { "testB", { AL, Ib }, PREFIX_REX2_ILLEGAL }, -+ { "testS", { eAX, Iv }, PREFIX_REX2_ILLEGAL }, -+ { "stosB", { Ybr, AL }, PREFIX_REX2_ILLEGAL }, -+ { "stosS", { Yvr, eAX }, PREFIX_REX2_ILLEGAL }, -+ { "lodsB", { ALr, Xb }, PREFIX_REX2_ILLEGAL }, -+ { "lodsS", { eAXr, Xv }, PREFIX_REX2_ILLEGAL }, -+ { "scasB", { AL, Yb }, PREFIX_REX2_ILLEGAL }, -+ { "scasS", { eAX, Yv }, PREFIX_REX2_ILLEGAL }, - /* b0 */ - { "movB", { RMAL, Ib }, 0 }, - { "movB", { RMCL, Ib }, 0 }, -@@ -1998,23 +2090,23 @@ static const struct dis386 dis386[] = { - { FLOAT }, - { FLOAT }, - /* e0 */ -- { "loopneFH", { Jb, XX, loop_jcxz_flag }, 0 }, -- { "loopeFH", { Jb, XX, loop_jcxz_flag }, 0 }, -- { "loopFH", { Jb, XX, loop_jcxz_flag }, 0 }, -- { "jEcxzH", { Jb, XX, loop_jcxz_flag }, 0 }, -- { "inB", { AL, Ib }, 0 }, -- { "inG", { zAX, Ib }, 0 }, -- { "outB", { Ib, AL }, 0 }, -- { "outG", { Ib, zAX }, 0 }, -+ { "loopneFH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL }, -+ { "loopeFH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL }, -+ { "loopFH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jEcxzH", { Jb, XX, loop_jcxz_flag }, PREFIX_REX2_ILLEGAL }, -+ { "inB", { AL, Ib }, PREFIX_REX2_ILLEGAL }, -+ { "inG", { zAX, Ib }, PREFIX_REX2_ILLEGAL }, -+ { "outB", { Ib, AL }, PREFIX_REX2_ILLEGAL }, -+ { "outG", { Ib, zAX }, PREFIX_REX2_ILLEGAL }, - /* e8 */ - { X86_64_TABLE (X86_64_E8) }, - { X86_64_TABLE (X86_64_E9) }, - { X86_64_TABLE (X86_64_EA) }, -- { "jmp", { Jb, BND }, 0 }, -- { "inB", { AL, indirDX }, 0 }, -- { "inG", { zAX, indirDX }, 0 }, -- { "outB", { indirDX, AL }, 0 }, -- { "outG", { indirDX, zAX }, 0 }, -+ { "jmp", { Jb, BND }, PREFIX_REX2_ILLEGAL }, -+ { "inB", { AL, indirDX }, PREFIX_REX2_ILLEGAL }, -+ { "inG", { zAX, indirDX }, PREFIX_REX2_ILLEGAL }, -+ { "outB", { indirDX, AL }, PREFIX_REX2_ILLEGAL }, -+ { "outG", { indirDX, zAX }, PREFIX_REX2_ILLEGAL }, - /* f0 */ - { Bad_Opcode }, /* lock prefix */ - { "int1", { XX }, 0 }, -@@ -2091,12 +2183,12 @@ static const struct dis386 dis386_twobyte[] = { - { PREFIX_TABLE (PREFIX_0F2E) }, - { PREFIX_TABLE (PREFIX_0F2F) }, - /* 30 */ -- { "wrmsr", { XX }, 0 }, -- { "rdtsc", { XX }, 0 }, -- { "rdmsr", { XX }, 0 }, -- { "rdpmc", { XX }, 0 }, -- { "sysenter", { SEP }, 0 }, -- { "sysexit%LQ", { SEP }, 0 }, -+ { "wrmsr", { XX }, PREFIX_REX2_ILLEGAL }, -+ { "rdtsc", { XX }, PREFIX_REX2_ILLEGAL }, -+ { "rdmsr", { XX }, PREFIX_REX2_ILLEGAL }, -+ { "rdpmc", { XX }, PREFIX_REX2_ILLEGAL }, -+ { "sysenter", { SEP }, PREFIX_REX2_ILLEGAL }, -+ { "sysexit%LQ", { SEP }, PREFIX_REX2_ILLEGAL }, - { Bad_Opcode }, - { "getsec", { XX }, 0 }, - /* 38 */ -@@ -2181,23 +2273,23 @@ static const struct dis386 dis386_twobyte[] = { - { PREFIX_TABLE (PREFIX_0F7E) }, - { PREFIX_TABLE (PREFIX_0F7F) }, - /* 80 */ -- { "joH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jnoH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jbH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jaeH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jeH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jneH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jbeH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jaH", { Jv, BND, cond_jump_flag }, 0 }, -+ { "joH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jnoH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jbH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jaeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jneH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jbeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jaH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, - /* 88 */ -- { "jsH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jnsH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jpH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jnpH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jlH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jgeH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jleH", { Jv, BND, cond_jump_flag }, 0 }, -- { "jgH", { Jv, BND, cond_jump_flag }, 0 }, -+ { "jsH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jnsH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jpH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jnpH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jlH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jgeH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jleH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, -+ { "jgH", { Jv, BND, cond_jump_flag }, PREFIX_REX2_ILLEGAL }, - /* 90 */ - { "seto", { Eb }, 0 }, - { "setno", { Eb }, 0 }, -@@ -2390,22 +2482,30 @@ static const char intel_index16[][6] = { - - static const char att_names64[][8] = { - "%rax", "%rcx", "%rdx", "%rbx", "%rsp", "%rbp", "%rsi", "%rdi", -- "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15" -+ "%r8", "%r9", "%r10", "%r11", "%r12", "%r13", "%r14", "%r15", -+ "%r16", "%r17", "%r18", "%r19", "%r20", "%r21", "%r22", "%r23", -+ "%r24", "%r25", "%r26", "%r27", "%r28", "%r29", "%r30", "%r31", - }; - static const char att_names32[][8] = { - "%eax", "%ecx", "%edx", "%ebx", "%esp", "%ebp", "%esi", "%edi", -- "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d" -+ "%r8d", "%r9d", "%r10d", "%r11d", "%r12d", "%r13d", "%r14d", "%r15d", -+ "%r16d", "%r17d", "%r18d", "%r19d", "%r20d", "%r21d", "%r22d", "%r23d", -+ "%r24d", "%r25d", "%r26d", "%r27d", "%r28d", "%r29d", "%r30d", "%r31d", - }; - static const char att_names16[][8] = { - "%ax", "%cx", "%dx", "%bx", "%sp", "%bp", "%si", "%di", -- "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w" -+ "%r8w", "%r9w", "%r10w", "%r11w", "%r12w", "%r13w", "%r14w", "%r15w", -+ "%r16w", "%r17w", "%r18w", "%r19w", "%r20w", "%r21w", "%r22w", "%r23w", -+ "%r24w", "%r25w", "%r26w", "%r27w", "%r28w", "%r29w", "%r30w", "%r31w", - }; - static const char att_names8[][8] = { - "%al", "%cl", "%dl", "%bl", "%ah", "%ch", "%dh", "%bh", - }; - static const char att_names8rex[][8] = { - "%al", "%cl", "%dl", "%bl", "%spl", "%bpl", "%sil", "%dil", -- "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b" -+ "%r8b", "%r9b", "%r10b", "%r11b", "%r12b", "%r13b", "%r14b", "%r15b", -+ "%r16b", "%r17b", "%r18b", "%r19b", "%r20b", "%r21b", "%r22b", "%r23b", -+ "%r24b", "%r25b", "%r26b", "%r27b", "%r28b", "%r29b", "%r30b", "%r31b", - }; - static const char att_names_seg[][4] = { - "%es", "%cs", "%ss", "%ds", "%fs", "%gs", "%?", "%?", -@@ -2520,25 +2620,25 @@ static const struct dis386 reg_table[][8] = { - }, - /* REG_C0 */ - { -- { "rolA", { Eb, Ib }, 0 }, -- { "rorA", { Eb, Ib }, 0 }, -- { "rclA", { Eb, Ib }, 0 }, -- { "rcrA", { Eb, Ib }, 0 }, -- { "shlA", { Eb, Ib }, 0 }, -- { "shrA", { Eb, Ib }, 0 }, -- { "shlA", { Eb, Ib }, 0 }, -- { "sarA", { Eb, Ib }, 0 }, -+ { "%NFrolA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "%NFrorA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "rclA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "rcrA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "%NFshlA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "%NFshrA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "%NFshlA", { VexGb, Eb, Ib }, NO_PREFIX }, -+ { "%NFsarA", { VexGb, Eb, Ib }, NO_PREFIX }, - }, - /* REG_C1 */ - { -- { "rolQ", { Ev, Ib }, 0 }, -- { "rorQ", { Ev, Ib }, 0 }, -- { "rclQ", { Ev, Ib }, 0 }, -- { "rcrQ", { Ev, Ib }, 0 }, -- { "shlQ", { Ev, Ib }, 0 }, -- { "shrQ", { Ev, Ib }, 0 }, -- { "shlQ", { Ev, Ib }, 0 }, -- { "sarQ", { Ev, Ib }, 0 }, -+ { "%NFrolQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, -+ { "%NFrorQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, -+ { "rclQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, -+ { "rcrQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, -+ { "%NFshlQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, -+ { "%NFshrQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, -+ { "%NFshlQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, -+ { "%NFsarQ", { VexGv, Ev, Ib }, PREFIX_NP_OR_DATA }, - }, - /* REG_C6 */ - { -@@ -2564,47 +2664,47 @@ static const struct dis386 reg_table[][8] = { - }, - /* REG_D0 */ - { -- { "rolA", { Eb, I1 }, 0 }, -- { "rorA", { Eb, I1 }, 0 }, -- { "rclA", { Eb, I1 }, 0 }, -- { "rcrA", { Eb, I1 }, 0 }, -- { "shlA", { Eb, I1 }, 0 }, -- { "shrA", { Eb, I1 }, 0 }, -- { "shlA", { Eb, I1 }, 0 }, -- { "sarA", { Eb, I1 }, 0 }, -+ { "%NFrolA", { VexGb, Eb, I1 }, NO_PREFIX }, -+ { "%NFrorA", { VexGb, Eb, I1 }, NO_PREFIX }, -+ { "rclA", { VexGb, Eb, I1 }, NO_PREFIX }, -+ { "rcrA", { VexGb, Eb, I1 }, NO_PREFIX }, -+ { "%NFshlA", { VexGb, Eb, I1 }, NO_PREFIX }, -+ { "%NFshrA", { VexGb, Eb, I1 }, NO_PREFIX }, -+ { "%NFshlA", { VexGb, Eb, I1 }, NO_PREFIX }, -+ { "%NFsarA", { VexGb, Eb, I1 }, NO_PREFIX }, - }, - /* REG_D1 */ - { -- { "rolQ", { Ev, I1 }, 0 }, -- { "rorQ", { Ev, I1 }, 0 }, -- { "rclQ", { Ev, I1 }, 0 }, -- { "rcrQ", { Ev, I1 }, 0 }, -- { "shlQ", { Ev, I1 }, 0 }, -- { "shrQ", { Ev, I1 }, 0 }, -- { "shlQ", { Ev, I1 }, 0 }, -- { "sarQ", { Ev, I1 }, 0 }, -+ { "%NFrolQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, -+ { "%NFrorQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, -+ { "rclQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, -+ { "rcrQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, -+ { "%NFshlQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, -+ { "%NFshrQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, -+ { "%NFshlQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, -+ { "%NFsarQ", { VexGv, Ev, I1 }, PREFIX_NP_OR_DATA }, - }, - /* REG_D2 */ - { -- { "rolA", { Eb, CL }, 0 }, -- { "rorA", { Eb, CL }, 0 }, -- { "rclA", { Eb, CL }, 0 }, -- { "rcrA", { Eb, CL }, 0 }, -- { "shlA", { Eb, CL }, 0 }, -- { "shrA", { Eb, CL }, 0 }, -- { "shlA", { Eb, CL }, 0 }, -- { "sarA", { Eb, CL }, 0 }, -+ { "%NFrolA", { VexGb, Eb, CL }, NO_PREFIX }, -+ { "%NFrorA", { VexGb, Eb, CL }, NO_PREFIX }, -+ { "rclA", { VexGb, Eb, CL }, NO_PREFIX }, -+ { "rcrA", { VexGb, Eb, CL }, NO_PREFIX }, -+ { "%NFshlA", { VexGb, Eb, CL }, NO_PREFIX }, -+ { "%NFshrA", { VexGb, Eb, CL }, NO_PREFIX }, -+ { "%NFshlA", { VexGb, Eb, CL }, NO_PREFIX }, -+ { "%NFsarA", { VexGb, Eb, CL }, NO_PREFIX }, - }, - /* REG_D3 */ - { -- { "rolQ", { Ev, CL }, 0 }, -- { "rorQ", { Ev, CL }, 0 }, -- { "rclQ", { Ev, CL }, 0 }, -- { "rcrQ", { Ev, CL }, 0 }, -- { "shlQ", { Ev, CL }, 0 }, -- { "shrQ", { Ev, CL }, 0 }, -- { "shlQ", { Ev, CL }, 0 }, -- { "sarQ", { Ev, CL }, 0 }, -+ { "%NFrolQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, -+ { "%NFrorQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, -+ { "rclQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, -+ { "rcrQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, -+ { "%NFshlQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, -+ { "%NFshrQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, -+ { "%NFshlQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, -+ { "%NFsarQ", { VexGv, Ev, CL }, PREFIX_NP_OR_DATA }, - }, - /* REG_F6 */ - { -@@ -2794,9 +2894,9 @@ static const struct dis386 reg_table[][8] = { - { Bad_Opcode }, - { "cmpxchg8b", { { CMPXCHG8B_Fixup, q_mode } }, 0 }, - { Bad_Opcode }, -- { "xrstors", { FXSAVE }, 0 }, -- { "xsavec", { FXSAVE }, 0 }, -- { "xsaves", { FXSAVE }, 0 }, -+ { "xrstors", { FXSAVE }, PREFIX_REX2_ILLEGAL }, -+ { "xsavec", { FXSAVE }, PREFIX_REX2_ILLEGAL }, -+ { "xsaves", { FXSAVE }, PREFIX_REX2_ILLEGAL }, - { MOD_TABLE (MOD_0FC7_REG_6) }, - { MOD_TABLE (MOD_0FC7_REG_7) }, - }, -@@ -2842,12 +2942,16 @@ static const struct dis386 reg_table[][8] = { - { - { RM_TABLE (RM_VEX_0F3849_X86_64_L_0_W_0_M_1_P_0_R_0) }, - }, -- /* REG_VEX_0F38F3_L_0 */ -+ /* REG_VEX_0F38F3_L_0_P_0 */ - { - { Bad_Opcode }, -- { "blsrS", { VexGdq, Edq }, PREFIX_OPCODE }, -- { "blsmskS", { VexGdq, Edq }, PREFIX_OPCODE }, -- { "blsiS", { VexGdq, Edq }, PREFIX_OPCODE }, -+ { "%NFblsrS", { VexGdq, Edq }, 0 }, -+ { "%NFblsmskS", { VexGdq, Edq }, 0 }, -+ { "%NFblsiS", { VexGdq, Edq }, 0 }, -+ }, -+ /* REG_VEX_MAP7_F8_L_0_W_0 */ -+ { -+ { X86_64_TABLE (X86_64_VEX_MAP7_F8_L_0_W_0_R_0) }, - }, - /* REG_XOP_09_01_L_0 */ - { -@@ -3364,7 +3468,7 @@ static const struct dis386 prefix_table[][4] = { - - /* PREFIX_0FAE_REG_4_MOD_0 */ - { -- { "xsave", { FXSAVE }, 0 }, -+ { "xsave", { FXSAVE }, PREFIX_REX2_ILLEGAL }, - { "ptwrite{%LQ|}", { Edq }, 0 }, - }, - -@@ -3382,7 +3486,7 @@ static const struct dis386 prefix_table[][4] = { - - /* PREFIX_0FAE_REG_6_MOD_0 */ - { -- { "xsaveopt", { FXSAVE }, PREFIX_OPCODE }, -+ { "xsaveopt", { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL }, - { "clrssbsy", { Mq }, PREFIX_OPCODE }, - { "clwb", { Mb }, PREFIX_OPCODE }, - }, -@@ -3550,18 +3654,27 @@ static const struct dis386 prefix_table[][4] = { - /* PREFIX_0F38F6 */ - { - { "wrssK", { M, Gdq }, 0 }, -- { "adoxS", { Gdq, Edq}, 0 }, -- { "adcxS", { Gdq, Edq}, 0 }, -+ { "adoxL", { VexGdq, Gdq, Edq }, 0 }, -+ { "adcxL", { VexGdq, Gdq, Edq }, 0 }, - { Bad_Opcode }, - }, - -- /* PREFIX_0F38F8 */ -+ /* PREFIX_0F38F8_M_0 */ - { - { Bad_Opcode }, - { "enqcmds", { Gva, M }, 0 }, - { "movdir64b", { Gva, M }, 0 }, - { "enqcmd", { Gva, M }, 0 }, - }, -+ -+ /* PREFIX_0F38F8_M_1_X86_64 */ -+ { -+ { Bad_Opcode }, -+ { "uwrmsr", { Gq, Rq }, 0 }, -+ { Bad_Opcode }, -+ { "urdmsr", { Rq, Gq }, 0 }, -+ }, -+ - /* PREFIX_0F38FA */ - { - { Bad_Opcode }, -@@ -3768,38 +3881,38 @@ static const struct dis386 prefix_table[][4] = { - - /* PREFIX_VEX_0F90_L_0_W_0 */ - { -- { "kmovw", { MaskG, MaskE }, 0 }, -+ { "%XEkmovw", { MaskG, MaskE }, 0 }, - { Bad_Opcode }, -- { "kmovb", { MaskG, MaskBDE }, 0 }, -+ { "%XEkmovb", { MaskG, MaskBDE }, 0 }, - }, - - /* PREFIX_VEX_0F90_L_0_W_1 */ - { -- { "kmovq", { MaskG, MaskE }, 0 }, -+ { "%XEkmovq", { MaskG, MaskE }, 0 }, - { Bad_Opcode }, -- { "kmovd", { MaskG, MaskBDE }, 0 }, -+ { "%XEkmovd", { MaskG, MaskBDE }, 0 }, - }, - - /* PREFIX_VEX_0F91_L_0_W_0 */ - { -- { "kmovw", { Mw, MaskG }, 0 }, -+ { "%XEkmovw", { Mw, MaskG }, 0 }, - { Bad_Opcode }, -- { "kmovb", { Mb, MaskG }, 0 }, -+ { "%XEkmovb", { Mb, MaskG }, 0 }, - }, - - /* PREFIX_VEX_0F91_L_0_W_1 */ - { -- { "kmovq", { Mq, MaskG }, 0 }, -+ { "%XEkmovq", { Mq, MaskG }, 0 }, - { Bad_Opcode }, -- { "kmovd", { Md, MaskG }, 0 }, -+ { "%XEkmovd", { Md, MaskG }, 0 }, - }, - - /* PREFIX_VEX_0F92_L_0_W_0 */ - { -- { "kmovw", { MaskG, Rdq }, 0 }, -+ { "%XEkmovw", { MaskG, Rdq }, 0 }, - { Bad_Opcode }, -- { "kmovb", { MaskG, Rdq }, 0 }, -- { "kmovd", { MaskG, Rdq }, 0 }, -+ { "%XEkmovb", { MaskG, Rdq }, 0 }, -+ { "%XEkmovd", { MaskG, Rdq }, 0 }, - }, - - /* PREFIX_VEX_0F92_L_0_W_1 */ -@@ -3807,15 +3920,15 @@ static const struct dis386 prefix_table[][4] = { - { Bad_Opcode }, - { Bad_Opcode }, - { Bad_Opcode }, -- { "kmovK", { MaskG, Rdq }, 0 }, -+ { "%XEkmovK", { MaskG, Rdq }, 0 }, - }, - - /* PREFIX_VEX_0F93_L_0_W_0 */ - { -- { "kmovw", { Gdq, MaskR }, 0 }, -+ { "%XEkmovw", { Gdq, MaskR }, 0 }, - { Bad_Opcode }, -- { "kmovb", { Gdq, MaskR }, 0 }, -- { "kmovd", { Gdq, MaskR }, 0 }, -+ { "%XEkmovb", { Gdq, MaskR }, 0 }, -+ { "%XEkmovd", { Gdq, MaskR }, 0 }, - }, - - /* PREFIX_VEX_0F93_L_0_W_1 */ -@@ -3823,7 +3936,7 @@ static const struct dis386 prefix_table[][4] = { - { Bad_Opcode }, - { Bad_Opcode }, - { Bad_Opcode }, -- { "kmovK", { Gdq, MaskR }, 0 }, -+ { "%XEkmovK", { Gdq, MaskR }, 0 }, - }, - - /* PREFIX_VEX_0F98_L_0_W_0 */ -@@ -3982,12 +4095,22 @@ static const struct dis386 prefix_table[][4] = { - { "vsm4rnds4", { XM, Vex, EXx }, 0 }, - }, - -+ /* PREFIX_VEX_0F38F2_L_0 */ -+ { -+ { "%NFandnS", { Gdq, VexGdq, Edq }, 0 }, -+ }, -+ -+ /* PREFIX_VEX_0F38F3_L_0 */ -+ { -+ { REG_TABLE (REG_VEX_0F38F3_L_0_P_0) }, -+ }, -+ - /* PREFIX_VEX_0F38F5_L_0 */ - { -- { "bzhiS", { Gdq, Edq, VexGdq }, 0 }, -- { "pextS", { Gdq, VexGdq, Edq }, 0 }, -+ { "%NFbzhiS", { Gdq, Edq, VexGdq }, 0 }, -+ { "%XEpextS", { Gdq, VexGdq, Edq }, 0 }, - { Bad_Opcode }, -- { "pdepS", { Gdq, VexGdq, Edq }, 0 }, -+ { "%XEpdepS", { Gdq, VexGdq, Edq }, 0 }, - }, - - /* PREFIX_VEX_0F38F6_L_0 */ -@@ -3995,15 +4118,15 @@ static const struct dis386 prefix_table[][4] = { - { Bad_Opcode }, - { Bad_Opcode }, - { Bad_Opcode }, -- { "mulxS", { Gdq, VexGdq, Edq }, 0 }, -+ { "%XEmulxS", { Gdq, VexGdq, Edq }, 0 }, - }, - - /* PREFIX_VEX_0F38F7_L_0 */ - { -- { "bextrS", { Gdq, Edq, VexGdq }, 0 }, -- { "sarxS", { Gdq, Edq, VexGdq }, 0 }, -- { "shlxS", { Gdq, Edq, VexGdq }, 0 }, -- { "shrxS", { Gdq, Edq, VexGdq }, 0 }, -+ { "%NFbextrS", { Gdq, Edq, VexGdq }, 0 }, -+ { "%XEsarxS", { Gdq, Edq, VexGdq }, 0 }, -+ { "%XEshlxS", { Gdq, Edq, VexGdq }, 0 }, -+ { "%XEshrxS", { Gdq, Edq, VexGdq }, 0 }, - }, - - /* PREFIX_VEX_0F3AF0_L_0 */ -@@ -4011,7 +4134,15 @@ static const struct dis386 prefix_table[][4] = { - { Bad_Opcode }, - { Bad_Opcode }, - { Bad_Opcode }, -- { "rorxS", { Gdq, Edq, Ib }, 0 }, -+ { "%XErorxS", { Gdq, Edq, Ib }, 0 }, -+ }, -+ -+ /* PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64 */ -+ { -+ { Bad_Opcode }, -+ { "uwrmsr", { Skip_MODRM, Id, Rq }, 0 }, -+ { Bad_Opcode }, -+ { "urdmsr", { Rq, Id }, 0 }, - }, - - #include "i386-dis-evex-prefix.h" -@@ -4160,13 +4291,13 @@ static const struct dis386 x86_64_table[][2] = { - /* X86_64_E8 */ - { - { "callP", { Jv, BND }, 0 }, -- { "call@", { Jv, BND }, 0 } -+ { "call@", { Jv, BND }, PREFIX_REX2_ILLEGAL } - }, - - /* X86_64_E9 */ - { - { "jmpP", { Jv, BND }, 0 }, -- { "jmp@", { Jv, BND }, 0 } -+ { "jmp@", { Jv, BND }, PREFIX_REX2_ILLEGAL } - }, - - /* X86_64_EA */ -@@ -4322,6 +4453,12 @@ static const struct dis386 x86_64_table[][2] = { - { "movZ", { Td, Em }, 0 }, - }, - -+ { -+ /* X86_64_0F38F8_M_1 */ -+ { Bad_Opcode }, -+ { PREFIX_TABLE (PREFIX_0F38F8_M_1_X86_64) }, -+ }, -+ - /* X86_64_0FC7_REG_6_MOD_3_PREFIX_1 */ - { - { Bad_Opcode }, -@@ -4361,97 +4498,103 @@ static const struct dis386 x86_64_table[][2] = { - /* X86_64_VEX_0F38E0 */ - { - { Bad_Opcode }, -- { "cmpoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38E1 */ - { - { Bad_Opcode }, -- { "cmpnoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpnoxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38E2 */ - { - { Bad_Opcode }, -- { "cmpbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38E3 */ - { - { Bad_Opcode }, -- { "cmpnbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpnbxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38E4 */ - { - { Bad_Opcode }, -- { "cmpzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38E5 */ - { - { Bad_Opcode }, -- { "cmpnzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpnzxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38E6 */ - { - { Bad_Opcode }, -- { "cmpbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38E7 */ - { - { Bad_Opcode }, -- { "cmpnbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpnbexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38E8 */ - { - { Bad_Opcode }, -- { "cmpsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38E9 */ - { - { Bad_Opcode }, -- { "cmpnsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpnsxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38EA */ - { - { Bad_Opcode }, -- { "cmppxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmppxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38EB */ - { - { Bad_Opcode }, -- { "cmpnpxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpnpxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38EC */ - { - { Bad_Opcode }, -- { "cmplxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmplxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38ED */ - { - { Bad_Opcode }, -- { "cmpnlxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpnlxadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38EE */ - { - { Bad_Opcode }, -- { "cmplexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmplexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, - }, - - /* X86_64_VEX_0F38EF */ - { - { Bad_Opcode }, -- { "cmpnlexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ { "%XEcmpnlexadd", { Mdq, Gdq, VexGdq }, PREFIX_DATA }, -+ }, -+ -+ /* X86_64_VEX_MAP7_F8_L_0_W_0_R_0 */ -+ { -+ { Bad_Opcode }, -+ { PREFIX_TABLE (PREFIX_VEX_MAP7_F8_L_0_W_0_R_0_X86_64) }, - }, - }; - -@@ -4739,7 +4882,7 @@ static const struct dis386 three_byte_table[][256] = { - { PREFIX_TABLE (PREFIX_0F38F6) }, - { Bad_Opcode }, - /* f8 */ -- { PREFIX_TABLE (PREFIX_0F38F8) }, -+ { MOD_TABLE (MOD_0F38F8) }, - { "movdiri", { Mdq, Gdq }, PREFIX_OPCODE }, - { PREFIX_TABLE (PREFIX_0F38FA) }, - { PREFIX_TABLE (PREFIX_0F38FB) }, -@@ -7039,12 +7182,12 @@ static const struct dis386 vex_len_table[][2] = { - - /* VEX_LEN_0F38F2 */ - { -- { "andnS", { Gdq, VexGdq, Edq }, PREFIX_OPCODE }, -+ { PREFIX_TABLE (PREFIX_VEX_0F38F2_L_0) }, - }, - - /* VEX_LEN_0F38F3 */ - { -- { REG_TABLE(REG_VEX_0F38F3_L_0) }, -+ { PREFIX_TABLE (PREFIX_VEX_0F38F3_L_0) }, - }, - - /* VEX_LEN_0F38F5 */ -@@ -7205,6 +7348,11 @@ static const struct dis386 vex_len_table[][2] = { - { PREFIX_TABLE (PREFIX_VEX_0F3AF0_L_0) }, - }, - -+ /* VEX_LEN_MAP7_F8 */ -+ { -+ { VEX_W_TABLE (VEX_W_MAP7_F8_L_0) }, -+ }, -+ - /* VEX_LEN_XOP_08_85 */ - { - { VEX_W_TABLE (VEX_W_XOP_08_85_L_0) }, -@@ -7811,6 +7959,10 @@ static const struct dis386 vex_w_table[][2] = { - /* VEX_W_0F3ADE */ - { VEX_LEN_TABLE (VEX_LEN_0F3ADE_W_0) }, - }, -+ { -+ /* VEX_W_MAP7_F8_L_0 */ -+ { REG_TABLE (REG_VEX_MAP7_F8_L_0_W_0) }, -+ }, - /* VEX_W_XOP_08_85_L_0 */ - { - { "vpmacssww", { XM, Vex, EXx, XMVexI4 }, 0 }, -@@ -8125,7 +8277,7 @@ static const struct dis386 mod_table[][2] = { - }, - { - /* MOD_0FAE_REG_5 */ -- { "xrstor", { FXSAVE }, PREFIX_OPCODE }, -+ { "xrstor", { FXSAVE }, PREFIX_OPCODE | PREFIX_REX2_ILLEGAL }, - { PREFIX_TABLE (PREFIX_0FAE_REG_5_MOD_3) }, - }, - { -@@ -8153,6 +8305,11 @@ static const struct dis386 mod_table[][2] = { - { "aesenc128kl", { XM, M }, 0 }, - { "loadiwkey", { XM, EXx }, 0 }, - }, -+ /* MOD_0F38F8 */ -+ { -+ { PREFIX_TABLE (PREFIX_0F38F8_M_0) }, -+ { X86_64_TABLE (X86_64_0F38F8_M_1) }, -+ }, - { - /* MOD_VEX_0F3849_X86_64_L_0_W_0 */ - { PREFIX_TABLE (PREFIX_VEX_0F3849_X86_64_L_0_W_0_M_0) }, -@@ -8323,6 +8480,24 @@ ckprefix (instr_info *ins) - return ckp_okay; - ins->last_rex_prefix = i; - break; -+ /* REX2 must be the last prefix. */ -+ case REX2_OPCODE: -+ if (ins->address_mode == mode_64bit) -+ { -+ if (ins->last_rex_prefix >= 0) -+ return ckp_bogus; -+ -+ ins->codep++; -+ if (!fetch_code (ins->info, ins->codep + 1)) -+ return ckp_fetch_error; -+ ins->rex2_payload = *ins->codep; -+ ins->rex2 = ins->rex2_payload >> 4; -+ ins->rex = (ins->rex2_payload & 0xf) | REX_OPCODE; -+ ins->codep++; -+ ins->last_rex2_prefix = i; -+ ins->all_prefixes[i] = REX2_OPCODE; -+ } -+ return ckp_okay; - case 0xf3: - ins->prefixes |= PREFIX_REPZ; - ins->last_repz_prefix = i; -@@ -8490,6 +8665,8 @@ prefix_name (enum address_mode mode, uint8_t pref, int sizeflag) - return "bnd"; - case NOTRACK_PREFIX: - return "notrack"; -+ case REX2_OPCODE: -+ return "rex2"; - default: - return NULL; - } -@@ -8507,10 +8684,10 @@ with the -M switch (multiple options should be separated by commas):\n")); - fprintf (stream, _(" i8086 Disassemble in 16bit mode\n")); - fprintf (stream, _(" att Display instruction in AT&T syntax\n")); - fprintf (stream, _(" intel Display instruction in Intel syntax\n")); -- fprintf (stream, _(" att-mnemonic\n" -- " Display instruction in AT&T mnemonic\n")); -- fprintf (stream, _(" intel-mnemonic\n" -- " Display instruction in Intel mnemonic\n")); -+ fprintf (stream, _(" att-mnemonic (AT&T syntax only)\n" -+ " Display instruction with AT&T mnemonic\n")); -+ fprintf (stream, _(" intel-mnemonic (AT&T syntax only)\n" -+ " Display instruction with Intel mnemonic\n")); - fprintf (stream, _(" addr64 Assume 64bit address size\n")); - fprintf (stream, _(" addr32 Assume 32bit address size\n")); - fprintf (stream, _(" addr16 Assume 16bit address size\n")); -@@ -8527,6 +8704,8 @@ static const struct dis386 bad_opcode = { "(bad)", { XX }, 0 }; - /* Fetch error indicator. */ - static const struct dis386 err_opcode = { NULL, { XX }, 0 }; - -+static const struct dis386 map7_f8_opcode = { VEX_LEN_TABLE (VEX_LEN_MAP7_F8) }; -+ - /* Get a pointer to struct dis386 with a valid name. */ - - static const struct dis386 * -@@ -8553,6 +8732,7 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) - break; - - case USE_PREFIX_TABLE: -+ use_prefix_table: - if (ins->need_vex) - { - /* The prefix in VEX is implicit. */ -@@ -8622,12 +8802,40 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) - dp = &prefix_table[dp->op[1].bytemode][vindex]; - break; - -+ case USE_X86_64_EVEX_FROM_VEX_TABLE: -+ case USE_X86_64_EVEX_PFX_TABLE: -+ case USE_X86_64_EVEX_W_TABLE: -+ case USE_X86_64_EVEX_MEM_W_TABLE: -+ ins->evex_type = evex_from_vex; -+ /* EVEX from VEX instructions are 64-bit only and require that EVEX.z, -+ EVEX.L'L, EVEX.b, and the lower 2 bits of EVEX.aaa must be 0. */ -+ if (ins->address_mode != mode_64bit -+ || (ins->vex.mask_register_specifier & 0x3) != 0 -+ || ins->vex.ll != 0 -+ || ins->vex.zeroing != 0 -+ || ins->vex.b) -+ return &bad_opcode; -+ -+ if (dp->op[0].bytemode == USE_X86_64_EVEX_PFX_TABLE) -+ goto use_prefix_table; -+ if (dp->op[0].bytemode == USE_X86_64_EVEX_W_TABLE) -+ goto use_vex_w_table; -+ if (dp->op[0].bytemode == USE_X86_64_EVEX_MEM_W_TABLE) -+ { -+ if (ins->modrm.mod == 3) -+ return &bad_opcode; -+ goto use_vex_w_table; -+ } -+ -+ /* Fall through. */ - case USE_X86_64_TABLE: - vindex = ins->address_mode == mode_64bit ? 1 : 0; - dp = &x86_64_table[dp->op[1].bytemode][vindex]; - break; - - case USE_3BYTE_TABLE: -+ if (ins->last_rex2_prefix >= 0) -+ return &err_opcode; - if (!fetch_code (ins->info, ins->codep + 2)) - return &err_opcode; - vindex = *ins->codep++; -@@ -8769,6 +8977,9 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) - case 0x3: - vex_table_index = VEX_0F3A; - break; -+ case 0x7: -+ vex_table_index = VEX_MAP7; -+ break; - } - ins->codep++; - ins->vex.w = *ins->codep & 0x80; -@@ -8803,7 +9014,12 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) - ins->need_vex = 3; - ins->codep++; - vindex = *ins->codep++; -- dp = &vex_table[vex_table_index][vindex]; -+ if (vex_table_index != VEX_MAP7) -+ dp = &vex_table[vex_table_index][vindex]; -+ else if (vindex == 0xf8) -+ dp = &map7_f8_opcode; -+ else -+ dp = &bad_opcode; - ins->end_codep = ins->codep; - /* There is no MODRM byte for VEX0F 77. */ - if ((vex_table_index != VEX_0F || vindex != 0x77) -@@ -8846,6 +9062,7 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) - break; - - case USE_VEX_W_TABLE: -+ use_vex_w_table: - if (!ins->need_vex) - abort (); - -@@ -8859,9 +9076,13 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) - if (!fetch_code (ins->info, ins->codep + 4)) - return &err_opcode; - /* The first byte after 0x62. */ -+ if (*ins->codep & 0x8) -+ ins->rex2 |= REX_B; -+ if (!(*ins->codep & 0x10)) -+ ins->rex2 |= REX_R; -+ - ins->rex = ~(*ins->codep >> 5) & 0x7; -- ins->vex.r = *ins->codep & 0x10; -- switch ((*ins->codep & 0xf)) -+ switch (*ins->codep & 0x7) - { - default: - return &bad_opcode; -@@ -8874,12 +9095,21 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) - case 0x3: - vex_table_index = EVEX_0F3A; - break; -+ case 0x4: -+ vex_table_index = EVEX_MAP4; -+ ins->evex_type = evex_from_legacy; -+ if (ins->address_mode != mode_64bit) -+ return &bad_opcode; -+ break; - case 0x5: - vex_table_index = EVEX_MAP5; - break; - case 0x6: - vex_table_index = EVEX_MAP6; - break; -+ case 0x7: -+ vex_table_index = EVEX_MAP7; -+ break; - } - - /* The second byte after 0x62. */ -@@ -8890,9 +9120,8 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) - - ins->vex.register_specifier = (~(*ins->codep >> 3)) & 0xf; - -- /* The U bit. */ - if (!(*ins->codep & 0x4)) -- return &bad_opcode; -+ ins->rex2 |= REX_X; - - switch ((*ins->codep & 0x3)) - { -@@ -8919,24 +9148,54 @@ get_valid_dis386 (const struct dis386 *dp, instr_info *ins) - ins->vex.v = *ins->codep & 0x8; - ins->vex.mask_register_specifier = *ins->codep & 0x7; - ins->vex.zeroing = *ins->codep & 0x80; -+ /* Set the NF bit for EVEX-Promoted instructions, this bit will be cleared -+ when it's an evex_default one. */ -+ ins->vex.nf = *ins->codep & 0x4; - - if (ins->address_mode != mode_64bit) - { -+ /* Report bad for !evex_default and when two fixed values of evex -+ change.. */ -+ if (ins->evex_type != evex_default -+ || (ins->rex2 & (REX_B | REX_X))) -+ return &bad_opcode; - /* In 16/32-bit mode silently ignore following bits. */ - ins->rex &= ~REX_B; -- ins->vex.r = true; -+ ins->rex2 &= ~REX_R; - } - -+ /* EVEX from legacy instructions, when the EVEX.ND bit is 0, -+ all bits of EVEX.vvvv and EVEX.V' must be 1. */ -+ if (ins->evex_type == evex_from_legacy && !ins->vex.nd -+ && (ins->vex.register_specifier || !ins->vex.v)) -+ return &bad_opcode; -+ - ins->need_vex = 4; -+ -+ /* EVEX from legacy instructions require that EVEX.z, EVEX.L’L and the -+ lower 2 bits of EVEX.aaa must be 0. */ -+ if (ins->evex_type == evex_from_legacy -+ && ((ins->vex.mask_register_specifier & 0x3) != 0 -+ || ins->vex.ll != 0 -+ || ins->vex.zeroing != 0)) -+ return &bad_opcode; -+ - ins->codep++; - vindex = *ins->codep++; -- dp = &evex_table[vex_table_index][vindex]; -+ if (vex_table_index != EVEX_MAP7) -+ dp = &evex_table[vex_table_index][vindex]; -+ else if (vindex == 0xf8) -+ dp = &map7_f8_opcode; -+ else -+ dp = &bad_opcode; - ins->end_codep = ins->codep; - if (!fetch_modrm (ins)) - return &err_opcode; - -- /* Set vector length. */ -- if (ins->modrm.mod == 3 && ins->vex.b) -+ /* Set vector length. For EVEX-promoted instructions, evex.ll == 0b00, -+ which has the same encoding as vex.length == 128 and they can share -+ the same processing with vex.length in OP_VEX. */ -+ if (ins->modrm.mod == 3 && ins->vex.b && ins->evex_type != evex_from_legacy) - ins->vex.length = 512; - else - { -@@ -9128,6 +9387,7 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) - .last_data_prefix = -1, - .last_addr_prefix = -1, - .last_rex_prefix = -1, -+ .last_rex2_prefix = -1, - .last_seg_prefix = -1, - .fwait_prefix = -1, - }; -@@ -9167,9 +9427,10 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) - } - else if (startswith (p, "intel")) - { -- ins.intel_syntax = 1; - if (startswith (p + 5, "-mnemonic")) - ins.intel_mnemonic = true; -+ else -+ ins.intel_syntax = 1; - } - else if (startswith (p, "att")) - { -@@ -9292,24 +9553,25 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) - goto out; - } - -- if (*ins.codep == 0x0f) -+ /* REX2.M in rex2 prefix represents map0 or map1. */ -+ if (ins.last_rex2_prefix < 0 ? *ins.codep == 0x0f : (ins.rex2 & REX2_M)) - { -- unsigned char threebyte; -+ if (!ins.rex2) -+ { -+ ins.codep++; -+ if (!fetch_code (info, ins.codep + 1)) -+ goto fetch_error_out; -+ } - -- ins.codep++; -- if (!fetch_code (info, ins.codep + 1)) -- goto fetch_error_out; -- threebyte = *ins.codep; -- dp = &dis386_twobyte[threebyte]; -- ins.need_modrm = twobyte_has_modrm[threebyte]; -- ins.codep++; -+ dp = &dis386_twobyte[*ins.codep]; -+ ins.need_modrm = twobyte_has_modrm[*ins.codep]; - } - else - { - dp = &dis386[*ins.codep]; - ins.need_modrm = onebyte_has_modrm[*ins.codep]; -- ins.codep++; - } -+ ins.codep++; - - /* Save sizeflag for printing the extra ins.prefixes later before updating - it for mnemonic and operand processing. The prefix names depend -@@ -9335,6 +9597,22 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) - dp = get_valid_dis386 (dp, &ins); - if (dp == &err_opcode) - goto fetch_error_out; -+ -+ /* For APX instructions promoted from legacy maps 0/1, embedded prefix -+ is interpreted as the operand size override. */ -+ if (ins.evex_type == evex_from_legacy -+ && ins.vex.prefix == DATA_PREFIX_OPCODE) -+ sizeflag ^= DFLAG; -+ -+ if(ins.evex_type == evex_default) -+ ins.vex.nf = false; -+ else -+ /* For EVEX-promoted formats, we need to clear EVEX.NF (ccmp and ctest -+ are cleared separately.) in mask_register_specifier and keep the low -+ 2 bits of mask_register_specifier to report errors for invalid cases -+ . */ -+ ins.vex.mask_register_specifier &= 0x3; -+ - if (dp != NULL && putop (&ins, dp->name, sizeflag) == 0) - { - if (!get_sib (&ins, sizeflag)) -@@ -9387,10 +9665,13 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) - oappend (&ins, "/(bad)"); - } - } -+ /* vex.nf is cleared after being consumed. */ -+ if (ins.vex.nf) -+ oappend (&ins, "{bad-nf}"); - - /* Check whether rounding control was enabled for an insn not -- supporting it. */ -- if (ins.modrm.mod == 3 && ins.vex.b -+ supporting it, when evex.b is not treated as evex.nd. */ -+ if (ins.modrm.mod == 3 && ins.vex.b && ins.evex_type == evex_default - && !(ins.evex_used & EVEX_b_used)) - { - for (i = 0; i < MAX_OPERANDS; ++i) -@@ -9454,7 +9735,15 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) - goto out; - } - -- switch (dp->prefix_requirement) -+ if ((dp->prefix_requirement & PREFIX_REX2_ILLEGAL) -+ && ins.last_rex2_prefix >= 0 && (ins.rex2 & REX2_SPECIAL) == 0) -+ { -+ i386_dis_printf (info, dis_style_text, "(bad)"); -+ ret = ins.end_codep - priv.the_buffer; -+ goto out; -+ } -+ -+ switch (dp->prefix_requirement & ~PREFIX_REX2_ILLEGAL) - { - case PREFIX_DATA: - /* If only the data prefix is marked as mandatory, its absence renders -@@ -9506,6 +9795,25 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) - if (ins.last_repnz_prefix >= 0) - ins.all_prefixes[ins.last_repnz_prefix] = 0xf2; - break; -+ -+ case PREFIX_NP_OR_DATA: -+ if (ins.vex.prefix == REPE_PREFIX_OPCODE -+ || ins.vex.prefix == REPNE_PREFIX_OPCODE) -+ { -+ i386_dis_printf (info, dis_style_text, "(bad)"); -+ ret = ins.end_codep - priv.the_buffer; -+ goto out; -+ } -+ break; -+ -+ case NO_PREFIX: -+ if (ins.vex.prefix) -+ { -+ i386_dis_printf (info, dis_style_text, "(bad)"); -+ ret = ins.end_codep - priv.the_buffer; -+ goto out; -+ } -+ break; - } - - /* Check if the REX prefix is used. */ -@@ -9513,6 +9821,14 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) - && !ins.need_vex && ins.last_rex_prefix >= 0) - ins.all_prefixes[ins.last_rex_prefix] = 0; - -+ /* Check if the REX2 prefix is used. */ -+ if (ins.last_rex2_prefix >= 0 -+ && ((ins.rex2 & REX2_SPECIAL) -+ || (((ins.rex2 & 7) ^ (ins.rex2_used & 7)) == 0 -+ && (ins.rex ^ ins.rex_used) == 0 -+ && (ins.rex2 & 7)))) -+ ins.all_prefixes[ins.last_rex2_prefix] = 0; -+ - /* Check if the SEG prefix is used. */ - if ((ins.prefixes & (PREFIX_CS | PREFIX_SS | PREFIX_DS | PREFIX_ES - | PREFIX_FS | PREFIX_GS)) != 0 -@@ -9541,7 +9857,11 @@ print_insn (bfd_vma pc, disassemble_info *info, int intel_syntax) - if (name == NULL) - abort (); - prefix_length += strlen (name) + 1; -- i386_dis_printf (info, dis_style_mnemonic, "%s ", name); -+ if (ins.all_prefixes[i] == REX2_OPCODE) -+ i386_dis_printf (info, dis_style_mnemonic, "{%s 0x%x} ", name, -+ (unsigned int) ins.rex2_payload); -+ else -+ i386_dis_printf (info, dis_style_mnemonic, "%s ", name); - } - - /* Check maximum code length. */ -@@ -10077,6 +10397,16 @@ putop (instr_info *ins, const char *in_template, int sizeflag) - int cond = 1; - unsigned int l = 0, len = 0; - char last[4]; -+ bool evex_printed = false; -+ -+ /* We don't want to add any prefix or suffix to (bad), so return early. */ -+ if (!strncmp (in_template, "(bad)", 5)) -+ { -+ oappend (ins, "(bad)"); -+ *ins->obufp = 0; -+ ins->mnemonicendp = ins->obufp; -+ return 0; -+ } - - for (p = in_template; *p; p++) - { -@@ -10090,6 +10420,12 @@ putop (instr_info *ins, const char *in_template, int sizeflag) - switch (*p) - { - default: -+ if (ins->evex_type == evex_from_legacy && !ins->vex.nd -+ && !(ins->rex2 & 7) && !evex_printed) -+ { -+ oappend (ins, "{evex} "); -+ evex_printed = true; -+ } - *ins->obufp++ = *p; - break; - case '%': -@@ -10120,7 +10456,7 @@ putop (instr_info *ins, const char *in_template, int sizeflag) - case 'A': - if (ins->intel_syntax) - break; -- if ((ins->need_modrm && ins->modrm.mod != 3) -+ if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd) - || (sizeflag & SUFFIX_ALWAYS)) - *ins->obufp++ = 'b'; - break; -@@ -10204,7 +10540,7 @@ putop (instr_info *ins, const char *in_template, int sizeflag) - { - case 'X': - if (!ins->vex.evex || ins->vex.b || ins->vex.ll >= 2 -- || !ins->vex.r -+ || (ins->rex2 & 7) - || (ins->modrm.mod == 3 && (ins->rex & REX_X)) - || !ins->vex.v || ins->vex.mask_register_specifier) - break; -@@ -10226,6 +10562,11 @@ putop (instr_info *ins, const char *in_template, int sizeflag) - *ins->obufp++ = '}'; - *ins->obufp++ = ' '; - break; -+ case 'M': -+ if (ins->modrm.mod != 3 && !(ins->rex2 & 7)) -+ oappend (ins, "{evex} "); -+ evex_printed = true; -+ break; - default: - abort (); - } -@@ -10245,16 +10586,39 @@ putop (instr_info *ins, const char *in_template, int sizeflag) - ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR); - break; - case 'F': -- if (ins->intel_syntax) -+ if (l == 0) -+ { -+ if (ins->intel_syntax) -+ break; -+ if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS)) -+ { -+ if (sizeflag & AFLAG) -+ *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l'; -+ else -+ *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w'; -+ ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR); -+ } -+ } -+ else if (l == 1 && last[0] == 'C') - break; -- if ((ins->prefixes & PREFIX_ADDR) || (sizeflag & SUFFIX_ALWAYS)) -+ else if (l == 1 && last[0] == 'N') - { -- if (sizeflag & AFLAG) -- *ins->obufp++ = ins->address_mode == mode_64bit ? 'q' : 'l'; -- else -- *ins->obufp++ = ins->address_mode == mode_64bit ? 'l' : 'w'; -- ins->used_prefixes |= (ins->prefixes & PREFIX_ADDR); -+ if (ins->vex.nf) -+ { -+ oappend (ins, "{nf} "); -+ /* This bit needs to be cleared after it is consumed. */ -+ ins->vex.nf = false; -+ evex_printed = true; -+ } -+ else if (ins->evex_type == evex_from_vex && !(ins->rex2 & 7) -+ && ins->vex.v) -+ { -+ oappend (ins, "{evex} "); -+ evex_printed = true; -+ } - } -+ else -+ abort (); - break; - case 'G': - if (ins->intel_syntax || (ins->obufp[-1] != 's' -@@ -10311,7 +10675,16 @@ putop (instr_info *ins, const char *in_template, int sizeflag) - *ins->obufp++ = 'd'; - break; - case 'L': -- abort (); -+ if (ins->intel_syntax) -+ break; -+ if (sizeflag & SUFFIX_ALWAYS) -+ { -+ if (ins->rex & REX_W) -+ *ins->obufp++ = 'q'; -+ else -+ *ins->obufp++ = 'l'; -+ } -+ break; - case 'M': - if (ins->intel_mnemonic != cond) - *ins->obufp++ = 'r'; -@@ -10346,6 +10719,19 @@ putop (instr_info *ins, const char *in_template, int sizeflag) - case 'P': - if (l == 0) - { -+ if (!cond && ins->last_rex2_prefix >= 0 && (ins->rex & REX_W)) -+ { -+ /* For pushp and popp, p is printed and do not print {rex2} -+ for them. */ -+ *ins->obufp++ = 'p'; -+ ins->rex2 |= REX2_SPECIAL; -+ break; -+ } -+ -+ /* For "!P" print nothing else in Intel syntax. */ -+ if (!cond && ins->intel_syntax) -+ break; -+ - if ((ins->modrm.mod == 3 || !cond) - && !(sizeflag & SUFFIX_ALWAYS)) - break; -@@ -10390,7 +10776,7 @@ putop (instr_info *ins, const char *in_template, int sizeflag) - if (ins->intel_syntax && !alt) - break; - USED_REX (REX_W); -- if ((ins->need_modrm && ins->modrm.mod != 3) -+ if ((ins->need_modrm && ins->modrm.mod != 3 && !ins->vex.nd) - || (sizeflag & SUFFIX_ALWAYS)) - { - if (ins->rex & REX_W) -@@ -10818,7 +11204,8 @@ print_displacement (instr_info *ins, bfd_signed_vma val) - static void - intel_operand_size (instr_info *ins, int bytemode, int sizeflag) - { -- if (ins->vex.b) -+ /* Check if there is a broadcast, when evex.b is not treated as evex.nd. */ -+ if (ins->vex.b && ins->evex_type == evex_default) - { - if (!ins->vex.no_broadcast) - switch (bytemode) -@@ -11088,6 +11475,8 @@ print_register (instr_info *ins, unsigned int reg, unsigned int rexmask, - USED_REX (rexmask); - if (ins->rex & rexmask) - reg += 8; -+ if (ins->rex2 & rexmask) -+ reg += 16; - - switch (bytemode) - { -@@ -11095,7 +11484,7 @@ print_register (instr_info *ins, unsigned int reg, unsigned int rexmask, - case b_swap_mode: - if (reg & 4) - USED_REX (0); -- if (ins->rex) -+ if (ins->rex || ins->rex2) - names = att_names8rex; - else - names = att_names8; -@@ -11300,6 +11689,7 @@ OP_Skip_MODRM (instr_info *ins, int bytemode ATTRIBUTE_UNUSED, - /* Skip mod/rm byte. */ - MODRM_CHECK; - ins->codep++; -+ ins->has_skipped_modrm = true; - return true; - } - -@@ -11310,7 +11700,10 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag) - int riprel = 0; - int shift; - -- if (ins->vex.evex) -+ add += (ins->rex2 & REX_B) ? 16 : 0; -+ -+ /* Handles EVEX other than APX EVEX-promoted instructions. */ -+ if (ins->vex.evex && ins->evex_type == evex_default) - { - - /* Zeroing-masking is invalid for memory destinations. Set the flag -@@ -11454,6 +11847,13 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag) - abort (); - if (ins->vex.evex) - { -+ /* S/G EVEX insns require EVEX.X4 not to be set. */ -+ if (ins->rex2 & REX_X) -+ { -+ oappend (ins, "(bad)"); -+ return true; -+ } -+ - if (!ins->vex.v) - vindex += 16; - check_gather = ins->obufp == ins->op_out[1]; -@@ -11483,6 +11883,9 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag) - } - break; - default: -+ if (ins->rex2 & REX_X) -+ vindex += 16; -+ - if (vindex != 4) - indexes = ins->address_mode == mode_64bit && !addr32flag - ? att_names64 : att_names32; -@@ -11653,7 +12056,7 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag) - - if (ins->rex & REX_R) - modrm_reg += 8; -- if (!ins->vex.r) -+ if (ins->rex2 & REX_R) - modrm_reg += 16; - if (vindex == modrm_reg) - oappend (ins, "/(bad)"); -@@ -11735,7 +12138,7 @@ OP_E_memory (instr_info *ins, int bytemode, int sizeflag) - print_operand_value (ins, disp & 0xffff, dis_style_text); - } - } -- if (ins->vex.b) -+ if (ins->vex.b && ins->evex_type == evex_default) - { - ins->evex_used |= EVEX_b_used; - -@@ -11818,7 +12221,11 @@ OP_E (instr_info *ins, int bytemode, int sizeflag) - { - /* Skip mod/rm byte. */ - MODRM_CHECK; -- ins->codep++; -+ if (!ins->has_skipped_modrm) -+ { -+ ins->codep++; -+ ins->has_skipped_modrm = true; -+ } - - if (ins->modrm.mod == 3) - { -@@ -11855,10 +12262,7 @@ OP_indirE (instr_info *ins, int bytemode, int sizeflag) - static bool - OP_G (instr_info *ins, int bytemode, int sizeflag) - { -- if (ins->vex.evex && !ins->vex.r && ins->address_mode == mode_64bit) -- oappend (ins, "(bad)"); -- else -- print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag); -+ print_register (ins, ins->modrm.reg, REX_R, bytemode, sizeflag); - return true; - } - -@@ -11866,7 +12270,7 @@ static bool - OP_REG (instr_info *ins, int code, int sizeflag) - { - const char *s; -- int add; -+ int add = 0; - - switch (code) - { -@@ -11879,8 +12283,8 @@ OP_REG (instr_info *ins, int code, int sizeflag) - USED_REX (REX_B); - if (ins->rex & REX_B) - add = 8; -- else -- add = 0; -+ if (ins->rex2 & REX_B) -+ add += 16; - - switch (code) - { -@@ -12011,6 +12415,8 @@ OP_I (instr_info *ins, int bytemode, int sizeflag) - case const_1_mode: - if (ins->intel_syntax) - oappend (ins, "1"); -+ else -+ oappend (ins, "$1"); - return true; - default: - oappend (ins, INTERNAL_DISASSEMBLER_ERROR); -@@ -12487,7 +12893,7 @@ OP_XMM (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED) - reg += 8; - if (ins->vex.evex) - { -- if (!ins->vex.r) -+ if (ins->rex2 & REX_R) - reg += 16; - } - -@@ -12592,6 +12998,8 @@ OP_EX (instr_info *ins, int bytemode, int sizeflag) - USED_REX (REX_B); - if (ins->rex & REX_B) - reg += 8; -+ if (ins->rex2 & REX_B) -+ reg += 16; - if (ins->vex.evex) - { - USED_REX (REX_X); -@@ -12623,9 +13031,10 @@ OP_R (instr_info *ins, int bytemode, int sizeflag) - { - case d_mode: - case dq_mode: -+ case q_mode: - case mask_mode: - return OP_E (ins, bytemode, sizeflag); -- case q_mode: -+ case q_mm_mode: - return OP_EM (ins, x_mode, sizeflag); - case xmm_mode: - if (ins->vex.length <= 128) -@@ -13095,6 +13504,13 @@ OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED) - if (!ins->need_vex) - return true; - -+ if (ins->evex_type == evex_from_legacy) -+ { -+ ins->evex_used |= EVEX_b_used; -+ if (!ins->vex.nd) -+ return true; -+ } -+ - reg = ins->vex.register_specifier; - ins->vex.register_specifier = 0; - if (ins->address_mode != mode_64bit) -@@ -13186,12 +13602,22 @@ OP_VEX (instr_info *ins, int bytemode, int sizeflag ATTRIBUTE_UNUSED) - names = att_names_xmm; - ins->evex_used |= EVEX_len_used; - break; -+ case v_mode: - case dq_mode: - if (ins->rex & REX_W) - names = att_names64; -+ else if (bytemode == v_mode -+ && !(sizeflag & DFLAG)) -+ names = att_names16; - else - names = att_names32; - break; -+ case b_mode: -+ names = att_names8rex; -+ break; -+ case q_mode: -+ names = att_names64; -+ break; - case mask_bd_mode: - case mask_mode: - if (reg > 0x7) -@@ -13491,7 +13917,7 @@ DistinctDest_Fixup (instr_info *ins, int bytemode, int sizeflag) - /* Calc destination register number. */ - if (ins->rex & REX_R) - modrm_reg += 8; -- if (!ins->vex.r) -+ if (ins->rex2 & REX_R) - modrm_reg += 16; - - /* Calc src1 register number. */ -@@ -13576,3 +14002,58 @@ PREFETCHI_Fixup (instr_info *ins, int bytemode, int sizeflag) - - return OP_M (ins, bytemode, sizeflag); - } -+ -+static bool -+PUSH2_POP2_Fixup (instr_info *ins, int bytemode, int sizeflag) -+{ -+ if (ins->modrm.mod != 3) -+ return true; -+ -+ unsigned int vvvv_reg = ins->vex.register_specifier -+ | (!ins->vex.v << 4); -+ unsigned int rm_reg = ins->modrm.rm + (ins->rex & REX_B ? 8 : 0) -+ + (ins->rex2 & REX_B ? 16 : 0); -+ -+ /* Push2/Pop2 cannot use RSP and Pop2 cannot pop two same registers. */ -+ if (!ins->vex.nd || vvvv_reg == 0x4 || rm_reg == 0x4 -+ || (!ins->modrm.reg -+ && vvvv_reg == rm_reg)) -+ { -+ oappend (ins, "(bad)"); -+ return true; -+ } -+ -+ return OP_VEX (ins, bytemode, sizeflag); -+} -+ -+static bool -+JMPABS_Fixup (instr_info *ins, int bytemode, int sizeflag) -+{ -+ if (ins->last_rex2_prefix >= 0) -+ { -+ uint64_t op; -+ -+ if ((ins->prefixes & (PREFIX_OPCODE | PREFIX_ADDR | PREFIX_LOCK)) != 0x0 -+ || (ins->rex & REX_W) != 0x0) -+ { -+ oappend (ins, "(bad)"); -+ return true; -+ } -+ -+ if (bytemode == eAX_reg) -+ return true; -+ -+ if (!get64 (ins, &op)) -+ return false; -+ -+ ins->mnemonicendp = stpcpy (ins->obuf, "jmpabs"); -+ ins->rex2 |= REX2_SPECIAL; -+ oappend_immediate (ins, op); -+ -+ return true; -+ } -+ -+ if (bytemode == eAX_reg) -+ return OP_IMREG (ins, bytemode, sizeflag); -+ return OP_OFF64 (ins, bytemode, sizeflag); -+} -diff --git a/opcodes/i386-gen.c b/opcodes/i386-gen.c ---- a/opcodes/i386-gen.c -+++ b/opcodes/i386-gen.c -@@ -1,4 +1,4 @@ --/* Copyright (C) 2007-2023 Free Software Foundation, Inc. -+/* Copyright (C) 2007-2024 Free Software Foundation, Inc. - - This file is part of the GNU opcodes library. - -@@ -63,7 +63,7 @@ static const dependency isa_dependencies[] = - { "NOCONA", - "GENERIC64|FISTTP|SSE3|MONITOR|CX16" }, - { "CORE", -- "P4|FISTTP|SSE3|MONITOR|CX16" }, -+ "P4|FISTTP|SSE3|MONITOR" }, - { "CORE2", - "NOCONA|SSSE3" }, - { "COREI7", -@@ -94,6 +94,8 @@ static const dependency isa_dependencies[] = - "ZNVER2|INVLPGB|TLBSYNC|VAES|VPCLMULQDQ|INVPCID|SNP|OSPKE" }, - { "ZNVER4", - "ZNVER3|AVX512F|AVX512DQ|AVX512IFMA|AVX512CD|AVX512BW|AVX512VL|AVX512_BF16|AVX512VBMI|AVX512_VBMI2|AVX512_VNNI|AVX512_BITALG|AVX512_VPOPCNTDQ|GFNI|RMPQUERY" }, -+ { "ZNVER5", -+ "ZNVER4|AVX_VNNI|MOVDIRI|MOVDIR64B|AVX512_VP2INTERSECT|PREFETCHI" }, - { "BTVER1", - "GENERIC64|FISTTP|MONITOR|CX16|LAHF_SAHF|Rdtscp|SSSE3|SSE4A|ABM|PRFCHW|Clflush|FISTTP|SVME" }, - { "BTVER2", -@@ -166,6 +168,10 @@ static const dependency isa_dependencies[] = - "AVX2" }, - { "AVX_NE_CONVERT", - "AVX2" }, -+ { "CX16", -+ "64" }, -+ { "LKGS", -+ "64" }, - { "FRED", - "LKGS" }, - { "AVX512F", -@@ -240,13 +246,13 @@ static const dependency isa_dependencies[] = - { "SNP", - "SEV_ES" }, - { "RMPQUERY", -- "SNP" }, -+ "SNP|64" }, - { "TSX", - "RTM|HLE" }, - { "TSXLDTRK", - "RTM" }, - { "AMX_TILE", -- "XSAVE" }, -+ "XSAVE|64" }, - { "AMX_INT8", - "AMX_TILE" }, - { "AMX_BF16", -@@ -259,6 +265,20 @@ static const dependency isa_dependencies[] = - "SSE2" }, - { "WIDEKL", - "KL" }, -+ { "PBNDKB", -+ "64" }, -+ { "UINTR", -+ "64" }, -+ { "PREFETCHI", -+ "64" }, -+ { "CMPCCXADD", -+ "64" }, -+ { "MSRLIST", -+ "64" }, -+ { "USER_MSR", -+ "64" }, -+ { "APX_F", -+ "XSAVE|64" }, - }; - - /* This array is populated as process_i386_initializers() walks cpu_flags[]. */ -@@ -380,6 +400,8 @@ static bitfield cpu_flags[] = - BITFIELD (RAO_INT), - BITFIELD (FRED), - BITFIELD (LKGS), -+ BITFIELD (USER_MSR), -+ BITFIELD (APX_F), - BITFIELD (MWAITX), - BITFIELD (CLZERO), - BITFIELD (OSPKE), -@@ -463,12 +485,12 @@ static bitfield opcode_modifiers[] = - BITFIELD (StaticRounding), - BITFIELD (SAE), - BITFIELD (Disp8MemShift), -- BITFIELD (Vsz), - BITFIELD (Optimize), -- BITFIELD (ATTMnemonic), -- BITFIELD (ATTSyntax), -- BITFIELD (IntelSyntax), -+ BITFIELD (Dialect), - BITFIELD (ISA64), -+ BITFIELD (NoEgpr), -+ BITFIELD (NF), -+ BITFIELD (Rex2), - }; - - #define CLASS(n) #n, n -@@ -587,7 +609,7 @@ static void - process_copyright (FILE *fp) - { - fprintf (fp, "/* This file is automatically generated by i386-gen. Do not edit! */\n\ --/* Copyright (C) 2007-2023 Free Software Foundation, Inc.\n\ -+/* Copyright (C) 2007-2024 Free Software Foundation, Inc.\n\ - \n\ - This file is part of the GNU opcodes library.\n\ - \n\ -@@ -771,8 +793,10 @@ add_isa_dependencies (bitfield *flags, const char *f, int value, - } - free (deps); - -- /* ISA extensions with dependencies need CPU_ANY_*_FLAGS emitted. */ -- if (reverse < ARRAY_SIZE (isa_reverse_deps[0])) -+ /* ISA extensions with dependencies need CPU_ANY_*_FLAGS emitted, -+ unless the sole dependency is the "64-bit mode only" one. */ -+ if (reverse < ARRAY_SIZE (isa_reverse_deps[0]) -+ && strcmp (isa_dependencies[i].deps, "64")) - isa_reverse_deps[reverse][reverse] = 1; - - is_avx = orig_is_avx; -@@ -787,15 +811,16 @@ add_isa_dependencies (bitfield *flags, const char *f, int value, - - static void - output_cpu_flags (FILE *table, bitfield *flags, unsigned int size, -- int macro, const char *comma, const char *indent, int lineno) -+ int mode, const char *comma, const char *indent, int lineno) - { - unsigned int i = 0, j = 0; - -- memset (&active_cpu_flags, 0, sizeof(active_cpu_flags)); -+ if (mode < 0) -+ memset (&active_cpu_flags, 0, sizeof(active_cpu_flags)); - - fprintf (table, "%s{ { ", indent); - -- if (!macro) -+ if (mode <= 0) - { - for (j = ~0u; i < CpuAttrEnums; i++) - { -@@ -806,7 +831,8 @@ output_cpu_flags (FILE *table, bitfield *flags, unsigned int size, - fail ("%s: %d: invalid combination of CPU identifiers\n", - filename, lineno); - j = i; -- active_cpu_flags.array[i / 32] |= 1U << (i % 32); -+ if (mode) -+ active_cpu_flags.array[i / 32] |= 1U << (i % 32); - } - - /* Write 0 to indicate "no associated flag". */ -@@ -824,16 +850,25 @@ output_cpu_flags (FILE *table, bitfield *flags, unsigned int size, - if (((j + 1) % 20) == 0) - { - /* We need \\ for macro. */ -- if (macro) -+ if (mode > 0) - fprintf (table, " \\\n %s", indent); - else - fprintf (table, "\n %s", indent); - } -- if (flags[i].value) -+ if (mode < 0 && flags[i].value) - active_cpu_flags.array[i / 32] |= 1U << (i % 32); - } - -- fprintf (table, "%d } }%s\n", flags[i].value, comma); -+#if defined(CpuAttrUnused) != defined(CpuUnused) -+ if (mode <= 0) -+# ifdef CpuUnused -+ fprintf (table, " } }%s\n", comma); -+# else -+ fprintf (table, "%d, 0 } }%s\n", flags[i].value, comma); -+# endif -+ else -+#endif -+ fprintf (table, "%d } }%s\n", flags[i].value, comma); - } - - static void -@@ -846,15 +881,17 @@ process_i386_cpu_flag (FILE *table, char *flag, - unsigned int i; - int value = 1; - bool is_isa = false; -- bitfield flags [ARRAY_SIZE (cpu_flags)]; -+ bitfield all [ARRAY_SIZE (cpu_flags)]; -+ bitfield any [ARRAY_SIZE (cpu_flags)]; - - /* Copy the default cpu flags. */ -- memcpy (flags, cpu_flags, sizeof (cpu_flags)); -+ memcpy (all, cpu_flags, sizeof (cpu_flags)); -+ memcpy (any, cpu_flags, sizeof (cpu_flags)); - - if (flag == NULL) - { - for (i = 0; i < ARRAY_SIZE (isa_reverse_deps[0]); ++i) -- flags[i].value = isa_reverse_deps[reverse][i]; -+ any[i].value = isa_reverse_deps[reverse][i]; - goto output; - } - -@@ -876,9 +913,9 @@ process_i386_cpu_flag (FILE *table, char *flag, - - /* First we turn on everything except for cpuno64 and - if - present - the padding field. */ -- for (i = 0; i < ARRAY_SIZE (flags); i++) -- if (flags[i].position < CpuNo64) -- flags[i].value = 1; -+ for (i = 0; i < ARRAY_SIZE (any); i++) -+ if (any[i].position < CpuNo64) -+ any[i].value = 1; - - /* Turn off selective bits. */ - value = 0; -@@ -886,10 +923,10 @@ process_i386_cpu_flag (FILE *table, char *flag, - - if (name != NULL && value != 0) - { -- for (i = 0; i < ARRAY_SIZE (flags); i++) -- if (strcasecmp (flags[i].name, name) == 0) -+ for (i = 0; i < ARRAY_SIZE (any); i++) -+ if (strcasecmp (any[i].name, name) == 0) - { -- add_isa_dependencies (flags, name, 1, reverse); -+ add_isa_dependencies (any, name, 1, reverse); - is_isa = true; - break; - } -@@ -897,18 +934,40 @@ process_i386_cpu_flag (FILE *table, char *flag, - - if (strcmp (flag, "0")) - { -+ bool combined = false; -+ - if (is_isa) - return; - - /* Turn on/off selective bits. */ - last = flag + strlen (flag); -+ if (name == NULL && strchr (flag, '&')) -+ { -+ for (; next < last && *next != '('; ) -+ { -+ str = next_field (next, '&', &next, last); -+ set_bitfield (str, all, value, ARRAY_SIZE (all), lineno); -+ } -+ if (*next == '(') -+ { -+ if (*--last != ')') -+ fail ("%s: %d: missing `)' in bitfield: %s\n", filename, -+ lineno, flag); -+ ++next; -+ *last = '\0'; -+ } -+ combined = true; -+ } - for (; next && next < last; ) - { - str = next_field (next, '|', &next, last); -- if (name == NULL) -- set_bitfield (str, flags, value, ARRAY_SIZE (flags), lineno); -- else -- add_isa_dependencies (flags, str, value, reverse); -+ if (name) -+ add_isa_dependencies (any, str, value, reverse); -+ else if (combined || next < last) -+ set_bitfield (str, any, value, ARRAY_SIZE (any), lineno); -+ else /* Singular specifiers go into "all". */ -+ set_bitfield (str, all, value, ARRAY_SIZE (all), lineno); -+ combined = true; - } - } - -@@ -918,6 +977,15 @@ process_i386_cpu_flag (FILE *table, char *flag, - size_t len = strlen (name); - char *upper = xmalloc (len + 1); - -+ /* Cpu64 is special: It specifies a mode dependency, not an ISA one. Zap -+ the flag from ISA initializer macros (and from CPU_ANY_64_FLAGS -+ itself we only care about tracking its dependents. Also don't emit the -+ (otherwise all zero) CPU_64_FLAGS. */ -+ if (flag != NULL && reverse == Cpu64) -+ return; -+ if (is_isa || flag == NULL) -+ any[Cpu64].value = 0; -+ - for (i = 0; i < len; ++i) - { - /* Don't emit #define-s for auxiliary entries. */ -@@ -930,8 +998,18 @@ process_i386_cpu_flag (FILE *table, char *flag, - flag != NULL ? "": "ANY_", upper); - free (upper); - } -+ else -+ { -+ /* Synthesize "64-bit mode only" dependencies from the dependencies we -+ have accumulated. */ -+ for (i = 0; i < ARRAY_SIZE (isa_reverse_deps[0]); ++i) -+ if (all[i].value && isa_reverse_deps[Cpu64][i]) -+ all[Cpu64].value = 1; -+ -+ output_cpu_flags(table, all, ARRAY_SIZE (all), -1, comma, indent, lineno); -+ } - -- output_cpu_flags (table, flags, ARRAY_SIZE (flags), name != NULL, -+ output_cpu_flags (table, any, ARRAY_SIZE (any), name != NULL, - comma, indent, lineno); - } - -@@ -1008,10 +1086,44 @@ get_element_size (char **opnd, int lineno) - return elem_size; - } - -+static bool -+rex2_disallowed (const unsigned long long opcode, unsigned int length, -+ unsigned int space, const char *cpu_flags) -+{ -+ /* Some opcodes encode a ModR/M-like byte directly in the opcode. */ -+ unsigned int base_opcode = opcode >> (8 * length - 8); -+ -+ /* All opcodes listed map0 0x4*, 0x7*, 0xa*, 0xe* and map1 0x3*, 0x8* -+ are reserved under REX2 and triggers #UD when prefixed with REX2 */ -+ if (space == 0) -+ switch (base_opcode >> 4) -+ { -+ case 0x4: -+ case 0x7: -+ case 0xA: -+ case 0xE: -+ return true; -+ default: -+ return false; -+ } -+ -+ if (space == SPACE_0F) -+ switch (base_opcode >> 4) -+ { -+ case 0x3: -+ case 0x8: -+ return true; -+ default: -+ return false; -+ } -+ -+ return false; -+} -+ - static void - process_i386_opcode_modifier (FILE *table, char *mod, unsigned int space, - unsigned int prefix, const char *extension_opcode, -- char **opnd, int lineno) -+ char **opnd, int lineno, bool rex2_disallowed) - { - char *str, *next, *last; - bitfield modifiers [ARRAY_SIZE (opcode_modifiers)]; -@@ -1021,8 +1133,10 @@ process_i386_opcode_modifier (FILE *table, char *mod, unsigned int space, - SPACE(0F), - SPACE(0F38), - SPACE(0F3A), -+ SPACE(EVEXMAP4), - SPACE(EVEXMAP5), - SPACE(EVEXMAP6), -+ SPACE(VEXMAP7), - SPACE(XOP08), - SPACE(XOP09), - SPACE(XOP0A), -@@ -1127,6 +1241,22 @@ process_i386_opcode_modifier (FILE *table, char *mod, unsigned int space, - fprintf (table, " SPACE_%s, %s,\n", - spaces[space], extension_opcode ? extension_opcode : "None"); - -+ /* Rather than evaluating multiple conditions at runtime to determine -+ whether an EVEX encoding is being dealt with, derive that information -+ right here. A missing EVex attribute means "dynamic". */ -+ if (!modifiers[EVex].value -+ && (modifiers[Disp8MemShift].value -+ || modifiers[Broadcast].value -+ || modifiers[Masking].value -+ || modifiers[SAE].value)) -+ modifiers[EVex].value = EVEXDYN; -+ -+ /* Vex, legacy map2 and map3 and rex2_disallowed do not support EGPR. -+ For templates supporting both Vex and EVex allowing EGPR. */ -+ if ((modifiers[Vex].value || space > SPACE_0F || rex2_disallowed) -+ && !modifiers[EVex].value) -+ modifiers[NoEgpr].value = 1; -+ - output_opcode_modifier (table, modifiers, ARRAY_SIZE (modifiers)); - } - -@@ -1351,7 +1481,9 @@ output_i386_opcode (FILE *table, const char *name, char *str, - free (ident); - - process_i386_opcode_modifier (table, opcode_modifier, space, prefix, -- extension_opcode, operand_types, lineno); -+ extension_opcode, operand_types, lineno, -+ rex2_disallowed (opcode, length, space, -+ cpu_flags)); - - process_i386_cpu_flag (table, cpu_flags, NULL, ",", " ", lineno, CpuMax); - -@@ -1406,10 +1538,10 @@ opcode_hash_eq (const void *p, const void *q) - return strcmp (name, entry->name) == 0; - } - --static void -+static bool - parse_template (char *buf, int lineno) - { -- char sep, *end, *name; -+ char sep, *end, *ptr; - struct template *tmpl; - struct template_instance *last_inst = NULL; - -@@ -1436,8 +1568,16 @@ parse_template (char *buf, int lineno) - prev->next = tmpl->next; - else - templates = tmpl->next; -- return; -+ return true; - } -+ -+ /* Check whether this actually is a reference to an existing template: -+ If there's '>' ahead of ':', it can't be a new template definition -+ (and template undefs have are dealt with above). */ -+ ptr = strchr (buf, '>'); -+ if (ptr != NULL && ptr < end) -+ return false; -+ - *end++ = '\0'; - remove_trailing_whitespaces (buf); - -@@ -1512,6 +1652,8 @@ parse_template (char *buf, int lineno) - - tmpl->next = templates; - templates = tmpl; -+ -+ return true; - } - - static unsigned int -@@ -1768,10 +1910,12 @@ process_i386_opcodes (FILE *table) - /* Ignore comments. */ - case '\0': - continue; -- break; -+ - case '<': -- parse_template (p, lineno); -- continue; -+ if (parse_template (p, lineno)) -+ continue; -+ break; -+ - default: - if (!marker) - continue; -@@ -1808,23 +1952,26 @@ process_i386_opcodes (FILE *table) - - /* Generate opcode sets array. */ - fprintf (table, "\n/* i386 opcode sets table. */\n\n"); -- fprintf (table, "static const insn_template *const i386_op_sets[] =\n{\n"); -- fprintf (table, " i386_optab,\n"); -+ fprintf (table, "typedef unsigned short i386_op_off_t;\n"); -+ fprintf (table, "static const i386_op_off_t i386_op_sets[] =\n{\n "); - - for (nr = j = 0; j < i; j++) - { - struct opcode_entry *next = &opcode_array[j]->entry; - -+ if ((j + 1) % 8 != 0) -+ fprintf (table, "%5u,", nr); -+ else -+ fprintf (table, "%5u,\n ", nr); - do - { - ++nr; - next = next->next; - } - while (next); -- fprintf (table, " i386_optab + %u,\n", nr); - } - -- fprintf (table, "};\n"); -+ fprintf (table, "%5u\n};\n", nr); - - /* Emit mnemonics and associated #define-s. */ - qsort (opcode_array, i, sizeof (*opcode_array), mnemonic_cmp); -@@ -2140,6 +2287,8 @@ main (int argc, char **argv) - qsort (operand_types, ARRAY_SIZE (operand_types), - sizeof (operand_types [0]), compare); - -+ process_i386_initializers (); -+ - table = fopen ("i386-tbl.h", "w"); - if (table == NULL) - fail ("can't create i386-tbl.h, errno = %s\n", -@@ -2149,7 +2298,6 @@ main (int argc, char **argv) - - process_i386_opcodes (table); - process_i386_registers (table); -- process_i386_initializers (); - - fclose (table); - -diff --git a/opcodes/i386-init.h b/opcodes/i386-init.h ---- a/opcodes/i386-init.h -+++ b/opcodes/i386-init.h -@@ -1,5 +1,5 @@ - /* This file is automatically generated by i386-gen. Do not edit! */ --/* Copyright (C) 2007-2023 Free Software Foundation, Inc. -+/* Copyright (C) 2007-2024 Free Software Foundation, Inc. - - This file is part of the GNU opcodes library. - -@@ -26,7 +26,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_286_FLAGS \ - { { 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -36,7 +36,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_386_FLAGS \ - { { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -46,7 +46,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_486_FLAGS \ - { { 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -56,7 +56,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_586_FLAGS \ - { { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -65,8 +65,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_686_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ -@@ -75,8 +75,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_CMOV_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -86,7 +86,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_FXSR_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -96,7 +96,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_CLFLUSH_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -106,7 +106,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_NOP_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -116,7 +116,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SYSCALL_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -126,7 +126,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_8087_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -136,7 +136,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_687_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ -@@ -145,8 +145,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_FISTTP_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, \ -@@ -155,8 +155,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_MMX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -@@ -166,7 +166,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SSE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -@@ -176,7 +176,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SSE2_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ -@@ -186,7 +186,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SSE3_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -196,7 +196,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_PADLOCK_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -@@ -206,7 +206,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SVME_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -@@ -216,7 +216,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_VMX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -226,7 +226,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SMX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -236,7 +236,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SSSE3_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -246,7 +246,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SSE4A_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -256,7 +256,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_LZCNT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -266,7 +266,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_POPCNT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -276,7 +276,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_MONITOR_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -286,7 +286,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SSE4_1_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -296,7 +296,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SSE4_2_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -306,7 +306,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AVX2_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -315,8 +315,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AVX512CD_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -325,8 +325,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512ER_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -335,8 +335,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512PF_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -345,8 +345,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512DQ_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -355,8 +355,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512BW_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -365,8 +365,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_IAMCU_FLAGS \ - { { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -376,7 +376,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_XSAVE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -386,7 +386,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_XSAVEOPT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -396,7 +396,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AES_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ -@@ -406,7 +406,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_PCLMULQDQ_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ -@@ -416,7 +416,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_FMA_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -425,8 +425,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_FMA4_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -435,8 +435,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_XOP_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -445,8 +445,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_LWP_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -456,7 +456,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_BMI_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -466,7 +466,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_TBM_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -476,7 +476,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_MOVBE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -486,7 +486,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_CX16_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -496,7 +496,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_LAHF_SAHF_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -506,7 +506,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_EPT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -516,7 +516,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_RDTSCP_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -526,7 +526,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_FSGSBASE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -536,7 +536,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_RDRND_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -546,7 +546,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_F16C_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -555,8 +555,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_BMI2_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -566,7 +566,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_RTM_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -576,7 +576,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_INVPCID_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -586,7 +586,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_VMFUNC_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -596,7 +596,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_MPX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -606,7 +606,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_RDSEED_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -616,7 +616,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ADX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -626,7 +626,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_PRFCHW_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -636,7 +636,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SMAP_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -646,7 +646,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SHA_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ -@@ -656,7 +656,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SHA512_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -665,8 +665,8 @@ - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SM3_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -675,8 +675,8 @@ - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SM4_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -685,8 +685,8 @@ - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_CLFLUSHOPT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -696,7 +696,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_XSAVES_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -706,7 +706,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_XSAVEC_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -716,7 +716,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_PREFETCHWT1_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -726,7 +726,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SE1_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -736,7 +736,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_CLWB_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -746,7 +746,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AVX512IFMA_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -755,8 +755,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512VBMI_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -765,8 +765,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512_4FMAPS_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -775,8 +775,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512_4VNNIW_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -785,8 +785,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512_VPOPCNTDQ_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -795,8 +795,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512_VBMI2_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -805,8 +805,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512_VNNI_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -815,8 +815,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512_BITALG_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -825,8 +825,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512_BF16_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -835,8 +835,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512_VP2INTERSECT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -845,8 +845,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_TDX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -856,7 +856,7 @@ - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AVX_VNNI_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -865,8 +865,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AVX512_FP16_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -875,8 +875,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_PREFETCHI_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -886,7 +886,7 @@ - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AVX_IFMA_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -895,8 +895,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AVX_VNNI_INT8_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -905,8 +905,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AVX_VNNI_INT16_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -915,8 +915,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_CMPCCXADD_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -926,7 +926,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_WRMSRNS_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -936,7 +936,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_MSRLIST_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -946,7 +946,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AVX_NE_CONVERT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -955,8 +955,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_RAO_INT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -966,7 +966,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_FRED_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -976,7 +976,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_LKGS_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -986,9 +986,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - --#define CPU_MWAITX_FLAGS \ -+#define CPU_USER_MSR_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -996,9 +996,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - --#define CPU_CLZERO_FLAGS \ -+#define CPU_MWAITX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1006,17 +1006,27 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } -+ -+#define CPU_CLZERO_FLAGS \ -+ { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_OSPKE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_RDPID_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1024,9 +1034,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_PTWRITE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1034,9 +1044,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_IBT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1044,9 +1054,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SHSTK_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1054,9 +1064,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AMX_INT8_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1064,9 +1074,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AMX_BF16_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1074,9 +1084,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AMX_FP16_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1084,9 +1094,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AMX_COMPLEX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1094,9 +1104,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AMX_TILE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1104,9 +1114,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_GFNI_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ -@@ -1114,9 +1124,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_VAES_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -1124,9 +1134,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_VPCLMULQDQ_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -1134,9 +1144,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_WBNOINVD_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1144,9 +1154,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_PCONFIG_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1154,9 +1164,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_PBNDKB_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1164,9 +1174,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_WAITPKG_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1174,9 +1184,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_UINTR_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1184,9 +1194,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_CLDEMOTE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1194,9 +1204,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_MOVDIRI_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1204,9 +1214,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_MOVDIR64B_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1214,9 +1224,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ENQCMD_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1225,8 +1235,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SERIALIZE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1235,8 +1245,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_RDPRU_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1245,8 +1255,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_MCOMMIT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1255,8 +1265,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SEV_ES_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -@@ -1265,8 +1275,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_TSXLDTRK_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1275,8 +1285,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_KL_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ -@@ -1285,8 +1295,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_WIDEKL_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ -@@ -1295,8 +1305,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_HRESET_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1305,8 +1315,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_INVLPGB_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1315,8 +1325,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_TLBSYNC_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1325,8 +1335,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_SNP_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -@@ -1335,8 +1345,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_RMPQUERY_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -@@ -1345,8 +1355,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_287_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1355,8 +1365,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_387_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1365,8 +1375,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_3DNOW_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -@@ -1375,8 +1385,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_3DNOWA_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -@@ -1385,18 +1395,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ -- 0, 0, 0, 0 } } -- --#define CPU_64_FLAGS \ -- { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AVX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -1405,8 +1405,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_HLE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1415,8 +1415,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 1, 0, 0, 0, 0, 0 } } - - #define CPU_AVX512F_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -1425,8 +1425,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 0, 0, 0, 0 } } - - #define CPU_AVX512VL_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -1435,8 +1435,18 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 1, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 1, 0, 0, 0 } } -+ -+#define CPU_APX_F_FLAGS \ -+ { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 1, 0, 0 } } - - #define CPU_UNKNOWN_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ -@@ -1446,7 +1456,7 @@ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \ -- 1, 1, 0, 0 } } -+ 1, 1, 1, 1, 0, 0 } } - - #define CPU_GENERIC32_FLAGS \ - { { 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1456,7 +1466,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_GENERIC64_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, \ -@@ -1465,8 +1475,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_NONE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1476,7 +1486,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_PENTIUMPRO_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1485,8 +1495,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_P2_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, \ -@@ -1495,8 +1505,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_P3_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, \ -@@ -1505,8 +1515,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_P4_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 0, 0, 0, \ -@@ -1515,8 +1525,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_NOCONA_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, \ -@@ -1525,18 +1535,18 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_CORE_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, \ - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_CORE2_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, \ -@@ -1545,8 +1555,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_COREI7_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, \ -@@ -1555,8 +1565,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_K6_FLAGS \ - { { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -@@ -1565,8 +1575,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_K6_2_FLAGS \ - { { 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -@@ -1575,8 +1585,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ATHLON_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, \ -@@ -1585,8 +1595,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_K8_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, \ -@@ -1595,8 +1605,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AMDFAM10_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 0, \ -@@ -1605,8 +1615,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_BDVER1_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, \ -@@ -1615,8 +1625,8 @@ - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_BDVER2_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, \ -@@ -1625,8 +1635,8 @@ - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_BDVER3_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, \ -@@ -1635,58 +1645,68 @@ - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_BDVER4_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, \ - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, \ - 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, \ - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ZNVER1_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, \ - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, \ - 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, \ - 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ZNVER2_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, \ - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, \ - 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, \ - 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, \ -- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, \ -+ 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ZNVER3_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, \ - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, \ - 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, \ - 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, \ -- 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, \ -+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 1, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ZNVER4_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, \ - 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, \ - 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, \ - 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, \ -- 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, \ -- 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, 0, \ -- 1, 1, 0, 0 } } -+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, \ -+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, \ -+ 0, 1, 1, 0, 0, 0 } } -+ -+#define CPU_ZNVER5_FLAGS \ -+ { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, \ -+ 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, \ -+ 1, 0, 0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 1, \ -+ 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, \ -+ 1, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, \ -+ 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, \ -+ 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 0, 0, 1, 1, \ -+ 0, 1, 1, 0, 0, 0 } } - - #define CPU_BTVER1_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, \ -@@ -1695,8 +1715,8 @@ - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_BTVER2_FLAGS \ - { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, \ -@@ -1705,8 +1725,8 @@ - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ABM_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1716,7 +1736,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_AVX10_1_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -1725,8 +1745,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, \ - 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 1, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 1, 0, 0, 0 } } - - #define CPU_TSX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1735,8 +1755,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 1, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_FXSR_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -1744,9 +1764,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_8087_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, \ -@@ -1755,8 +1775,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_687_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, \ -@@ -1766,7 +1786,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_FISTTP_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ -@@ -1776,7 +1796,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_MMX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -@@ -1785,8 +1805,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SSE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, \ -@@ -1794,9 +1814,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SSE2_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, \ -@@ -1804,9 +1824,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SSE3_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, \ -@@ -1816,7 +1836,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SVME_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -@@ -1825,8 +1845,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_VMX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1836,7 +1856,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SSSE3_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1846,7 +1866,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SSE4A_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1856,7 +1876,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SSE4_1_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1866,7 +1886,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SSE4_2_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1876,7 +1896,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX2_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1884,9 +1904,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, \ - 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 1, 1, 0, 0 } } -+ 0, 1, 1, 0, 0, 0 } } - - #define CPU_ANY_AVX512CD_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1896,7 +1916,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512ER_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1906,7 +1926,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512PF_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1916,7 +1936,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512DQ_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1926,7 +1946,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512BW_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1936,7 +1956,7 @@ - 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_IAMCU_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1946,17 +1966,17 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_XSAVE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, \ - 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, \ - 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, \ -- 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, \ -- 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 1, 0, 0 } } -+ 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ -+ 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 1, 1, 0, 0 } } - - #define CPU_ANY_XSAVEOPT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1966,7 +1986,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AES_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1974,9 +1994,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_PCLMULQDQ_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1984,9 +2004,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_FMA_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -1996,7 +2016,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_FMA4_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2006,7 +2026,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_XOP_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2016,7 +2036,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_LWP_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2026,7 +2046,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_EPT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2036,7 +2056,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_F16C_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2046,7 +2066,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_RTM_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2055,8 +2075,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_VMFUNC_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2066,7 +2086,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_MPX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2076,7 +2096,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SHA_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2086,7 +2106,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SHA512_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2096,7 +2116,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SM3_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2106,7 +2126,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SM4_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2116,7 +2136,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_XSAVES_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2126,7 +2146,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_XSAVEC_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2136,7 +2156,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512IFMA_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2146,7 +2166,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512VBMI_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2156,7 +2176,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512_4FMAPS_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2166,7 +2186,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512_4VNNIW_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2176,7 +2196,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512_VPOPCNTDQ_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2186,7 +2206,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512_VBMI2_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2196,7 +2216,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512_VNNI_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2206,7 +2226,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512_BITALG_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2216,7 +2236,7 @@ - 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512_BF16_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2226,7 +2246,7 @@ - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512_VP2INTERSECT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2236,7 +2256,7 @@ - 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX_VNNI_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2246,7 +2266,7 @@ - 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX512_FP16_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2256,7 +2276,7 @@ - 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX_IFMA_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2266,7 +2286,7 @@ - 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX_VNNI_INT8_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2276,7 +2296,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX_VNNI_INT16_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2286,7 +2306,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AVX_NE_CONVERT_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2296,7 +2316,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_FRED_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2306,7 +2326,7 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_LKGS_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2316,17 +2336,17 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_OSPKE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AMX_INT8_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2334,9 +2354,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AMX_BF16_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2344,9 +2364,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AMX_FP16_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2354,9 +2374,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AMX_COMPLEX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2364,9 +2384,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_AMX_TILE_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2374,9 +2394,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_GFNI_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2384,9 +2404,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_VAES_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2394,9 +2414,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_VPCLMULQDQ_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2404,9 +2424,9 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SEV_ES_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2415,8 +2435,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_TSXLDTRK_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2425,8 +2445,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_KL_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2435,8 +2455,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_WIDEKL_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2445,8 +2465,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_SNP_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2455,8 +2475,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_RMPQUERY_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2465,8 +2485,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_287_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, \ -@@ -2475,8 +2495,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_387_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, \ -@@ -2485,8 +2505,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_3DNOW_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2495,8 +2515,8 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } - - #define CPU_ANY_3DNOWA_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2505,8 +2525,18 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, \ -- 0, 0, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, \ -+ 0, 0, 0, 0, 0, 0 } } -+ -+#define CPU_ANY_64_FLAGS \ -+ { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 1, 1, 1, 0, 0, \ -+ 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 1, 0, 0 } } - - #define CPU_ANY_AVX_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2514,9 +2544,9 @@ - 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, \ - 1, 1, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, \ -- 1, 1, 0, 0 } } -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, \ -+ 0, 1, 1, 0, 0, 0 } } - - #define CPU_ANY_AVX512F_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2526,7 +2556,7 @@ - 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 1, 1, 0, 0 } } -+ 0, 1, 1, 0, 0, 0 } } - - #define CPU_ANY_AVX512VL_FLAGS \ - { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -@@ -2536,5 +2566,15 @@ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -- 0, 1, 0, 0 } } -+ 0, 0, 1, 0, 0, 0 } } -+ -+#define CPU_ANY_APX_F_FLAGS \ -+ { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \ -+ 0, 0, 0, 1, 0, 0 } } - -diff --git a/opcodes/i386-opc.tbl b/opcodes/i386-opc.tbl ---- a/opcodes/i386-opc.tbl -+++ b/opcodes/i386-opc.tbl -@@ -1,5 +1,5 @@ - // i386 opcode table. --// Copyright (C) 2007-2023 Free Software Foundation, Inc. -+// Copyright (C) 2007-2024 Free Software Foundation, Inc. - // - // This file is part of the GNU opcodes library. - // -@@ -85,6 +85,11 @@ - #define RegKludge OperandConstraint=REG_KLUDGE - #define SwapSources OperandConstraint=SWAP_SOURCES - #define Ugh OperandConstraint=UGH -+#define ImplicitStackOp OperandConstraint=IMPLICIT_STACK_OP -+ -+#define ATTSyntax Dialect=ATT_SYNTAX -+#define ATTMnemonic Dialect=ATT_MNEMONIC -+#define IntelSyntax Dialect=INTEL_SYNTAX - - #define IgnoreSize MnemonicSize=IGNORESIZE - #define DefaultSize MnemonicSize=DEFAULTSIZE -@@ -109,9 +114,12 @@ - #define SpaceXOP09 OpcodeSpace=SPACE_XOP09 - #define SpaceXOP0A OpcodeSpace=SPACE_XOP0A - -+#define EVexMap4 OpcodeSpace=SPACE_EVEXMAP4|EVex128 - #define EVexMap5 OpcodeSpace=SPACE_EVEXMAP5 - #define EVexMap6 OpcodeSpace=SPACE_EVEXMAP6 - -+#define VexMap7 OpcodeSpace=SPACE_VEXMAP7 -+ - #define VexW0 VexW=VEXW0 - #define VexW1 VexW=VEXW1 - #define VexWIG VexW=VEXWIG -@@ -133,12 +141,22 @@ - - #define Disp8ShiftVL Disp8MemShift=DISP8_SHIFT_VL - --#define Vsz256 Vsz=VSZ256 --#define Vsz512 Vsz=VSZ512 -+#define DstVVVV VexVVVV=VexVVVV_DST -+ -+// The template supports VEX format for cpuid and EVEX format for cpuid & APX_F. -+// While therefore we really mean cpuid|(cpuid&APX_F) here, this can't be -+// expressed in the generated templates. It's equivalent to just cpuid|APX_F -+// anyway, but that is not what we want (as APX_F alone isn't a sufficient -+// prereq for such insns). Instead the assembler will massage the CPU specifier -+// to the equivalent of either cpuid&(cpuid) or cpuid&(APX_F) (or something -+// substantially similar), depending on what encoding was requested. -+#define APX_F(cpuid) cpuid&(cpuid|APX_F) - - // The EVEX purpose of StaticRounding appears only together with SAE. Re-use - // the bit to mark commutative VEX encodings where swapping the source - // operands may allow to switch from 3-byte to 2-byte VEX encoding. -+// And re-use the bit to mark some NDD insns that swapping the source operands -+// may allow to switch from EVEX encoding to REX2 encoding. - #define C StaticRounding - - #define FP 387|287|8087 -@@ -156,6 +174,8 @@ - #define i287 287 - #define i387 387 - #define i687 687 -+// Note: Don't add this one to any templates already specifying a 64-bit-mode- -+// only ISA extension: i386-gen takes care of adding such dependencies. - #define x64 64 - - ### MARKER ### -@@ -164,11 +184,11 @@ - mov, 0xa0, No64, D|W|CheckOperandSize|No_sSuf|No_qSuf, { Disp16|Disp32|Unspecified|Byte|Word|Dword, Acc|Byte|Word|Dword } - mov, 0xa0, x64, D|W|CheckOperandSize|No_sSuf, { Disp64|Unspecified|Byte|Word|Dword|Qword, Acc|Byte|Word|Dword|Qword } - movabs, 0xa0, x64, D|W|CheckOperandSize|No_sSuf, { Disp64|Unspecified|Byte|Word|Dword|Qword, Acc|Byte|Word|Dword|Qword } --mov, 0x88, 0, D|W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixRelease, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+mov, 0x88, 0, D|W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixRelease, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } - // In the 64bit mode the short form mov immediate is redefined to have - // 64bit value. - mov, 0xb0, 0, W|No_sSuf|No_qSuf, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32 } --mov, 0xc6/0, 0, W|Modrm|No_sSuf|HLEPrefixRelease|Optimize, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+mov, 0xc6/0, 0, W|Modrm|No_sSuf|HLEPrefixRelease|Optimize, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } - mov, 0xb8, x64, No_bSuf|No_wSuf|No_lSuf|No_sSuf|Optimize, { Imm64, Reg64 } - movabs, 0xb8, x64, No_bSuf|No_wSuf|No_lSuf|No_sSuf, { Imm64, Reg64 } - // The segment register moves accept WordReg so that a segment register -@@ -181,14 +201,18 @@ mov, 0x8c, 0, D|Modrm|IgnoreSize|No_bSuf|No_lSuf|No_sSuf|No_qSuf, { SReg, Word|U - mov, 0x8e, 0, Modrm|IgnoreSize|No_bSuf|No_sSuf|NoRex64, { Reg16|Reg32|Reg64, SReg } - // Move to/from control debug registers. In the 16 or 32bit modes - // they are 32bit. In the 64bit mode they are 64bit. --mov, 0xf20, i386|No64, D|RegMem|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Control, Reg32 } -+mov, 0xf20, i386&No64, D|RegMem|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Control, Reg32 } - mov, 0xf20, x64, D|RegMem|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64, { Control, Reg64 } --mov, 0xf21, i386|No64, D|RegMem|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Debug, Reg32 } -+mov, 0xf21, i386&No64, D|RegMem|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Debug, Reg32 } - mov, 0xf21, x64, D|RegMem|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64, { Debug, Reg64 } --mov, 0xf24, i386|No64, D|RegMem|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Test, Reg32 } -+mov, 0xf24, i386&No64, D|RegMem|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Test, Reg32 } - - // Move after swapping the bytes - movbe, 0x0f38f0, Movbe, D|Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Word|Dword|Qword|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+movbe, 0x60, Movbe&APX_F, D|Modrm|CheckOperandSize|No_bSuf|No_sSuf|EVexMap4, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+// This needs to live here for easy EVEX -> REX2 conversion, which wants to -+// restart with the next sequential template. -+bswap, 0xfc8, i486, No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64 } - - // Move with sign extend. - movsb, 0xfbe, i386, Modrm|No_bSuf|No_sSuf, { Reg8|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -@@ -201,37 +225,39 @@ movsxd, 0x63, x64, Amd64|Modrm|NoSuf, { Reg32|Unspecified|BaseIndex, Reg16 } - movsxd, 0x63, x64, Intel64|Modrm|NoSuf, { Reg16|Unspecified|BaseIndex, Reg16 } - - // Move with zero extend. --movzb, 0xfb6, i386, Modrm|No_bSuf|No_sSuf, { Reg8|Byte|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } --movzw, 0xfb7, i386, Modrm|No_bSuf|No_wSuf|No_sSuf, { Reg16|Word|Unspecified|BaseIndex, Reg32|Reg64 } -+movzb, 0xfb6, i386, Modrm|No_bSuf|No_sSuf, { Reg8|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+movzw, 0xfb7, i386, Modrm|No_bSuf|No_wSuf|No_sSuf, { Reg16|Unspecified|BaseIndex, Reg32|Reg64 } - // The 64-bit variant is not particularly useful since the zero extend - // 32->64 is implicit, but we can encode them. - movzx, 0xfb6, i386, W|Modrm|No_lSuf|No_sSuf|No_qSuf, { Reg8|Reg16|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } - - // Push instructions. --push, 0x50, No64, No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32 } --push, 0xff/6, No64, Modrm|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32|Word|Dword|Unspecified|BaseIndex } --push, 0x6a, i186|No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Imm8S } --push, 0x68, i186|No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Imm16|Imm32 } --push, 0x6, No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, { SReg } -+push, 0x50, No64, ImplicitStackOp|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32 } -+push, 0xff/6, No64, Modrm|ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32|Unspecified|BaseIndex } -+push, 0x6a, i186&No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Imm8S } -+push, 0x68, i186&No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Imm16|Imm32 } -+push, 0x6, No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { SReg } - // In 64bit mode, the operand size is implicitly 64bit. --push, 0x50, x64, No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64 } --push, 0xff/6, x64, Modrm|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64|Word|Qword|Unspecified|BaseIndex } --push, 0x6a, x64, DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Imm8S } --push, 0x68, x64, DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Imm16|Imm32S } --push, 0xfa0, x64, DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { SReg } -+push, 0x50, x64, ImplicitStackOp|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64 } -+pushp, 0x50, APX_F, ImplicitStackOp|No_bSuf|No_wSuf|No_lSuf|No_sSuf|Rex2, { Reg64 } -+push, 0xff/6, x64, Modrm|ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64|Unspecified|BaseIndex } -+push, 0x6a, x64, ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Imm8S } -+push, 0x68, x64, ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Imm16|Imm32S } -+push, 0xfa0, x64, ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { SReg } - --pusha, 0x60, i186|No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, {} -+pusha, 0x60, i186&No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, {} - - // Pop instructions. --pop, 0x58, No64, No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32 } --pop, 0x8f/0, No64, Modrm|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32|Word|Dword|Unspecified|BaseIndex } --pop, 0x7, No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, { SReg } -+pop, 0x58, No64, ImplicitStackOp|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32 } -+pop, 0x8f/0, No64, Modrm|ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32|Unspecified|BaseIndex } -+pop, 0x7, No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { SReg } - // In 64bit mode, the operand size is implicitly 64bit. --pop, 0x58, x64, No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64 } --pop, 0x8f/0, x64, Modrm|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64|Word|Qword|Unspecified|BaseIndex } --pop, 0xfa1, x64, DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { SReg } -+pop, 0x58, x64, ImplicitStackOp|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64 } -+popp, 0x58, APX_F, ImplicitStackOp|No_bSuf|No_wSuf|No_lSuf|No_sSuf|Rex2, { Reg64 } -+pop, 0x8f/0, x64, Modrm|ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Reg16|Reg64|Unspecified|BaseIndex } -+pop, 0xfa1, x64, ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { SReg } - --popa, 0x61, i186|No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, {} -+popa, 0x61, i186&No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, {} - - // Exchange instructions. - // xchg commutes: we allow both operand orders. -@@ -273,70 +299,67 @@ lahf, 0x9f, No64, NoSuf, {} - lahf, 0x9f, LAHF_SAHF, NoSuf, {} - sahf, 0x9e, No64, NoSuf, {} - sahf, 0x9e, LAHF_SAHF, NoSuf, {} --pushf, 0x9c, No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, {} --pushf, 0x9c, x64, DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, {} --popf, 0x9d, No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, {} --popf, 0x9d, x64, DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, {} -+pushf, 0x9c, No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, {} -+pushf, 0x9c, x64, ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, {} -+popf, 0x9d, No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, {} -+popf, 0x9d, x64, ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, {} - stc, 0xf9, 0, NoSuf, {} - std, 0xfd, 0, NoSuf, {} - sti, 0xfb, 0, NoSuf, {} - - // Arithmetic. --add, 0x0, 0, D|W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --add, 0x83/0, 0, Modrm|No_bSuf|No_sSuf|HLEPrefixLock, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } --add, 0x4, 0, W|No_sSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword } --add, 0x80/0, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -- --inc, 0x40, No64, No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32 } --inc, 0xfe/0, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } - --sub, 0x28, 0, D|W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock|Optimize, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --sub, 0x83/5, 0, Modrm|No_bSuf|No_sSuf|HLEPrefixLock, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } --sub, 0x2c, 0, W|No_sSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword } --sub, 0x80/5, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+ -+ -+, << 3, APX_F, D||W|CheckOperandSize|Modrm|No_sSuf|DstVVVV|EVexMap4||, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg8|Reg16|Reg32|Reg64 } -+, << 3, 0, D|W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock||, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, << 3, APX_F, D|W|CheckOperandSize|Modrm|No_sSuf|EVexMap4|, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0x83/, APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|DstVVVV|EVexMap4|, { Imm8S, Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+, 0x83/, 0, Modrm|No_bSuf|No_sSuf|HLEPrefixLock|, { Imm8S, Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0x83/, 0, Modrm|No_bSuf|No_sSuf|EVexMap4|, { Imm8S, Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0x04 | ( << 3), 0, W|No_sSuf|, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword } -+, 0x80/, APX_F, W|Modrm|CheckOperandSize|No_sSuf|DstVVVV|EVexMap4|, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg8|Reg16|Reg32|Reg64 } -+, 0x80/, 0, W|Modrm|No_sSuf|HLEPrefixLock|, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0x80/, APX_F, W|Modrm|EVexMap4|No_sSuf|, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+ -+ - --dec, 0x48, No64, No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32 } --dec, 0xfe/1, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -- --sbb, 0x18, 0, D|W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --sbb, 0x83/3, 0, Modrm|No_bSuf|No_sSuf|HLEPrefixLock, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } --sbb, 0x1c, 0, W|No_sSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword } --sbb, 0x80/3, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+// clr with 1 operand is really xor with 2 operands. -+clr, 0x30, 0, W|Modrm|No_sSuf|RegKludge|Optimize, { Reg8|Reg16|Reg32|Reg64 } -+clr, 0x30, APX_F, W|Modrm|No_sSuf|RegKludge|EVexMap4|NF, { Reg8|Reg16|Reg32|Reg64 } - --cmp, 0x38, 0, D|W|CheckOperandSize|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --cmp, 0x83/7, 0, Modrm|No_bSuf|No_sSuf, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } -+cmp, 0x38, 0, D|W|CheckOperandSize|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+cmp, 0x83/7, 0, Modrm|No_bSuf|No_sSuf, { Imm8S, Reg16|Reg32|Reg64|Unspecified|BaseIndex } - cmp, 0x3c, 0, W|No_sSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword } --cmp, 0x80/7, 0, W|Modrm|No_sSuf, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+cmp, 0x80/7, 0, W|Modrm|No_sSuf, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } - - test, 0x84, 0, D|W|C|CheckOperandSize|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } - test, 0xa8, 0, W|No_sSuf|Optimize, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword } --test, 0xf6/0, 0, W|Modrm|No_sSuf|Optimize, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+test, 0xf6/0, 0, W|Modrm|No_sSuf|Optimize, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } - --and, 0x20, 0, D|W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock|Optimize, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --and, 0x83/4, 0, Modrm|No_bSuf|No_sSuf|HLEPrefixLock|Optimize, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } --and, 0x24, 0, W|No_sSuf|Optimize, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword } --and, 0x80/4, 0, W|Modrm|No_sSuf|HLEPrefixLock|Optimize, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+ - --or, 0x8, 0, D|W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock|Optimize, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --or, 0x83/1, 0, Modrm|No_bSuf|No_sSuf|HLEPrefixLock, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } --or, 0xc, 0, W|No_sSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword } --or, 0x80/1, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+, 0x40 | ( << 3), No64, No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32 } -+, 0xfe/, APX_F, W|Modrm|No_sSuf|CheckOperandSize|DstVVVV|EVexMap4|NF, {Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg8|Reg16|Reg32|Reg64} -+, 0xfe/, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0xfe/, APX_F, W|Modrm|No_sSuf|EVexMap4|NF, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } - --xor, 0x30, 0, D|W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock|Optimize, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --xor, 0x83/6, 0, Modrm|No_bSuf|No_sSuf|HLEPrefixLock, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } --xor, 0x34, 0, W|No_sSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword } --xor, 0x80/6, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+ - --// clr with 1 operand is really xor with 2 operands. --clr, 0x30, 0, W|Modrm|No_sSuf|RegKludge|Optimize, { Reg8|Reg16|Reg32|Reg64 } -+ - --adc, 0x10, 0, D|W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --adc, 0x83/2, 0, Modrm|No_bSuf|No_sSuf|HLEPrefixLock, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } --adc, 0x14, 0, W|No_sSuf, { Imm8|Imm16|Imm32|Imm32S, Acc|Byte|Word|Dword|Qword } --adc, 0x80/2, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Imm8|Imm16|Imm32|Imm32S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+, 0xf6/, APX_F, W|Modrm|CheckOperandSize|No_sSuf|DstVVVV|EVexMap4|, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg8|Reg16|Reg32|Reg64 } -+, 0xf6/, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0xf6/, APX_F, W|Modrm|No_sSuf|EVexMap4|, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } - --neg, 0xf6/3, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --not, 0xf6/2, 0, W|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+ - - aaa, 0x37, No64, NoSuf, {} - aas, 0x3f, No64, NoSuf, {} -@@ -367,81 +390,82 @@ cqto, 0x99, x64, Size64|NoSuf, {} - // expanding 64-bit multiplies, and *cannot* be selected to accomplish - // 'imul %ebx, %eax' (opcode 0x0faf must be used in this case) - // These multiplies can only be selected with single operand forms. --mul, 0xf6/4, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --imul, 0xf6/5, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --imul, 0xfaf, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Unspecified|Word|Dword|Qword|BaseIndex, Reg16|Reg32|Reg64 } --imul, 0x6b, i186, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Imm8S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } --imul, 0x69, i186, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Imm16|Imm32|Imm32S, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+ -+ -+, 0xf6/, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0xf6/, APX_F, W|Modrm|No_sSuf|EVexMap4|NF, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+imul, 0xaf, APX_F, C|Modrm|CheckOperandSize|No_bSuf|No_sSuf|DstVVVV|EVexMap4|NF, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64 } -+imul, 0xfaf, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+imul, 0xaf, APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|EVexMap4|NF, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+imul, 0x6b, i186, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Imm8S, Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+imul, 0x6b, APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|EVexMap4|NF, { Imm8S, Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+imul, 0x69, i186, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Imm16|Imm32|Imm32S, Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+imul, 0x69, APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|EVexMap4|NF, { Imm16|Imm32|Imm32S, Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } - // imul with 2 operands mimics imul with 3 by putting the register in - // both i.rm.reg & i.rm.regmem fields. RegKludge enables this - // transformation. - imul, 0x6b, i186, Modrm|No_bSuf|No_sSuf|RegKludge, { Imm8S, Reg16|Reg32|Reg64 } -+imul, 0x6b, APX_F, Modrm|No_bSuf|No_sSuf|RegKludge|EVexMap4|NF, { Imm8S, Reg16|Reg32|Reg64 } - imul, 0x69, i186, Modrm|No_bSuf|No_sSuf|RegKludge, { Imm16|Imm32|Imm32S, Reg16|Reg32|Reg64 } -- --div, 0xf6/6, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --div, 0xf6/6, 0, W|CheckOperandSize|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex, Acc|Byte|Word|Dword|Qword } --idiv, 0xf6/7, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --idiv, 0xf6/7, 0, W|CheckOperandSize|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex, Acc|Byte|Word|Dword|Qword } -- --rol, 0xd0/0, 0, W|Modrm|No_sSuf, { Imm1, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --rol, 0xc0/0, i186, W|Modrm|No_sSuf, { Imm8|Imm8S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --rol, 0xd2/0, 0, W|Modrm|No_sSuf, { ShiftCount, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --rol, 0xd0/0, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -- --ror, 0xd0/1, 0, W|Modrm|No_sSuf, { Imm1, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --ror, 0xc0/1, i186, W|Modrm|No_sSuf, { Imm8|Imm8S, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --ror, 0xd2/1, 0, W|Modrm|No_sSuf, { ShiftCount, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --ror, 0xd0/1, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -- --rcl, 0xd0/2, 0, W|Modrm|No_sSuf, { Imm1, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --rcl, 0xc0/2, i186, W|Modrm|No_sSuf, { Imm8, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --rcl, 0xd2/2, 0, W|Modrm|No_sSuf, { ShiftCount, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --rcl, 0xd0/2, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -- --rcr, 0xd0/3, 0, W|Modrm|No_sSuf, { Imm1, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --rcr, 0xc0/3, i186, W|Modrm|No_sSuf, { Imm8, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --rcr, 0xd2/3, 0, W|Modrm|No_sSuf, { ShiftCount, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --rcr, 0xd0/3, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -- --sal, 0xd0/4, 0, W|Modrm|No_sSuf, { Imm1, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --sal, 0xc0/4, i186, W|Modrm|No_sSuf, { Imm8, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --sal, 0xd2/4, 0, W|Modrm|No_sSuf, { ShiftCount, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --sal, 0xd0/4, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -- --shl, 0xd0/4, 0, W|Modrm|No_sSuf, { Imm1, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --shl, 0xc0/4, i186, W|Modrm|No_sSuf, { Imm8, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --shl, 0xd2/4, 0, W|Modrm|No_sSuf, { ShiftCount, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --shl, 0xd0/4, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -- --shr, 0xd0/5, 0, W|Modrm|No_sSuf, { Imm1, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --shr, 0xc0/5, i186, W|Modrm|No_sSuf, { Imm8, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --shr, 0xd2/5, 0, W|Modrm|No_sSuf, { ShiftCount, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --shr, 0xd0/5, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -- --sar, 0xd0/7, 0, W|Modrm|No_sSuf, { Imm1, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --sar, 0xc0/7, i186, W|Modrm|No_sSuf, { Imm8, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --sar, 0xd2/7, 0, W|Modrm|No_sSuf, { ShiftCount, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --sar, 0xd0/7, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -- --shld, 0xfa4, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Imm8, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } --shld, 0xfa5, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { ShiftCount, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } --shld, 0xfa5, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } -- --shrd, 0xfac, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Imm8, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } --shrd, 0xfad, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { ShiftCount, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } --shrd, 0xfad, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } -+imul, 0x69, APX_F, Modrm|No_bSuf|No_sSuf|RegKludge|EVexMap4|NF, { Imm16|Imm32|Imm32S, Reg16|Reg32|Reg64 } -+ -+ -+ -+ -+ -+
, 0xf6/, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+
, 0xf6/, APX_F, W|Modrm|No_sSuf|EVexMap4|NF, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+
, 0xf6/, 0, W|CheckOperandSize|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex, Acc|Byte|Word|Dword|Qword } -+
, 0xf6/, APX_F, W|CheckOperandSize|Modrm|No_sSuf|EVexMap4|NF, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex, Acc|Byte|Word|Dword|Qword } -+ -+
-+ -+ -+ -+, 0xd0/, APX_F, W|Modrm|No_sSuf|CheckOperandSize|DstVVVV|EVexMap4|, { Imm1, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg8|Reg16|Reg32|Reg64 } -+, 0xd0/, 0, W|Modrm|No_sSuf, { Imm1, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0xd0/, APX_F, W|Modrm|No_sSuf|EVexMap4|, { Imm1, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0xc0/, APX_F, W|Modrm|No_sSuf|CheckOperandSize|DstVVVV|EVexMap4|, { , Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg8|Reg16|Reg32|Reg64 } -+, 0xc0/, i186, W|Modrm|No_sSuf, { , Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0xc0/, APX_F, W|Modrm|No_sSuf|EVexMap4|, { , Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0xd2/, APX_F, W|Modrm|No_sSuf|CheckOperandSize|DstVVVV|EVexMap4|, { ShiftCount, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg8|Reg16|Reg32|Reg64 } -+, 0xd2/, 0, W|Modrm|No_sSuf, { ShiftCount, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0xd2/, APX_F, W|Modrm|No_sSuf|EVexMap4|, { ShiftCount, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+, 0xd0/, 0, W|Modrm|No_sSuf, { Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+ -+ -+ -+ -+ -+shd, 0x24 | , APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|DstVVVV|EVexMap4|NF, { Imm8, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+shd, 0x0fa4 | , i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Imm8, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+shd, 0x24 | , APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|EVexMap4|NF, { Imm8, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+shd, 0xa5 | , APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|DstVVVV|EVexMap4|NF, { ShiftCount, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+shd, 0x0fa5 | , i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { ShiftCount, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+shd, 0xa5 | , APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|EVexMap4|NF, { ShiftCount, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+shd, 0x0fa5 | , i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+ -+ - - // Control transfer instructions. --call, 0xe8, No64, JumpDword|DefaultSize|No_bSuf|No_sSuf|No_qSuf|BNDPrefixOk, { Disp16|Disp32 } --call, 0xe8, x64, Amd64|JumpDword|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64|BNDPrefixOk, { Disp16|Disp32 } --call, 0xe8, x64, Intel64|JumpDword|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64|BNDPrefixOk, { Disp32 } --call, 0xff/2, No64, Modrm|JumpAbsolute|DefaultSize|No_bSuf|No_sSuf|No_qSuf|BNDPrefixOk|NoTrackPrefixOk, { Reg16|Reg32|Unspecified|BaseIndex } --call, 0xff/2, x64, Amd64|Modrm|JumpAbsolute|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64|BNDPrefixOk|NoTrackPrefixOk, { Reg16|Reg64|Unspecified|BaseIndex } --call, 0xff/2, x64, Intel64|Modrm|JumpAbsolute|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64|BNDPrefixOk|NoTrackPrefixOk, { Reg64|Unspecified|BaseIndex } -+call, 0xe8, No64, JumpDword|ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf|BNDPrefixOk, { Disp16|Disp32 } -+call, 0xe8, x64, Amd64|JumpDword|ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64|BNDPrefixOk, { Disp16|Disp32 } -+call, 0xe8, x64, Intel64|JumpDword|ImplicitStackOp|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64|BNDPrefixOk, { Disp32 } -+call, 0xff/2, No64, Modrm|JumpAbsolute|ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf|BNDPrefixOk|NoTrackPrefixOk, { Reg16|Reg32|Unspecified|BaseIndex } -+call, 0xff/2, x64, Amd64|Modrm|JumpAbsolute|ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64|BNDPrefixOk|NoTrackPrefixOk, { Reg16|Reg64|Unspecified|BaseIndex } -+call, 0xff/2, x64, Intel64|Modrm|JumpAbsolute|ImplicitStackOp|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64|BNDPrefixOk|NoTrackPrefixOk, { Reg64|Unspecified|BaseIndex } - // Intel Syntax remaining call instances. --call, 0x9a, No64, JumpInterSegment|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Imm16, Imm16|Imm32 } --call, 0xff/3, 0, Amd64|Modrm|JumpAbsolute|DefaultSize|NoSuf, { Dword|Fword|BaseIndex } --call, 0xff/3, x64, Intel64|Modrm|JumpAbsolute|NoSuf, { Dword|Fword|Tbyte|BaseIndex } -+call, 0x9a, No64, JumpInterSegment|ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Imm16, Imm16|Imm32 } -+call, 0xff/3, 0, Amd64|Modrm|JumpAbsolute|ImplicitStackOp|DefaultSize|NoSuf, { Dword|Fword|BaseIndex } -+call, 0xff/3, x64, Intel64|Modrm|JumpAbsolute|ImplicitStackOp|NoSuf, { Dword|Fword|Tbyte|BaseIndex } - lcall, 0x9a, No64, JumpInterSegment|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Imm16, Imm16|Imm32 } - lcall, 0xff/3, 0, Amd64|Modrm|JumpAbsolute|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Unspecified|BaseIndex } - lcall, 0xff/3, x64, Intel64|Modrm|JumpAbsolute|No_bSuf|No_sSuf, { Unspecified|BaseIndex } -@@ -459,22 +483,22 @@ ljmp, 0xea, No64, JumpInterSegment|No_bSuf|No_sSuf|No_qSuf, { Imm16, Imm16|Imm32 - ljmp, 0xff/5, 0, Amd64|Modrm|JumpAbsolute|No_bSuf|No_sSuf|No_qSuf, { Unspecified|BaseIndex } - ljmp, 0xff/5, x64, Intel64|Modrm|JumpAbsolute|No_bSuf|No_sSuf, { Unspecified|BaseIndex } - --ret, 0xc3, No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf|RepPrefixOk|BNDPrefixOk, {} --ret, 0xc2, No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf|RepPrefixOk|BNDPrefixOk, { Imm16 } --ret, 0xc3, x64, Amd64|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64|RepPrefixOk|BNDPrefixOk, {} --ret, 0xc2, x64, Amd64|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64|RepPrefixOk|BNDPrefixOk, { Imm16 } --ret, 0xc3, x64, Intel64|Size64|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64|RepPrefixOk|BNDPrefixOk, {} --ret, 0xc2, x64, Intel64|Size64|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64|RepPrefixOk|BNDPrefixOk, { Imm16 } -+ret, 0xc3, No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf|RepPrefixOk|BNDPrefixOk, {} -+ret, 0xc2, No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf|RepPrefixOk|BNDPrefixOk, { Imm16 } -+ret, 0xc3, x64, Amd64|ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64|RepPrefixOk|BNDPrefixOk, {} -+ret, 0xc2, x64, Amd64|ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64|RepPrefixOk|BNDPrefixOk, { Imm16 } -+ret, 0xc3, x64, Intel64|ImplicitStackOp|Size64|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64|RepPrefixOk|BNDPrefixOk, {} -+ret, 0xc2, x64, Intel64|ImplicitStackOp|Size64|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64|RepPrefixOk|BNDPrefixOk, { Imm16 } - lret, 0xcb, 0, DefaultSize|No_bSuf|No_sSuf, {} - lret, 0xca, 0, DefaultSize|No_bSuf|No_sSuf, { Imm16 } - // Intel Syntax. - retf, 0xcb, 0, DefaultSize|No_bSuf|No_sSuf, {} - retf, 0xca, 0, DefaultSize|No_bSuf|No_sSuf, { Imm16 } - --enter, 0xc8, i186|No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Imm16, Imm8 } --enter, 0xc8, x64, DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Imm16, Imm8 } --leave, 0xc9, i186|No64, DefaultSize|No_bSuf|No_sSuf|No_qSuf, {} --leave, 0xc9, x64, DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, {} -+enter, 0xc8, i186&No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, { Imm16, Imm8 } -+enter, 0xc8, x64, ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, { Imm16, Imm8 } -+leave, 0xc9, i186&No64, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf|No_qSuf, {} -+leave, 0xc9, x64, ImplicitStackOp|DefaultSize|No_bSuf|No_lSuf|No_sSuf|NoRex64, {} - - -@@ -503,7 +527,7 @@ loopne, 0xe0, No64, JumpByte|No_bSuf|No_sSuf|No_qSuf, { Disp8 } - loopne, 0xe0, x64, JumpByte|No_bSuf|No_wSuf|No_sSuf|NoRex64, { Disp8 } - - // Set byte on flag instructions. --set, 0xf9/0, i386, Modrm|No_wSuf|No_lSuf|No_sSuf|No_qSuf, { Reg8|Byte|Unspecified|BaseIndex } -+set, 0xf9/0, i386, Modrm|No_wSuf|No_lSuf|No_sSuf|No_qSuf, { Reg8|Unspecified|BaseIndex } - - // String manipulation. - cmps, 0xa6, 0, W|No_sSuf|RepPrefixOk, {} -@@ -540,58 +564,58 @@ xlat, 0xd7, 0, No_wSuf|No_lSuf|No_sSuf|No_qSuf, {} - xlat, 0xd7, 0, No_wSuf|No_lSuf|No_sSuf|No_qSuf|IsString, { Byte|Unspecified|BaseIndex } - - // Bit manipulation. --bsf, 0xfbc, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf|RepPrefixOk, { Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } --bsr, 0xfbd, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf|RepPrefixOk, { Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } --bt, 0xfa3, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } -+bsf, 0xfbc, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf|RepPrefixOk, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+bsr, 0xfbd, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf|RepPrefixOk, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+bt, 0xfa3, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Unspecified|BaseIndex } - bt, 0xfba/4, i386, Modrm|No_bSuf|No_sSuf|Optimize, { Imm8, Reg16|Reg32|Reg64|Unspecified|BaseIndex } --btc, 0xfbb, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf|HLEPrefixLock, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } -+btc, 0xfbb, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf|HLEPrefixLock, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Unspecified|BaseIndex } - btc, 0xfba/7, i386, Modrm|No_bSuf|No_sSuf|Optimize|HLEPrefixLock, { Imm8, Reg16|Reg32|Reg64|Unspecified|BaseIndex } --btr, 0xfb3, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf|HLEPrefixLock, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } -+btr, 0xfb3, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf|HLEPrefixLock, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Unspecified|BaseIndex } - btr, 0xfba/6, i386, Modrm|No_bSuf|No_sSuf|Optimize|HLEPrefixLock, { Imm8, Reg16|Reg32|Reg64|Unspecified|BaseIndex } --bts, 0xfab, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf|HLEPrefixLock, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } -+bts, 0xfab, i386, Modrm|CheckOperandSize|No_bSuf|No_sSuf|HLEPrefixLock, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64|Unspecified|BaseIndex } - bts, 0xfba/5, i386, Modrm|No_bSuf|No_sSuf|Optimize|HLEPrefixLock, { Imm8, Reg16|Reg32|Reg64|Unspecified|BaseIndex } - - // Interrupts & op. sys insns. - // See gas/config/tc-i386.c for conversion of 'int $3' into the special - // int 3 insn. --int, 0xcd, 0, NoSuf, { Imm8 } --int1, 0xf1, 0, NoSuf, {} --int3, 0xcc, 0, NoSuf, {} --into, 0xce, No64, NoSuf, {} --iret, 0xcf, 0, DefaultSize|No_bSuf|No_sSuf, {} -+int, 0xcd, 0, ImplicitStackOp|NoSuf, { Imm8 } -+int1, 0xf1, 0, ImplicitStackOp|NoSuf, {} -+int3, 0xcc, 0, ImplicitStackOp|NoSuf, {} -+into, 0xce, No64, ImplicitStackOp|NoSuf, {} -+iret, 0xcf, 0, ImplicitStackOp|DefaultSize|No_bSuf|No_sSuf, {} - // i386sl, i486sl, later 486, and Pentium. - rsm, 0xfaa, i386, NoSuf, {} - --bound, 0x62, i186|No64, Modrm|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32, Dword|Qword|Unspecified|BaseIndex } -+bound, 0x62, i186&No64, Modrm|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32, Dword|Qword|Unspecified|BaseIndex } - - hlt, 0xf4, 0, NoSuf, {} - --nop, 0xf1f/0, Nop, Modrm|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex } -+nop, 0xf1f/0, Nop, Modrm|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Unspecified|BaseIndex } - - // nop is actually "xchg %ax,%ax" in 16bit mode, "xchg %eax,%eax" in - // 32bit mode and "xchg %rax,%rax" in 64bit mode. - nop, 0x90, 0, NoSuf|RepPrefixOk, {} - - // Protection control. --arpl, 0x63, i286|No64, RegMem|CheckOperandSize|IgnoreSize|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32, Reg16|Reg32 } --arpl, 0x63, i286|No64, Modrm|IgnoreSize|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32, Word|Unspecified|BaseIndex } -+arpl, 0x63, i286&No64, RegMem|CheckOperandSize|IgnoreSize|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32, Reg16|Reg32 } -+arpl, 0x63, i286&No64, Modrm|IgnoreSize|No_bSuf|No_sSuf|No_qSuf, { Reg16|Reg32, Word|Unspecified|BaseIndex } - lar, 0xf02, i286, Modrm|CheckOperandSize|No_bSuf|No_sSuf|NoRex64, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64 } - lar, 0xf02, i286, Modrm|No_bSuf|No_sSuf|NoRex64, { Reg16|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } --lgdt, 0xf01/2, i286|No64, Modrm|No_bSuf|No_sSuf|No_qSuf, { Fword|Unspecified|BaseIndex } -+lgdt, 0xf01/2, i286&No64, Modrm|No_bSuf|No_sSuf|No_qSuf, { Fword|Unspecified|BaseIndex } - lgdt, 0xf01/2, x64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64, { Tbyte|Unspecified|BaseIndex } --lidt, 0xf01/3, i286|No64, Modrm|No_bSuf|No_sSuf|No_qSuf, { Fword|Unspecified|BaseIndex } -+lidt, 0xf01/3, i286&No64, Modrm|No_bSuf|No_sSuf|No_qSuf, { Fword|Unspecified|BaseIndex } - lidt, 0xf01/3, x64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64, { Tbyte|Unspecified|BaseIndex } - lldt, 0xf00/2, i286, Modrm|IgnoreSize|No_bSuf|No_sSuf|NoRex64, { Reg16|Reg32|Reg64 } - lldt, 0xf00/2, i286, Modrm|IgnoreSize|No_bSuf|No_lSuf|No_sSuf|No_qSuf, { Word|Unspecified|BaseIndex } --lmsw, 0xf01/6, i286, Modrm|IgnoreSize|No_bSuf|No_lSuf|No_sSuf|No_qSuf, { Reg16|Word|Unspecified|BaseIndex } -+lmsw, 0xf01/6, i286, Modrm|IgnoreSize|No_bSuf|No_lSuf|No_sSuf|No_qSuf, { Reg16|Unspecified|BaseIndex } - lsl, 0xf03, i286, Modrm|CheckOperandSize|No_bSuf|No_sSuf|NoRex64, { Reg16|Reg32|Reg64, Reg16|Reg32|Reg64 } - lsl, 0xf03, i286, Modrm|No_bSuf|No_sSuf|NoRex64, { Reg16|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } - ltr, 0xf00/3, i286, Modrm|IgnoreSize|No_bSuf|No_sSuf|NoRex64, { Reg16|Reg32|Reg64 } - ltr, 0xf00/3, i286, Modrm|IgnoreSize|No_bSuf|No_lSuf|No_sSuf|No_qSuf, { Word|Unspecified|BaseIndex } - --sgdt, 0xf01/0, i286|No64, Modrm|No_bSuf|No_sSuf|No_qSuf, { Fword|Unspecified|BaseIndex } -+sgdt, 0xf01/0, i286&No64, Modrm|No_bSuf|No_sSuf|No_qSuf, { Fword|Unspecified|BaseIndex } - sgdt, 0xf01/0, x64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64, { Tbyte|Unspecified|BaseIndex } --sidt, 0xf01/1, i286|No64, Modrm|No_bSuf|No_sSuf|No_qSuf, { Fword|Unspecified|BaseIndex } -+sidt, 0xf01/1, i286&No64, Modrm|No_bSuf|No_sSuf|No_qSuf, { Fword|Unspecified|BaseIndex } - sidt, 0xf01/1, x64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64, { Tbyte|Unspecified|BaseIndex } - sldt, 0xf00/0, i286, Modrm|No_bSuf|No_sSuf|NoRex64, { Reg16|Reg32|Reg64 } - sldt, 0xf00/0, i286, Modrm|IgnoreSize|No_bSuf|No_lSuf|No_sSuf|No_qSuf, { Word|Unspecified|BaseIndex } -@@ -700,14 +724,13 @@ faddp, 0xdec1, FP, NoSuf, {} - fsub, 0xd8/4, FP, Modrm|NoSuf, { FloatReg } - fsub, 0xd8/4, FP, D|Modrm|NoSuf, { FloatReg, FloatAcc } - // alias for fsubp --fsub, 0xdee1, FP, NoSuf|Ugh|ATTMnemonic|ATTSyntax, {} --fsub, 0xdee9, FP, NoSuf|Ugh|ATTMnemonic, {} -+fsub, 0xdee1, FP, NoSuf|Ugh|ATTMnemonic, {} - fsub, 0xd8/4, FP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf, { Dword|Qword|Unspecified|BaseIndex } - fisub, 0xde/4, FP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf, { Word|Dword|Unspecified|BaseIndex } - --fsubp, 0xde/4, FP, Modrm|NoSuf|ATTMnemonic|ATTSyntax, { FloatAcc, FloatReg } --fsubp, 0xde/4, FP, Modrm|NoSuf|ATTMnemonic|ATTSyntax, { FloatReg } --fsubp, 0xdee1, FP, NoSuf|ATTMnemonic|ATTSyntax, {} -+fsubp, 0xde/4, FP, Modrm|NoSuf|ATTMnemonic, { FloatAcc, FloatReg } -+fsubp, 0xde/4, FP, Modrm|NoSuf|ATTMnemonic, { FloatReg } -+fsubp, 0xdee1, FP, NoSuf|ATTMnemonic, {} - fsubp, 0xde/5, FP, Modrm|NoSuf, { FloatAcc, FloatReg } - fsubp, 0xde/5, FP, Modrm|NoSuf, { FloatReg } - fsubp, 0xdee9, FP, NoSuf, {} -@@ -716,14 +739,13 @@ fsubp, 0xdee9, FP, NoSuf, {} - fsubr, 0xd8/5, FP, Modrm|NoSuf, { FloatReg } - fsubr, 0xd8/5, FP, D|Modrm|NoSuf, { FloatReg, FloatAcc } - // alias for fsubrp --fsubr, 0xdee9, FP, NoSuf|Ugh|ATTMnemonic|ATTSyntax, {} --fsubr, 0xdee1, FP, NoSuf|Ugh|ATTMnemonic, {} -+fsubr, 0xdee9, FP, NoSuf|Ugh|ATTMnemonic, {} - fsubr, 0xd8/5, FP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf, { Dword|Qword|Unspecified|BaseIndex } - fisubr, 0xde/5, FP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf, { Word|Dword|Unspecified|BaseIndex } - --fsubrp, 0xde/5, FP, Modrm|NoSuf|ATTMnemonic|ATTSyntax, { FloatAcc, FloatReg } --fsubrp, 0xde/5, FP, Modrm|NoSuf|ATTMnemonic|ATTSyntax, { FloatReg } --fsubrp, 0xdee9, FP, NoSuf|ATTMnemonic|ATTSyntax, {} -+fsubrp, 0xde/5, FP, Modrm|NoSuf|ATTMnemonic, { FloatAcc, FloatReg } -+fsubrp, 0xde/5, FP, Modrm|NoSuf|ATTMnemonic, { FloatReg } -+fsubrp, 0xdee9, FP, NoSuf|ATTMnemonic, {} - fsubrp, 0xde/4, FP, Modrm|NoSuf, { FloatAcc, FloatReg } - fsubrp, 0xde/4, FP, Modrm|NoSuf, { FloatReg } - fsubrp, 0xdee1, FP, NoSuf, {} -@@ -745,14 +767,13 @@ fmulp, 0xdec9, FP, NoSuf, {} - fdiv, 0xd8/6, FP, Modrm|NoSuf, { FloatReg } - fdiv, 0xd8/6, FP, D|Modrm|NoSuf, { FloatReg, FloatAcc } - // alias for fdivp --fdiv, 0xdef1, FP, NoSuf|Ugh|ATTMnemonic|ATTSyntax, {} --fdiv, 0xdef9, FP, NoSuf|Ugh|ATTMnemonic, {} -+fdiv, 0xdef1, FP, NoSuf|Ugh|ATTMnemonic, {} - fdiv, 0xd8/6, FP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf, { Dword|Qword|Unspecified|BaseIndex } - fidiv, 0xde/6, FP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf, { Word|Dword|Unspecified|BaseIndex } - --fdivp, 0xde/6, FP, Modrm|NoSuf|ATTMnemonic|ATTSyntax, { FloatAcc, FloatReg } --fdivp, 0xde/6, FP, Modrm|NoSuf|ATTMnemonic|ATTSyntax, { FloatReg } --fdivp, 0xdef1, FP, NoSuf|ATTMnemonic|ATTSyntax, {} -+fdivp, 0xde/6, FP, Modrm|NoSuf|ATTMnemonic, { FloatAcc, FloatReg } -+fdivp, 0xde/6, FP, Modrm|NoSuf|ATTMnemonic, { FloatReg } -+fdivp, 0xdef1, FP, NoSuf|ATTMnemonic, {} - fdivp, 0xde/7, FP, Modrm|NoSuf, { FloatAcc, FloatReg } - fdivp, 0xde/7, FP, Modrm|NoSuf, { FloatReg } - fdivp, 0xdef9, FP, NoSuf, {} -@@ -761,14 +782,13 @@ fdivp, 0xdef9, FP, NoSuf, {} - fdivr, 0xd8/7, FP, Modrm|NoSuf, { FloatReg } - fdivr, 0xd8/7, FP, D|Modrm|NoSuf, { FloatReg, FloatAcc } - // alias for fdivrp --fdivr, 0xdef9, FP, NoSuf|Ugh|ATTMnemonic|ATTSyntax, {} --fdivr, 0xdef1, FP, NoSuf|Ugh|ATTMnemonic, {} -+fdivr, 0xdef9, FP, NoSuf|Ugh|ATTMnemonic, {} - fdivr, 0xd8/7, FP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf, { Dword|Qword|Unspecified|BaseIndex } - fidivr, 0xde/7, FP, Modrm|FloatMF|No_bSuf|No_wSuf|No_qSuf, { Word|Dword|Unspecified|BaseIndex } - --fdivrp, 0xde/7, FP, Modrm|NoSuf|ATTMnemonic|ATTSyntax, { FloatAcc, FloatReg } --fdivrp, 0xde/7, FP, Modrm|NoSuf|ATTMnemonic|ATTSyntax, { FloatReg } --fdivrp, 0xdef9, FP, NoSuf|ATTMnemonic|ATTSyntax, {} -+fdivrp, 0xde/7, FP, Modrm|NoSuf|ATTMnemonic, { FloatAcc, FloatReg } -+fdivrp, 0xde/7, FP, Modrm|NoSuf|ATTMnemonic, { FloatReg } -+fdivrp, 0xdef9, FP, NoSuf|ATTMnemonic, {} - fdivrp, 0xde/6, FP, Modrm|NoSuf, { FloatAcc, FloatReg } - fdivrp, 0xde/6, FP, Modrm|NoSuf, { FloatReg } - fdivrp, 0xdef1, FP, NoSuf, {} -@@ -831,14 +851,14 @@ fwait, 0x9b, FP, NoSuf, {} - - // Opcode prefixes; we allow them as separate insns too. - --addr16, 0x67, i386|No64, Size16|IgnoreSize|NoSuf|IsPrefix, {} -+addr16, 0x67, i386&No64, Size16|IgnoreSize|NoSuf|IsPrefix, {} - addr32, 0x67, i386, Size32|IgnoreSize|NoSuf|IsPrefix, {} --aword, 0x67, i386|No64, Size16|IgnoreSize|NoSuf|IsPrefix, {} -+aword, 0x67, i386&No64, Size16|IgnoreSize|NoSuf|IsPrefix, {} - adword, 0x67, i386, Size32|IgnoreSize|NoSuf|IsPrefix, {} - data16, 0x66, i386, Size16|IgnoreSize|NoSuf|IsPrefix, {} --data32, 0x66, i386|No64, Size32|IgnoreSize|NoSuf|IsPrefix, {} -+data32, 0x66, i386&No64, Size32|IgnoreSize|NoSuf|IsPrefix, {} - word, 0x66, i386, Size16|IgnoreSize|NoSuf|IsPrefix, {} --dword, 0x66, i386|No64, Size32|IgnoreSize|NoSuf|IsPrefix, {} -+dword, 0x66, i386&No64, Size32|IgnoreSize|NoSuf|IsPrefix, {} - lock, 0xf0, 0, NoSuf|IsPrefix, {} - wait, 0x9b, 0, NoSuf|IsPrefix, {} - cs, 0x2e, 0, NoSuf|IsPrefix, {} -@@ -888,18 +908,18 @@ rex.wrxb, 0x4f, x64, NoSuf|IsPrefix, {} - - // Pseudo prefixes (base_opcode == PSEUDO_PREFIX) - -- -+ rex:REX:x64, rex2:REX2:APX_F, nf:NF:APX_F, + -+ nooptimize:NoOptimize:0> - - {}, PSEUDO_PREFIX/Prefix_, , NoSuf|IsPrefix, {} - --// 486 extensions. -+// 486 extensions (BSWAP moved elsewhere). - --bswap, 0xfc8, i486, No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64 } --xadd, 0xfc0, i486, W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } --cmpxchg, 0xfb0, i486, W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Byte|Word|Dword|Qword|Unspecified|BaseIndex } -+xadd, 0xfc0, i486, W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } -+cmpxchg, 0xfb0, i486, W|CheckOperandSize|Modrm|No_sSuf|HLEPrefixLock, { Reg8|Reg16|Reg32|Reg64, Reg8|Reg16|Reg32|Reg64|Unspecified|BaseIndex } - invd, 0xf08, i486, NoSuf, {} - wbinvd, 0xf09, i486, NoSuf, {} - invlpg, 0xf01/7, i486, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex } -@@ -915,13 +935,13 @@ cmpxchg8b, 0xfc7/1, i586, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64|HLEPrefi - - // Pentium II/Pentium Pro extensions. - sysenter, 0xf34, x64, Intel64Only|NoSuf, {} --sysenter, 0xf34, i686|No64, NoSuf, {} -+sysenter, 0xf34, i686&No64, NoSuf, {} - sysexit, 0xf35, x64, Intel64Only|No_bSuf|No_wSuf|No_sSuf, {} --sysexit, 0xf35, i686|No64, NoSuf, {} -+sysexit, 0xf35, i686&No64, NoSuf, {} - fxsave, 0xfae/0, FXSR, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf, { Unspecified|BaseIndex } --fxsave64, 0xfae/0, FXSR|x64, Modrm|NoSuf|Size64, { Unspecified|BaseIndex } -+fxsave64, 0xfae/0, FXSR&x64, Modrm|NoSuf|Size64, { Unspecified|BaseIndex } - fxrstor, 0xfae/1, FXSR, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf, { Unspecified|BaseIndex } --fxrstor64, 0xfae/1, FXSR|x64, Modrm|NoSuf|Size64, { Unspecified|BaseIndex } -+fxrstor64, 0xfae/1, FXSR&x64, Modrm|NoSuf|Size64, { Unspecified|BaseIndex } - rdpmc, 0xf33, i686, NoSuf, {} - // official undefined instr. - ud2, 0xf0b, i186, NoSuf, {} -@@ -934,7 +954,8 @@ ud2b, 0xfb9, i186, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|U - // 3rd official undefined instr (older CPUs don't take a ModR/M byte) - ud0, 0xfff, i186, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } - --cmov, 0xf4, CMOV, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+cmov, 0x4, CMOV&APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|DstVVVV|EVexMap4, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64, Reg16|Reg32|Reg64 } -+cmov, 0xf4, CMOV, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } - - fcmovb, 0xda/0, i687, Modrm|NoSuf, { FloatReg, FloatAcc } - fcmovnae, 0xda/0, i687, Modrm|NoSuf, { FloatReg, FloatAcc } -@@ -992,9 +1013,9 @@ pause, 0xf390, i186, NoSuf, {} - b:0:VexW0:Byte:AVX512DQ:66:AVX512VBMI, + - w:1:VexW1:Word:AVX512F::AVX512BW> - -- -+ - - emms, 0xf77, MMX, NoSuf, {} - // These really shouldn't allow for Reg64 (movq is the right mnemonic for -@@ -1002,21 +1023,21 @@ emms, 0xf77, MMX, NoSuf, {} - // spec). AMD's spec, having been in existence for much longer, failed to - // recognize that and specified movd for 32- and 64-bit operations. - movd, 0x666e, AVX, D|Modrm|Vex128|Space0F|VexW0|NoSuf|SSE2AVX, { Reg32|Unspecified|BaseIndex, RegXMM } --movd, 0x666e, AVX|x64, D|Modrm|Vex=1|Space0F|VexW1|NoSuf|Size64|SSE2AVX, { Reg64|BaseIndex, RegXMM } -+movd, 0x666e, AVX&x64, D|Modrm|Vex=1|Space0F|VexW1|NoSuf|Size64|SSE2AVX, { Reg64|BaseIndex, RegXMM } - movd, 0x660f6e, SSE2, D|Modrm|IgnoreSize|NoSuf, { Reg32|Unspecified|BaseIndex, RegXMM } --movd, 0x660f6e, SSE2|x64, D|Modrm|NoSuf|Size64, { Reg64|BaseIndex, RegXMM } -+movd, 0x660f6e, SSE2&x64, D|Modrm|NoSuf|Size64, { Reg64|BaseIndex, RegXMM } - // The MMX templates have to remain after at least the SSE2AVX ones. - movd, 0xf6e, MMX, D|Modrm|IgnoreSize|NoSuf, { Reg32|Unspecified|BaseIndex, RegMMX } --movd, 0xf6e, MMX|x64, D|Modrm|NoSuf|Size64, { Reg64|BaseIndex, RegMMX } --movq, 0xf37e, AVX, Load|Modrm|Vex=1|Space0F|VexWIG|NoSuf|SSE2AVX, { Qword|Unspecified|BaseIndex|RegXMM, RegXMM } --movq, 0x66d6, AVX, Modrm|Vex=1|Space0F|VexWIG|NoSuf|SSE2AVX, { RegXMM, Qword|Unspecified|BaseIndex|RegXMM } --movq, 0x666e, AVX|x64, D|Modrm|Vex=1|Space0F|VexW1|NoSuf|Size64|SSE2AVX, { Reg64|Unspecified|BaseIndex, RegXMM } -+movd, 0xf6e, MMX&x64, D|Modrm|NoSuf|Size64, { Reg64|BaseIndex, RegMMX } -+movq, 0xf37e, AVX, Load|Modrm|Vex128|Space0F|VexW0|NoSuf|SSE2AVX, { Qword|Unspecified|BaseIndex|RegXMM, RegXMM } -+movq, 0x66d6, AVX, Modrm|Vex128|Space0F|VexW0|NoSuf|SSE2AVX, { RegXMM, Qword|Unspecified|BaseIndex|RegXMM } -+movq, 0x666e, AVX&x64, D|Modrm|Vex=1|Space0F|VexW1|NoSuf|Size64|SSE2AVX, { Reg64|Unspecified|BaseIndex, RegXMM } - movq, 0xf30f7e, SSE2, Load|Modrm|NoSuf, { Unspecified|Qword|BaseIndex|RegXMM, RegXMM } - movq, 0x660fd6, SSE2, Modrm|NoSuf, { RegXMM, Unspecified|Qword|BaseIndex|RegXMM } --movq, 0x660f6e, SSE2|x64, D|Modrm|NoSuf|Size64, { Reg64|Unspecified|BaseIndex, RegXMM } -+movq, 0x660f6e, SSE2&x64, D|Modrm|NoSuf|Size64, { Reg64|Unspecified|BaseIndex, RegXMM } - // The MMX templates have to remain after at least the SSE2AVX ones. - movq, 0xf6f, MMX, D|Modrm|NoSuf, { Unspecified|Qword|BaseIndex|RegMMX, RegMMX } --movq, 0xf6e, MMX|x64, D|Modrm|NoSuf|Size64, { Reg64|Unspecified|BaseIndex, RegMMX } -+movq, 0xf6e, MMX&x64, D|Modrm|NoSuf|Size64, { Reg64|Unspecified|BaseIndex, RegMMX } - packssdw, 0x0f6b, , Modrm||NoSuf, { ||Unspecified|BaseIndex, } - packsswb, 0x0f63, , Modrm||NoSuf, { ||Unspecified|BaseIndex, } - packuswb, 0x0f67, , Modrm||NoSuf, { ||Unspecified|BaseIndex, } -@@ -1083,11 +1104,11 @@ cmpss, 0xf30fc2, , Modrm|||NoSuf, { Imm8, Dwor - comiss, 0x0f2f, , Modrm||NoSuf, { Dword|Unspecified|BaseIndex|RegXMM, RegXMM } - cvtpi2ps, 0xf2a, SSE, Modrm|NoSuf, { Qword|Unspecified|BaseIndex|RegMMX, RegXMM } - cvtps2pi, 0xf2d, SSE, Modrm|NoSuf, { Qword|Unspecified|BaseIndex|RegXMM, RegMMX } --cvtsi2ss, 0xf30f2a, |No64, Modrm|||IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Reg32|Unspecified|BaseIndex, RegXMM } --cvtsi2ss, 0xf32a, AVX|x64, Modrm|Vex=3|Space0F|VexVVVV|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|SSE2AVX|ATTSyntax, { Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex, RegXMM } --cvtsi2ss, 0xf32a, AVX|x64, Modrm|Vex=3|Space0F|VexVVVV|No_bSuf|No_wSuf|No_sSuf|SSE2AVX|IntelSyntax, { Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex, RegXMM } --cvtsi2ss, 0xf30f2a, SSE|x64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|ATTSyntax, { Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex, RegXMM } --cvtsi2ss, 0xf30f2a, SSE|x64, Modrm|No_bSuf|No_wSuf|No_sSuf|IntelSyntax, { Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex, RegXMM } -+cvtsi2ss, 0xf30f2a, &No64, Modrm|||IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Reg32|Unspecified|BaseIndex, RegXMM } -+cvtsi2ss, 0xf32a, AVX&x64, Modrm|Vex=3|Space0F|VexVVVV|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|SSE2AVX|ATTSyntax, { Reg32|Reg64|Unspecified|BaseIndex, RegXMM } -+cvtsi2ss, 0xf32a, AVX&x64, Modrm|Vex=3|Space0F|VexVVVV|No_bSuf|No_wSuf|No_sSuf|SSE2AVX|IntelSyntax, { Reg32|Reg64|Unspecified|BaseIndex, RegXMM } -+cvtsi2ss, 0xf30f2a, SSE&x64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|ATTSyntax, { Reg32|Reg64|Unspecified|BaseIndex, RegXMM } -+cvtsi2ss, 0xf30f2a, SSE&x64, Modrm|No_bSuf|No_wSuf|No_sSuf|IntelSyntax, { Reg32|Reg64|Unspecified|BaseIndex, RegXMM } - cvtss2si, 0xf32d, AVX, Modrm|VexLIG|Space0F|No_bSuf|No_wSuf|No_sSuf|SSE2AVX, { Dword|Unspecified|BaseIndex|RegXMM, Reg32|Reg64 } - cvtss2si, 0xf30f2d, SSE, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Dword|Unspecified|BaseIndex|RegXMM, Reg32|Reg64 } - cvttps2pi, 0xf2c, SSE, Modrm|NoSuf, { Qword|Unspecified|BaseIndex|RegXMM, RegMMX } -@@ -1178,11 +1199,11 @@ comisd, 0x660f2f, , Modrm||NoSuf, { Qword|Unspecified - cvtpi2pd, 0x660f2a, SSE2, Modrm|NoSuf, { RegMMX, RegXMM } - cvtpi2pd, 0xf3e6, AVX, Modrm|Vex|Space0F|VexW0|NoSuf|SSE2AVX, { Qword|Unspecified|BaseIndex, RegXMM } - cvtpi2pd, 0x660f2a, SSE2, Modrm|NoSuf, { Qword|Unspecified|BaseIndex, RegXMM } --cvtsi2sd, 0xf20f2a, |No64, Modrm|IgnoreSize|||No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Reg32|Unspecified|BaseIndex, RegXMM } --cvtsi2sd, 0xf22a, AVX|x64, Modrm|Vex=3|Space0F|VexVVVV|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|SSE2AVX|ATTSyntax, { Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex, RegXMM } --cvtsi2sd, 0xf22a, AVX|x64, Modrm|Vex=3|Space0F|VexVVVV|No_bSuf|No_wSuf|No_sSuf|SSE2AVX|IntelSyntax, { Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex, RegXMM } --cvtsi2sd, 0xf20f2a, SSE2|x64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|ATTSyntax, { Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex, RegXMM } --cvtsi2sd, 0xf20f2a, SSE2|x64, Modrm|No_bSuf|No_wSuf|No_sSuf|IntelSyntax, { Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex, RegXMM } -+cvtsi2sd, 0xf20f2a, &No64, Modrm|IgnoreSize|||No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Reg32|Unspecified|BaseIndex, RegXMM } -+cvtsi2sd, 0xf22a, AVX&x64, Modrm|Vex=3|Space0F|VexVVVV|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|SSE2AVX|ATTSyntax, { Reg32|Reg64|Unspecified|BaseIndex, RegXMM } -+cvtsi2sd, 0xf22a, AVX&x64, Modrm|Vex=3|Space0F|VexVVVV|No_bSuf|No_wSuf|No_sSuf|SSE2AVX|IntelSyntax, { Reg32|Reg64|Unspecified|BaseIndex, RegXMM } -+cvtsi2sd, 0xf20f2a, SSE2&x64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|ATTSyntax, { Reg32|Reg64|Unspecified|BaseIndex, RegXMM } -+cvtsi2sd, 0xf20f2a, SSE2&x64, Modrm|No_bSuf|No_wSuf|No_sSuf|IntelSyntax, { Reg32|Reg64|Unspecified|BaseIndex, RegXMM } - divpd, 0x660f5e, , Modrm|||NoSuf, { RegXMM|Unspecified|BaseIndex, RegXMM } - divsd, 0xf20f5e, , Modrm|||NoSuf, { Qword|Unspecified|BaseIndex|RegXMM, RegXMM } - maxpd, 0x660f5f, , Modrm|||NoSuf, { RegXMM|Unspecified|BaseIndex, RegXMM } -@@ -1271,7 +1292,7 @@ fisttpll, 0xdd/1, FISTTP, Modrm|NoSuf|ATTSyntax, { Unspecified|BaseIndex } - - // CMPXCHG16B instruction. - --cmpxchg16b, 0xfc7/1, CX16|x64, Modrm|NoSuf|Size64|LockPrefixOk, { Oword|Unspecified|BaseIndex } -+cmpxchg16b, 0xfc7/1, CX16, Modrm|NoSuf|Size64|LockPrefixOk, { Oword|Unspecified|BaseIndex } - - // MONITOR instructions. - -@@ -1281,7 +1302,7 @@ monitor, 0xf01c8, MONITOR, NoSuf, {} - // all modes. - monitor, 0xf01c8, MONITOR, AddrPrefixOpReg|NoSuf, { Acc|Word|Dword|Qword, RegC|Dword, RegD|Dword } - // The 64-bit form exists only for compatibility with older gas. --monitor, 0xf01c8, MONITOR|x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword, RegD|Qword } -+monitor, 0xf01c8, MONITOR&x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword, RegD|Qword } - mwait, 0xf01c9, MONITOR, NoSuf, {} - // mwait is very special. AX and CX are always 32 bits. - // The 64-bit form exists only for compatibility with older gas. -@@ -1295,10 +1316,10 @@ vmlaunch, 0xf01c2, VMX, NoSuf, {} - vmresume, 0xf01c3, VMX, NoSuf, {} - vmptrld, 0xfc7/6, VMX, Modrm|NoSuf, { Qword|Unspecified|BaseIndex } - vmptrst, 0xfc7/7, VMX, Modrm|NoSuf, { Qword|Unspecified|BaseIndex } --vmread, 0xf78, VMX|No64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Reg32, Reg32|Unspecified|BaseIndex } --vmread, 0xf78, VMX|x64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64, { Reg64, Reg64|Qword|Unspecified|BaseIndex } --vmwrite, 0xf79, VMX|No64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Reg32|Unspecified|BaseIndex, Reg32 } --vmwrite, 0xf79, VMX|x64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64, { Reg64|Qword|Unspecified|BaseIndex, Reg64 } -+vmread, 0xf78, VMX&No64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Reg32, Reg32|Unspecified|BaseIndex } -+vmread, 0xf78, VMX&x64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64, { Reg64, Reg64|Unspecified|BaseIndex } -+vmwrite, 0xf79, VMX&No64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Reg32|Unspecified|BaseIndex, Reg32 } -+vmwrite, 0xf79, VMX&x64, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoRex64, { Reg64|Unspecified|BaseIndex, Reg64 } - vmxoff, 0xf01c4, VMX, NoSuf, {} - vmxon, 0xf30fc7/6, VMX, Modrm|NoSuf, { Qword|Unspecified|BaseIndex } - -@@ -1312,15 +1333,18 @@ getsec, 0xf37, SMX, NoSuf, {} - - // EPT instructions. - --invept, 0x660f3880, EPT|No64, Modrm|IgnoreSize|NoSuf, { Oword|Unspecified|BaseIndex, Reg32 } --invept, 0x660f3880, EPT|x64, Modrm|NoSuf|NoRex64, { Oword|Unspecified|BaseIndex, Reg64 } --invvpid, 0x660f3881, EPT|No64, Modrm|IgnoreSize|NoSuf, { Oword|Unspecified|BaseIndex, Reg32 } --invvpid, 0x660f3881, EPT|x64, Modrm|NoSuf|NoRex64, { Oword|Unspecified|BaseIndex, Reg64 } -+invept, 0x660f3880, EPT&No64, Modrm|IgnoreSize|NoSuf, { Oword|Unspecified|BaseIndex, Reg32 } -+invept, 0x660f3880, EPT&x64, Modrm|NoSuf|NoRex64, { Oword|Unspecified|BaseIndex, Reg64 } -+invept, 0xf3f0, EPT&APX_F, Modrm|NoSuf|EVexMap4|VexWIG, { Oword|Unspecified|BaseIndex, Reg64 } -+invvpid, 0x660f3881, EPT&No64, Modrm|IgnoreSize|NoSuf, { Oword|Unspecified|BaseIndex, Reg32 } -+invvpid, 0x660f3881, EPT&x64, Modrm|NoSuf|NoRex64, { Oword|Unspecified|BaseIndex, Reg64 } -+invvpid, 0xf3f1, EPT&APX_F, Modrm|NoSuf|EVexMap4|VexWIG, { Oword|Unspecified|BaseIndex, Reg64 } - - // INVPCID instruction - --invpcid, 0x660f3882, INVPCID|No64, Modrm|IgnoreSize|NoSuf, { Oword|Unspecified|BaseIndex, Reg32 } --invpcid, 0x660f3882, INVPCID|x64, Modrm|NoSuf|NoRex64, { Oword|Unspecified|BaseIndex, Reg64 } -+invpcid, 0x660f3882, INVPCID&No64, Modrm|IgnoreSize|NoSuf, { Oword|Unspecified|BaseIndex, Reg32 } -+invpcid, 0x660f3882, INVPCID&x64, Modrm|NoSuf|NoRex64, { Oword|Unspecified|BaseIndex, Reg64 } -+invpcid, 0xf3f2, INVPCID&APX_F, Modrm|NoSuf|EVexMap4|VexWIG, { Oword|Unspecified|BaseIndex, Reg64 } - - // SSSE3 instructions. - -@@ -1355,10 +1379,10 @@ blendvp, 0x664a | , AVX, Modrm|Vex128|Space0F3A|VexVVVV|VexW0|NoSuf| - blendvp, 0x660f3814 | , SSE4_1, Modrm|NoSuf, { Acc|Xmmword, RegXMM|Unspecified|BaseIndex, RegXMM } - blendvp, 0x660f3814 | , SSE4_1, Modrm|NoSuf, { RegXMM|Unspecified|BaseIndex, RegXMM } - dpp, 0x660f3a40 | , , Modrm|||NoSuf, { Imm8|Imm8S, RegXMM|Unspecified|BaseIndex, RegXMM } --extractps, 0x6617, AVX, Modrm|Vex|Space0F3A|VexWIG|NoSuf|SSE2AVX, { Imm8, RegXMM, Reg32|Dword|Unspecified|BaseIndex } --extractps, 0x6617, AVX|x64, RegMem|Vex|Space0F3A|VexWIG|NoSuf|SSE2AVX, { Imm8, RegXMM, Reg64 } --extractps, 0x660f3a17, SSE4_1, Modrm|IgnoreSize|NoSuf, { Imm8, RegXMM, Reg32|Dword|Unspecified|BaseIndex } --extractps, 0x660f3a17, SSE4_1|x64, RegMem|NoSuf|NoRex64, { Imm8, RegXMM, Reg64 } -+extractps, 0x6617, AVX, Modrm|Vex128|Space0F3A|VexW0|NoSuf|SSE2AVX, { Imm8, RegXMM, Reg32|Unspecified|BaseIndex } -+extractps, 0x6617, AVX&x64, RegMem|Vex128|Space0F3A|VexW1|NoSuf|SSE2AVX, { Imm8, RegXMM, Reg64 } -+extractps, 0x660f3a17, SSE4_1, Modrm|IgnoreSize|NoSuf, { Imm8, RegXMM, Reg32|Unspecified|BaseIndex } -+extractps, 0x660f3a17, SSE4_1&x64, RegMem|NoSuf|NoRex64, { Imm8, RegXMM, Reg64 } - insertps, 0x660f3a21, , Modrm|||NoSuf, { Imm8, Dword|Unspecified|BaseIndex|RegXMM, RegXMM } - movntdqa, 0x660f382a, , Modrm||NoSuf, { Xmmword|Unspecified|BaseIndex, RegXMM } - mpsadbw, 0x660f3a42, , Modrm|||NoSuf, { Imm8|Imm8S, RegXMM|Unspecified|BaseIndex, RegXMM } -@@ -1372,14 +1396,14 @@ pcmpeqq, 0x660f3829, , Modrm|||NoSuf|O - pextr, 0x660f3a14 | , , RegMem||NoSuf|IgnoreSize|NoRex64, { Imm8, RegXMM, Reg32|Reg64 } - pextr, 0x660f3a14 | , , Modrm||NoSuf, { Imm8, RegXMM, |Unspecified|BaseIndex } - pextrd, 0x660f3a16, , Modrm||NoSuf|IgnoreSize, { Imm8, RegXMM, Reg32|Unspecified|BaseIndex } --pextrq, 0x6616, AVX|x64, Modrm|Vex|Space0F3A|VexW1|NoSuf|SSE2AVX, { Imm8, RegXMM, Reg64|Unspecified|BaseIndex } --pextrq, 0x660f3a16, SSE4_1|x64, Modrm|Size64|NoSuf, { Imm8, RegXMM, Reg64|Unspecified|BaseIndex } -+pextrq, 0x6616, AVX&x64, Modrm|Vex|Space0F3A|VexW1|NoSuf|SSE2AVX, { Imm8, RegXMM, Reg64|Unspecified|BaseIndex } -+pextrq, 0x660f3a16, SSE4_1&x64, Modrm|Size64|NoSuf, { Imm8, RegXMM, Reg64|Unspecified|BaseIndex } - phminposuw, 0x660f3841, , Modrm||NoSuf, { RegXMM|Unspecified|BaseIndex, RegXMM } - pinsrb, 0x660f3a20, , Modrm|||NoSuf|IgnoreSize|NoRex64, { Imm8, Reg32|Reg64, RegXMM } - pinsrb, 0x660f3a20, , Modrm|||NoSuf, { Imm8, Byte|Unspecified|BaseIndex, RegXMM } - pinsrd, 0x660f3a22, , Modrm|||NoSuf|IgnoreSize, { Imm8, Reg32|Unspecified|BaseIndex, RegXMM } --pinsrq, 0x6622, AVX|x64, Modrm|Vex|Space0F3A|VexVVVV|VexW1|NoSuf|SSE2AVX, { Imm8, Reg64|Unspecified|BaseIndex, RegXMM } --pinsrq, 0x660f3a22, SSE4_1|x64, Modrm|Size64|NoSuf, { Imm8, Reg64|Unspecified|BaseIndex, RegXMM } -+pinsrq, 0x6622, AVX&x64, Modrm|Vex|Space0F3A|VexVVVV|VexW1|NoSuf|SSE2AVX, { Imm8, Reg64|Unspecified|BaseIndex, RegXMM } -+pinsrq, 0x660f3a22, SSE4_1&x64, Modrm|Size64|NoSuf, { Imm8, Reg64|Unspecified|BaseIndex, RegXMM } - pmaxsb, 0x660f383c, , Modrm|||NoSuf, { RegXMM|Unspecified|BaseIndex, RegXMM } - pmaxsd, 0x660f383d, , Modrm|||NoSuf, { RegXMM|Unspecified|BaseIndex, RegXMM } - pmaxud, 0x660f383f, , Modrm|||NoSuf, { RegXMM|Unspecified|BaseIndex, RegXMM } -@@ -1411,33 +1435,36 @@ rounds, 0x660f3a0a | , , Modrm|| - - pcmpgtq, 0x660f3837, , Modrm|||NoSuf|Optimize, { RegXMM|Unspecified|BaseIndex, RegXMM } --pcmpestri, 0x660f3a61, |No64, Modrm||NoSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } --pcmpestri, 0x6661, AVX|x64, Modrm|Vex|Space0F3A|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|SSE2AVX, { Imm8, Xmmword|Unspecified|BaseIndex|RegXMM, RegXMM } --pcmpestri, 0x660f3a61, SSE4_2|x64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Imm8, Xmmword|Unspecified|BaseIndex|RegXMM, RegXMM } --pcmpestrm, 0x660f3a60, |No64, Modrm||NoSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } --pcmpestrm, 0x6660, AVX|x64, Modrm|Vex|Space0F3A|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|SSE2AVX, { Imm8, Xmmword|Unspecified|BaseIndex|RegXMM, RegXMM } --pcmpestrm, 0x660f3a60, SSE4_2|x64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Imm8, Xmmword|Unspecified|BaseIndex|RegXMM, RegXMM } -+pcmpestri, 0x660f3a61, &No64, Modrm||NoSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } -+pcmpestri, 0x6661, AVX&x64, Modrm|Vex|Space0F3A|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|SSE2AVX, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } -+pcmpestri, 0x660f3a61, SSE4_2&x64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } -+pcmpestrm, 0x660f3a60, &No64, Modrm||NoSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } -+pcmpestrm, 0x6660, AVX&x64, Modrm|Vex|Space0F3A|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|SSE2AVX, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } -+pcmpestrm, 0x660f3a60, SSE4_2&x64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } - pcmpistri, 0x660f3a63, , Modrm||NoSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } - pcmpistrm, 0x660f3a62, , Modrm||NoSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } - crc32, 0xf20f38f0, SSE4_2, W|Modrm|No_sSuf|No_qSuf, { Reg8|Reg16|Reg32|Unspecified|BaseIndex, Reg32 } --crc32, 0xf20f38f0, SSE4_2|x64, W|Modrm|No_wSuf|No_lSuf|No_sSuf, { Reg8|Reg64|Unspecified|BaseIndex, Reg64 } -+crc32, 0xf20f38f0, SSE4_2&x64, W|Modrm|No_wSuf|No_lSuf|No_sSuf, { Reg8|Reg64|Unspecified|BaseIndex, Reg64 } -+crc32, 0xf0, APX_F, W|Modrm|No_sSuf|No_qSuf|EVexMap4, { Reg8|Reg16|Reg32|Unspecified|BaseIndex, Reg32 } -+crc32, 0xf0, APX_F, W|Modrm|No_wSuf|No_lSuf|No_sSuf|EVexMap4, { Reg8|Reg64|Unspecified|BaseIndex, Reg64 } - - // xsave/xrstor New Instructions. - --xsave, 0xfae/4, Xsave, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf, { Unspecified|BaseIndex } --xsave64, 0xfae/4, Xsave|x64, Modrm|NoSuf|Size64, { Unspecified|BaseIndex } --xrstor, 0xfae/5, Xsave, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf, { Unspecified|BaseIndex } --xrstor64, 0xfae/5, Xsave|x64, Modrm|NoSuf|Size64, { Unspecified|BaseIndex } -+xsave, 0xfae/4, Xsave, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoEgpr, { Unspecified|BaseIndex } -+xsave64, 0xfae/4, Xsave&x64, Modrm|NoSuf|Size64|NoEgpr, { Unspecified|BaseIndex } -+xrstor, 0xfae/5, Xsave, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoEgpr, { Unspecified|BaseIndex } -+xrstor64, 0xfae/5, Xsave&x64, Modrm|NoSuf|Size64|NoEgpr, { Unspecified|BaseIndex } - xgetbv, 0xf01d0, Xsave, NoSuf, {} - xsetbv, 0xf01d1, Xsave, NoSuf, {} - - // xsaveopt --xsaveopt, 0xfae/6, Xsaveopt, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf, { Unspecified|BaseIndex } --xsaveopt64, 0xfae/6, Xsaveopt|x64, Modrm|NoSuf|Size64, { Unspecified|BaseIndex } -+ -+xsaveopt, 0xfae/6, Xsaveopt, Modrm|No_bSuf|No_wSuf|No_lSuf|No_sSuf|NoEgpr, { Unspecified|BaseIndex } -+xsaveopt64, 0xfae/6, Xsaveopt&x64, Modrm|NoSuf|Size64|NoEgpr, { Unspecified|BaseIndex } - - // AES instructions. - -- -+ - - aesdec, 0x660f38de, AES, Modrm|||NoSuf, { RegXMM|Unspecified|BaseIndex, RegXMM } - aesdeclast, 0x660f38df, AES, Modrm|||NoSuf, { RegXMM|Unspecified|BaseIndex, RegXMM } -@@ -1448,7 +1475,7 @@ aeskeygenassist, 0x660f3adf, AES, Modrm||NoSuf, { Imm8, - - // PCLMULQDQ - -- -+ - - pclmulqdq, 0x660f3a44, PCLMULQDQ, Modrm||NoSuf, { Imm8|Imm8S, RegXMM|Unspecified|BaseIndex, RegXMM } - pclmullqlqdq, 0x660f3a44/0x00, PCLMULQDQ, Modrm||NoSuf|ImmExt, { RegXMM|Unspecified|BaseIndex, RegXMM } -@@ -1458,7 +1485,7 @@ pclmulhqhqdq, 0x660f3a44/0x11, PCLMULQDQ, Modrm| -+ - - gf2p8affineqb, 0x660f3ace, GFNI, Modrm||NoSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } - gf2p8affineinvqb, 0x660f3acf, GFNI, Modrm||NoSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegXMM } -@@ -1477,6 +1504,9 @@ gf2p8mulb, 0x660f38cf, GFNI, Modrm||NoSuf, { RegXMM|Uns - true_us:1f:C> - - // is used for VEX instructions with x/y suffixes. -+// NOTE: The order of the "unnamed" ($-prefixed) entries here needs to remain -+// in sync with , for match_template()'s EVEX-to-VEX lowering to -+// continue to work. - , 0x55, AVX, Modrm|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSiz - vandp, 0x54, AVX, Modrm|C|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vblendp, 0x660c | , AVX, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vblendvp, 0x664a | , AVX, Modrm|Vex|Space0F3A|VexVVVV|VexW0|CheckOperandSize|NoSuf, { RegXMM|RegYMM, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } --vbroadcastf128, 0x661a, AVX, Modrm|Vex=2|Space0F38|VexW=1|NoSuf, { Xmmword|Unspecified|BaseIndex, RegYMM } -+vbroadcastf128, 0x661a, AVX, Modrm|Vex256|Space0F38|VexW0|NoSuf, { Xmmword|Unspecified|BaseIndex, RegYMM } -+// vbroadcastf32x4 in disguise (see vround{p,s}{s,d} comment) -+vbroadcastf128, 0x661a, APX_F&AVX512VL, Modrm|EVex256|Space0F38|VexW0|Disp8MemShift=4|NoSuf, { Xmmword|Unspecified|BaseIndex, RegYMM } - vbroadcastsd, 0x6619, AVX, Modrm|Vex256|Space0F38|VexW0|NoSuf, { Qword|Unspecified|BaseIndex, RegYMM } - vbroadcastss, 0x6618, AVX, Modrm|Vex128|Space0F38|VexW0|NoSuf, { Dword|Unspecified|BaseIndex, RegXMM|RegYMM } - vcmpp, 0xc2/0x, AVX, Modrm||Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf|ImmExt, { RegXMM|RegYMM|Unspecified|BaseIndex, RegXMM|RegYMM, RegXMM|RegYMM } -@@ -1519,14 +1551,18 @@ vdivp, 0x5e, AVX, Modrm|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize - vdivs, 0x5e, AVX, Modrm|VexLIG|Space0F|VexVVVV|VexWIG|NoSuf, { |Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } - vdppd, 0x6641, AVX, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } - vdpps, 0x6640, AVX, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } --vextractf128, 0x6619, AVX, Modrm|Vex=2|Space0F3A|VexW=1|NoSuf, { Imm8, RegYMM, Unspecified|BaseIndex|RegXMM } --vextractps, 0x6617, AVX|AVX512F, Modrm|Vex128|EVex128|Space0F3A|VexWIG|Disp8MemShift=2|NoSuf, { Imm8, RegXMM, Reg32|Dword|Unspecified|BaseIndex } --vextractps, 0x6617, AVX|AVX512F|x64, RegMem|Vex128|EVex128|Space0F3A|VexWIG|NoSuf, { Imm8, RegXMM, Reg64 } -+vextractf128, 0x6619, AVX, Modrm|Vex256|Space0F3A|VexW0|NoSuf, { Imm8, RegYMM, Unspecified|BaseIndex|RegXMM } -+// vextractf32x4 in disguise (see vround{p,s}{s,d} comment) -+vextractf128, 0x6619, APX_F&AVX512VL, Modrm|EVex256|Space0F3A|VexW0|Disp8MemShift=4|NoSuf, { Imm8, RegYMM, Xmmword|Unspecified|BaseIndex } -+vextractps, 0x6617, AVX|AVX512F, Modrm|Vex128|EVex128|Space0F3A|VexWIG|Disp8MemShift=2|NoSuf, { Imm8, RegXMM, Reg32|Unspecified|BaseIndex } -+vextractps, 0x6617, x64&(AVX|AVX512F), RegMem|Vex128|EVex128|Space0F3A|VexWIG|NoSuf, { Imm8, RegXMM, Reg64 } - vhaddpd, 0x667c, AVX, Modrm|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vhaddps, 0xf27c, AVX, Modrm|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vhsubpd, 0x667d, AVX, Modrm|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vhsubps, 0xf27d, AVX, Modrm|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vinsertf128, 0x6618, AVX, Modrm|Vex256|Space0F3A|VexVVVV|VexW0|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegYMM, RegYMM } -+// vinsertf32x4 in disguise (see vround{p,s}{s,d} comment) -+vinsertf128, 0x6618, APX_F&AVX512VL, Modrm|EVex256|Space0F3A|VexVVVV|VexW0|Disp8MemShift=4|NoSuf, { Imm8, Xmmword|Unspecified|BaseIndex, RegYMM, RegYMM } - vinsertps, 0x6621, AVX, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf, { Imm8, Dword|Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } - vlddqu, 0xf2f0, AVX, Modrm|Vex|Space0F|VexWIG|CheckOperandSize|NoSuf, { Xmmword|Ymmword|Unspecified|BaseIndex, RegXMM|RegYMM } - vldmxcsr, 0xae/2, AVX, Modrm|Vex128|Space0F|VexWIG|NoSuf, { Dword|Unspecified|BaseIndex } -@@ -1544,7 +1580,7 @@ vmovap, 0x28, AVX, D|Modrm|Vex|Space0F|VexWIG|CheckOperandSize|NoSu - // support assembler for AMD64, we accept 64bit operand on vmovd so - // that we can use one template for both SSE and AVX instructions. - vmovd, 0x666e, AVX|AVX512F, D|Modrm|Vex128|EVex128|Space0F|Disp8MemShift=2|NoSuf, { Reg32|Unspecified|BaseIndex, RegXMM } --vmovd, 0x667e, AVX|x64, D|RegMem|Vex=1|Space0F|VexW=2|NoSuf|Size64, { RegXMM, Reg64 } -+vmovd, 0x667e, AVX&x64, D|RegMem|Vex=1|Space0F|VexW=2|NoSuf|Size64, { RegXMM, Reg64 } - vmovddup, 0xf212, AVX, Modrm|Vex|Space0F|VexWIG|NoSuf, { Qword|Unspecified|BaseIndex|RegXMM, RegXMM } - vmovddup, 0xf212, AVX, Modrm|Vex=2|Space0F|VexWIG|NoSuf, { Unspecified|BaseIndex|RegYMM, RegYMM } - vmovdqa, 0x666f, AVX, D|Modrm|Vex|Space0F|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM } -@@ -1561,7 +1597,7 @@ vmovntdqa, 0x662a, AVX|AVX2, Modrm|Vex|Space0F38|VexWIG|CheckOperandSize|NoSuf, - vmovntp, 0x2b, AVX, Modrm|Vex|Space0F|VexWIG|CheckOperandSize|NoSuf, { RegXMM|RegYMM, Xmmword|Ymmword|Unspecified|BaseIndex } - vmovq, 0xf37e, AVX, Load|Modrm|Vex=1|Space0F|VexWIG|NoSuf, { Qword|Unspecified|BaseIndex|RegXMM, RegXMM } - vmovq, 0x66d6, AVX, Modrm|Vex=1|Space0F|VexWIG|NoSuf, { RegXMM, Qword|Unspecified|BaseIndex|RegXMM } --vmovq, 0x666e, AVX|AVX512F|x64, D|Modrm|Vex128|EVex128|Space0F|VexW1|Disp8MemShift=3|NoSuf, { Reg64|Unspecified|BaseIndex, RegXMM } -+vmovq, 0x666e, x64&(AVX|AVX512F), D|Modrm|Vex128|EVex128|Space0F|VexW1|Disp8MemShift=3|NoSuf, { Reg64|Unspecified|BaseIndex, RegXMM } - vmovs, 0x10, AVX, D|Modrm|VexLIG|Space0F|VexWIG|NoSuf, { |Unspecified|BaseIndex, RegXMM } - vmovs, 0x10, AVX, D|Modrm|VexLIG|Space0F|VexVVVV|VexWIG|NoSuf, { RegXMM, RegXMM, RegXMM } - vmovshdup, 0xf316, AVX, Modrm|Vex|Space0F|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM } -@@ -1591,10 +1627,10 @@ vpblendw, 0x660e, AVX|AVX2, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|CheckOperandSize| - vpcmpeq, 0x6674 | , AVX|AVX2, Modrm|C|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vpcmpeqd, 0x6676, AVX|AVX2, Modrm|C|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vpcmpeqq, 0x6629, AVX|AVX2, Modrm|Vex|Space0F38|VexVVVV|VexWIG|CheckOperandSize|NoSuf|Optimize, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } --vpcmpestri, 0x6661, AVX|No64, Modrm|Vex|Space0F3A|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegXMM } --vpcmpestri, 0x6661, AVX|x64, Modrm|Vex|Space0F3A|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Imm8, Xmmword|Unspecified|BaseIndex|RegXMM, RegXMM } --vpcmpestrm, 0x6660, AVX|No64, Modrm|Vex|Space0F3A|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegXMM } --vpcmpestrm, 0x6660, AVX|x64, Modrm|Vex|Space0F3A|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Imm8, Xmmword|Unspecified|BaseIndex|RegXMM, RegXMM } -+vpcmpestri, 0x6661, AVX&No64, Modrm|Vex|Space0F3A|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegXMM } -+vpcmpestri, 0x6661, AVX&x64, Modrm|Vex|Space0F3A|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegXMM } -+vpcmpestrm, 0x6660, AVX&No64, Modrm|Vex|Space0F3A|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegXMM } -+vpcmpestrm, 0x6660, AVX&x64, Modrm|Vex|Space0F3A|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegXMM } - vpcmpgt, 0x6664 | , AVX|AVX2, Modrm|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf|Optimize, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vpcmpgtd, 0x6666, AVX|AVX2, Modrm|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf|Optimize, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vpcmpgtq, 0x6637, AVX|AVX2, Modrm|Vex|Space0F38|VexVVVV|VexWIG|CheckOperandSize|NoSuf|Optimize, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } -@@ -1605,7 +1641,7 @@ vpermilps, 0x660c, AVX|AVX512F, Modrm|Vex|EVexDYN|Masking|Space0F38|VexVVVV|VexW - vpermilps, 0x6604, AVX|AVX512F, Modrm|Vex|EVexDYN|Masking|Space0F3A|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf, { Imm8|Imm8S, RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - vpermilpd, 0x660d, AVX, Modrm|Vex|Space0F38|VexVVVV|VexW0|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vpermilpd, 0x6605, AVX, Modrm|Vex|Space0F3A|VexW0|CheckOperandSize|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM } --vpextr, 0x6616, AVX|, Modrm|Vex|Space0F3A||NoSuf, { Imm8, RegXMM, |Unspecified|BaseIndex } -+vpextr, 0x6616, AVX&, Modrm|Vex|Space0F3A||NoSuf, { Imm8, RegXMM, |Unspecified|BaseIndex } - vpextrw, 0x66c5, AVX, Load|Modrm|Vex|Space0F|VexWIG|No_bSuf|No_wSuf|No_sSuf, { Imm8, RegXMM, Reg32|Reg64 } - vpextr, 0x6614 | , AVX, RegMem|Vex|Space0F3A|VexWIG|NoSuf, { Imm8, RegXMM, Reg32|Reg64 } - vpextr, 0x6614 | , AVX, Modrm|Vex|Space0F3A|VexWIG|NoSuf, { Imm8, RegXMM, |Unspecified|BaseIndex } -@@ -1618,7 +1654,7 @@ vphsubsw, 0x6607, AVX|AVX2, Modrm|Vex|Space0F38|VexVVVV|VexWIG|CheckOperandSize| - vphsubw, 0x6605, AVX|AVX2, Modrm|Vex|Space0F38|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vpinsrb, 0x6620, AVX, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf, { Imm8, Reg32|Reg64, RegXMM, RegXMM } - vpinsrb, 0x6620, AVX, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf, { Imm8, Byte|Unspecified|BaseIndex, RegXMM, RegXMM } --vpinsr, 0x6622, AVX|, Modrm|Vex|Space0F3A|VexVVVV||NoSuf, { Imm8, |Unspecified|BaseIndex, RegXMM, RegXMM } -+vpinsr, 0x6622, AVX&, Modrm|Vex|Space0F3A|VexVVVV||NoSuf, { Imm8, |Unspecified|BaseIndex, RegXMM, RegXMM } - vpinsrw, 0x66c4, AVX, Modrm|Vex|Space0F|VexVVVV|VexWIG|No_bSuf|No_wSuf|No_sSuf, { Imm8, Reg32|Reg64, RegXMM, RegXMM } - vpinsrw, 0x66c4, AVX, Modrm|Vex|Space0F|VexVVVV|VexWIG|NoSuf, { Imm8, Word|Unspecified|BaseIndex, RegXMM, RegXMM } - vpmaddubsw, 0x6604, AVX|AVX2, Modrm|Vex|Space0F38|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } -@@ -1636,18 +1672,18 @@ vpminub, 0x66da, AVX|AVX2, Modrm|C|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|N - vpminud, 0x663b, AVX|AVX2, Modrm|Vex|Space0F38|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vpminuw, 0x663a, AVX|AVX2, Modrm|Vex|Space0F38|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vpmovmskb, 0x66d7, AVX|AVX2, Modrm|Vex|Space0F|VexWIG|No_bSuf|No_wSuf|No_sSuf, { RegXMM|RegYMM, Reg32|Reg64 } --vpmovsxbd, 0x6621, AVX|AVX512F|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegXMM } --vpmovsxbq, 0x6622, AVX|AVX512F|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=1|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegXMM } -+vpmovsxbd, 0x6621, AVX|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegXMM } -+vpmovsxbq, 0x6622, AVX|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=1|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegXMM } - vpmovsxbw, 0x6620, AVX, Modrm|Vex|Space0F38|VexWIG|NoSuf, { Qword|Unspecified|BaseIndex|RegXMM, RegXMM } - vpmovsxdq, 0x6625, AVX, Modrm|Vex|Space0F38|VexWIG|NoSuf, { Qword|Unspecified|BaseIndex|RegXMM, RegXMM } --vpmovsxwd, 0x6623, AVX|AVX512F|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } --vpmovsxwq, 0x6624, AVX|AVX512F|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegXMM } --vpmovzxbd, 0x6631, AVX|AVX512F|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegXMM } --vpmovzxbq, 0x6632, AVX|AVX512F|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=1|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegXMM } -+vpmovsxwd, 0x6623, AVX|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } -+vpmovsxwq, 0x6624, AVX|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegXMM } -+vpmovzxbd, 0x6631, AVX|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegXMM } -+vpmovzxbq, 0x6632, AVX|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=1|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegXMM } - vpmovzxbw, 0x6630, AVX, Modrm|Vex|Space0F38|VexWIG|NoSuf, { Qword|Unspecified|BaseIndex|RegXMM, RegXMM } - vpmovzxdq, 0x6635, AVX, Modrm|Vex|Space0F38|VexWIG|NoSuf, { Qword|Unspecified|BaseIndex|RegXMM, RegXMM } --vpmovzxwd, 0x6633, AVX|AVX512F|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } --vpmovzxwq, 0x6634, AVX|AVX512F|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegXMM } -+vpmovzxwd, 0x6633, AVX|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } -+vpmovzxwq, 0x6634, AVX|AVX512VL, Modrm|Vex128|EVex128|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegXMM } - vpmuldq, 0x6628, AVX|AVX2, Modrm|Vex|Space0F38|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vpmulhrsw, 0x660b, AVX|AVX2, Modrm|Vex|Space0F38|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } - vpmulhuw, 0x66e4, AVX|AVX2, Modrm|C|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } -@@ -1695,6 +1731,10 @@ vrcpps, 0x53, AVX, Modrm|Vex|Space0F|VexWIG|CheckOperandSize|NoSuf, { Unspecifie - vrcpss, 0xf353, AVX, Modrm|Vex=3|Space0F|VexVVVV|VexWIG|NoSuf, { Dword|Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } - vroundp, 0x6608 | , AVX, Modrm|Vex|Space0F3A|VexWIG|CheckOperandSize|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM } - vrounds, 0x660a | , AVX, Modrm|VexLIG|Space0F3A|VexVVVV|VexWIG|NoSuf, { Imm8, |Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } -+// These are really clones of VRNDSCALE{P,S}{S,D}, with broadcast, masking, SAE, -+// 512-bit operand size, and register sources dropped. -+vroundp, 0x6608 | , APX_F&AVX512VL, Modrm|Space0F3A||Disp8ShiftVL|CheckOperandSize|NoSuf, { Imm8, Xmmword|Ymmword|Unspecified|BaseIndex, RegXMM|RegYMM } -+vrounds, 0x660a | , APX_F&AVX512F, Modrm|EVexLIG|Space0F3A|VexVVVV||Disp8MemShift|NoSuf, { Imm8, |Unspecified|BaseIndex, RegXMM, RegXMM } - vrsqrtps, 0x52, AVX, Modrm|Vex|Space0F|VexWIG|CheckOperandSize|NoSuf, { Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM } - vrsqrtss, 0xf352, AVX, Modrm|Vex=3|Space0F|VexVVVV|VexWIG|NoSuf, { Dword|Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } - vshufp, 0xc6, AVX, Modrm|Vex|Space0F|VexVVVV|VexWIG|CheckOperandSize|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } -@@ -1714,22 +1754,24 @@ vzeroupper, 0x77, AVX, Vex|Space0F|VexWIG|NoSuf, {} - - // 256bit integer AVX2 instructions. - --vpmovsxbd, 0x6621, AVX2|AVX512F|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegYMM } --vpmovsxbq, 0x6622, AVX2|AVX512F|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } -+vpmovsxbd, 0x6621, AVX2|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegYMM } -+vpmovsxbq, 0x6622, AVX2|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } - vpmovsxbw, 0x6620, AVX2, Modrm|Vex=2|Space0F38|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegYMM } - vpmovsxdq, 0x6625, AVX2, Modrm|Vex=2|Space0F38|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegYMM } --vpmovsxwd, 0x6623, AVX2|AVX512F|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } --vpmovsxwq, 0x6624, AVX2|AVX512F|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegYMM } --vpmovzxbd, 0x6631, AVX2|AVX512F|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegYMM } --vpmovzxbq, 0x6632, AVX2|AVX512F|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } -+vpmovsxwd, 0x6623, AVX2|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } -+vpmovsxwq, 0x6624, AVX2|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegYMM } -+vpmovzxbd, 0x6631, AVX2|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegYMM } -+vpmovzxbq, 0x6632, AVX2|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } - vpmovzxbw, 0x6630, AVX2, Modrm|Vex=2|Space0F38|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegYMM } - vpmovzxdq, 0x6635, AVX2, Modrm|Vex=2|Space0F38|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegYMM } --vpmovzxwd, 0x6633, AVX2|AVX512F|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } --vpmovzxwq, 0x6634, AVX2|AVX512F|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegYMM } -+vpmovzxwd, 0x6633, AVX2|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } -+vpmovzxwq, 0x6634, AVX2|AVX512VL, Modrm|Vex256|EVex256|Masking|Space0F38|VexWIG|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegYMM } - - // New AVX2 instructions. - --vbroadcasti128, 0x665A, AVX2, Modrm|Vex=2|Space0F38|VexW=1|NoSuf, { Xmmword|Unspecified|BaseIndex, RegYMM } -+vbroadcasti128, 0x665A, AVX2, Modrm|Vex256|Space0F38|VexW0|NoSuf, { Xmmword|Unspecified|BaseIndex, RegYMM } -+// vbroadcasti32x4 in disguise (see vround{p,s}{s,d} comment) -+vbroadcasti128, 0x665a, APX_F&AVX512VL, Modrm|EVex256|Space0F38|VexW0|Disp8MemShift=4|NoSuf, { Xmmword|Unspecified|BaseIndex, RegYMM } - vbroadcastsd, 0x6619, AVX2, Modrm|Vex=2|Space0F38|VexW=1|NoSuf, { RegXMM, RegYMM } - vbroadcastss, 0x6618, AVX2|AVX512F, Modrm|Vex|EVexDYN|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - vpblendd, 0x6602, AVX2, Modrm|Vex|Space0F3A|VexVVVV|VexW0|CheckOperandSize|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } -@@ -1741,8 +1783,12 @@ vpermd, 0x6636, AVX2|AVX512F, Modrm|Vex256|EVexDYN|Masking|Space0F38|VexVVVV|Vex - vpermpd, 0x6601, AVX2|AVX512F, Modrm|Vex256|EVexDYN|Masking|Space0F3A|VexW1|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf, { Imm8|Imm8S, RegYMM|RegZMM|Qword|Unspecified|BaseIndex, RegYMM|RegZMM } - vpermps, 0x6616, AVX2|AVX512F, Modrm|Vex256|EVexDYN|Masking|Space0F38|VexVVVV|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegYMM|RegZMM|Dword|Unspecified|BaseIndex, RegYMM|RegZMM, RegYMM|RegZMM } - vpermq, 0x6600, AVX2|AVX512F, Modrm|Vex256|EVexDYN|Masking|Space0F3A|VexW1|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf, { Imm8|Imm8S, RegYMM|RegZMM|Qword|Unspecified|BaseIndex, RegYMM|RegZMM } --vextracti128, 0x6639, AVX2, Modrm|Vex=2|Space0F3A|VexW=1|NoSuf, { Imm8, RegYMM, Unspecified|BaseIndex|RegXMM } -+vextracti128, 0x6639, AVX2, Modrm|Vex256|Space0F3A|VexW0|NoSuf, { Imm8, RegYMM, Unspecified|BaseIndex|RegXMM } -+// vextracti32x4 in disguise (see vround{p,s}{s,d} comment) -+vextracti128, 0x6639, APX_F&AVX512VL, Modrm|EVex256|Space0F3A|VexW0|Disp8MemShift=4|NoSuf, { Imm8, RegYMM, Xmmword|Unspecified|BaseIndex } - vinserti128, 0x6638, AVX2, Modrm|Vex256|Space0F3A|VexVVVV|VexW0|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegYMM, RegYMM } -+// vinserti32x4 in disguise (see vround{p,s}{s,d} comment) -+vinserti128, 0x6638, APX_F&AVX512VL, Modrm|EVex256|Space0F3A|VexVVVV|VexW0|Disp8MemShift=4|NoSuf, { Imm8, Xmmword|Unspecified|BaseIndex, RegYMM, RegYMM } - vpmaskmov, 0x668e, AVX2, Modrm|Vex|Space0F38|VexVVVV||CheckOperandSize|NoSuf, { RegXMM|RegYMM, RegXMM|RegYMM, Xmmword|Ymmword|Unspecified|BaseIndex } - vpmaskmov, 0x668c, AVX2, Modrm|Vex|Space0F38|VexVVVV||CheckOperandSize|NoSuf, { Xmmword|Ymmword|Unspecified|BaseIndex, RegXMM|RegYMM, RegXMM|RegYMM } - vpsllv, 0x6647, AVX2|AVX512F, Modrm|Vex|EVexDYN|Masking|Space0F38|VexVVVV||Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM||Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -@@ -1765,26 +1811,26 @@ vpgatherqq, 0x6691, AVX2, Modrm|Vex256|Space0F38|VexVVVV|VexW1|SwapSources|NoSuf - - // AES + AVX - --vaesdec, 0x66de, AVX|AES, Modrm|Vex|Space0F38|VexVVVV|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } --vaesdeclast, 0x66df, AVX|AES, Modrm|Vex|Space0F38|VexVVVV|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } --vaesenc, 0x66dc, AVX|AES, Modrm|Vex|Space0F38|VexVVVV|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } --vaesenclast, 0x66dd, AVX|AES, Modrm|Vex|Space0F38|VexVVVV|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } --vaesimc, 0x66db, AVX|AES, Modrm|Vex|Space0F38|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegXMM } --vaeskeygenassist, 0x66df, AVX|AES, Modrm|Vex|Space0F3A|VexWIG|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegXMM } -+vaesdec, 0x66de, AVX&AES, Modrm|Vex|Space0F38|VexVVVV|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } -+vaesdeclast, 0x66df, AVX&AES, Modrm|Vex|Space0F38|VexVVVV|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } -+vaesenc, 0x66dc, AVX&AES, Modrm|Vex|Space0F38|VexVVVV|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } -+vaesenclast, 0x66dd, AVX&AES, Modrm|Vex|Space0F38|VexVVVV|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } -+vaesimc, 0x66db, AVX&AES, Modrm|Vex|Space0F38|VexWIG|NoSuf, { Unspecified|BaseIndex|RegXMM, RegXMM } -+vaeskeygenassist, 0x66df, AVX&AES, Modrm|Vex|Space0F3A|VexWIG|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM, RegXMM } - - // PCLMULQDQ + AVX - --vpclmulqdq, 0x6644, AVX|PCLMULQDQ, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } --vpclmullqlqdq, 0x6644/0x00, AVX|PCLMULQDQ, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf|ImmExt, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } --vpclmulhqlqdq, 0x6644/0x01, AVX|PCLMULQDQ, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf|ImmExt, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } --vpclmullqhqdq, 0x6644/0x10, AVX|PCLMULQDQ, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf|ImmExt, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } --vpclmulhqhqdq, 0x6644/0x11, AVX|PCLMULQDQ, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf|ImmExt, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } -+vpclmulqdq, 0x6644, AVX&PCLMULQDQ, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf, { Imm8|Imm8S, Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } -+vpclmullqlqdq, 0x6644/0x00, AVX&PCLMULQDQ, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf|ImmExt, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } -+vpclmulhqlqdq, 0x6644/0x01, AVX&PCLMULQDQ, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf|ImmExt, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } -+vpclmullqhqdq, 0x6644/0x10, AVX&PCLMULQDQ, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf|ImmExt, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } -+vpclmulhqhqdq, 0x6644/0x11, AVX&PCLMULQDQ, Modrm|Vex|Space0F3A|VexVVVV|VexWIG|NoSuf|ImmExt, { Unspecified|BaseIndex|RegXMM, RegXMM, RegXMM } - - // GFNI + AVX - --vgf2p8affineinvqb, 0x66cf, AVX|GFNI, Modrm|Vex|Space0F3A|VexVVVV|VexW1|CheckOperandSize|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } --vgf2p8affineqb, 0x66ce, AVX|GFNI, Modrm|Vex|Space0F3A|VexVVVV|VexW1|CheckOperandSize|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } --vgf2p8mulb, 0x66cf, GFNI|AVX|AVX512F, Modrm|Vex|EVexDYN|Masking|Space0F38|VexVVVV|VexW0|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vgf2p8affineinvqb, 0x66cf, AVX&GFNI, Modrm|Vex|Space0F3A|VexVVVV|VexW1|CheckOperandSize|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } -+vgf2p8affineqb, 0x66ce, AVX&GFNI, Modrm|Vex|Space0F3A|VexVVVV|VexW1|CheckOperandSize|NoSuf, { Imm8, Unspecified|BaseIndex|RegXMM|RegYMM, RegXMM|RegYMM, RegXMM|RegYMM } -+vgf2p8mulb, 0x66cf, GFNI&(AVX|AVX512F), Modrm|Vex|EVexDYN|Masking|Space0F38|VexVVVV|VexW0|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } - - // FSGSBASE, RDRND and F16C - -@@ -1803,8 +1849,8 @@ vcvtps2ph, 0x661d, F16C, Modrm|Vex=2|Space0F3A|VexW=1|NoSuf, { Imm8, RegYMM, Uns - - - - - vfmaddp, 0x6688 | 0x, , Modrm||Masking||VexVVVV||Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|StaticRounding|SAE, { RegXMM|RegYMM|RegZMM||Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -@@ -1831,14 +1877,14 @@ xtest, 0xf01d6, HLE|RTM, NoSuf, {} - - // BMI2 instructions. - --bzhi, 0xf5, BMI2, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|SwapSources|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64, Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } --mulx, 0xf2f6, BMI2, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64, Reg32|Reg64 } --pdep, 0xf2f5, BMI2, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64, Reg32|Reg64 } --pext, 0xf3f5, BMI2, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64, Reg32|Reg64 } --rorx, 0xf2f0, BMI2, Modrm|CheckOperandSize|Vex128|Space0F3A|No_bSuf|No_wSuf|No_sSuf, { Imm8|Imm8S, Reg32|Reg64|Dword|Qword|Unspecified|BaseIndex, Reg32|Reg64 } --sarx, 0xf3f7, BMI2, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|SwapSources|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64, Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } --shlx, 0x66f7, BMI2, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|SwapSources|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64, Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } --shrx, 0xf2f7, BMI2, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|SwapSources|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64, Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+bzhi, 0xf5, APX_F(BMI2), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|SwapSources|No_bSuf|No_wSuf|No_sSuf|NF, { Reg32|Reg64, Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+mulx, 0xf2f6, APX_F(BMI2), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64, Reg32|Reg64 } -+pdep, 0xf2f5, APX_F(BMI2), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64, Reg32|Reg64 } -+pext, 0xf3f5, APX_F(BMI2), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64, Reg32|Reg64 } -+rorx, 0xf2f0, APX_F(BMI2), Modrm|CheckOperandSize|Vex128|EVex128|Space0F3A|No_bSuf|No_wSuf|No_sSuf, { Imm8|Imm8S, Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+sarx, 0xf3f7, APX_F(BMI2), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|SwapSources|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64, Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+shlx, 0x66f7, APX_F(BMI2), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|SwapSources|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64, Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+shrx, 0xf2f7, APX_F(BMI2), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|SwapSources|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64, Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } - - // FMA4 instructions - -@@ -1908,12 +1954,13 @@ lwpins, 0x12/0, LWP, Modrm|SpaceXOP0A|NoSuf|VexVVVV|Vex, { Imm32|Imm32S, Reg32|U - - // BMI instructions - --andn, 0xf2, BMI, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64, Reg32|Reg64 } --bextr, 0xf7, BMI, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|SwapSources|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64, Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } --blsi, 0xf3/3, BMI, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } --blsmsk, 0xf3/2, BMI, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } --blsr, 0xf3/1, BMI, Modrm|CheckOperandSize|Vex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } --tzcnt, 0xf30fbc, BMI, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+andn, 0xf2, APX_F(BMI), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf|NF, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64, Reg32|Reg64 } -+bextr, 0xf7, APX_F(BMI), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|SwapSources|No_bSuf|No_wSuf|No_sSuf|NF, { Reg32|Reg64, Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+blsi, 0xf3/3, APX_F(BMI), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf|NF, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+blsmsk, 0xf3/2, APX_F(BMI), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf|NF, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+blsr, 0xf3/1, APX_F(BMI), Modrm|CheckOperandSize|Vex128|EVex128|Space0F38|VexVVVV|No_bSuf|No_wSuf|No_sSuf|NF, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+tzcnt, 0xf30fbc, BMI, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+tzcnt, 0xf4, BMI&APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|EVexMap4|NF, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } - - // TBM instructions - -@@ -1990,10 +2037,12 @@ insertq, 0xf20f79, SSE4a, Modrm|NoSuf, { RegXMM, RegXMM } - insertq, 0xf20f78, SSE4a, Modrm|NoSuf, { Imm8, Imm8, RegXMM, RegXMM } - - // LZCNT instruction --lzcnt, 0xf30fbd, LZCNT, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+lzcnt, 0xf30fbd, LZCNT, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+lzcnt, 0xf5, LZCNT&APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|EVexMap4|NF, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } - - // POPCNT instruction --popcnt, 0xf30fb8, POPCNT, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Word|Dword|Qword|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+popcnt, 0xf30fb8, POPCNT, Modrm|CheckOperandSize|No_bSuf|No_sSuf, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+popcnt, 0x88, POPCNT&APX_F, Modrm|CheckOperandSize|No_bSuf|No_sSuf|EVexMap4|NF, { Reg16|Reg32|Reg64|Unspecified|BaseIndex, Reg16|Reg32|Reg64 } - - // VIA PadLock extensions. - xstore-rng, 0xfa7c0, PadLock, NoSuf|RepPrefixOk, {} -@@ -2016,8 +2065,11 @@ xcryptofb, 0xf30fa7e8, PadLock, NoSuf|RepPrefixOk, {} - xstore, 0xfa7c0, PadLock, NoSuf|RepPrefixOk, {} - - // Multy-precision Add Carry, rdseed instructions. --adcx, 0x660f38f6, ADX, Modrm|CheckOperandSize|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } --adox, 0xf30f38f6, ADX, Modrm|CheckOperandSize|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+ -+adx, 0x66, ADX&APX_F, C|Modrm|CheckOperandSize|No_bSuf|No_wSuf|No_sSuf|DstVVVV|EVexMap4, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64, Reg32|Reg64 } -+adx, 0x0f38f6, ADX, Modrm|CheckOperandSize|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+adx, 0x66, ADX&APX_F, Modrm|CheckOperandSize|No_bSuf|No_wSuf|No_sSuf|EVexMap4, { Reg32|Reg64|Unspecified|BaseIndex, Reg32|Reg64 } -+ - rdseed, 0xfc7/7, RdSeed, Modrm|NoSuf, { Reg16|Reg32|Reg64 } - - // SMAP instructions. -@@ -2030,12 +2082,12 @@ bnd, 0xf2, MPX, NoSuf|IsPrefix, {} - // MPX instructions. - bndmk, 0xf30f1b, MPX, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex, RegBND } - bndmov, 0x660f1a, MPX, D|Modrm|NoSuf, { Xmmword|Unspecified|BaseIndex|RegBND, RegBND } --bndcl, 0xf30f1a, MPX|No64, Modrm|Anysize|IgnoreSize|NoSuf, { Reg32|BaseIndex, RegBND } --bndcl, 0xf30f1a, MPX|x64, Modrm|Anysize|IgnoreSize|NoSuf|NoRex64, { Reg64|BaseIndex, RegBND } --bndcu, 0xf20f1a, MPX|No64, Modrm|Anysize|IgnoreSize|NoSuf, { Reg32|BaseIndex, RegBND } --bndcu, 0xf20f1a, MPX|x64, Modrm|Anysize|IgnoreSize|NoSuf|NoRex64, { Reg64|BaseIndex, RegBND } --bndcn, 0xf20f1b, MPX|No64, Modrm|Anysize|IgnoreSize|NoSuf, { Reg32|BaseIndex, RegBND } --bndcn, 0xf20f1b, MPX|x64, Modrm|Anysize|IgnoreSize|NoSuf|NoRex64, { Reg64|BaseIndex, RegBND } -+bndcl, 0xf30f1a, MPX&No64, Modrm|Anysize|IgnoreSize|NoSuf, { Reg32|BaseIndex, RegBND } -+bndcl, 0xf30f1a, MPX&x64, Modrm|Anysize|IgnoreSize|NoSuf|NoRex64, { Reg64|BaseIndex, RegBND } -+bndcu, 0xf20f1a, MPX&No64, Modrm|Anysize|IgnoreSize|NoSuf, { Reg32|BaseIndex, RegBND } -+bndcu, 0xf20f1a, MPX&x64, Modrm|Anysize|IgnoreSize|NoSuf|NoRex64, { Reg64|BaseIndex, RegBND } -+bndcn, 0xf20f1b, MPX&No64, Modrm|Anysize|IgnoreSize|NoSuf, { Reg32|BaseIndex, RegBND } -+bndcn, 0xf20f1b, MPX&x64, Modrm|Anysize|IgnoreSize|NoSuf|NoRex64, { Reg64|BaseIndex, RegBND } - bndstx, 0x0f1b, MPX, Modrm|Anysize|IgnoreSize|NoSuf, { RegBND, BaseIndex } - bndldx, 0x0f1a, MPX, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex, RegBND } - -@@ -2073,26 +2125,29 @@ vsm4rnds4, 0xf2da, SM4, Modrm|Space0F38|Vex|VexVVVV|VexW0|CheckOperandSize|NoSuf - - // VAES - --vaesdec, 0x66de, VAES|AVX|AVX512F, Modrm|Vex|EVexDYN|Space0F38|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } --vaesdeclast, 0x66df, VAES|AVX|AVX512F, Modrm|Vex|EVexDYN|Space0F38|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } --vaesenc, 0x66dc, VAES|AVX|AVX512F, Modrm|Vex|EVexDYN|Space0F38|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } --vaesenclast, 0x66dd, VAES|AVX|AVX512F, Modrm|Vex|EVexDYN|Space0F38|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vaesdec, 0x66de, VAES&(AVX|AVX512F), Modrm|Vex|EVexDYN|Space0F38|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vaesdeclast, 0x66df, VAES&(AVX|AVX512F), Modrm|Vex|EVexDYN|Space0F38|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vaesenc, 0x66dc, VAES&(AVX|AVX512F), Modrm|Vex|EVexDYN|Space0F38|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vaesenclast, 0x66dd, VAES&(AVX|AVX512F), Modrm|Vex|EVexDYN|Space0F38|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } - - // VAES instructions end - - // VPCLMULQDQ instructions - --vpclmulqdq, 0x6644, VPCLMULQDQ|AVX|AVX512F, Modrm|Space0F3A|Vex|EVexDYN|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf, { Imm8|Imm8S, RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } --vpclmullqlqdq, 0x6644/0x00, VPCLMULQDQ|AVX|AVX512F, Modrm|Space0F3A|Vex|EVexDYN|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf|ImmExt, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } --vpclmulhqlqdq, 0x6644/0x01, VPCLMULQDQ|AVX|AVX512F, Modrm|Space0F3A|Vex|EVexDYN|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf|ImmExt, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } --vpclmullqhqdq, 0x6644/0x10, VPCLMULQDQ|AVX|AVX512F, Modrm|Space0F3A|Vex|EVexDYN|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf|ImmExt, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } --vpclmulhqhqdq, 0x6644/0x11, VPCLMULQDQ|AVX|AVX512F, Modrm|Space0F3A|Vex|EVexDYN|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf|ImmExt, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vpclmulqdq, 0x6644, VPCLMULQDQ&(AVX|AVX512F), Modrm|Space0F3A|Vex|EVexDYN|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf, { Imm8|Imm8S, RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vpclmullqlqdq, 0x6644/0x00, VPCLMULQDQ&(AVX|AVX512F), Modrm|Space0F3A|Vex|EVexDYN|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf|ImmExt, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vpclmulhqlqdq, 0x6644/0x01, VPCLMULQDQ&(AVX|AVX512F), Modrm|Space0F3A|Vex|EVexDYN|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf|ImmExt, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vpclmullqhqdq, 0x6644/0x10, VPCLMULQDQ&(AVX|AVX512F), Modrm|Space0F3A|Vex|EVexDYN|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf|ImmExt, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vpclmulhqhqdq, 0x6644/0x11, VPCLMULQDQ&(AVX|AVX512F), Modrm|Space0F3A|Vex|EVexDYN|VexWIG|VexVVVV|Disp8ShiftVL|CheckOperandSize|NoSuf|ImmExt, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } - - // VPCLMULQDQ instructions end - - // AVX512F instructions. - - // is used for EVEX instructions with x/y suffixes. -+// NOTE: The order of the "unnamed" ($-prefixed) entries here needs to remain -+// in sync with , for match_template()'s EVEX-to-VEX lowering to -+// continue to work. - , 0x45, , Modrm|Vex256|Space0F|VexVVVV|VexW0|NoSuf, { R - kxnor, 0x46, , Modrm|Vex256|Space0F|VexVVVV|VexW0|NoSuf, { RegMask, RegMask, RegMask } - kxor, 0x47, , Modrm|Vex256|Space0F|VexVVVV|VexW0|NoSuf, { RegMask, RegMask, RegMask } - --kmov, 0x90, , Modrm|Vex128|Space0F|VexW0|NoSuf, { RegMask||Unspecified|BaseIndex, RegMask } --kmov, 0x91, , Modrm|Vex128|Space0F|VexW0|NoSuf, { RegMask, |Unspecified|BaseIndex } --kmov, 0x92, , D|Modrm|Vex128|Space0F|VexW0|NoSuf, { Reg32, RegMask } -+kmov, 0x90, APX_F(), Modrm|Vex128|EVex128|Space0F|VexW0|NoSuf, { RegMask||Unspecified|BaseIndex, RegMask } -+kmov, 0x91, APX_F(), Modrm|Vex128|EVex128|Space0F|VexW0|NoSuf, { RegMask, |Unspecified|BaseIndex } -+kmov, 0x92, APX_F(), D|Modrm|Vex128|EVex128|Space0F|VexW0|NoSuf, { Reg32, RegMask } - - knot, 0x44, , Modrm|Vex128|Space0F|VexW0|NoSuf, { RegMask, RegMask } - kortest, 0x98, , Modrm|Vex128|Space0F|VexW0|NoSuf, { RegMask, RegMask } -@@ -2188,11 +2243,11 @@ vcvtudq2pd, 0xF37A, AVX512F, Modrm|EVex=1|Masking|Space0F|VexW=1|Broadcast|Disp8 - vcvtdq2ps, 0x5B, AVX512F, Modrm|Masking|Space0F|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|StaticRounding|SAE, { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - vcvtps2udq, 0x79, AVX512F, Modrm|Masking|Space0F|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|StaticRounding|SAE, { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - --vcvtpd2dq, 0xf2e6, AVX512F|, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } -+vcvtpd2dq, 0xf2e6, AVX512F&, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } - --vcvtpd2ps, 0x665a, AVX512F|, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } -+vcvtpd2ps, 0x665a, AVX512F&, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } - --vcvtpd2udq, 0x79, AVX512F|, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } -+vcvtpd2udq, 0x79, AVX512F&, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } - - vcvtph2ps, 0x6613, AVX512F, Modrm|EVex512|Masking|Space0F38|VexW0|Disp8MemShift=5|NoSuf|SAE, { RegYMM|Unspecified|BaseIndex, RegZMM } - -@@ -2223,8 +2278,8 @@ vcvtusi2ss, 0xF37B, AVX512F, Modrm|EVexLIG|Space0F|VexVVVV|Disp8ShiftVL|No_bSuf| - - vcvtss2sd, 0xF35A, AVX512F, Modrm|EVexLIG|Masking|Space0F|VexVVVV|VexW0|Disp8MemShift=2|NoSuf|SAE, { RegXMM|Dword|Unspecified|BaseIndex, RegXMM, RegXMM } - --vcvttpd2dq, 0x66e6, AVX512F|, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } --vcvttpd2udq, 0x78, AVX512F|, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } -+vcvttpd2dq, 0x66e6, AVX512F&, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } -+vcvttpd2udq, 0x78, AVX512F&, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } - - vcvttps2dq, 0xF35B, AVX512F, Modrm|Masking|Space0F|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|SAE, { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - vcvttps2udq, 0x78, AVX512F, Modrm|Masking|Space0F|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|SAE, { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } -@@ -2272,8 +2327,8 @@ vmovntdqa, 0x662A, AVX512F, Modrm|Space0F38|VexW=1|Disp8ShiftVL|CheckOperandSize - vgetexpp, 0x6642, , Modrm|Masking|||Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|SAE, { RegXMM|RegYMM|RegZMM||Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - vgetexps, 0x6643, , Modrm|EVexLIG|Masking||VexVVVV||Disp8MemShift|NoSuf|SAE, { RegXMM||Unspecified|BaseIndex, RegXMM, RegXMM } - --vinsertf32x4, 0x6618, AVX512F, Modrm|Masking|Space0F3A|VexVVVV|VexW0|Disp8MemShift=4|CheckOperandSize|NoSuf, { Imm8, RegXMM|XMMword|Unspecified|BaseIndex, RegYMM|RegZMM, RegYMM|RegZMM } --vinserti32x4, 0x6638, AVX512F, Modrm|Masking|Space0F3A|VexVVVV|VexW0|Disp8MemShift=4|CheckOperandSize|NoSuf, { Imm8, RegXMM|XMMword|Unspecified|BaseIndex, RegYMM|RegZMM, RegYMM|RegZMM } -+vinsertf32x4, 0x6618, AVX512F, Modrm|Masking|Space0F3A|VexVVVV|VexW0|Disp8MemShift=4|CheckOperandSize|NoSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegYMM|RegZMM, RegYMM|RegZMM } -+vinserti32x4, 0x6638, AVX512F, Modrm|Masking|Space0F3A|VexVVVV|VexW0|Disp8MemShift=4|CheckOperandSize|NoSuf, { Imm8, RegXMM|Unspecified|BaseIndex, RegYMM|RegZMM, RegYMM|RegZMM } - - vinsertf64x4, 0x661A, AVX512F, Modrm|EVex=1|Masking|Space0F3A|VexVVVV|VexW1|Disp8MemShift=5|NoSuf, { Imm8, RegYMM|Unspecified|BaseIndex, RegZMM, RegZMM } - vinserti64x4, 0x663A, AVX512F, Modrm|EVex=1|Masking|Space0F3A|VexVVVV|VexW1|Disp8MemShift=5|NoSuf, { Imm8, RegYMM|Unspecified|BaseIndex, RegZMM, RegZMM } -@@ -2470,17 +2525,17 @@ clflushopt, 0x660fae/7, ClflushOpt, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex - - // XSAVES/XRSTORS instructions. - --xrstors, 0xfc7/3, XSAVES, Modrm|NoSuf, { Unspecified|BaseIndex } --xrstors64, 0xfc7/3, XSAVES|x64, Modrm|NoSuf|Size64, { Unspecified|BaseIndex } --xsaves, 0xfc7/5, XSAVES, Modrm|NoSuf, { Unspecified|BaseIndex } --xsaves64, 0xfc7/5, XSAVES|x64, Modrm|NoSuf|Size64, { Unspecified|BaseIndex } -+xrstors, 0xfc7/3, XSAVES, Modrm|NoSuf|NoEgpr, { Unspecified|BaseIndex } -+xrstors64, 0xfc7/3, XSAVES&x64, Modrm|NoSuf|Size64|NoEgpr, { Unspecified|BaseIndex } -+xsaves, 0xfc7/5, XSAVES, Modrm|NoSuf|NoEgpr, { Unspecified|BaseIndex } -+xsaves64, 0xfc7/5, XSAVES&x64, Modrm|NoSuf|Size64|NoEgpr, { Unspecified|BaseIndex } - - // XSAVES instructions end. - - // XSAVEC instructions. - --xsavec, 0xfc7/4, XSAVEC, Modrm|NoSuf, { Unspecified|BaseIndex } --xsavec64, 0xfc7/4, XSAVEC|x64, Modrm|NoSuf|Size64, { Unspecified|BaseIndex } -+xsavec, 0xfc7/4, XSAVEC, Modrm|NoSuf|NoEgpr, { Unspecified|BaseIndex } -+xsavec64, 0xfc7/4, XSAVEC&x64, Modrm|NoSuf|Size64|NoEgpr, { Unspecified|BaseIndex } - - // XSAVEC instructions end. - -@@ -2494,108 +2549,108 @@ enclv, 0xf01c0, SE1, NoSuf, {} - - // AVX512VL instructions. - --vgatherdpd, 0x6692, AVX512F|AVX512VL, Modrm|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB128|NoSuf, { Qword|Unspecified|BaseIndex, RegXMM|RegYMM } --vgatherdps, 0x6692, AVX512F|AVX512VL, Modrm|EVex=2|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB128|NoSuf, { Dword|Unspecified|BaseIndex, RegXMM } --vgatherdps, 0x6692, AVX512F|AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { Dword|Unspecified|BaseIndex, RegYMM } --vgatherqp, 0x6693, AVX512F|AVX512VL, Modrm|EVex128|Masking|NoDefMask|Space0F38||Disp8MemShift|VecSIB128|NoSuf, { |Unspecified|BaseIndex, RegXMM } --vgatherqpd, 0x6693, AVX512F|AVX512VL, Modrm|EVex256|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB256|NoSuf, { Qword|Unspecified|BaseIndex, RegYMM } --vgatherqps, 0x6693, AVX512F|AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { Dword|Unspecified|BaseIndex, RegXMM } --vpgatherdd, 0x6690, AVX512F|AVX512VL, Modrm|EVex=2|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB128|NoSuf, { Dword|Unspecified|BaseIndex, RegXMM } --vpgatherdd, 0x6690, AVX512F|AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { Dword|Unspecified|BaseIndex, RegYMM } --vpgatherdq, 0x6690, AVX512F|AVX512VL, Modrm|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB128|NoSuf, { Qword|Unspecified|BaseIndex, RegXMM|RegYMM } --vpgatherq, 0x6691, AVX512F|AVX512VL, Modrm|EVex128|Masking|NoDefMask|Space0F38||Disp8MemShift|VecSIB128|NoSuf, { |Unspecified|BaseIndex, RegXMM } --vpgatherqd, 0x6691, AVX512F|AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { Dword|Unspecified|BaseIndex, RegXMM } --vpgatherqq, 0x6691, AVX512F|AVX512VL, Modrm|EVex256|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB256|NoSuf, { Qword|Unspecified|BaseIndex, RegYMM } -- --vpscatterdd, 0x66A0, AVX512F|AVX512VL, Modrm|EVex=2|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB128|NoSuf, { RegXMM, Dword|Unspecified|BaseIndex } --vpscatterdd, 0x66A0, AVX512F|AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { RegYMM, Dword|Unspecified|BaseIndex } --vpscatterdq, 0x66A0, AVX512F|AVX512VL, Modrm|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB128|NoSuf, { RegXMM|RegYMM, Qword|Unspecified|BaseIndex } --vpscatterq, 0x66A1, AVX512F|AVX512VL, Modrm|EVex128|Masking|NoDefMask|Space0F38||Disp8MemShift|VecSIB128|NoSuf, { RegXMM, |Unspecified|BaseIndex } --vpscatterqd, 0x66A1, AVX512F|AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { RegXMM, Dword|Unspecified|BaseIndex } --vpscatterqq, 0x66A1, AVX512F|AVX512VL, Modrm|EVex256|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB256|NoSuf, { RegYMM, Qword|Unspecified|BaseIndex } --vscatterdpd, 0x66A2, AVX512F|AVX512VL, Modrm|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB128|NoSuf, { RegXMM|RegYMM, Qword|Unspecified|BaseIndex } --vscatterdps, 0x66A2, AVX512F|AVX512VL, Modrm|EVex=2|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB128|NoSuf, { RegXMM, Dword|Unspecified|BaseIndex } --vscatterdps, 0x66A2, AVX512F|AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { RegYMM, Dword|Unspecified|BaseIndex } --vscatterqp, 0x66A3, AVX512F|AVX512VL, Modrm|EVex128|Masking|NoDefMask|Space0F38||Disp8MemShift|VecSIB128|NoSuf, { RegXMM, |Unspecified|BaseIndex } --vscatterqpd, 0x66A3, AVX512F|AVX512VL, Modrm|EVex256|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB256|NoSuf, { RegYMM, Qword|Unspecified|BaseIndex } --vscatterqps, 0x66A3, AVX512F|AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { RegXMM, Dword|Unspecified|BaseIndex } -- --vcvtdq2pd, 0xF3E6, AVX512F|AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } --vcvtdq2pd, 0xF3E6, AVX512F|AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } --vcvtudq2pd, 0xF37A, AVX512F|AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } --vcvtudq2pd, 0xF37A, AVX512F|AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } -- --vcvtph2ps, 0x6613, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } --vcvtph2ps, 0x6613, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } -- --vcvtps2pd, 0x5A, AVX512F|AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } --vcvtps2pd, 0x5A, AVX512F|AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } -- --vcvtps2ph, 0x661D, AVX512F|AVX512VL, Modrm|EVex128|Masking|Space0F3A|VexW0|Disp8MemShift=3|NoSuf, { Imm8, RegXMM, RegXMM|Qword|Unspecified|BaseIndex } --vcvtps2ph, 0x661D, AVX512F|AVX512VL, Modrm|EVex256|Masking|Space0F3A|VexW0|Disp8MemShift=4|NoSuf, { Imm8, RegYMM, RegXMM|Unspecified|BaseIndex } -- --vmovddup, 0xF212, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F|VexW1|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } -- --vpmovdb, 0xF331, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } --vpmovdb, 0xF331, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovsdb, 0xF321, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } --vpmovsdb, 0xF321, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovusdb, 0xF311, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } --vpmovusdb, 0xF311, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } -- --vpmovdw, 0xF333, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovdw, 0xF333, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } --vpmovsdw, 0xF323, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovsdw, 0xF323, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } --vpmovusdw, 0xF313, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovusdw, 0xF313, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } -- --vpmovqb, 0xF332, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=1|NoSuf, { RegXMM, RegXMM|Word|Unspecified|BaseIndex } --vpmovqb, 0xF332, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegYMM, RegXMM|Dword|Unspecified|BaseIndex } --vpmovsqb, 0xF322, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=1|NoSuf, { RegXMM, RegXMM|Word|Unspecified|BaseIndex } --vpmovsqb, 0xF322, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegYMM, RegXMM|Dword|Unspecified|BaseIndex } --vpmovusqb, 0xF312, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=1|NoSuf, { RegXMM, RegXMM|Word|Unspecified|BaseIndex } --vpmovusqb, 0xF312, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegYMM, RegXMM|Dword|Unspecified|BaseIndex } -- --vpmovqd, 0xF335, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovqd, 0xF335, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } --vpmovsqd, 0xF325, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovsqd, 0xF325, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } --vpmovusqd, 0xF315, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovusqd, 0xF315, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } -- --vpmovqw, 0xF334, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } --vpmovqw, 0xF334, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovsqw, 0xF324, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } --vpmovsqw, 0xF324, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovusqw, 0xF314, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } --vpmovusqw, 0xF314, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } -- --vpmovsxdq, 0x6625, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } --vpmovsxdq, 0x6625, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } --vpmovzxdq, 0x6635, AVX512F|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } --vpmovzxdq, 0x6635, AVX512F|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } -+vgatherdpd, 0x6692, AVX512VL, Modrm|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB128|NoSuf, { Qword|Unspecified|BaseIndex, RegXMM|RegYMM } -+vgatherdps, 0x6692, AVX512VL, Modrm|EVex=2|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB128|NoSuf, { Dword|Unspecified|BaseIndex, RegXMM } -+vgatherdps, 0x6692, AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { Dword|Unspecified|BaseIndex, RegYMM } -+vgatherqp, 0x6693, AVX512VL, Modrm|EVex128|Masking|NoDefMask|Space0F38||Disp8MemShift|VecSIB128|NoSuf, { |Unspecified|BaseIndex, RegXMM } -+vgatherqpd, 0x6693, AVX512VL, Modrm|EVex256|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB256|NoSuf, { Qword|Unspecified|BaseIndex, RegYMM } -+vgatherqps, 0x6693, AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { Dword|Unspecified|BaseIndex, RegXMM } -+vpgatherdd, 0x6690, AVX512VL, Modrm|EVex=2|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB128|NoSuf, { Dword|Unspecified|BaseIndex, RegXMM } -+vpgatherdd, 0x6690, AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { Dword|Unspecified|BaseIndex, RegYMM } -+vpgatherdq, 0x6690, AVX512VL, Modrm|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB128|NoSuf, { Qword|Unspecified|BaseIndex, RegXMM|RegYMM } -+vpgatherq, 0x6691, AVX512VL, Modrm|EVex128|Masking|NoDefMask|Space0F38||Disp8MemShift|VecSIB128|NoSuf, { |Unspecified|BaseIndex, RegXMM } -+vpgatherqd, 0x6691, AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { Dword|Unspecified|BaseIndex, RegXMM } -+vpgatherqq, 0x6691, AVX512VL, Modrm|EVex256|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB256|NoSuf, { Qword|Unspecified|BaseIndex, RegYMM } -+ -+vpscatterdd, 0x66A0, AVX512VL, Modrm|EVex=2|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB128|NoSuf, { RegXMM, Dword|Unspecified|BaseIndex } -+vpscatterdd, 0x66A0, AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { RegYMM, Dword|Unspecified|BaseIndex } -+vpscatterdq, 0x66A0, AVX512VL, Modrm|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB128|NoSuf, { RegXMM|RegYMM, Qword|Unspecified|BaseIndex } -+vpscatterq, 0x66A1, AVX512VL, Modrm|EVex128|Masking|NoDefMask|Space0F38||Disp8MemShift|VecSIB128|NoSuf, { RegXMM, |Unspecified|BaseIndex } -+vpscatterqd, 0x66A1, AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { RegXMM, Dword|Unspecified|BaseIndex } -+vpscatterqq, 0x66A1, AVX512VL, Modrm|EVex256|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB256|NoSuf, { RegYMM, Qword|Unspecified|BaseIndex } -+vscatterdpd, 0x66A2, AVX512VL, Modrm|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB128|NoSuf, { RegXMM|RegYMM, Qword|Unspecified|BaseIndex } -+vscatterdps, 0x66A2, AVX512VL, Modrm|EVex=2|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB128|NoSuf, { RegXMM, Dword|Unspecified|BaseIndex } -+vscatterdps, 0x66A2, AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { RegYMM, Dword|Unspecified|BaseIndex } -+vscatterqp, 0x66A3, AVX512VL, Modrm|EVex128|Masking|NoDefMask|Space0F38||Disp8MemShift|VecSIB128|NoSuf, { RegXMM, |Unspecified|BaseIndex } -+vscatterqpd, 0x66A3, AVX512VL, Modrm|EVex256|Masking|NoDefMask|Space0F38|VexW1|Disp8MemShift=3|VecSIB256|NoSuf, { RegYMM, Qword|Unspecified|BaseIndex } -+vscatterqps, 0x66A3, AVX512VL, Modrm|EVex=3|Masking|NoDefMask|Space0F38|VexW0|Disp8MemShift=2|VecSIB256|NoSuf, { RegXMM, Dword|Unspecified|BaseIndex } -+ -+vcvtdq2pd, 0xF3E6, AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } -+vcvtdq2pd, 0xF3E6, AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } -+vcvtudq2pd, 0xF37A, AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } -+vcvtudq2pd, 0xF37A, AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } -+ -+vcvtph2ps, 0x6613, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } -+vcvtph2ps, 0x6613, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } -+ -+vcvtps2pd, 0x5A, AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } -+vcvtps2pd, 0x5A, AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } -+ -+vcvtps2ph, 0x661D, AVX512VL, Modrm|EVex128|Masking|Space0F3A|VexW0|Disp8MemShift=3|NoSuf, { Imm8, RegXMM, RegXMM|Qword|Unspecified|BaseIndex } -+vcvtps2ph, 0x661D, AVX512VL, Modrm|EVex256|Masking|Space0F3A|VexW0|Disp8MemShift=4|NoSuf, { Imm8, RegYMM, RegXMM|Unspecified|BaseIndex } -+ -+vmovddup, 0xF212, AVX512VL, Modrm|EVex=2|Masking|Space0F|VexW1|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } -+ -+vpmovdb, 0xF331, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } -+vpmovdb, 0xF331, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovsdb, 0xF321, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } -+vpmovsdb, 0xF321, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovusdb, 0xF311, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } -+vpmovusdb, 0xF311, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } -+ -+vpmovdw, 0xF333, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovdw, 0xF333, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } -+vpmovsdw, 0xF323, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovsdw, 0xF323, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } -+vpmovusdw, 0xF313, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovusdw, 0xF313, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } -+ -+vpmovqb, 0xF332, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=1|NoSuf, { RegXMM, RegXMM|Word|Unspecified|BaseIndex } -+vpmovqb, 0xF332, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegYMM, RegXMM|Dword|Unspecified|BaseIndex } -+vpmovsqb, 0xF322, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=1|NoSuf, { RegXMM, RegXMM|Word|Unspecified|BaseIndex } -+vpmovsqb, 0xF322, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegYMM, RegXMM|Dword|Unspecified|BaseIndex } -+vpmovusqb, 0xF312, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=1|NoSuf, { RegXMM, RegXMM|Word|Unspecified|BaseIndex } -+vpmovusqb, 0xF312, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegYMM, RegXMM|Dword|Unspecified|BaseIndex } -+ -+vpmovqd, 0xF335, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovqd, 0xF335, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } -+vpmovsqd, 0xF325, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovsqd, 0xF325, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } -+vpmovusqd, 0xF315, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovusqd, 0xF315, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } -+ -+vpmovqw, 0xF334, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } -+vpmovqw, 0xF334, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovsqw, 0xF324, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } -+vpmovsqw, 0xF324, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovusqw, 0xF314, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=2|NoSuf, { RegXMM, RegXMM|Dword|Unspecified|BaseIndex } -+vpmovusqw, 0xF314, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegYMM, RegXMM|Qword|Unspecified|BaseIndex } -+ -+vpmovsxdq, 0x6625, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } -+vpmovsxdq, 0x6625, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } -+vpmovzxdq, 0x6635, AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } -+vpmovzxdq, 0x6635, AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } - - // AVX512VL instructions end. - - // AVX512BW instructions. - --kadd, 0x4a, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1||NoSuf, { RegMask, RegMask, RegMask } --kand, 0x41, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1||NoSuf, { RegMask, RegMask, RegMask } --kandn, 0x42, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1||NoSuf|Optimize, { RegMask, RegMask, RegMask } --kmov, 0x90, AVX512BW, Modrm|Vex128|Space0F|VexW1||NoSuf, { RegMask||Unspecified|BaseIndex, RegMask } --kmov, 0x91, AVX512BW, Modrm|Vex128|Space0F|VexW1||NoSuf, { RegMask, |Unspecified|BaseIndex } --kmov, 0xf292, AVX512BW, D|Modrm|Vex128|Space0F|||NoSuf, { , RegMask } --knot, 0x44, AVX512BW, Modrm|Vex128|Space0F|VexW1||NoSuf, { RegMask, RegMask } --kor, 0x45, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1||NoSuf, { RegMask, RegMask, RegMask } --kortest, 0x98, AVX512BW, Modrm|Vex128|Space0F|VexW1||NoSuf, { RegMask, RegMask } --ktest, 0x99, AVX512BW, Modrm|Vex128|Space0F|VexW1||NoSuf, { RegMask, RegMask } --kxnor, 0x46, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1||NoSuf, { RegMask, RegMask, RegMask } --kxor, 0x47, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1||NoSuf|Optimize, { RegMask, RegMask, RegMask } --kunpckdq, 0x4B, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1|Vsz512|NoSuf, { RegMask, RegMask, RegMask } --kunpckwd, 0x4B, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW0|Vsz256|NoSuf, { RegMask, RegMask, RegMask } --kshiftl, 0x6633, AVX512BW, Modrm|Vex128|Space0F3A|||NoSuf, { Imm8, RegMask, RegMask } --kshiftr, 0x6631, AVX512BW, Modrm|Vex128|Space0F3A|||NoSuf, { Imm8, RegMask, RegMask } -+kadd, 0x4a, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1|NoSuf, { RegMask, RegMask, RegMask } -+kand, 0x41, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1|NoSuf, { RegMask, RegMask, RegMask } -+kandn, 0x42, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1|NoSuf|Optimize, { RegMask, RegMask, RegMask } -+kmov, 0x90, APX_F(AVX512BW), Modrm|Vex128|EVex128|Space0F|VexW1|NoSuf, { RegMask||Unspecified|BaseIndex, RegMask } -+kmov, 0x91, APX_F(AVX512BW), Modrm|Vex128|EVex128|Space0F|VexW1|NoSuf, { RegMask, |Unspecified|BaseIndex } -+kmov, 0xf292, APX_F(AVX512BW), D|Modrm|Vex128|EVex128|Space0F||NoSuf, { , RegMask } -+knot, 0x44, AVX512BW, Modrm|Vex128|Space0F|VexW1|NoSuf, { RegMask, RegMask } -+kor, 0x45, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1|NoSuf, { RegMask, RegMask, RegMask } -+kortest, 0x98, AVX512BW, Modrm|Vex128|Space0F|VexW1|NoSuf, { RegMask, RegMask } -+ktest, 0x99, AVX512BW, Modrm|Vex128|Space0F|VexW1|NoSuf, { RegMask, RegMask } -+kxnor, 0x46, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1|NoSuf, { RegMask, RegMask, RegMask } -+kxor, 0x47, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1|NoSuf|Optimize, { RegMask, RegMask, RegMask } -+kunpckdq, 0x4B, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW1|NoSuf, { RegMask, RegMask, RegMask } -+kunpckwd, 0x4B, AVX512BW, Modrm|Vex256|Space0F|VexVVVV|VexW0|NoSuf, { RegMask, RegMask, RegMask } -+kshiftl, 0x6633, AVX512BW, Modrm|Vex128|Space0F3A||NoSuf, { Imm8, RegMask, RegMask } -+kshiftr, 0x6631, AVX512BW, Modrm|Vex128|Space0F3A||NoSuf, { Imm8, RegMask, RegMask } - - vdbpsadbw, 0x6642, AVX512BW, Modrm|Masking|Space0F3A|VexVVVV|VexW0|Disp8ShiftVL|CheckOperandSize|NoSuf, { Imm8|Imm8S, RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } - -@@ -2681,23 +2736,23 @@ vpmov2m, 0xf329, AVX512BW, Modrm|EVexDYN|Space0F38||NoSuf, { RegXMM - vpmovm2, 0xf328, AVX512BW, Modrm|EVexDYN|Space0F38||NoSuf, { RegMask, RegXMM|RegYMM|RegZMM } - - vpmovswb, 0xF320, AVX512BW, Modrm|EVex=1|Masking|Space0F38|VexW=1|Disp8MemShift=5|NoSuf, { RegZMM, RegYMM|Unspecified|BaseIndex } --vpmovswb, 0xF320, AVX512BW|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovswb, 0xF320, AVX512BW|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } -+vpmovswb, 0xF320, AVX512BW&AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovswb, 0xF320, AVX512BW&AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } - - vpmovuswb, 0xF310, AVX512BW, Modrm|EVex=1|Masking|Space0F38|VexW=1|Disp8MemShift=5|NoSuf, { RegZMM, RegYMM|Unspecified|BaseIndex } --vpmovuswb, 0xF310, AVX512BW|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovuswb, 0xF310, AVX512BW|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } -+vpmovuswb, 0xF310, AVX512BW&AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovuswb, 0xF310, AVX512BW&AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } - - vpmovwb, 0xF330, AVX512BW, Modrm|EVex=1|Masking|Space0F38|VexW=1|Disp8MemShift=5|NoSuf, { RegZMM, RegYMM|Unspecified|BaseIndex } --vpmovwb, 0xF330, AVX512BW|AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } --vpmovwb, 0xF330, AVX512BW|AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } -+vpmovwb, 0xF330, AVX512BW&AVX512VL, Modrm|EVex=2|Masking|Space0F38|VexW0|Disp8MemShift=3|NoSuf, { RegXMM, RegXMM|Qword|Unspecified|BaseIndex } -+vpmovwb, 0xF330, AVX512BW&AVX512VL, Modrm|EVex=3|Masking|Space0F38|VexW=1|Disp8MemShift=4|NoSuf, { RegYMM, RegXMM|Unspecified|BaseIndex } - - vpmovsxbw, 0x6620, AVX512BW, Modrm|EVex=1|Masking|Space0F38|VexWIG|Disp8MemShift=5|NoSuf, { RegYMM|Unspecified|BaseIndex, RegZMM } --vpmovsxbw, 0x6620, AVX512BW|AVX512VL, Modrm|EVex=2|Masking|VexWIG|Space0F38|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } --vpmovsxbw, 0x6620, AVX512BW|AVX512VL, Modrm|EVex=3|Masking|VexWIG|Space0F38|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } -+vpmovsxbw, 0x6620, AVX512BW&AVX512VL, Modrm|EVex=2|Masking|VexWIG|Space0F38|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } -+vpmovsxbw, 0x6620, AVX512BW&AVX512VL, Modrm|EVex=3|Masking|VexWIG|Space0F38|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } - vpmovzxbw, 0x6630, AVX512BW, Modrm|EVex=1|Masking|Space0F38|VexWIG|Disp8MemShift=5|NoSuf, { RegYMM|Unspecified|BaseIndex, RegZMM } --vpmovzxbw, 0x6630, AVX512BW|AVX512VL, Modrm|EVex=2|Masking|VexWIG|Space0F38|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } --vpmovzxbw, 0x6630, AVX512BW|AVX512VL, Modrm|EVex=3|Masking|VexWIG|Space0F38|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } -+vpmovzxbw, 0x6630, AVX512BW&AVX512VL, Modrm|EVex=2|Masking|VexWIG|Space0F38|Disp8MemShift=3|NoSuf, { RegXMM|Qword|Unspecified|BaseIndex, RegXMM } -+vpmovzxbw, 0x6630, AVX512BW&AVX512VL, Modrm|EVex=3|Masking|VexWIG|Space0F38|Disp8MemShift=4|NoSuf, { RegXMM|Unspecified|BaseIndex, RegYMM } - - vpsadbw, 0x66F6, AVX512BW, Modrm|Space0F|VexVVVV|VexWIG|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } - -@@ -2738,36 +2793,36 @@ vcvtpd2qq, 0x667B, AVX512DQ, Modrm|Masking|Space0F|VexW1|Broadcast|Disp8ShiftVL| - vcvtpd2uqq, 0x6679, AVX512DQ, Modrm|Masking|Space0F|VexW1|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|StaticRounding|SAE, { RegXMM|RegYMM|RegZMM|Qword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - - vcvtps2qq, 0x667B, AVX512DQ, Modrm|EVex512|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=5|NoSuf|StaticRounding|SAE, { RegYMM|Dword|Unspecified|BaseIndex, RegZMM } --vcvtps2qq, 0x667B, AVX512DQ|AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } --vcvtps2qq, 0x667B, AVX512DQ|AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } -+vcvtps2qq, 0x667B, AVX512DQ&AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } -+vcvtps2qq, 0x667B, AVX512DQ&AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } - vcvtps2uqq, 0x6679, AVX512DQ, Modrm|EVex512|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=5|NoSuf|StaticRounding|SAE, { RegYMM|Dword|Unspecified|BaseIndex, RegZMM } --vcvtps2uqq, 0x6679, AVX512DQ|AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } --vcvtps2uqq, 0x6679, AVX512DQ|AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|RegXMM|Dword|Unspecified|BaseIndex, RegYMM } -+vcvtps2uqq, 0x6679, AVX512DQ&AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } -+vcvtps2uqq, 0x6679, AVX512DQ&AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|RegXMM|Dword|Unspecified|BaseIndex, RegYMM } - - vcvtqq2pd, 0xF3E6, AVX512DQ, Modrm|Masking|Space0F|VexW1|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|StaticRounding|SAE, { RegXMM|RegYMM|RegZMM|Qword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - vcvtuqq2pd, 0xF37A, AVX512DQ, Modrm|Masking|Space0F|VexW1|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|StaticRounding|SAE, { RegXMM|RegYMM|RegZMM|Qword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - --vcvtqq2ps, 0x5b, AVX512DQ|, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } -+vcvtqq2ps, 0x5b, AVX512DQ&, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } - - vcvttpd2qq, 0x667A, AVX512DQ, Modrm|Masking|Space0F|VexW1|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|SAE, { RegXMM|RegYMM|RegZMM|Qword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - vcvttpd2uqq, 0x6678, AVX512DQ, Modrm|Masking|Space0F|VexW1|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|SAE, { RegXMM|RegYMM|RegZMM|Qword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - - vcvttps2qq, 0x667A, AVX512DQ, Modrm|EVex512|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=5|NoSuf|SAE, { RegYMM|Dword|Unspecified|BaseIndex, RegZMM } --vcvttps2qq, 0x667A, AVX512DQ|AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } --vcvttps2qq, 0x667A, AVX512DQ|AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } -+vcvttps2qq, 0x667A, AVX512DQ&AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } -+vcvttps2qq, 0x667A, AVX512DQ&AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } - vcvttps2uqq, 0x6678, AVX512DQ, Modrm|EVex512|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=5|NoSuf|SAE, { RegYMM|Dword|Unspecified|BaseIndex, RegZMM } --vcvttps2uqq, 0x6678, AVX512DQ|AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } --vcvttps2uqq, 0x6678, AVX512DQ|AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } -+vcvttps2uqq, 0x6678, AVX512DQ&AVX512VL, Modrm|EVex128|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Dword|Qword|Unspecified|BaseIndex, RegXMM } -+vcvttps2uqq, 0x6678, AVX512DQ&AVX512VL, Modrm|EVex256|Masking|Space0F|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Dword|Unspecified|BaseIndex, RegYMM } - --vcvtuqq2ps, 0xf27a, AVX512DQ|, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } -+vcvtuqq2ps, 0xf27a, AVX512DQ&, Modrm||Masking|Space0F|VexW1|Broadcast|NoSuf|, { |Qword, } - - vextractf32x8, 0x661B, AVX512DQ, Modrm|EVex=1|Masking|Space0F3A|VexW=1|Disp8MemShift=5|NoSuf, { Imm8, RegZMM, RegYMM|Unspecified|BaseIndex } - vextracti32x8, 0x663B, AVX512DQ, Modrm|EVex=1|Masking|Space0F3A|VexW=1|Disp8MemShift=5|NoSuf, { Imm8, RegZMM, RegYMM|Unspecified|BaseIndex } - vinsertf32x8, 0x661A, AVX512DQ, Modrm|EVex512|Masking|Space0F3A|VexVVVV|VexW0|Disp8MemShift=5|NoSuf, { Imm8, RegYMM|Unspecified|BaseIndex, RegZMM, RegZMM } - vinserti32x8, 0x663A, AVX512DQ, Modrm|EVex512|Masking|Space0F3A|VexVVVV|VexW0|Disp8MemShift=5|NoSuf, { Imm8, RegYMM|Unspecified|BaseIndex, RegZMM, RegZMM } - --vpextr, 0x6616, AVX512DQ|, Modrm|EVex128|Space0F3A||Disp8MemShift|NoSuf, { Imm8, RegXMM, |Unspecified|BaseIndex } --vpinsr, 0x6622, AVX512DQ|, Modrm|EVex128|Space0F3A|VexVVVV||Disp8MemShift|NoSuf, { Imm8, |Unspecified|BaseIndex, RegXMM, RegXMM } -+vpextr, 0x6616, AVX512DQ&, Modrm|EVex128|Space0F3A||Disp8MemShift|NoSuf, { Imm8, RegXMM, |Unspecified|BaseIndex } -+vpinsr, 0x6622, AVX512DQ&, Modrm|EVex128|Space0F3A|VexVVVV||Disp8MemShift|NoSuf, { Imm8, |Unspecified|BaseIndex, RegXMM, RegXMM } - - vextractf64x2, 0x6619, AVX512DQ, Modrm|Masking|Space0F3A|VexW=2|Disp8MemShift=4|NoSuf, { Imm8, RegYMM|RegZMM, RegXMM|Unspecified|BaseIndex } - vextracti64x2, 0x6639, AVX512DQ, Modrm|Masking|Space0F3A|VexW=2|Disp8MemShift=4|NoSuf, { Imm8, RegYMM|RegZMM, RegXMM|Unspecified|BaseIndex } -@@ -2777,8 +2832,8 @@ vinserti64x2, 0x6638, AVX512DQ, Modrm|Masking|Space0F3A|VexVVVV|VexW1|Disp8MemSh - vfpclassp, 0x6666, AVX512DQ, Modrm|Masking|Space0F3A||Broadcast|Disp8ShiftVL|NoSuf|IntelSyntax, { Imm8|Imm8S, RegXMM|RegYMM|RegZMM||Unspecified|BaseIndex, RegMask } - vfpclassp, 0x6666, AVX512DQ, Modrm|Masking|Space0F3A||Broadcast|Disp8ShiftVL|NoSuf|ATTSyntax, { Imm8|Imm8S, RegXMM|RegYMM|RegZMM||BaseIndex, RegMask } - vfpclasspz, 0x6666, AVX512DQ, Modrm|EVex512|Masking|Space0F3A||Broadcast|Disp8MemShift=6|NoSuf, { Imm8|Imm8S, RegZMM||Unspecified|BaseIndex, RegMask } --vfpclasspx, 0x6666, AVX512DQ|AVX512VL, Modrm|EVex128|Masking|Space0F3A||Broadcast|Disp8MemShift=4|NoSuf, { Imm8|Imm8S, RegXMM||Unspecified|BaseIndex, RegMask } --vfpclasspy, 0x6666, AVX512DQ|AVX512VL, Modrm|EVex256|Masking|Space0F3A||Broadcast|Disp8MemShift=5|NoSuf, { Imm8|Imm8S, RegYMM||Unspecified|BaseIndex, RegMask } -+vfpclasspx, 0x6666, AVX512DQ&AVX512VL, Modrm|EVex128|Masking|Space0F3A||Broadcast|Disp8MemShift=4|NoSuf, { Imm8|Imm8S, RegXMM||Unspecified|BaseIndex, RegMask } -+vfpclasspy, 0x6666, AVX512DQ&AVX512VL, Modrm|EVex256|Masking|Space0F3A||Broadcast|Disp8MemShift=5|NoSuf, { Imm8|Imm8S, RegYMM||Unspecified|BaseIndex, RegMask } - vfpclasss, 0x67, , Modrm|EVexLIG|Masking|Space0F3A||Disp8MemShift|NoSuf, { Imm8|Imm8S, RegXMM||Unspecified|BaseIndex, RegMask } - - vpmov2m, 0xf339, AVX512DQ, Modrm|EVexDYN|Space0F38||NoSuf, { RegXMM|RegYMM|RegZMM, RegMask } -@@ -2916,8 +2971,8 @@ vpshufbitqmb, 0x668f, AVX512_BITALG, Modrm|Masking|Space0F38|VexVVVV|VexW0|Disp8 - - // AVX512 + GFNI instructions - --vgf2p8affineinvqb, 0x66cf, GFNI|AVX512F, Modrm|Masking|Space0F3A|VexVVVV|VexW1|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf, { Imm8, RegXMM|RegYMM|RegZMM|Qword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } --vgf2p8affineqb, 0x66ce, GFNI|AVX512F, Modrm|Masking|Space0F3A|VexVVVV|VexW1|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf, { Imm8, RegXMM|RegYMM|RegZMM|Qword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vgf2p8affineinvqb, 0x66cf, GFNI&AVX512F, Modrm|Masking|Space0F3A|VexVVVV|VexW1|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf, { Imm8, RegXMM|RegYMM|RegZMM|Qword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } -+vgf2p8affineqb, 0x66ce, GFNI&AVX512F, Modrm|Masking|Space0F3A|VexVVVV|VexW1|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf, { Imm8, RegXMM|RegYMM|RegZMM|Qword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } - - // AVX512 + GFNI instructions end - -@@ -2946,7 +3001,7 @@ clzero, 0xf01fc, CLZERO, AddrPrefixOpReg|NoSuf, { Acc|Word|Dword|Qword } - monitorx, 0xf01fa, MWAITX, NoSuf, {} - monitorx, 0xf01fa, MWAITX, AddrPrefixOpReg|NoSuf, { Acc|Word|Dword|Qword, RegC|Dword, RegD|Dword } - // The 64-bit form exists only for compatibility with older gas. --monitorx, 0xf01fa, MWAITX|x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword, RegD|Qword } -+monitorx, 0xf01fa, MWAITX&x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword, RegD|Qword } - - mwaitx, 0xf01fb, MWAITX, NoSuf, {} - // The 64-bit form exists only for compatibility with older gas. -@@ -2963,30 +3018,34 @@ wrpkru, 0xf01ef, OSPKE, NoSuf, {} - - // RDPID instructions. - --rdpid, 0xf30fc7/7, RDPID|No64, Modrm|IgnoreSize|NoSuf, { Reg32 } --rdpid, 0xf30fc7/7, RDPID|x64, Modrm|NoSuf|NoRex64, { Reg64 } -+rdpid, 0xf30fc7/7, RDPID&No64, Modrm|IgnoreSize|NoSuf, { Reg32 } -+rdpid, 0xf30fc7/7, RDPID&x64, Modrm|NoSuf|NoRex64, { Reg64 } - - // RDPID instructions end. - - // PTWRITE instructions. - --ptwrite, 0xf30fae/4, PTWRITE|No64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Reg32|Unspecified|BaseIndex } --ptwrite, 0xf30fae/4, PTWRITE|x64, Modrm|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex } -+ptwrite, 0xf30fae/4, PTWRITE&No64, Modrm|IgnoreSize|No_bSuf|No_wSuf|No_sSuf|No_qSuf, { Reg32|Unspecified|BaseIndex } -+ptwrite, 0xf30fae/4, PTWRITE&x64, Modrm|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64|Unspecified|BaseIndex } - - // PTWRITE instructions end. - - // CET instructions. - - incsspd, 0xf30fae/5, SHSTK, Modrm|IgnoreSize|NoSuf, { Reg32 } --incsspq, 0xf30fae/5, SHSTK|x64, Modrm|NoSuf, { Reg64 } -+incsspq, 0xf30fae/5, SHSTK&x64, Modrm|NoSuf, { Reg64 } - rdsspd, 0xf30f1e/1, SHSTK, Modrm|IgnoreSize|NoSuf, { Reg32 } --rdsspq, 0xf30f1e/1, SHSTK|x64, Modrm|NoSuf, { Reg64 } -+rdsspq, 0xf30f1e/1, SHSTK&x64, Modrm|NoSuf, { Reg64 } - saveprevssp, 0xf30f01ea, SHSTK, NoSuf, {} - rstorssp, 0xf30f01/5, SHSTK, Modrm|NoSuf, { Qword|Unspecified|BaseIndex } - wrssd, 0x0f38f6, SHSTK, Modrm|IgnoreSize|NoSuf, { Reg32, Dword|Unspecified|BaseIndex } --wrssq, 0x0f38f6, SHSTK|x64, Modrm|NoSuf|Size64, { Reg64, Qword|Unspecified|BaseIndex } -+wrssd, 0x66, SHSTK&APX_F, Modrm|NoSuf|EVexMap4, { Reg32, Dword|Unspecified|BaseIndex } -+wrssq, 0x0f38f6, SHSTK&x64, Modrm|NoSuf, { Reg64, Qword|Unspecified|BaseIndex } -+wrssq, 0x66, SHSTK&APX_F, Modrm|NoSuf|EVexMap4, { Reg64, Qword|Unspecified|BaseIndex } - wrussd, 0x660f38f5, SHSTK, Modrm|IgnoreSize|NoSuf, { Reg32, Dword|Unspecified|BaseIndex } --wrussq, 0x660f38f5, SHSTK|x64, Modrm|NoSuf, { Reg64, Qword|Unspecified|BaseIndex } -+wrussd, 0x6665, SHSTK&APX_F, Modrm|NoSuf|EVexMap4, { Reg32, Dword|Unspecified|BaseIndex } -+wrussq, 0x660f38f5, SHSTK&x64, Modrm|NoSuf, { Reg64, Qword|Unspecified|BaseIndex } -+wrussq, 0x6665, SHSTK&APX_F, Modrm|NoSuf|EVexMap4, { Reg64, Qword|Unspecified|BaseIndex } - setssbsy, 0xf30f01e8, SHSTK, NoSuf, {} - clrssbsy, 0xf30fae/6, SHSTK, Modrm|NoSuf, { Qword|Unspecified|BaseIndex } - endbr64, 0xf30f1efa, IBT, NoSuf, {} -@@ -3011,7 +3070,7 @@ pconfig, 0x0f01c5, PCONFIG, NoSuf, {} - - // PBNDKB instruction. - --pbndkb, 0x0f01c7, PBNDKB|x64, NoSuf, {} -+pbndkb, 0x0f01c7, PBNDKB, NoSuf, {} - - // PBNDKB instruction end. - -@@ -3034,7 +3093,9 @@ cldemote, 0x0f1c/0, CLDEMOTE, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex } - // MOVDIR[I,64B] instructions. - - movdiri, 0xf38f9, MOVDIRI, Modrm|CheckOperandSize|IgnoreSize|No_bSuf|No_wSuf|No_sSuf, { Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } -+movdiri, 0xf9, MOVDIRI&APX_F, Modrm|CheckOperandSize|No_bSuf|No_wSuf|No_sSuf|EVexMap4, { Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } - movdir64b, 0x660f38f8, MOVDIR64B, Modrm|AddrPrefixOpReg|NoSuf, { Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+movdir64b, 0x66f8, MOVDIR64B&APX_F, Modrm|AddrPrefixOpReg|NoSuf|EVexMap4, { Unspecified|BaseIndex, Reg32|Reg64 } - - // MOVEDIR instructions end. - -@@ -3042,7 +3103,7 @@ movdir64b, 0x660f38f8, MOVDIR64B, Modrm|AddrPrefixOpReg|NoSuf, { Unspecified|Bas - - vcvtne2ps2bf16, 0xf272, AVX512_BF16, Modrm|Space0F38|VexVVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } - --vcvtneps2bf16, 0xf372, AVX512_BF16|, Modrm|Space0F38||Masking|VexW0|Broadcast|NoSuf, { |Dword, } -+vcvtneps2bf16, 0xf372, AVX512_BF16&, Modrm|Space0F38||Masking|VexW0|Broadcast|NoSuf, { |Dword, } - - vdpbf16ps, 0xf352, AVX512_BF16, Modrm|Space0F38|VexVVVV|Masking|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf, { RegXMM|RegYMM|RegZMM|Dword|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM, RegXMM|RegYMM|RegZMM } - -@@ -3063,7 +3124,9 @@ vcvtneps2bf16, 0xf372, AVX_NE_CONVERT, Modrm||Space0F38|VexW0|NoSu - // ENQCMD instructions. - - enqcmd, 0xf20f38f8, ENQCMD, Modrm|AddrPrefixOpReg|NoSuf, { Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+enqcmd, 0xf2f8, APX_F(ENQCMD), Modrm|AddrPrefixOpReg|NoSuf|EVexMap4, { Unspecified|BaseIndex, Reg32|Reg64 } - enqcmds, 0xf30f38f8, ENQCMD, Modrm|AddrPrefixOpReg|NoSuf, { Unspecified|BaseIndex, Reg16|Reg32|Reg64 } -+enqcmds, 0xf3f8, APX_F(ENQCMD), Modrm|AddrPrefixOpReg|NoSuf|EVexMap4, { Unspecified|BaseIndex, Reg32|Reg64 } - - // ENQCMD instructions end. - -@@ -3081,25 +3144,25 @@ mcommit, 0xf30f01fa, MCOMMIT, NoSuf, {} - - // SNP instructions - --psmash, 0xf30f01ff, SNP|x64, NoSuf, {} --psmash, 0xf30f01ff, SNP|x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword } -+psmash, 0xf30f01ff, SNP&x64, NoSuf, {} -+psmash, 0xf30f01ff, SNP&x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword } - pvalidate, 0xf20f01ff, SNP, NoSuf, {} - pvalidate, 0xf20f01ff, SNP, AddrPrefixOpReg|NoSuf, { Acc|Word|Dword|Qword, RegC|Dword, RegD|Dword } --rmpupdate, 0xf20f01fe, SNP|x64, NoSuf, {} --rmpupdate, 0xf20f01fe, SNP|x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword } --rmpadjust, 0xf30f01fe, SNP|x64, NoSuf, {} --rmpadjust, 0xf30f01fe, SNP|x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword, RegD|Qword } -+rmpupdate, 0xf20f01fe, SNP&x64, NoSuf, {} -+rmpupdate, 0xf20f01fe, SNP&x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword } -+rmpadjust, 0xf30f01fe, SNP&x64, NoSuf, {} -+rmpadjust, 0xf30f01fe, SNP&x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword, RegD|Qword } - // The single-operand forms exist only for compatibility with older gas. - pvalidate, 0xf20f01ff, SNP, AddrPrefixOpReg|NoSuf, { Acc|Word|Dword|Qword } --rmpupdate, 0xf20f01fe, SNP|x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword } --rmpadjust, 0xf30f01fe, SNP|x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword } -+rmpupdate, 0xf20f01fe, SNP&x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword } -+rmpadjust, 0xf30f01fe, SNP&x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword } - - // SNP instructions end - - // RMPQUERY instruction - --rmpquery, 0xf30f01fd, RMPQUERY|x64, NoSuf, {} --rmpquery, 0xf30f01fd, RMPQUERY|x64, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword, RegD|Qword } -+rmpquery, 0xf30f01fd, RMPQUERY, NoSuf, {} -+rmpquery, 0xf30f01fd, RMPQUERY, AddrPrefixOpReg|NoSuf, { Acc|Dword|Qword, RegC|Qword, RegD|Qword } - - // RMPQUERY instruction end - -@@ -3124,26 +3187,26 @@ xresldtrk, 0xf20f01e9, TSXLDTRK, NoSuf, {} - - // AMX instructions. - --ldtilecfg, 0x49/0, AMX_TILE|x64, Modrm|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex } --sttilecfg, 0x6649/0, AMX_TILE|x64, Modrm|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex } -+ldtilecfg, 0x49/0, APX_F(AMX_TILE), Modrm|Vex128|EVex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex } -+sttilecfg, 0x6649/0, APX_F(AMX_TILE), Modrm|Vex128|EVex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex } - --tcmmimfp16ps, 0x666c, AMX_COMPLEX|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } --tcmmrlfp16ps, 0x6c, AMX_COMPLEX|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -+tcmmimfp16ps, 0x666c, AMX_COMPLEX, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -+tcmmrlfp16ps, 0x6c, AMX_COMPLEX, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } - --tdpbf16ps, 0xf35c, AMX_BF16|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } --tdpfp16ps, 0xf25c, AMX_FP16|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } --tdpbssd, 0xf25e, AMX_INT8|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } --tdpbuud, 0x5e, AMX_INT8|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } --tdpbusd, 0x665e, AMX_INT8|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } --tdpbsud, 0xf35e, AMX_INT8|x64, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -+tdpbf16ps, 0xf35c, AMX_BF16, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -+tdpfp16ps, 0xf25c, AMX_FP16, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -+tdpbssd, 0xf25e, AMX_INT8, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -+tdpbuud, 0x5e, AMX_INT8, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -+tdpbusd, 0x665e, AMX_INT8, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } -+tdpbsud, 0xf35e, AMX_INT8, Modrm|Vex128|Space0F38|VexVVVV|VexW0|SwapSources|NoSuf, { RegTMM, RegTMM, RegTMM } - --tileloadd, 0xf24b, AMX_TILE|x64, Sibmem|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex, RegTMM } --tileloaddt1, 0x664b, AMX_TILE|x64, Sibmem|Vex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex, RegTMM } --tilestored, 0xf34b, AMX_TILE|x64, Sibmem|Vex128|Space0F38|VexW0|NoSuf, { RegTMM, Unspecified|BaseIndex } -+tileloadd, 0xf24b, APX_F(AMX_TILE), Sibmem|Vex128|EVex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex, RegTMM } -+tileloaddt1, 0x664b, APX_F(AMX_TILE), Sibmem|Vex128|EVex128|Space0F38|VexW0|NoSuf, { Unspecified|BaseIndex, RegTMM } -+tilestored, 0xf34b, APX_F(AMX_TILE), Sibmem|Vex128|EVex128|Space0F38|VexW0|NoSuf, { RegTMM, Unspecified|BaseIndex } - --tilerelease, 0x49c0, AMX_TILE|x64, Vex128|Space0F38|VexW0|NoSuf, {} -+tilerelease, 0x49c0, AMX_TILE, Vex128|Space0F38|VexW0|NoSuf, {} - --tilezero, 0xf249, AMX_TILE|x64, Modrm|Vex128|Space0F38|VexW0|NoSuf, { RegTMM } -+tilezero, 0xf249, AMX_TILE, Modrm|Vex128|Space0F38|VexW0|NoSuf, { RegTMM } - - // AMX instructions end. - -@@ -3166,19 +3229,19 @@ aesdecwide256kl, 0xf30f38d8/3, WideKL, Modrm|NoSuf, { Unspecified|BaseIndex } - // TDX instructions. - - tdcall, 0x660f01cc, TDX, NoSuf, {} --seamret, 0x660f01cd, TDX|x64, NoSuf, {} --seamops, 0x660f01ce, TDX|x64, NoSuf, {} --seamcall, 0x660f01cf, TDX|x64, NoSuf, {} -+seamret, 0x660f01cd, TDX&x64, NoSuf, {} -+seamops, 0x660f01ce, TDX&x64, NoSuf, {} -+seamcall, 0x660f01cf, TDX&x64, NoSuf, {} - - // TDX instructions end. - - // UINTR instructions. - --uiret, 0xf30f01ec, UINTR|x64, NoSuf, {} --clui, 0xf30f01ee, UINTR|x64, NoSuf, {} --stui, 0xf30f01ef, UINTR|x64, NoSuf, {} --testui, 0xf30f01ed, UINTR|x64, NoSuf, {} --senduipi, 0xf30fc7/6, UINTR|x64, Modrm|NoSuf|NoRex64, { Reg64 } -+uiret, 0xf30f01ec, UINTR, NoSuf, {} -+clui, 0xf30f01ee, UINTR, NoSuf, {} -+stui, 0xf30f01ef, UINTR, NoSuf, {} -+testui, 0xf30f01ed, UINTR, NoSuf, {} -+senduipi, 0xf30fc7/6, UINTR, Modrm|NoSuf|NoRex64, { Reg64 } - - // UINTR instructions end. - -@@ -3208,37 +3271,37 @@ vcmpph, 0xc2, AVX512_FP16, Modrm|Masking|Space0F3A|VexVVVV|VexW0|Broadcast|Disp8 - vcmpsh, 0xf3c2/0x, AVX512_FP16, Modrm|EVexLIG|Masking|Space0F3A|VexVVVV|VexW0|Disp8MemShift=1|NoSuf|ImmExt|SAE, { RegXMM|Word|Unspecified|BaseIndex, RegXMM, RegMask } - vcmpsh, 0xf3c2, AVX512_FP16, Modrm|EVexLIG|Masking|Space0F3A|VexVVVV|VexW0|Disp8MemShift=1|NoSuf|SAE, { Imm8, RegXMM|Word|Unspecified|BaseIndex, RegXMM, RegMask } - --vcvtdq2ph, 0x5b, AVX512_FP16|, Modrm||Masking|EVexMap5|VexW0|Broadcast|NoSuf|, { |Dword, } --vcvtudq2ph, 0xf27a, AVX512_FP16|, Modrm||Masking|EVexMap5|VexW0|Broadcast|NoSuf|, { |Dword, } -+vcvtdq2ph, 0x5b, AVX512_FP16&, Modrm||Masking|EVexMap5|VexW0|Broadcast|NoSuf|, { |Dword, } -+vcvtudq2ph, 0xf27a, AVX512_FP16&, Modrm||Masking|EVexMap5|VexW0|Broadcast|NoSuf|, { |Dword, } - --vcvtqq2ph, 0x5b, AVX512_FP16|, Modrm||Masking|EVexMap5|VexW1|Broadcast|NoSuf||, { |Qword, RegXMM } --vcvtuqq2ph, 0xf27a, AVX512_FP16|, Modrm||Masking|EVexMap5|VexW1|Broadcast|NoSuf||, { |Qword, RegXMM } -+vcvtqq2ph, 0x5b, AVX512_FP16&, Modrm||Masking|EVexMap5|VexW1|Broadcast|NoSuf||, { |Qword, RegXMM } -+vcvtuqq2ph, 0xf27a, AVX512_FP16&, Modrm||Masking|EVexMap5|VexW1|Broadcast|NoSuf||, { |Qword, RegXMM } - --vcvtpd2ph, 0x665a, AVX512_FP16|, Modrm||Masking|EVexMap5|VexW1|Broadcast|NoSuf||, { |Qword, RegXMM } -+vcvtpd2ph, 0x665a, AVX512_FP16&, Modrm||Masking|EVexMap5|VexW1|Broadcast|NoSuf||, { |Qword, RegXMM } - --vcvtps2phx, 0x661d, AVX512_FP16|, Modrm||Masking|EVexMap5|VexW0|Broadcast|NoSuf|, { |Dword, } -+vcvtps2phx, 0x661d, AVX512_FP16&, Modrm||Masking|EVexMap5|VexW0|Broadcast|NoSuf|, { |Dword, } - - vcvtw2ph, 0xf37d, AVX512_FP16, Modrm|Masking|EVexMap5|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|StaticRounding|SAE, { RegXMM|RegYMM|RegZMM|Word|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - vcvtuw2ph, 0xf27d, AVX512_FP16, Modrm|Masking|EVexMap5|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|StaticRounding|SAE, { RegXMM|RegYMM|RegZMM|Word|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } - --vcvtph2dq, 0x665b, AVX512_FP16|AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegXMM } --vcvtph2dq, 0x665b, AVX512_FP16|AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegYMM } -+vcvtph2dq, 0x665b, AVX512_FP16&AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegXMM } -+vcvtph2dq, 0x665b, AVX512_FP16&AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegYMM } - vcvtph2dq, 0x665b, AVX512_FP16, Modrm|EVex512|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=5|NoSuf|StaticRounding|SAE, { RegYMM|Word|Unspecified|BaseIndex, RegZMM } - --vcvtph2udq, 0x79, AVX512_FP16|AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegXMM } --vcvtph2udq, 0x79, AVX512_FP16|AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegYMM } -+vcvtph2udq, 0x79, AVX512_FP16&AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegXMM } -+vcvtph2udq, 0x79, AVX512_FP16&AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegYMM } - vcvtph2udq, 0x79, AVX512_FP16, Modrm|EVex512|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=5|NoSuf|StaticRounding|SAE, { RegYMM|Word|Unspecified|BaseIndex, RegZMM } - --vcvtph2qq, 0x667b, AVX512_FP16|AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=2|NoSuf, { RegXMM|Word|Dword|Unspecified|BaseIndex, RegXMM } --vcvtph2qq, 0x667b, AVX512_FP16|AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegYMM } -+vcvtph2qq, 0x667b, AVX512_FP16&AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=2|NoSuf, { RegXMM|Word|Dword|Unspecified|BaseIndex, RegXMM } -+vcvtph2qq, 0x667b, AVX512_FP16&AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegYMM } - vcvtph2qq, 0x667b, AVX512_FP16, Modrm|EVex512|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf|StaticRounding|SAE, { RegXMM|Word|Unspecified|BaseIndex, RegZMM } - --vcvtph2uqq, 0x6679, AVX512_FP16|AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=2|NoSuf, { RegXMM|Word|Dword|Unspecified|BaseIndex, RegXMM } --vcvtph2uqq, 0x6679, AVX512_FP16|AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegYMM } -+vcvtph2uqq, 0x6679, AVX512_FP16&AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=2|NoSuf, { RegXMM|Word|Dword|Unspecified|BaseIndex, RegXMM } -+vcvtph2uqq, 0x6679, AVX512_FP16&AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegYMM } - vcvtph2uqq, 0x6679, AVX512_FP16, Modrm|EVex512|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf|StaticRounding|SAE, { RegXMM|Word|Unspecified|BaseIndex, RegZMM } - --vcvtph2pd, 0x5a, AVX512_FP16|AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=2|NoSuf, { RegXMM|Word|Dword|Unspecified|BaseIndex, RegXMM } --vcvtph2pd, 0x5a, AVX512_FP16|AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegYMM } -+vcvtph2pd, 0x5a, AVX512_FP16&AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=2|NoSuf, { RegXMM|Word|Dword|Unspecified|BaseIndex, RegXMM } -+vcvtph2pd, 0x5a, AVX512_FP16&AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegYMM } - vcvtph2pd, 0x5a, AVX512_FP16, Modrm|EVex512|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf|SAE, { RegXMM|Word|Unspecified|BaseIndex, RegZMM } - - vcvtph2w, 0x667d, AVX512_FP16, Modrm|Masking|EVexMap5|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|StaticRounding|SAE, { RegXMM|RegYMM|RegZMM|Word|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } -@@ -3258,24 +3321,24 @@ vcvtsh2ss, 0x13, AVX512_FP16, Modrm|EVexLIG|Masking|EVexMap6|VexVVVV|VexW0|Disp8 - - vcvtsh2si, 0xf32d, AVX512_FP16, Modrm|EVexLIG|EVexMap5|Disp8MemShift=1|NoSuf|StaticRounding|SAE, { RegXMM|Word|Unspecified|BaseIndex, Reg32|Reg64 } - --vcvttph2dq, 0xf35b, AVX512_FP16|AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegXMM } --vcvttph2dq, 0xf35b, AVX512_FP16|AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegYMM } -+vcvttph2dq, 0xf35b, AVX512_FP16&AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegXMM } -+vcvttph2dq, 0xf35b, AVX512_FP16&AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegYMM } - vcvttph2dq, 0xf35b, AVX512_FP16, Modrm|EVex512|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=5|NoSuf|SAE, { RegYMM|Word|Unspecified|BaseIndex, RegZMM } - --vcvttph2udq, 0x78, AVX512_FP16|AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegXMM } --vcvttph2udq, 0x78, AVX512_FP16|AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegYMM } -+vcvttph2udq, 0x78, AVX512_FP16&AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegXMM } -+vcvttph2udq, 0x78, AVX512_FP16&AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegYMM } - vcvttph2udq, 0x78, AVX512_FP16, Modrm|EVex512|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=5|NoSuf|SAE, { RegYMM|Word|Unspecified|BaseIndex, RegZMM } - --vcvttph2qq, 0x667a, AVX512_FP16|AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=2|NoSuf, { RegXMM|Word|Dword|Unspecified|BaseIndex, RegXMM } --vcvttph2qq, 0x667a, AVX512_FP16|AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegYMM } -+vcvttph2qq, 0x667a, AVX512_FP16&AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=2|NoSuf, { RegXMM|Word|Dword|Unspecified|BaseIndex, RegXMM } -+vcvttph2qq, 0x667a, AVX512_FP16&AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegYMM } - vcvttph2qq, 0x667a, AVX512_FP16, Modrm|EVex512|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf|SAE, { RegXMM|Word|Unspecified|BaseIndex, RegZMM } - --vcvttph2uqq, 0x6678, AVX512_FP16|AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=2|NoSuf, { RegXMM|Word|Dword|Unspecified|BaseIndex, RegXMM } --vcvttph2uqq, 0x6678, AVX512_FP16|AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegYMM } -+vcvttph2uqq, 0x6678, AVX512_FP16&AVX512VL, Modrm|EVex128|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=2|NoSuf, { RegXMM|Word|Dword|Unspecified|BaseIndex, RegXMM } -+vcvttph2uqq, 0x6678, AVX512_FP16&AVX512VL, Modrm|EVex256|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegYMM } - vcvttph2uqq, 0x6678, AVX512_FP16, Modrm|EVex512|Masking|EVexMap5|VexW0|Broadcast|Disp8MemShift=4|NoSuf|SAE, { RegXMM|Word|Unspecified|BaseIndex, RegZMM } - --vcvtph2psx, 0x6613, AVX512_FP16|AVX512VL, Modrm|EVex128|Masking|EVexMap6|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegXMM } --vcvtph2psx, 0x6613, AVX512_FP16|AVX512VL, Modrm|EVex256|Masking|EVexMap6|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegYMM } -+vcvtph2psx, 0x6613, AVX512_FP16&AVX512VL, Modrm|EVex128|Masking|EVexMap6|VexW0|Broadcast|Disp8MemShift=3|NoSuf, { RegXMM|Word|Qword|Unspecified|BaseIndex, RegXMM } -+vcvtph2psx, 0x6613, AVX512_FP16&AVX512VL, Modrm|EVex256|Masking|EVexMap6|VexW0|Broadcast|Disp8MemShift=4|NoSuf, { RegXMM|Word|Unspecified|BaseIndex, RegYMM } - vcvtph2psx, 0x6613, AVX512_FP16, Modrm|EVex512|Masking|EVexMap6|VexW0|Broadcast|Disp8MemShift=5|NoSuf|SAE, { RegYMM|Word|Unspecified|BaseIndex, RegZMM } - - vcvttph2w, 0x667c, AVX512_FP16, Modrm|Masking|EVexMap5|VexW0|Broadcast|Disp8ShiftVL|CheckOperandSize|NoSuf|SAE, { RegXMM|RegYMM|RegZMM|Word|Unspecified|BaseIndex, RegXMM|RegYMM|RegZMM } -@@ -3283,7 +3346,7 @@ vcvttph2uw, 0x7c, AVX512_FP16, Modrm|Masking|EVexMap5|VexW0|Broadcast|Disp8Shift - - vcvttsh2si, 0xf32c, AVX512_FP16, Modrm|EVexLIG|EVexMap5|Disp8MemShift=1|NoSuf|SAE, { RegXMM|Word|Unspecified|BaseIndex, Reg32|Reg64 } - --vfpclassph, 0x66, AVX512_FP16|, Modrm||Masking|Space0F3A|VexW0|Broadcast|NoSuf|, { Imm8|Imm8S, |Word, RegMask } -+vfpclassph, 0x66, AVX512_FP16&, Modrm||Masking|Space0F3A|VexW0|Broadcast|NoSuf|, { Imm8|Imm8S, |Word, RegMask } - - vmovw, 0x666e, AVX512_FP16, D|Modrm|EVex128|VexWIG|EVexMap5|Disp8MemShift=1|NoSuf, { Word|Unspecified|BaseIndex, RegXMM } - vmovw, 0x667e, AVX512_FP16, D|RegMem|EVex128|VexWIG|EVexMap5|NoSuf, { RegXMM, Reg32 } -@@ -3300,14 +3363,14 @@ vrsqrtsh, 0x664f, AVX512_FP16, Modrm|EVexLIG|Masking|EVexMap6|VexVVVV|VexW0|Disp - - // PREFETCHI instructions. - --prefetchit0, 0xf18/7, PREFETCHI|x64, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex } --prefetchit1, 0xf18/6, PREFETCHI|x64, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex } -+prefetchit0, 0xf18/7, PREFETCHI, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex } -+prefetchit1, 0xf18/6, PREFETCHI, Modrm|Anysize|IgnoreSize|NoSuf, { BaseIndex } - - // PREFETCHI instructions end. - - // CMPCCXADD instructions. - --cmpxadd, 0x66e, CMPCCXADD|x64, Modrm|Vex|Space0F38|VexVVVV|SwapSources|CheckOperandSize|NoSuf, { Reg32|Reg64, Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } -+cmpxadd, 0x66e, APX_F(CMPCCXADD), Modrm|Vex|EVex128|Space0F38|VexVVVV|SwapSources|CheckOperandSize|NoSuf, { Reg32|Reg64, Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } - - // CMPCCXADD instructions end. - -@@ -3319,30 +3382,52 @@ wrmsrns, 0x0f01c6, WRMSRNS, NoSuf, {} - - // MSRLIST instructions. - --rdmsrlist, 0xf20f01c6, MSRLIST|x64, NoSuf, {} --wrmsrlist, 0xf30f01c6, MSRLIST|x64, NoSuf, {} -+rdmsrlist, 0xf20f01c6, MSRLIST, NoSuf, {} -+wrmsrlist, 0xf30f01c6, MSRLIST, NoSuf, {} - - // MSRLIST instructions end. - - // RAO-INT instructions. - --aadd, 0xf38fc, RAO_INT, Modrm|IgnoreSize|CheckOperandSize|NoSuf, { Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } --aand, 0x660f38fc, RAO_INT, Modrm|IgnoreSize|CheckOperandSize|NoSuf, { Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } --aor, 0xf20f38fc, RAO_INT, Modrm|IgnoreSize|CheckOperandSize|NoSuf, { Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } --axor, 0xf30f38fc, RAO_INT, Modrm|IgnoreSize|CheckOperandSize|NoSuf, { Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } -+ -+a, 0x0f38fc, RAO_INT, Modrm|IgnoreSize|CheckOperandSize|NoSuf, { Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } -+a, 0xfc, RAO_INT&APX_F, Modrm|CheckOperandSize|NoSuf|EVexMap4, { Reg32|Reg64, Dword|Qword|Unspecified|BaseIndex } -+ - - // RAO-INT instructions end. - - // LKGS instruction. - --lkgs, 0xf20f00/6, LKGS|x64, Modrm|IgnoreSize|No_bSuf|No_sSuf|NoRex64, { Reg16|Reg32|Reg64 } --lkgs, 0xf20f00/6, LKGS|x64, Modrm|IgnoreSize|No_bSuf|No_lSuf|No_sSuf|No_qSuf, { Word|Unspecified|BaseIndex } -+lkgs, 0xf20f00/6, LKGS, Modrm|IgnoreSize|No_bSuf|No_sSuf|NoRex64, { Reg16|Reg32|Reg64 } -+lkgs, 0xf20f00/6, LKGS, Modrm|IgnoreSize|No_bSuf|No_lSuf|No_sSuf|No_qSuf, { Word|Unspecified|BaseIndex } - - // LKGS instruction end. - - // FRED instructions. - --erets, 0xf20f01ca, FRED|x64, NoSuf, {} --eretu, 0xf30f01ca, FRED|x64, NoSuf, {} -+erets, 0xf20f01ca, FRED, NoSuf, {} -+eretu, 0xf30f01ca, FRED, NoSuf, {} - - // FRED instructions end. -+ -+// USER_MSR instructions. -+ -+urdmsr, 0xf20f38f8, USER_MSR, RegMem|NoSuf|NoRex64, { Reg64, Reg64 } -+urdmsr, 0xf2f8, USER_MSR&APX_F, RegMem|EVexMap4|VexW0|NoSuf, { Reg64, Reg64 } -+urdmsr, 0xf2f8/0, APX_F(USER_MSR), Modrm|Vex128|VexMap7|EVex128|VexW0|NoSuf, { Imm32, Reg64 } -+uwrmsr, 0xf30f38f8, USER_MSR, Modrm|NoSuf|NoRex64, { Reg64, Reg64 } -+uwrmsr, 0xf3f8, USER_MSR&APX_F, Modrm|EVexMap4|VexW0|NoSuf, { Reg64, Reg64 } -+// Immediates want to be first; md_assemble() takes care of swapping operands -+// accordingly. -+uwrmsr, 0xf3f8/0, APX_F(USER_MSR), Modrm|Vex128|VexMap7|EVex128|VexW0|NoSuf, { Imm32, Reg64 } -+ -+// USER_MSR instructions end. -+ -+// APX Push2/Pop2 instructions. -+ -+push2, 0xff/6, APX_F, Modrm|VexW0|EVexMap4|VexVVVV|ImplicitStackOp|No_bSuf|No_wSuf|No_lSuf|No_sSuf, { Reg64, Reg64 } -+push2p, 0xff/6, APX_F, Modrm|VexW1|EVexMap4|VexVVVV|ImplicitStackOp|No_bSuf|No_wSuf|No_lSuf|No_sSuf, { Reg64, Reg64 } -+pop2, 0x8f/0, APX_F, Modrm|VexW0|EVexMap4|VexVVVV|ImplicitStackOp|No_bSuf|No_wSuf|No_lSuf|No_sSuf, { Reg64, Reg64 } -+pop2p, 0x8f/0, APX_F, Modrm|VexW1|EVexMap4|VexVVVV|ImplicitStackOp|No_bSuf|No_wSuf|No_lSuf|No_sSuf, { Reg64, Reg64 } -+ -+// APX Push2/Pop2 instructions end. diff --git a/gdb-rhel-86801-binutils-z17-update-12of12.patch b/gdb-rhel-50069-support-z17.patch similarity index 81% rename from gdb-rhel-86801-binutils-z17-update-12of12.patch rename to gdb-rhel-50069-support-z17.patch index 9fba933..7c3504e 100644 --- a/gdb-rhel-86801-binutils-z17-update-12of12.patch +++ b/gdb-rhel-50069-support-z17.patch @@ -1,10 +1,10 @@ From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 From: Jens Remus Date: Wed, 9 Apr 2025 08:59:24 +0200 -Subject: gdb-rhel-86801-binutils-z17-update-12of12.patch +Subject: gdb-rhel-50069-support-z17.patch -;; Backkport "s390: Add support for z17 as CPU name" -;; (Jens Remus, RHEL-86801) +;; Backport "s390: Add support for z17 as CPU name" +;; (Jens Remus, RHEL-50069) So far IBM z17 was identified as arch15. Add the real name, as it has been announced. [1] @@ -26,7 +26,7 @@ Signed-off-by: Jens Remus diff --git a/opcodes/s390-mkopc.c b/opcodes/s390-mkopc.c --- a/opcodes/s390-mkopc.c +++ b/opcodes/s390-mkopc.c -@@ -384,7 +384,8 @@ main (void) +@@ -443,7 +443,8 @@ main (void) else if (strcmp (cpu_string, "z16") == 0 || strcmp (cpu_string, "arch14") == 0) min_cpu = S390_OPCODE_ARCH14; @@ -35,4 +35,4 @@ diff --git a/opcodes/s390-mkopc.c b/opcodes/s390-mkopc.c + || strcmp (cpu_string, "arch15") == 0) min_cpu = S390_OPCODE_ARCH15; else { - fprintf (stderr, "Couldn't parse cpu string %s\n", cpu_string); + print_error ("Mnemonic \"%s\": Couldn't parse CPU string: %s\n", diff --git a/gdb-rhel-86801-binutils-z17-update-10of12.patch b/gdb-rhel-86801-binutils-z17-update-10of12.patch deleted file mode 100644 index e6b6fb4..0000000 --- a/gdb-rhel-86801-binutils-z17-update-10of12.patch +++ /dev/null @@ -1,103 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jens Remus -Date: Mon, 28 Apr 2025 11:23:22 -0700 -Subject: gdb-rhel-86801-binutils-z17-update-10of12.patch - -;; Backkport "s390: Relax risbg[n]z, risb{h|l}gz, {rns|ros|rxs}bgt operand constraints" -;; (Jens Remus, RHEL-86801) - -This leverages commit ("s390: Simplify (dis)assembly of insn operands -with const bits") to relax the operand constraints of the immediate -operand that contains the constant Z- or T-bit of the following extended -mnemonics: -risbgz, risbgnz, risbhgz, risblgz, rnsbgt, rosbgt, rxsbgt - -Previously those instructions were the only ones where the assembler -on s390 restricted the specification of the subject I3/I4 operand values -exactly according to their specification to an unsigned 6- or 5-bit -unsigned integer. For any other instructions the assembler allows to -specify any operand value allowed by the instruction format, regardless -of whether the instruction specification is more restrictive. - -Allow to specify the subject I3/I4 operand as unsigned 8-bit integer -with the constant operand bits being ORed during assembly. -Relax the instructions subject significant operand bit masks to only -consider the Z/T-bit as significant, so that the instructions get -disassembled as their *z or *t flavor regardless of whether any reserved -bits are set in addition to the Z/T-bit. -Adapt the rnsbg, rosbg, and rxsbg test cases not to inadvertently set -the T-bit in operand I3, as they otherwise get disassembled as their -rnsbgt, rosbgt, and rxsbgt counterpart. - -This aligns GNU Assembler to LLVM Assembler. - -opcodes/ - * s390-opc.c (U6_18, U5_27, U6_26): Remove. - (INSTR_RIE_RRUUU2, INSTR_RIE_RRUUU3, INSTR_RIE_RRUUU4): Define - as INSTR_RIE_RRUUU while retaining insn fmt mask. - (MASK_RIE_RRUUU2, MASK_RIE_RRUUU3, MASK_RIE_RRUUU4): Treat only - Z/T-bit of I3/I4 operand as significant. - -gas/testsuite/ - * gas/s390/zarch-z10.s (rnsbg, rosbg, rxsbg): Do not set T-bit. - -Reported-by: Dominik Steenken -Suggested-by: Ulrich Weigand -Signed-off-by: Jens Remus - -diff --git a/opcodes/s390-opc.c b/opcodes/s390-opc.c ---- a/opcodes/s390-opc.c -+++ b/opcodes/s390-opc.c -@@ -216,15 +216,9 @@ const struct s390_operand s390_operands[] = - { 4, 36, 0 }, - #define U8_8 (U4_36 + 1) /* 8 bit unsigned value starting at 8 */ - { 8, 8, 0 }, --#define U6_18 (U8_8 + 1) /* 6 bit unsigned value starting at 18 */ -- { 6, 18, 0 }, --#define U8_16 (U6_18 + 1) /* 8 bit unsigned value starting at 16 */ -+#define U8_16 (U8_8 + 1) /* 8 bit unsigned value starting at 16 */ - { 8, 16, 0 }, --#define U5_27 (U8_16 + 1) /* 5 bit unsigned value starting at 27 */ -- { 5, 27, 0 }, --#define U6_26 (U5_27 + 1) /* 6 bit unsigned value starting at 26 */ -- { 6, 26, 0 }, --#define U8_24 (U6_26 + 1) /* 8 bit unsigned value starting at 24 */ -+#define U8_24 (U8_16 + 1) /* 8 bit unsigned value starting at 24 */ - { 8, 24, 0 }, - #define U8_28 (U8_24 + 1) /* 8 bit unsigned value starting at 28 */ - { 8, 28, 0 }, -@@ -288,7 +282,7 @@ unused_s390_operands_static_asserts (void) - p - pc relative - r - general purpose register - re - gpr extended operand, a valid general purpose register pair -- u - unsigned integer, 4, 6, 8, 16 or 32 bit -+ u - unsigned integer, 4, 8, 16 or 32 bit - m - mode field, 4 bit - 0 - operand skipped. - The order of the letters reflects the layout of the format in -@@ -324,9 +318,9 @@ unused_s390_operands_static_asserts (void) - #define INSTR_RIE_R0U0 6, { R_8,U16_16,0,0,0,0 } /* e.g. clfitne */ - #define INSTR_RIE_RUI0 6, { R_8,I16_16,U4_12,0,0,0 } /* e.g. lochi */ - #define INSTR_RIE_RRUUU 6, { R_8,R_12,U8_16,U8_24,U8_32,0 } /* e.g. rnsbg */ --#define INSTR_RIE_RRUUU2 6, { R_8,R_12,U8_16,U6_26,U8_32,0 } /* e.g. risbgz */ --#define INSTR_RIE_RRUUU3 6, { R_8,R_12,U8_16,U5_27,U8_32,0 } /* e.g. risbhg */ --#define INSTR_RIE_RRUUU4 6, { R_8,R_12,U6_18,U8_24,U8_32,0 } /* e.g. rnsbgt */ -+#define INSTR_RIE_RRUUU2 INSTR_RIE_RRUUU /* e.g. risbgz */ -+#define INSTR_RIE_RRUUU3 INSTR_RIE_RRUUU /* e.g. risbhg */ -+#define INSTR_RIE_RRUUU4 INSTR_RIE_RRUUU /* e.g. rnsbgt */ - #define INSTR_RIL_0P 6, { J32_16,0,0,0,0 } /* e.g. jg */ - #define INSTR_RIL_RP 6, { R_8,J32_16,0,0,0,0 } /* e.g. brasl */ - #define INSTR_RIL_UP 6, { U4_8,J32_16,0,0,0,0 } /* e.g. brcl */ -@@ -551,9 +545,9 @@ unused_s390_operands_static_asserts (void) - #define MASK_RIE_R0U0 { 0xff, 0x0f, 0x00, 0x00, 0xff, 0xff } - #define MASK_RIE_RUI0 { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff } - #define MASK_RIE_RRUUU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff } --#define MASK_RIE_RRUUU2 { 0xff, 0x00, 0x00, 0xc0, 0x00, 0xff } --#define MASK_RIE_RRUUU3 { 0xff, 0x00, 0x00, 0xe0, 0x00, 0xff } --#define MASK_RIE_RRUUU4 { 0xff, 0x00, 0xc0, 0x00, 0x00, 0xff } -+#define MASK_RIE_RRUUU2 { 0xff, 0x00, 0x00, 0x80, 0x00, 0xff } -+#define MASK_RIE_RRUUU3 { 0xff, 0x00, 0x00, 0x80, 0x00, 0xff } -+#define MASK_RIE_RRUUU4 { 0xff, 0x00, 0x80, 0x00, 0x00, 0xff } - #define MASK_RIL_0P { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 } - #define MASK_RIL_RP { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 } - #define MASK_RIL_UP { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 } diff --git a/gdb-rhel-86801-binutils-z17-update-11of12.patch b/gdb-rhel-86801-binutils-z17-update-11of12.patch deleted file mode 100644 index a72b568..0000000 --- a/gdb-rhel-86801-binutils-z17-update-11of12.patch +++ /dev/null @@ -1,244 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Andreas Krebbel -Date: Mon, 28 Apr 2025 11:23:22 -0700 -Subject: gdb-rhel-86801-binutils-z17-update-11of12.patch - -;; Backkport "s390: Add arch15 instructions" -;; (Andreas Krebbel, RHEL-86801) - -opcodes/ - * s390-mkopc.c (main) Accept arch15 as CPU string. - * s390-opc.txt: Add arch15 instructions. - -include/ - * opcode/s390.h (enum s390_opcode_cpu_val): Add - S390_OPCODE_ARCH15. - -gas/ - * config/tc-s390.c (s390_parse_cpu): New entry for arch15. - * doc/c-s390.texi: Document arch15 march option. - * doc/as.texi: Likewise. - * testsuite/gas/s390/s390.exp: Run the arch15 related tests. - * testsuite/gas/s390/zarch-arch15.d: Tests for arch15 - instructions. - * testsuite/gas/s390/zarch-arch15.s: Likewise. - -Signed-off-by: Andreas Krebbel -Reviewed-by: Jens Remus - -diff --git a/include/opcode/s390.h b/include/opcode/s390.h ---- a/include/opcode/s390.h -+++ b/include/opcode/s390.h -@@ -45,6 +45,7 @@ enum s390_opcode_cpu_val - S390_OPCODE_ARCH12, - S390_OPCODE_ARCH13, - S390_OPCODE_ARCH14, -+ S390_OPCODE_ARCH15, - S390_OPCODE_MAXCPU - }; - -diff --git a/opcodes/s390-mkopc.c b/opcodes/s390-mkopc.c ---- a/opcodes/s390-mkopc.c -+++ b/opcodes/s390-mkopc.c -@@ -384,6 +384,8 @@ main (void) - else if (strcmp (cpu_string, "z16") == 0 - || strcmp (cpu_string, "arch14") == 0) - min_cpu = S390_OPCODE_ARCH14; -+ else if (strcmp (cpu_string, "arch15") == 0) -+ min_cpu = S390_OPCODE_ARCH15; - else { - fprintf (stderr, "Couldn't parse cpu string %s\n", cpu_string); - exit (1); -diff --git a/opcodes/s390-opc.c b/opcodes/s390-opc.c ---- a/opcodes/s390-opc.c -+++ b/opcodes/s390-opc.c -@@ -228,7 +228,9 @@ const struct s390_operand s390_operands[] = - { 12, 16, 0 }, - #define U16_16 (U12_16 + 1) /* 16 bit unsigned value starting at 16 */ - { 16, 16, 0 }, --#define U16_32 (U16_16 + 1) /* 16 bit unsigned value starting at 32 */ -+#define U16_20 (U16_16 + 1) /* 16 bit unsigned value starting at 20 */ -+ { 16, 20, 0 }, -+#define U16_32 (U16_20 + 1) /* 16 bit unsigned value starting at 32 */ - { 16, 32, 0 }, - #define U32_16 (U16_32 + 1) /* 32 bit unsigned value starting at 16 */ - { 32, 16, 0 }, -@@ -484,6 +486,8 @@ unused_s390_operands_static_asserts (void) - #define INSTR_VRI_VVUUU 6, { V_8,V_12,U12_16,U4_32,U4_28,0 } /* e.g. vftci */ - #define INSTR_VRI_VVUUU2 6, { V_8,V_12,U8_28,U8_16,U4_24,0 } /* e.g. vpsop */ - #define INSTR_VRI_VR0UU 6, { V_8,R_12,U8_28,U4_24,0,0 } /* e.g. vcvd */ -+#define INSTR_VRI_VV0UU 6, { V_8,V_12,U8_28,U4_24,0,0 } /* e.g. vcvdq */ -+#define INSTR_VRI_VVV0UV 6, { V_8,V_12,V_16,V_32,U8_24,0 } /* e.g. veval */ - #define INSTR_VRX_VRRD 6, { V_8,D_20,X_12,B_16,0,0 } /* e.g. vl */ - #define INSTR_VRX_VV 6, { V_8,V_12,0,0,0,0 } /* e.g. vlr */ - #define INSTR_VRX_VRRDU 6, { V_8,D_20,X_12,B_16,U4_32,0 } /* e.g. vlrep */ -@@ -494,10 +498,10 @@ unused_s390_operands_static_asserts (void) - #define INSTR_VRS_VRRDU 6, { V_8,R_12,D_20,B_16,U4_32,0 } /* e.g. vlvg */ - #define INSTR_VRS_VRRD 6, { V_8,R_12,D_20,B_16,0,0 } /* e.g. vlvgb */ - #define INSTR_VRS_RRDV 6, { V_32,R_12,D_20,B_16,0,0 } /* e.g. vlrlr */ --#define INSTR_VRR_0V 6, { V_12,0,0,0,0,0 } /* e.g. vtp */ - #define INSTR_VRR_VRR 6, { V_8,R_12,R_16,0,0,0 } /* e.g. vlvgp */ - #define INSTR_VRR_VVV0U 6, { V_8,V_12,V_16,U4_32,0,0 } /* e.g. vmrh */ - #define INSTR_VRR_VVV0U0 6, { V_8,V_12,V_16,U4_24,0,0 } /* e.g. vfaeb */ -+#define INSTR_VRR_VVV0U02 6, { V_8,V_12,V_16,U4_28,0,0 } /* e.g. vd */ - #define INSTR_VRR_VVV0U1 INSTR_VRR_VVV0U0 /* e.g. vfaebs*/ - #define INSTR_VRR_VVV0U2 INSTR_VRR_VVV0U0 /* e.g. vfaezb*/ - #define INSTR_VRR_VVV0U3 INSTR_VRR_VVV0U0 /* e.g. vfaezbs*/ -@@ -523,6 +527,9 @@ unused_s390_operands_static_asserts (void) - #define INSTR_VRR_VV0UUU 6, { V_8,V_12,U4_32,U4_28,U4_24,0 } /* e.g. vcdg */ - #define INSTR_VRR_VVVU0UV 6, { V_8,V_12,V_16,V_32,U4_28,U4_20 } /* e.g. vfma */ - #define INSTR_VRR_VV0U0U 6, { V_8,V_12,U4_32,U4_24,0,0 } /* e.g. vistr */ -+#define INSTR_VRR_0V 6, { V_12,0,0,0,0,0 } /* e.g. vtp */ -+#define INSTR_VRR_0V0U 6, { V_12,U16_20,0,0,0,0 } /* e.g. vtp */ -+#define INSTR_VRR_0VVU 6, { V_12,V_16,U16_20,0,0,0 } /* e.g. vtz */ - #define INSTR_VRR_0VV0U 6, { V_12,V_16,U4_24,0,0,0 } /* e.g. vcp */ - #define INSTR_VRR_RV0U 6, { R_8,V_12,U4_24,0,0,0 } /* e.g. vcvb */ - #define INSTR_VRR_RV0UU 6, { R_8,V_12,U4_24,U4_28,0,0 } /* e.g. vcvb */ -@@ -711,6 +718,8 @@ unused_s390_operands_static_asserts (void) - #define MASK_VRI_VVUUU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff } - #define MASK_VRI_VVUUU2 { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff } - #define MASK_VRI_VR0UU { 0xff, 0x00, 0xff, 0x00, 0x00, 0xff } -+#define MASK_VRI_VV0UU { 0xff, 0x00, 0xff, 0x00, 0x00, 0xff } -+#define MASK_VRI_VVV0UV { 0xff, 0x00, 0x0f, 0x00, 0x00, 0xff } - #define MASK_VRX_VRRD { 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff } - #define MASK_VRX_VV { 0xff, 0x00, 0xff, 0xff, 0xf0, 0xff } - #define MASK_VRX_VRRDU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff } -@@ -721,10 +730,10 @@ unused_s390_operands_static_asserts (void) - #define MASK_VRS_VRRDU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff } - #define MASK_VRS_VRRD { 0xff, 0x00, 0x00, 0x00, 0xf0, 0xff } - #define MASK_VRS_RRDV { 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff } --#define MASK_VRR_0V { 0xff, 0xf0, 0xff, 0xff, 0xf0, 0xff } - #define MASK_VRR_VRR { 0xff, 0x00, 0x0f, 0xff, 0xf0, 0xff } - #define MASK_VRR_VVV0U { 0xff, 0x00, 0x0f, 0xff, 0x00, 0xff } - #define MASK_VRR_VVV0U0 { 0xff, 0x00, 0x0f, 0x0f, 0xf0, 0xff } -+#define MASK_VRR_VVV0U02 { 0xff, 0x00, 0x0f, 0xf0, 0xf0, 0xff } - #define MASK_VRR_VVV0U1 { 0xff, 0x00, 0x0f, 0x1f, 0xf0, 0xff } - #define MASK_VRR_VVV0U2 { 0xff, 0x00, 0x0f, 0x2f, 0xf0, 0xff } - #define MASK_VRR_VVV0U3 { 0xff, 0x00, 0x0f, 0x3f, 0xf0, 0xff } -@@ -750,6 +759,9 @@ unused_s390_operands_static_asserts (void) - #define MASK_VRR_VV0UUU { 0xff, 0x00, 0xff, 0x00, 0x00, 0xff } - #define MASK_VRR_VVVU0UV { 0xff, 0x00, 0x00, 0xf0, 0x00, 0xff } - #define MASK_VRR_VV0U0U { 0xff, 0x00, 0xff, 0x0f, 0x00, 0xff } -+#define MASK_VRR_0V { 0xff, 0xf0, 0xff, 0xff, 0xf0, 0xff } -+#define MASK_VRR_0V0U { 0xff, 0xf0, 0xf0, 0x00, 0x00, 0xff } -+#define MASK_VRR_0VVU { 0xff, 0xf0, 0x00, 0x00, 0x00, 0xff } - #define MASK_VRR_0VV0U { 0xff, 0xf0, 0x0f, 0x0f, 0xf0, 0xff } - #define MASK_VRR_RV0U { 0xff, 0x00, 0xff, 0x0f, 0xf0, 0xff } - #define MASK_VRR_RV0UU { 0xff, 0x00, 0xff, 0x00, 0xf0, 0xff } -diff --git a/opcodes/s390-opc.txt b/opcodes/s390-opc.txt ---- a/opcodes/s390-opc.txt -+++ b/opcodes/s390-opc.txt -@@ -2072,3 +2072,113 @@ b201 stbear S_RD "store bear" arch14 zarch - # Processor-Activity-Instrumentation Facility - - b28f qpaci S_RD "query processor activity counter information" arch14 zarch -+ -+ -+# arch15 instructions -+ -+e70000000089 vblend VRR_VVVU0V " " arch15 zarch -+e70000000089 vblendb VRR_VVV0V " " arch15 zarch -+e70001000089 vblendh VRR_VVV0V " " arch15 zarch -+e70002000089 vblendf VRR_VVV0V " " arch15 zarch -+e70003000089 vblendg VRR_VVV0V " " arch15 zarch -+e70004000089 vblendq VRR_VVV0V " " arch15 zarch -+ -+e70000000088 veval VRI_VVV0UV " " arch15 zarch -+ -+e70000000054 vgem VRR_VV0U " " arch15 zarch -+e70000000054 vgemb VRR_VV " " arch15 zarch -+e70000001054 vgemh VRR_VV " " arch15 zarch -+e70000002054 vgemf VRR_VV " " arch15 zarch -+e70000003054 vgemg VRR_VV " " arch15 zarch -+e70000004054 vgemq VRR_VV " " arch15 zarch -+ -+e700000030d7 vuphg VRR_VV " " arch15 zarch -+e700000030d5 vuplhg VRR_VV " " arch15 zarch -+e700000030d6 vuplg VRR_VV " " arch15 zarch -+e700000030d4 vupllg VRR_VV " " arch15 zarch -+ -+e700000040f2 vavgq VRR_VVV " " arch15 zarch -+e700000040f0 vavglq VRR_VVV " " arch15 zarch -+e700000040db vecq VRR_VV " " arch15 zarch -+e700000040d9 veclq VRR_VV " " arch15 zarch -+e700000040f8 vceqq VRR_VVV " " arch15 zarch -+e700001040f8 vceqqs VRR_VVV " " arch15 zarch -+e700000040fb vchq VRR_VVV " " arch15 zarch -+e700001040fb vchqs VRR_VVV " " arch15 zarch -+e700000040f9 vchlq VRR_VVV " " arch15 zarch -+e700001040f9 vchlqs VRR_VVV " " arch15 zarch -+e70000004053 vclzq VRR_VV " " arch15 zarch -+e70000004052 vctzq VRR_VV " " arch15 zarch -+e700000040de vlcq VRR_VV " " arch15 zarch -+e700000040df vlpq VRR_VV " " arch15 zarch -+e700000040ff vmxq VRR_VVV " " arch15 zarch -+e700000040fd vmxlq VRR_VVV " " arch15 zarch -+e700000040fe vmnq VRR_VVV " " arch15 zarch -+e700000040fc vmnlq VRR_VVV " " arch15 zarch -+e700030000aa vmalg VRR_VVV0V " " arch15 zarch -+e700040000aa vmalq VRR_VVV0V " " arch15 zarch -+e700030000ab vmahg VRR_VVV0V " " arch15 zarch -+e700040000ab vmahq VRR_VVV0V " " arch15 zarch -+e700030000a9 vmalhg VRR_VVV0V " " arch15 zarch -+e700040000a9 vmalhq VRR_VVV0V " " arch15 zarch -+e700030000ae vmaeg VRR_VVV0V " " arch15 zarch -+e700030000ac vmaleg VRR_VVV0V " " arch15 zarch -+e700030000af vmaog VRR_VVV0V " " arch15 zarch -+e700030000ad vmalog VRR_VVV0V " " arch15 zarch -+e700000030a3 vmhg VRR_VVV " " arch15 zarch -+e700000040a3 vmhq VRR_VVV " " arch15 zarch -+e700000030a1 vmlhg VRR_VVV " " arch15 zarch -+e700000040a1 vmlhq VRR_VVV " " arch15 zarch -+e700000030a2 vmlg VRR_VVV " " arch15 zarch -+e700000040a2 vmlq VRR_VVV " " arch15 zarch -+e700000030a6 vmeg VRR_VVV " " arch15 zarch -+e700000030a4 vmleg VRR_VVV " " arch15 zarch -+e700000030a7 vmog VRR_VVV " " arch15 zarch -+e700000030a5 vmlog VRR_VVV " " arch15 zarch -+ -+e700000000b2 vd VRR_VVV0UU " " arch15 zarch -+e700000020b2 vdf VRR_VVV0U02 " " arch15 zarch -+e700000030b2 vdg VRR_VVV0U02 " " arch15 zarch -+e700000040b2 vdq VRR_VVV0U02 " " arch15 zarch -+ -+e700000000b0 vdl VRR_VVV0UU " " arch15 zarch -+e700000020b0 vdlf VRR_VVV0U02 " " arch15 zarch -+e700000030b0 vdlg VRR_VVV0U02 " " arch15 zarch -+e700000040b0 vdlq VRR_VVV0U02 " " arch15 zarch -+ -+e700000000b3 vr VRR_VVV0UU " " arch15 zarch -+e700000020b3 vrf VRR_VVV0U02 " " arch15 zarch -+e700000030b3 vrg VRR_VVV0U02 " " arch15 zarch -+e700000040b3 vrq VRR_VVV0U02 " " arch15 zarch -+ -+e700000000b1 vrl VRR_VVV0UU " " arch15 zarch -+e700000020b1 vrlf VRR_VVV0U02 " " arch15 zarch -+e700000030b1 vrlg VRR_VVV0U02 " " arch15 zarch -+e700000040b1 vrlq VRR_VVV0U02 " " arch15 zarch -+ -+b968 clzg RRE_RR " " arch15 zarch -+b969 ctzg RRE_RR " " arch15 zarch -+ -+e30000000060 lxab RXY_RRRD " " arch15 zarch -+e30000000062 lxah RXY_RRRD " " arch15 zarch -+e30000000064 lxaf RXY_RRRD " " arch15 zarch -+e30000000066 lxag RXY_RRRD " " arch15 zarch -+e30000000068 lxaq RXY_RRRD " " arch15 zarch -+ -+e30000000061 llxab RXY_RRRD " " arch15 zarch -+e30000000063 llxah RXY_RRRD " " arch15 zarch -+e30000000065 llxaf RXY_RRRD " " arch15 zarch -+e30000000067 llxag RXY_RRRD " " arch15 zarch -+e30000000069 llxaq RXY_RRRD " " arch15 zarch -+ -+b96c bextg RRF_R0RR2 " " arch15 zarch -+b96d bdepg RRF_R0RR2 " " arch15 zarch -+ -+b93e kimd RRF_U0RR " " arch15 zarch optparm -+b93f klmd RRF_U0RR " " arch15 zarch optparm -+ -+e6000000004e vcvbq VRR_VV0U2 " " arch15 zarch -+e6000000004a vcvdq VRI_VV0UU " " arch15 zarch -+ -+e6000000005f vtp VRR_0V0U " " arch15 zarch optparm -+e6000000007f vtz VRR_0VVU " " arch15 zarch diff --git a/gdb-rhel-86801-binutils-z17-update-1of12.patch b/gdb-rhel-86801-binutils-z17-update-1of12.patch deleted file mode 100644 index 84d9a1d..0000000 --- a/gdb-rhel-86801-binutils-z17-update-1of12.patch +++ /dev/null @@ -1,343 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jens Remus -Date: Mon, 28 Apr 2025 11:23:21 -0700 -Subject: gdb-rhel-86801-binutils-z17-update-1of12.patch - -;; Backkport "s390: Make operand table indices relative to each other" -;; (Jens Remus, RHEL-86801) - -This is a purely mechanical change. It allows subsequent insertions into -the operands table without having to renumber all operand indices. - -The only differences in the resulting ELF object are in the .debug_info -section. This has been confirmed by diffing the following xxd and readelf -output: - -xxd s390-opc.o -readelf -aW -x .text -x .data -x .bss -x .rodata -x .debug_info \ - -x .symtab -x .strtab -x .shstrtab --debug-dump s390-opc.o - -opcodes/ - * s390-opc.c: Make operand table indices relative to each other. - -Signed-off-by: Jens Remus -Reviewed-by: Andreas Krebbel - -diff --git a/opcodes/s390-opc.c b/opcodes/s390-opc.c ---- a/opcodes/s390-opc.c -+++ b/opcodes/s390-opc.c -@@ -34,76 +34,82 @@ - inserting operands into instructions and vice-versa is kept in this - file. */ - -+/* Build-time checks are preferrable over runtime ones. Use this construct -+ in preference where possible. */ -+#define static_assert(e) ((void)sizeof (struct { int _:1 - 2 * !(e); })) -+ -+#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a)[0])) -+ - /* The operands table. - The fields are bits, shift, insert, extract, flags. */ - - const struct s390_operand s390_operands[] = - { --#define UNUSED 0 -+#define UNUSED 0 - { 0, 0, 0 }, /* Indicates the end of the operand list */ - - /* General purpose register operands. */ - --#define R_8 1 /* GPR starting at position 8 */ -+#define R_8 (UNUSED + 1) /* GPR starting at position 8 */ - { 4, 8, S390_OPERAND_GPR }, --#define R_12 2 /* GPR starting at position 12 */ -+#define R_12 (R_8 + 1) /* GPR starting at position 12 */ - { 4, 12, S390_OPERAND_GPR }, --#define R_16 3 /* GPR starting at position 16 */ -+#define R_16 (R_12 + 1) /* GPR starting at position 16 */ - { 4, 16, S390_OPERAND_GPR }, --#define R_20 4 /* GPR starting at position 20 */ -+#define R_20 (R_16 + 1) /* GPR starting at position 20 */ - { 4, 20, S390_OPERAND_GPR }, --#define R_24 5 /* GPR starting at position 24 */ -+#define R_24 (R_20 + 1) /* GPR starting at position 24 */ - { 4, 24, S390_OPERAND_GPR }, --#define R_28 6 /* GPR starting at position 28 */ -+#define R_28 (R_24 + 1) /* GPR starting at position 28 */ - { 4, 28, S390_OPERAND_GPR }, --#define R_32 7 /* GPR starting at position 32 */ -+#define R_32 (R_28 + 1) /* GPR starting at position 32 */ - { 4, 32, S390_OPERAND_GPR }, - - /* General purpose register pair operands. */ - --#define RE_8 8 /* GPR starting at position 8 */ -+#define RE_8 (R_32 + 1) /* GPR starting at position 8 */ - { 4, 8, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR }, --#define RE_12 9 /* GPR starting at position 12 */ -+#define RE_12 (RE_8 + 1) /* GPR starting at position 12 */ - { 4, 12, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR }, --#define RE_16 10 /* GPR starting at position 16 */ -+#define RE_16 (RE_12 + 1) /* GPR starting at position 16 */ - { 4, 16, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR }, --#define RE_20 11 /* GPR starting at position 20 */ -+#define RE_20 (RE_16 + 1) /* GPR starting at position 20 */ - { 4, 20, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR }, --#define RE_24 12 /* GPR starting at position 24 */ -+#define RE_24 (RE_20 + 1) /* GPR starting at position 24 */ - { 4, 24, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR }, --#define RE_28 13 /* GPR starting at position 28 */ -+#define RE_28 (RE_24 + 1) /* GPR starting at position 28 */ - { 4, 28, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR }, --#define RE_32 14 /* GPR starting at position 32 */ -+#define RE_32 (RE_28 + 1) /* GPR starting at position 32 */ - { 4, 32, S390_OPERAND_GPR | S390_OPERAND_REG_PAIR }, - - /* Floating point register operands. */ - --#define F_8 15 /* FPR starting at position 8 */ -+#define F_8 (RE_32 + 1) /* FPR starting at position 8 */ - { 4, 8, S390_OPERAND_FPR }, --#define F_12 16 /* FPR starting at position 12 */ -+#define F_12 (F_8 + 1) /* FPR starting at position 12 */ - { 4, 12, S390_OPERAND_FPR }, --#define F_16 17 /* FPR starting at position 16 */ -+#define F_16 (F_12 + 1) /* FPR starting at position 16 */ - { 4, 16, S390_OPERAND_FPR }, --#define F_24 18 /* FPR starting at position 24 */ -+#define F_24 (F_16 + 1) /* FPR starting at position 24 */ - { 4, 24, S390_OPERAND_FPR }, --#define F_28 19 /* FPR starting at position 28 */ -+#define F_28 (F_24 + 1) /* FPR starting at position 28 */ - { 4, 28, S390_OPERAND_FPR }, --#define F_32 20 /* FPR starting at position 32 */ -+#define F_32 (F_28 + 1) /* FPR starting at position 32 */ - { 4, 32, S390_OPERAND_FPR }, - - /* Floating point register pair operands. */ - --#define FE_8 21 /* FPR starting at position 8 */ -+#define FE_8 (F_32 + 1) /* FPR starting at position 8 */ - { 4, 8, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR }, --#define FE_12 22 /* FPR starting at position 12 */ -+#define FE_12 (FE_8 + 1) /* FPR starting at position 12 */ - { 4, 12, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR }, --#define FE_16 23 /* FPR starting at position 16 */ -+#define FE_16 (FE_12 + 1) /* FPR starting at position 16 */ - { 4, 16, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR }, --#define FE_24 24 /* FPR starting at position 24 */ -+#define FE_24 (FE_16 + 1) /* FPR starting at position 24 */ - { 4, 24, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR }, --#define FE_28 25 /* FPR starting at position 28 */ -+#define FE_28 (FE_24 + 1) /* FPR starting at position 28 */ - { 4, 28, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR }, --#define FE_32 26 /* FPR starting at position 32 */ -+#define FE_32 (FE_28 + 1) /* FPR starting at position 32 */ - { 4, 32, S390_OPERAND_FPR | S390_OPERAND_REG_PAIR }, - - /* Vector register operands. */ -@@ -111,145 +117,149 @@ const struct s390_operand s390_operands[] = - /* For each of these operands and additional bit in the RXB operand is - needed. */ - --#define V_8 27 /* Vector reg. starting at position 8 */ -+#define V_8 (FE_32 + 1) /* Vector reg. starting at position 8 */ - { 4, 8, S390_OPERAND_VR }, --#define V_12 28 /* Vector reg. starting at position 12 */ -+#define V_12 (V_8 + 1) /* Vector reg. starting at position 12 */ - { 4, 12, S390_OPERAND_VR }, --#define V_CP16_12 29 /* Vector reg. starting at position 12 */ -+#define V_CP16_12 (V_12 + 1) /* Vector reg. starting at position 12 */ - { 4, 12, S390_OPERAND_VR | S390_OPERAND_CP16 }, /* with a copy at pos 16 */ --#define V_16 30 /* Vector reg. starting at position 16 */ -+#define V_16 (V_CP16_12+1) /* Vector reg. starting at position 16 */ - { 4, 16, S390_OPERAND_VR }, --#define V_32 31 /* Vector reg. starting at position 32 */ -+#define V_32 (V_16 + 1) /* Vector reg. starting at position 32 */ - { 4, 32, S390_OPERAND_VR }, - - /* Access register operands. */ - --#define A_8 32 /* Access reg. starting at position 8 */ -+#define A_8 (V_32 + 1) /* Access reg. starting at position 8 */ - { 4, 8, S390_OPERAND_AR }, --#define A_12 33 /* Access reg. starting at position 12 */ -+#define A_12 (A_8 + 1) /* Access reg. starting at position 12 */ - { 4, 12, S390_OPERAND_AR }, --#define A_24 34 /* Access reg. starting at position 24 */ -+#define A_24 (A_12 + 1) /* Access reg. starting at position 24 */ - { 4, 24, S390_OPERAND_AR }, --#define A_28 35 /* Access reg. starting at position 28 */ -+#define A_28 (A_24 + 1) /* Access reg. starting at position 28 */ - { 4, 28, S390_OPERAND_AR }, - - /* Control register operands. */ - --#define C_8 36 /* Control reg. starting at position 8 */ -+#define C_8 (A_28 + 1) /* Control reg. starting at position 8 */ - { 4, 8, S390_OPERAND_CR }, --#define C_12 37 /* Control reg. starting at position 12 */ -+#define C_12 (C_8 + 1) /* Control reg. starting at position 12 */ - { 4, 12, S390_OPERAND_CR }, - - /* Base register operands. */ - --#define B_16 38 /* Base register starting at position 16 */ -+#define B_16 (C_12 + 1) /* Base register starting at position 16 */ - { 4, 16, S390_OPERAND_BASE | S390_OPERAND_GPR }, --#define B_32 39 /* Base register starting at position 32 */ -+#define B_32 (B_16 + 1) /* Base register starting at position 32 */ - { 4, 32, S390_OPERAND_BASE | S390_OPERAND_GPR }, - --#define X_12 40 /* Index register starting at position 12 */ -+#define X_12 (B_32 + 1) /* Index register starting at position 12 */ - { 4, 12, S390_OPERAND_INDEX | S390_OPERAND_GPR }, - --#define VX_12 41 /* Vector index register starting at position 12 */ -+#define VX_12 (X_12+1) /* Vector index register starting at position 12 */ - { 4, 12, S390_OPERAND_INDEX | S390_OPERAND_VR }, - - /* Address displacement operands. */ - --#define D_20 42 /* Displacement starting at position 20 */ -+#define D_20 (VX_12 + 1) /* Displacement starting at position 20 */ - { 12, 20, S390_OPERAND_DISP }, --#define D_36 43 /* Displacement starting at position 36 */ -+#define D_36 (D_20 + 1) /* Displacement starting at position 36 */ - { 12, 36, S390_OPERAND_DISP }, --#define D20_20 44 /* 20 bit displacement starting at 20 */ -+#define D20_20 (D_36 + 1) /* 20 bit displacement starting at 20 */ - { 20, 20, S390_OPERAND_DISP | S390_OPERAND_SIGNED }, - - /* Length operands. */ - --#define L4_8 45 /* 4 bit length starting at position 8 */ -+#define L4_8 (D20_20 + 1) /* 4 bit length starting at position 8 */ - { 4, 8, S390_OPERAND_LENGTH }, --#define L4_12 46 /* 4 bit length starting at position 12 */ -+#define L4_12 (L4_8 + 1) /* 4 bit length starting at position 12 */ - { 4, 12, S390_OPERAND_LENGTH }, --#define L8_8 47 /* 8 bit length starting at position 8 */ -+#define L8_8 (L4_12 + 1) /* 8 bit length starting at position 8 */ - { 8, 8, S390_OPERAND_LENGTH }, - - /* Signed immediate operands. */ - --#define I8_8 48 /* 8 bit signed value starting at 8 */ -+#define I8_8 (L8_8 + 1) /* 8 bit signed value starting at 8 */ - { 8, 8, S390_OPERAND_SIGNED }, --#define I8_32 49 /* 8 bit signed value starting at 32 */ -+#define I8_32 (I8_8 + 1) /* 8 bit signed value starting at 32 */ - { 8, 32, S390_OPERAND_SIGNED }, --#define I12_12 50 /* 12 bit signed value starting at 12 */ -+#define I12_12 (I8_32 + 1) /* 12 bit signed value starting at 12 */ - { 12, 12, S390_OPERAND_SIGNED }, --#define I16_16 51 /* 16 bit signed value starting at 16 */ -+#define I16_16 (I12_12 + 1) /* 16 bit signed value starting at 16 */ - { 16, 16, S390_OPERAND_SIGNED }, --#define I16_32 52 /* 16 bit signed value starting at 32 */ -+#define I16_32 (I16_16 + 1) /* 16 bit signed value starting at 32 */ - { 16, 32, S390_OPERAND_SIGNED }, --#define I24_24 53 /* 24 bit signed value starting at 24 */ -+#define I24_24 (I16_32 + 1) /* 24 bit signed value starting at 24 */ - { 24, 24, S390_OPERAND_SIGNED }, --#define I32_16 54 /* 32 bit signed value starting at 16 */ -+#define I32_16 (I24_24 + 1) /* 32 bit signed value starting at 16 */ - { 32, 16, S390_OPERAND_SIGNED }, - - /* Unsigned immediate operands. */ - --#define U4_8 55 /* 4 bit unsigned value starting at 8 */ -+#define U4_8 (I32_16 + 1) /* 4 bit unsigned value starting at 8 */ - { 4, 8, 0 }, --#define U4_12 56 /* 4 bit unsigned value starting at 12 */ -+#define U4_12 (U4_8 + 1) /* 4 bit unsigned value starting at 12 */ - { 4, 12, 0 }, --#define U4_16 57 /* 4 bit unsigned value starting at 16 */ -+#define U4_16 (U4_12 + 1) /* 4 bit unsigned value starting at 16 */ - { 4, 16, 0 }, --#define U4_20 58 /* 4 bit unsigned value starting at 20 */ -+#define U4_20 (U4_16 + 1) /* 4 bit unsigned value starting at 20 */ - { 4, 20, 0 }, --#define U4_24 59 /* 4 bit unsigned value starting at 24 */ -+#define U4_24 (U4_20 + 1) /* 4 bit unsigned value starting at 24 */ - { 4, 24, 0 }, --#define U4_OR1_24 60 /* 4 bit unsigned value ORed with 1 */ -+#define U4_OR1_24 (U4_24 + 1) /* 4 bit unsigned value ORed with 1 */ - { 4, 24, S390_OPERAND_OR1 }, /* starting at 24 */ --#define U4_OR2_24 61 /* 4 bit unsigned value ORed with 2 */ -+#define U4_OR2_24 (U4_OR1_24+1) /* 4 bit unsigned value ORed with 2 */ - { 4, 24, S390_OPERAND_OR2 }, /* starting at 24 */ --#define U4_OR3_24 62 /* 4 bit unsigned value ORed with 3 */ -+#define U4_OR3_24 (U4_OR2_24+1) /* 4 bit unsigned value ORed with 3 */ - { 4, 24, S390_OPERAND_OR1 | S390_OPERAND_OR2 }, /* starting at 24 */ --#define U4_28 63 /* 4 bit unsigned value starting at 28 */ -+#define U4_28 (U4_OR3_24+1) /* 4 bit unsigned value starting at 28 */ - { 4, 28, 0 }, --#define U4_OR8_28 64 /* 4 bit unsigned value ORed with 8 */ -+#define U4_OR8_28 (U4_28 + 1) /* 4 bit unsigned value ORed with 8 */ - { 4, 28, S390_OPERAND_OR8 }, /* starting at 28 */ --#define U4_32 65 /* 4 bit unsigned value starting at 32 */ -+#define U4_32 (U4_OR8_28+1) /* 4 bit unsigned value starting at 32 */ - { 4, 32, 0 }, --#define U4_36 66 /* 4 bit unsigned value starting at 36 */ -+#define U4_36 (U4_32 + 1) /* 4 bit unsigned value starting at 36 */ - { 4, 36, 0 }, --#define U8_8 67 /* 8 bit unsigned value starting at 8 */ -+#define U8_8 (U4_36 + 1) /* 8 bit unsigned value starting at 8 */ - { 8, 8, 0 }, --#define U8_16 68 /* 8 bit unsigned value starting at 16 */ -+#define U8_16 (U8_8 + 1) /* 8 bit unsigned value starting at 16 */ - { 8, 16, 0 }, --#define U6_26 69 /* 6 bit unsigned value starting at 26 */ -+#define U6_26 (U8_16 + 1) /* 6 bit unsigned value starting at 26 */ - { 6, 26, 0 }, --#define U8_24 70 /* 8 bit unsigned value starting at 24 */ -+#define U8_24 (U6_26 + 1) /* 8 bit unsigned value starting at 24 */ - { 8, 24, 0 }, --#define U8_28 71 /* 8 bit unsigned value starting at 28 */ -+#define U8_28 (U8_24 + 1) /* 8 bit unsigned value starting at 28 */ - { 8, 28, 0 }, --#define U8_32 72 /* 8 bit unsigned value starting at 32 */ -+#define U8_32 (U8_28 + 1) /* 8 bit unsigned value starting at 32 */ - { 8, 32, 0 }, --#define U12_16 73 /* 12 bit unsigned value starting at 16 */ -+#define U12_16 (U8_32 + 1) /* 12 bit unsigned value starting at 16 */ - { 12, 16, 0 }, --#define U16_16 74 /* 16 bit unsigned value starting at 16 */ -+#define U16_16 (U12_16 + 1) /* 16 bit unsigned value starting at 16 */ - { 16, 16, 0 }, --#define U16_32 75 /* 16 bit unsigned value starting at 32 */ -+#define U16_32 (U16_16 + 1) /* 16 bit unsigned value starting at 32 */ - { 16, 32, 0 }, --#define U32_16 76 /* 32 bit unsigned value starting at 16 */ -+#define U32_16 (U16_32 + 1) /* 32 bit unsigned value starting at 16 */ - { 32, 16, 0 }, - - /* PC-relative address operands. */ - --#define J12_12 77 /* 12 bit PC relative offset at 12 */ -+#define J12_12 (U32_16 + 1) /* 12 bit PC relative offset at 12 */ - { 12, 12, S390_OPERAND_PCREL }, --#define J16_16 78 /* 16 bit PC relative offset at 16 */ -+#define J16_16 (J12_12 + 1) /* 16 bit PC relative offset at 16 */ - { 16, 16, S390_OPERAND_PCREL }, --#define J16_32 79 /* 16 bit PC relative offset at 32 */ -+#define J16_32 (J16_16 + 1) /* 16 bit PC relative offset at 32 */ - { 16, 32, S390_OPERAND_PCREL }, --#define J24_24 80 /* 24 bit PC relative offset at 24 */ -+#define J24_24 (J16_32 + 1) /* 24 bit PC relative offset at 24 */ - { 24, 24, S390_OPERAND_PCREL }, --#define J32_16 81 /* 32 bit PC relative offset at 16 */ -+#define J32_16 (J24_24 + 1) /* 32 bit PC relative offset at 16 */ - { 32, 16, S390_OPERAND_PCREL }, - - }; - -+static inline void unused_s390_operands_static_asserts(void) -+{ -+ static_assert(ARRAY_SIZE(s390_operands) - 1 == J32_16); -+} - - /* Macros used to form opcodes. */ - diff --git a/gdb-rhel-86801-binutils-z17-update-2of12.patch b/gdb-rhel-86801-binutils-z17-update-2of12.patch deleted file mode 100644 index 50c77f4..0000000 --- a/gdb-rhel-86801-binutils-z17-update-2of12.patch +++ /dev/null @@ -1,99 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jens Remus -Date: Mon, 28 Apr 2025 11:23:21 -0700 -Subject: gdb-rhel-86801-binutils-z17-update-2of12.patch - -;; Backkport "s390: Align optional operand definition to specs" -;; (Jens Remus, RHEL-86801) - -The IBM z/Architecture Principle of Operation [1] specifies the last -operand(s) of some (extended) mnemonics to be optional. Align the -mnemonic definitions in the opcode table according to specification. - -This changes the last operand of the following (extended) mnemonics to -be optional: -risbg, risbgz, risbgn, risbgnz, risbhg, risblg, rnsbg, rosbg, rxsbg - -Note that efpc and sfpc actually have only one operand, but had -erroneously been defined to have two. For backwards compatibility the -wrong RR register format must be retained. Since the superfluous second -operand is defined as optional the instruction can still be coded as -specified. - -[1]: IBM z/Architecture Principles of Operation, SA22-7832-13, IBM z16, - https://publibfp.dhe.ibm.com/epubs/pdf/a227832d.pdf - -opcodes/ - * s390-opc.txt: Align optional operand definition to - specification. - -testsuite/ - * zarch-z10.s: Add test cases for risbg, risbgz, rnsbg, rosbg, - and rxsbg. - * zarch-z10.d: Likewise. - * zarch-z196.s: Add test cases for risbhg and risblg. - * zarch-z196.d: Likewise. - * zarch-zEC12.s: Add test cases for risbgn and risbgnz. - * zarch-zEC12.d: Likewise. - -Signed-off-by: Jens Remus -Reviewed-by: Andreas Krebbel - -diff --git a/opcodes/s390-opc.txt b/opcodes/s390-opc.txt ---- a/opcodes/s390-opc.txt -+++ b/opcodes/s390-opc.txt -@@ -305,6 +305,7 @@ b30d debr RRE_FF "divide short bfp" g5 esa,zarch - ed000000000d deb RXE_FRRD "divide short bfp" g5 esa,zarch - b35b didbr RRF_FUFF "divide to integer long bfp" g5 esa,zarch - b353 diebr RRF_FUFF "divide to integer short bfp" g5 esa,zarch -+# efpc and sfpc have only one operand; retain RR register format for compatibility - b38c efpc RRE_RR "extract fpc" g5 esa,zarch optparm - b342 ltxbr RRE_FEFE "load and test extended bfp" g5 esa,zarch - b312 ltdbr RRE_FF "load and test long bfp" g5 esa,zarch -@@ -348,6 +349,7 @@ b31f msdbr RRF_F0FF "multiply and subtract long bfp" g5 esa,zarch - ed000000001f msdb RXF_FRRDF "multiply and subtract long bfp" g5 esa,zarch - b30f msebr RRF_F0FF "multiply and subtract short bfp" g5 esa,zarch - ed000000000f mseb RXF_FRRDF "multiply and subtract short bfp" g5 esa,zarch -+# efpc and sfpc have only one operand; retain RR register format for compatibility - b384 sfpc RRE_RR "set fpc" g5 esa,zarch optparm - b299 srnm S_RD "set rounding mode" g5 esa,zarch - b316 sqxbr RRE_FEFE "square root extended bfp" g5 esa,zarch -@@ -966,11 +968,11 @@ c201 msfi RIL_RI "multiply single immediate (32)" z10 zarch - c200 msgfi RIL_RI "multiply single immediate (64)" z10 zarch - e30000000036 pfd RXY_URRD "prefetch data" z10 zarch - c602 pfdrl RIL_UP "prefetch data relative long" z10 zarch --ec0000000054 rnsbg RIE_RRUUU "rotate then and selected bits" z10 zarch --ec0000000057 rxsbg RIE_RRUUU "rotate then exclusive or selected bits" z10 zarch --ec0000000056 rosbg RIE_RRUUU "rotate then or selected bits" z10 zarch --ec0000000055 risbg RIE_RRUUU "rotate then insert selected bits" z10 zarch --ec0000800055 risbgz RIE_RRUUU2 "rotate then insert selected bits and zero remaining bits" z10 zarch -+ec0000000054 rnsbg RIE_RRUUU "rotate then and selected bits" z10 zarch optparm -+ec0000000057 rxsbg RIE_RRUUU "rotate then exclusive or selected bits" z10 zarch optparm -+ec0000000056 rosbg RIE_RRUUU "rotate then or selected bits" z10 zarch optparm -+ec0000000055 risbg RIE_RRUUU "rotate then insert selected bits" z10 zarch optparm -+ec0000800055 risbgz RIE_RRUUU2 "rotate then insert selected bits and zero remaining bits" z10 zarch optparm - c40f strl RIL_RP "store relative long (32)" z10 zarch - c40b stgrl RIL_RP "store relative long (64)" z10 zarch - c407 sthrl RIL_RP "store halfword relative long" z10 zarch -@@ -1014,8 +1016,8 @@ e300000000c4 lhh RXY_RRRD "load halfword high" z196 zarch - e300000000ca lfh RXY_RRRD "load high" z196 zarch - e300000000c2 llch RXY_RRRD "load logical character high" z196 zarch - e300000000c6 llhh RXY_RRRD "load logical halfword high" z196 zarch --ec000000005d risbhg RIE_RRUUU "rotate then insert selected bits high" z196 zarch --ec0000000051 risblg RIE_RRUUU "rotate then insert selected bits low" z196 zarch -+ec000000005d risbhg RIE_RRUUU "rotate then insert selected bits high" z196 zarch optparm -+ec0000000051 risblg RIE_RRUUU "rotate then insert selected bits low" z196 zarch optparm - e300000000c3 stch RXY_RRRD "store character high" z196 zarch - e300000000c7 sthh RXY_RRRD "store halfword high" z196 zarch - e300000000cb stfh RXY_RRRD "store high" z196 zarch -@@ -1153,8 +1155,8 @@ eb0000000023 clt RSY_RURD "compare logical and trap 32 bit reg-mem" zEC12 zarch - eb0000000023 clt$12 RSY_R0RD "compare logical and trap 32 bit reg-mem" zEC12 zarch - eb000000002b clgt RSY_RURD "compare logical and trap 64 bit reg-mem" zEC12 zarch - eb000000002b clgt$12 RSY_R0RD "compare logical and trap 64 bit reg-mem" zEC12 zarch --ec0000000059 risbgn RIE_RRUUU "rotate then insert selected bits nocc" zEC12 zarch --ec0000800059 risbgnz RIE_RRUUU2 "rotate then insert selected bits and zero remaining bits nocc" zEC12 zarch -+ec0000000059 risbgn RIE_RRUUU "rotate then insert selected bits nocc" zEC12 zarch optparm -+ec0000800059 risbgnz RIE_RRUUU2 "rotate then insert selected bits and zero remaining bits nocc" zEC12 zarch optparm - ed00000000aa cdzt RSL_LRDFU "convert from zoned long" zEC12 zarch - ed00000000ab cxzt RSL_LRDFEU "convert from zoned extended" zEC12 zarch - ed00000000a8 czdt RSL_LRDFU "convert to zoned long" zEC12 zarch diff --git a/gdb-rhel-86801-binutils-z17-update-3of12.patch b/gdb-rhel-86801-binutils-z17-update-3of12.patch deleted file mode 100644 index 37c6ed0..0000000 --- a/gdb-rhel-86801-binutils-z17-update-3of12.patch +++ /dev/null @@ -1,244 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jens Remus -Date: Mon, 28 Apr 2025 11:23:22 -0700 -Subject: gdb-rhel-86801-binutils-z17-update-3of12.patch - -;; Backkport "s390: Add missing extended mnemonics" -;; (Jens Remus, RHEL-86801) - -Add extended mnemonics specified in the z/Architecture Principles of -Operation [1] and z/Architecture Reference Summary [2], that were -previously missing from the opcode table. - -The following added extended mnemonics are synonyms to a base mnemonic -and therefore disassemble into their base mnemonic: -jc, jcth, lfi, llgfi, llghi - -The following added extended mnemonics are more specific than their base -mnemonic and therefore disassemble into the added extended mnemonic: -risbhgz, risblgz, rnsbgt, rosbgt, rxsbgt - -The following added extended mnemonics are more specific than their base -mnemonic, but disassemble into their base mnemonic due to design -constraints: -notr, notgr - -The missing extended mnemonic jl* conditional jump long flavors cannot -be added, as they would clash with the existing non-standard extended -mnemonic j* conditional jump flavors jle and jlh. The missing extended -mnemonic jlc jump long conditional is not added, as the related jl* -flavors cannot be added. -Note that these missing jl* conditional jump long flavors are already -defined as non-standard jg* flavors instead. While the related missing -extended mnemonic jlc could be added as non-standard jgc instead it is -forgone in favor of not adding further non-standard mnemonics. - -The missing extended mnemonics sllhh, sllhl, slllh, srlhh, srlhl, and -srllh cannot be implemented using the current design, as they require -computed operands. For that reason the following missing extended -mnemonics are not added as well, as they fall into the same category of -instructions that operate on high and low words of registers. They -should better be added together, not to confuse the user, which of those -instructions are currently implemented or not. -lhhr, lhlr, llhfr, llchhr, llchlr, llclhr, llhhhr, llhhlr, llhlhr, -nhhr, nhlr, nlhr, ohhr, ohlr, olhr, xhhr, xhlr, xlhr - -[1] IBM z/Architecture Principles of Operation, SA22-7832-13, IBM z16, - https://publibfp.dhe.ibm.com/epubs/pdf/a227832d.pdf -[2] IBM z/Architecture Reference Summary, SA22-7871-11, - https://www.ibm.com/support/pages/sites/default/files/2022-09/SA22-7871-11.pdf - -opcodes/ - * s390-opc.c: Define operand formats R_CP16_28, U6_18, and - U5_27. Define instruction formats RIE_RRUUU3, RIE_RRUUU4, - and RRF_R0RR4. - * s390-opc.txt: Add extended mnemonics jc, jcth, lfi, llgfi, - llghi, notgr, notr, risbhgz, risblgz, rnsbgt, rosbgt, and - rxsbgt. - -gas/ - * config/tc-s390.c: Add support to insert operand for format - R_CP16_28, reusing existing logic for format V_CP16_12. - * testsuite/gas/s390/esa-g5.s: Add test for extended mnemonic - jc. - * testsuite/gas/s390/esa-g5.d: Likewise. - * testsuite/gas/s390/zarch-z900.s: Add test for extended - mnemonic llghi. - * testsuite/gas/s390/zarch-z900.d: Likewise. - * testsuite/gas/s390/zarch-z9-109.s: Add tests for extended - mnemonics lfi and llgfi. - * testsuite/gas/s390/zarch-z9-109.d: Likewise. - * testsuite/gas/s390/zarch-z10.s: Add tests for extended - mnemonics rnsbgt, rosbgt, and rxsbgt. - * testsuite/gas/s390/zarch-z10.d: Likewise. - * testsuite/gas/s390/zarch-z196.s: Add tests for extended - mnemonics jcth, risbhgz, and risblgz. - * testsuite/gas/s390/zarch-z196.d: Likewise. - * testsuite/gas/s390/zarch-arch13.s: Add tests for extended - mnemonics notr and notgr. - * testsuite/gas/s390/zarch-arch13.d: Likewise. - -Signed-off-by: Jens Remus -Reviewed-by: Andreas Krebbel - -diff --git a/opcodes/s390-opc.c b/opcodes/s390-opc.c ---- a/opcodes/s390-opc.c -+++ b/opcodes/s390-opc.c -@@ -62,7 +62,9 @@ const struct s390_operand s390_operands[] = - { 4, 24, S390_OPERAND_GPR }, - #define R_28 (R_24 + 1) /* GPR starting at position 28 */ - { 4, 28, S390_OPERAND_GPR }, --#define R_32 (R_28 + 1) /* GPR starting at position 32 */ -+#define R_CP16_28 (R_28 + 1) /* GPR starting at position 28 */ -+ { 4, 28, S390_OPERAND_GPR | S390_OPERAND_CP16 }, /* with a copy at pos 16 */ -+#define R_32 (R_CP16_28+1) /* GPR starting at position 32 */ - { 4, 32, S390_OPERAND_GPR }, - - /* General purpose register pair operands. */ -@@ -222,9 +224,13 @@ const struct s390_operand s390_operands[] = - { 4, 36, 0 }, - #define U8_8 (U4_36 + 1) /* 8 bit unsigned value starting at 8 */ - { 8, 8, 0 }, --#define U8_16 (U8_8 + 1) /* 8 bit unsigned value starting at 16 */ -+#define U6_18 (U8_8 + 1) /* 6 bit unsigned value starting at 18 */ -+ { 6, 18, 0 }, -+#define U8_16 (U6_18 + 1) /* 8 bit unsigned value starting at 16 */ - { 8, 16, 0 }, --#define U6_26 (U8_16 + 1) /* 6 bit unsigned value starting at 26 */ -+#define U5_27 (U8_16 + 1) /* 5 bit unsigned value starting at 27 */ -+ { 5, 27, 0 }, -+#define U6_26 (U5_27 + 1) /* 6 bit unsigned value starting at 26 */ - { 6, 26, 0 }, - #define U8_24 (U6_26 + 1) /* 8 bit unsigned value starting at 24 */ - { 8, 24, 0 }, -@@ -289,7 +295,7 @@ static inline void unused_s390_operands_static_asserts(void) - p - pc relative - r - general purpose register - re - gpr extended operand, a valid general purpose register pair -- u - unsigned integer, 4, 8, 16 or 32 bit -+ u - unsigned integer, 4, 6, 8, 16 or 32 bit - m - mode field, 4 bit - 0 - operand skipped. - The order of the letters reflects the layout of the format in -@@ -325,7 +331,9 @@ static inline void unused_s390_operands_static_asserts(void) - #define INSTR_RIE_R0U0 6, { R_8,U16_16,0,0,0,0 } /* e.g. clfitne */ - #define INSTR_RIE_RUI0 6, { R_8,I16_16,U4_12,0,0,0 } /* e.g. lochi */ - #define INSTR_RIE_RRUUU 6, { R_8,R_12,U8_16,U8_24,U8_32,0 } /* e.g. rnsbg */ --#define INSTR_RIE_RRUUU2 6, { R_8,R_12,U8_16,U6_26,U8_32,0 } /* e.g. rnsbg */ -+#define INSTR_RIE_RRUUU2 6, { R_8,R_12,U8_16,U6_26,U8_32,0 } /* e.g. risbgz */ -+#define INSTR_RIE_RRUUU3 6, { R_8,R_12,U8_16,U5_27,U8_32,0 } /* e.g. risbhg */ -+#define INSTR_RIE_RRUUU4 6, { R_8,R_12,U6_18,U8_24,U8_32,0 } /* e.g. rnsbgt */ - #define INSTR_RIL_0P 6, { J32_16,0,0,0,0 } /* e.g. jg */ - #define INSTR_RIL_RP 6, { R_8,J32_16,0,0,0,0 } /* e.g. brasl */ - #define INSTR_RIL_UP 6, { U4_8,J32_16,0,0,0,0 } /* e.g. brcl */ -@@ -374,6 +382,7 @@ static inline void unused_s390_operands_static_asserts(void) - #define INSTR_RRF_R0RR2 4, { R_24,R_28,R_16,0,0,0 } /* e.g. ark */ - #define INSTR_RRF_R0RER 4, { RE_24,R_28,R_16,0,0,0 } /* e.g. mgrk */ - #define INSTR_RRF_R0RR3 4, { R_24,R_28,R_16,0,0,0 } /* e.g. selrz */ -+#define INSTR_RRF_R0RR4 4, { R_24,R_CP16_28,0,0,0,0 } /* e.g. notr */ - #define INSTR_RRF_U0FF 4, { F_24,U4_16,F_28,0,0,0 } /* e.g. fidbr */ - #define INSTR_RRF_U0FEFE 4, { FE_24,U4_16,FE_28,0,0,0 } /* e.g. fixbr */ - #define INSTR_RRF_U0RF 4, { R_24,U4_16,F_28,0,0,0 } /* e.g. cfebr */ -@@ -550,6 +559,8 @@ static inline void unused_s390_operands_static_asserts(void) - #define MASK_RIE_RUI0 { 0xff, 0x00, 0x00, 0x00, 0xff, 0xff } - #define MASK_RIE_RRUUU { 0xff, 0x00, 0x00, 0x00, 0x00, 0xff } - #define MASK_RIE_RRUUU2 { 0xff, 0x00, 0x00, 0xc0, 0x00, 0xff } -+#define MASK_RIE_RRUUU3 { 0xff, 0x00, 0x00, 0xe0, 0x00, 0xff } -+#define MASK_RIE_RRUUU4 { 0xff, 0x00, 0xc0, 0x00, 0x00, 0xff } - #define MASK_RIL_0P { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 } - #define MASK_RIL_RP { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 } - #define MASK_RIL_UP { 0xff, 0x0f, 0x00, 0x00, 0x00, 0x00 } -@@ -598,6 +609,7 @@ static inline void unused_s390_operands_static_asserts(void) - #define MASK_RRF_R0RR2 { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 } - #define MASK_RRF_R0RER { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 } - #define MASK_RRF_R0RR3 { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 } -+#define MASK_RRF_R0RR4 { 0xff, 0xff, 0x00, 0x00, 0x00, 0x00 } - #define MASK_RRF_U0FF { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 } - #define MASK_RRF_U0FEFE { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 } - #define MASK_RRF_U0RF { 0xff, 0xff, 0x0f, 0x00, 0x00, 0x00 } -diff --git a/opcodes/s390-opc.txt b/opcodes/s390-opc.txt ---- a/opcodes/s390-opc.txt -+++ b/opcodes/s390-opc.txt -@@ -272,6 +272,7 @@ a701 tml RI_RU "test under mask low" g5 esa,zarch - 4700 nop RX_0RRD "no operation" g5 esa,zarch optparm - 4700 b*8 RX_0RRD "conditional branch" g5 esa,zarch - 47f0 b RX_0RRD "unconditional branch" g5 esa,zarch -+a704 jc RI_UP "conditional jump" g5 esa,zarch - a704 jnop RI_0P "nop jump" g5 esa,zarch - a704 j*8 RI_0P "conditional jump" g5 esa,zarch - a704 br*8 RI_0P "conditional jump" g5 esa,zarch -@@ -473,8 +474,10 @@ eb0000000080 icmh RSE_RURD "insert characters under mask high" z900 zarch - a702 tmhh RI_RU "test under mask high high" z900 zarch - a703 tmhl RI_RU "test under mask high low" z900 zarch - c004 brcl RIL_UP "branch relative on condition long" z900 esa,zarch -+# jlc omitted due to missing jl* (see jl*8) and not added as non-standard jgc - c004 jgnop RIL_0P "nop jump long" z900 esa,zarch - c004 jg*8 RIL_0P "conditional jump long" z900 esa,zarch -+# jl*8 omitted due to clash with non-standard j*8 flavors jle and jlh; exists as non-standard jg*8 instead - c004 br*8l RIL_0P "conditional jump long" z900 esa,zarch - c0f4 jg RIL_0P "unconditional jump long" z900 esa,zarch - c0f4 brul RIL_0P "unconditional jump long" z900 esa,zarch -@@ -523,6 +526,7 @@ a50c llihh RI_RU "load logical immediate high high" z900 zarch - a50d llihl RI_RU "load logical immediate high low" z900 zarch - a50e llilh RI_RU "load logical immediate low high" z900 zarch - a50f llill RI_RU "load logical immediate low low" z900 zarch -+a50f llghi RI_RU "load logical immediate" z900 zarch - b2b1 stfl S_RD "store facility list" z900 esa,zarch - b2b2 lpswe S_RD "load psw extended" z900 zarch - b90d dsgr RRE_RER "divide single 64" z900 zarch -@@ -750,6 +754,7 @@ c006 xihf RIL_RU "exclusive or immediate high" z9-109 zarch - c007 xilf RIL_RU "exclusive or immediate low" z9-109 zarch - c008 iihf RIL_RU "insert immediate high" z9-109 zarch - c009 iilf RIL_RU "insert immediate low" z9-109 zarch -+c009 lfi RIL_RU "insert immediate 32" z9-109 zarch - # z9-109 misc instruction - b983 flogr RRE_RER "find leftmost one" z9-109 zarch - e30000000012 lt RXY_RRRD "load and test 32" z9-109 zarch -@@ -767,6 +772,7 @@ b995 llhr RRE_RR "load logical halfword 32" z9-109 zarch - b985 llghr RRE_RR "load logical halfword 64" z9-109 zarch - c00e llihf RIL_RU "load logical immediate high" z9-109 zarch - c00f llilf RIL_RU "load logical immediate low" z9-109 zarch -+c00f llgfi RIL_RU "load logical immediate" z9-109 zarch - c00c oihf RIL_RU "or immediate high" z9-109 zarch - c00d oilf RIL_RU "or immediate low" z9-109 zarch - c205 slfi RIL_RU "subtract logical immediate 32" z9-109 zarch -@@ -969,8 +975,11 @@ c200 msgfi RIL_RI "multiply single immediate (64)" z10 zarch - e30000000036 pfd RXY_URRD "prefetch data" z10 zarch - c602 pfdrl RIL_UP "prefetch data relative long" z10 zarch - ec0000000054 rnsbg RIE_RRUUU "rotate then and selected bits" z10 zarch optparm -+ec0080000054 rnsbgt RIE_RRUUU4 "rotate then and selected bits and test results" z10 zarch optparm - ec0000000057 rxsbg RIE_RRUUU "rotate then exclusive or selected bits" z10 zarch optparm -+ec0080000057 rxsbgt RIE_RRUUU4 "rotate then exclusive or selected bits and test results" z10 zarch optparm - ec0000000056 rosbg RIE_RRUUU "rotate then or selected bits" z10 zarch optparm -+ec0080000056 rosbgt RIE_RRUUU4 "rotate then or selected bits and test results" z10 zarch optparm - ec0000000055 risbg RIE_RRUUU "rotate then insert selected bits" z10 zarch optparm - ec0000800055 risbgz RIE_RRUUU2 "rotate then insert selected bits and zero remaining bits" z10 zarch optparm - c40f strl RIL_RP "store relative long (32)" z10 zarch -@@ -1003,6 +1012,7 @@ b9da alhhlr RRF_R0RR2 "add logical high low" z196 zarch - cc0a alsih RIL_RI "add logical with signed immediate high with cc" z196 zarch - cc0b alsihn RIL_RI "add logical with signed immediate high no cc" z196 zarch - cc06 brcth RIL_RP "branch relative on count high" z196 zarch -+cc06 jcth RIL_RP "jump on count high" z196 zarch - b9cd chhr RRE_RR "compare high high" z196 zarch - b9dd chlr RRE_RR "compare high low" z196 zarch - e300000000cd chf RXY_RRRD "compare high" z196 zarch -@@ -1017,7 +1027,9 @@ e300000000ca lfh RXY_RRRD "load high" z196 zarch - e300000000c2 llch RXY_RRRD "load logical character high" z196 zarch - e300000000c6 llhh RXY_RRRD "load logical halfword high" z196 zarch - ec000000005d risbhg RIE_RRUUU "rotate then insert selected bits high" z196 zarch optparm -+ec000080005d risbhgz RIE_RRUUU3 "rotate then insert selected bits high and zero remaining bits" z196 zarch optparm - ec0000000051 risblg RIE_RRUUU "rotate then insert selected bits low" z196 zarch optparm -+ec0000800051 risblgz RIE_RRUUU3 "rotate then insert selected bits low and zero remaining bits" z196 zarch optparm - e300000000c3 stch RXY_RRRD "store character high" z196 zarch - e300000000c7 sthh RXY_RRRD "store halfword high" z196 zarch - e300000000cb stfh RXY_RRRD "store high" z196 zarch -@@ -1913,7 +1925,9 @@ e50a mvcrl SSE_RDRD "move right to left" arch13 zarch - b974 nnrk RRF_R0RR2 "nand 32 bit" arch13 zarch - b964 nngrk RRF_R0RR2 "nand 64 bit" arch13 zarch - b976 nork RRF_R0RR2 "nor 32 bit" arch13 zarch -+b976 notr RRF_R0RR4 "not 32 bit" arch13 zarch - b966 nogrk RRF_R0RR2 "nor 64 bit" arch13 zarch -+b966 notgr RRF_R0RR4 "not 64 bit" arch13 zarch - b977 nxrk RRF_R0RR2 "not exclusive or 32 bit" arch13 zarch - b967 nxgrk RRF_R0RR2 "not exclusive or 64 bit" arch13 zarch - b975 ocrk RRF_R0RR2 "or with complement 32 bit" arch13 zarch diff --git a/gdb-rhel-86801-binutils-z17-update-4of12.patch b/gdb-rhel-86801-binutils-z17-update-4of12.patch deleted file mode 100644 index 98f4f04..0000000 --- a/gdb-rhel-86801-binutils-z17-update-4of12.patch +++ /dev/null @@ -1,30 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jens Remus -Date: Mon, 28 Apr 2025 11:23:22 -0700 -Subject: gdb-rhel-86801-binutils-z17-update-4of12.patch - -;; Backkport "s390: Correct prno instruction name" -;; (Jens Remus, RHEL-86801) - -IBM z13 (arch11) introduced ppno (Perform Pseudorandom Number Operation). -IBM z14 (arch12) introduced prno (Perform Random Number Operation) and -deprecated ppno. - -opcodes/ - * s390-opc.txt: Correct prno instruction name. - -Signed-off-by: Jens Remus -Reviewed-by: Andreas Krebbel - -diff --git a/opcodes/s390-opc.txt b/opcodes/s390-opc.txt ---- a/opcodes/s390-opc.txt -+++ b/opcodes/s390-opc.txt -@@ -1910,7 +1910,7 @@ e30000000049 stgsc RXY_RRRD "store guarded storage controls" arch12 zarch - - b929 kma RRF_R0RR "cipher message with galois counter mode" arch12 zarch - --b93c prno RRE_RR "perform pseudorandom number operation" arch12 zarch -+b93c prno RRE_RR "perform random number operation" arch12 zarch - b9a1 tpei RRE_RR "test pending external interruption" arch12 zarch - b9ac irbm RRE_RR "insert reference bits multiple" arch12 zarch - diff --git a/gdb-rhel-86801-binutils-z17-update-5of12.patch b/gdb-rhel-86801-binutils-z17-update-5of12.patch deleted file mode 100644 index f8e7d7b..0000000 --- a/gdb-rhel-86801-binutils-z17-update-5of12.patch +++ /dev/null @@ -1,24 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Nick Clifton -Date: Mon, 28 Apr 2025 11:23:22 -0700 -Subject: gdb-rhel-86801-binutils-z17-update-5of12.patch - -;; Backkport "Fix building for the s390 target with clang" -;; (Nick Clifton, RHEL-86801) - -diff --git a/opcodes/s390-opc.c b/opcodes/s390-opc.c ---- a/opcodes/s390-opc.c -+++ b/opcodes/s390-opc.c -@@ -262,9 +262,10 @@ const struct s390_operand s390_operands[] = - - }; - --static inline void unused_s390_operands_static_asserts(void) -+static inline void ATTRIBUTE_UNUSED -+unused_s390_operands_static_asserts (void) - { -- static_assert(ARRAY_SIZE(s390_operands) - 1 == J32_16); -+ static_assert (ARRAY_SIZE (s390_operands) - 1 == J32_16); - } - - /* Macros used to form opcodes. */ diff --git a/gdb-rhel-86801-binutils-z17-update-6of12.patch b/gdb-rhel-86801-binutils-z17-update-6of12.patch deleted file mode 100644 index e4cc432..0000000 --- a/gdb-rhel-86801-binutils-z17-update-6of12.patch +++ /dev/null @@ -1,97 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jens Remus -Date: Mon, 28 Apr 2025 11:23:22 -0700 -Subject: gdb-rhel-86801-binutils-z17-update-6of12.patch - -;; Backkport "s390: Align letter case of instruction descriptions" -;; (Jens Remus, RHEL-86801) - -Change the bitwise operations names "and" and "or" to lower case. Change -the register name abbreviations "FPR", "GR", and "VR" to upper case. - -opcodes/ - * s390-opc.txt: Align letter case of instruction descriptions. - -Signed-off-by: Jens Remus -Reviewed-by: Andreas Krebbel - -diff --git a/opcodes/s390-opc.txt b/opcodes/s390-opc.txt ---- a/opcodes/s390-opc.txt -+++ b/opcodes/s390-opc.txt -@@ -144,14 +144,14 @@ d3 mvz SS_L0RDRD "move zones" g5 esa,zarch - 67 mxd RX_FERRD "multiply (long to ext.)" g5 esa,zarch - 27 mxdr RR_FEF "multiply (long to ext.)" g5 esa,zarch - 26 mxr RR_FEFE "multiply (ext.)" g5 esa,zarch --54 n RX_RRRD "AND" g5 esa,zarch --d4 nc SS_L0RDRD "AND" g5 esa,zarch --94 ni SI_URD "AND" g5 esa,zarch --14 nr RR_RR "AND" g5 esa,zarch --56 o RX_RRRD "OR" g5 esa,zarch --d6 oc SS_L0RDRD "OR" g5 esa,zarch --96 oi SI_URD "OR" g5 esa,zarch --16 or RR_RR "OR" g5 esa,zarch -+54 n RX_RRRD "and" g5 esa,zarch -+d4 nc SS_L0RDRD "and" g5 esa,zarch -+94 ni SI_URD "and" g5 esa,zarch -+14 nr RR_RR "and" g5 esa,zarch -+56 o RX_RRRD "or" g5 esa,zarch -+d6 oc SS_L0RDRD "or" g5 esa,zarch -+96 oi SI_URD "or" g5 esa,zarch -+16 or RR_RR "or" g5 esa,zarch - f2 pack SS_LLRDRD "pack" g5 esa,zarch - b248 palb RRE_00 "purge ALB" g5 esa,zarch - b218 pc S_RD "program call" g5 esa,zarch -@@ -215,8 +215,8 @@ b6 stctl RS_CCRD "store control" g5 esa,zarch - 40 sth RX_RRRD "store halfword" g5 esa,zarch - b202 stidp S_RD "store CPU id" g5 esa,zarch - 90 stm RS_RRRD "store multiple" g5 esa,zarch --ac stnsm SI_URD "store then AND system mask" g5 esa,zarch --ad stosm SI_URD "store then OR system mask" g5 esa,zarch -+ac stnsm SI_URD "store then and system mask" g5 esa,zarch -+ad stosm SI_URD "store then or system mask" g5 esa,zarch - b209 stpt S_RD "store CPU timer" g5 esa,zarch - b211 stpx S_RD "store prefix" g5 esa,zarch - b234 stsch S_RD "store subchannel" g5 esa,zarch -@@ -239,10 +239,10 @@ dd trt SS_L0RDRD "translate and test" g5 esa,zarch - b235 tsch S_RD "test subchannel" g5 esa,zarch - f3 unpk SS_LLRDRD "unpack" g5 esa,zarch - 0102 upt E "update tree" g5 esa,zarch --57 x RX_RRRD "exclusive OR" g5 esa,zarch --d7 xc SS_L0RDRD "exclusive OR" g5 esa,zarch --97 xi SI_URD "exclusive OR" g5 esa,zarch --17 xr RR_RR "exclusive OR" g5 esa,zarch -+57 x RX_RRRD "exclusive or" g5 esa,zarch -+d7 xc SS_L0RDRD "exclusive or" g5 esa,zarch -+97 xi SI_URD "exclusive or" g5 esa,zarch -+17 xr RR_RR "exclusive or" g5 esa,zarch - f8 zap SS_LLRDRD "zero and add" g5 esa,zarch - a70a ahi RI_RI "add halfword immediate" g5 esa,zarch - 84 brxh RSI_RRP "branch relative on index high" g5 esa,zarch -@@ -821,8 +821,8 @@ b370 lpdfr RRE_FF "load positive no cc" z9-ec zarch - b371 lndfr RRE_FF "load negative no cc" z9-ec zarch - b372 cpsdr RRF_F0FF2 "copy sign" z9-ec zarch - b373 lcdfr RRE_FF "load complement no cc" z9-ec zarch --b3c1 ldgr RRE_FR "load fpr from gr" z9-ec zarch --b3cd lgdr RRE_RF "load gr from fpr" z9-ec zarch -+b3c1 ldgr RRE_FR "load FPR from GR" z9-ec zarch -+b3cd lgdr RRE_RF "load GR from FPR" z9-ec zarch - b3d2 adtr RRR_F0FF "add long dfp" z9-ec zarch - b3da axtr RRR_FE0FEFE "add extended dfp" z9-ec zarch - b3e4 cdtr RRE_FF "compare long dfp" z9-ec zarch -@@ -1203,11 +1203,11 @@ e70000000040 vleib VRI_V0IU "vector load byte element immediate" z13 zarch vx - e70000000041 vleih VRI_V0IU "vector load halfword element immediate" z13 zarch vx - e70000000043 vleif VRI_V0IU "vector load word element immediate" z13 zarch vx - e70000000042 vleig VRI_V0IU "vector load double word element immediate" z13 zarch vx --e70000000021 vlgv VRS_RVRDU "vector load gr from vr element" z13 zarch vx --e70000000021 vlgvb VRS_RVRD "vector load gr from vr byte element" z13 zarch vx --e70000001021 vlgvh VRS_RVRD "vector load gr from vr halfword element" z13 zarch vx --e70000002021 vlgvf VRS_RVRD "vector load gr from vr word element" z13 zarch vx --e70000003021 vlgvg VRS_RVRD "vector load gr from vr double word element" z13 zarch vx -+e70000000021 vlgv VRS_RVRDU "vector load GR from VR element" z13 zarch vx -+e70000000021 vlgvb VRS_RVRD "vector load GR from VR byte element" z13 zarch vx -+e70000001021 vlgvh VRS_RVRD "vector load GR from VR halfword element" z13 zarch vx -+e70000002021 vlgvf VRS_RVRD "vector load GR from VR word element" z13 zarch vx -+e70000003021 vlgvg VRS_RVRD "vector load GR from VR double word element" z13 zarch vx - e70000000004 vllez VRX_VRRDU "vector load logical element and zero" z13 zarch vx - e70000000004 vllezb VRX_VRRD "vector load logical byte element and zero" z13 zarch vx - e70000001004 vllezh VRX_VRRD "vector load logical halfword element and zero" z13 zarch vx diff --git a/gdb-rhel-86801-binutils-z17-update-7of12.patch b/gdb-rhel-86801-binutils-z17-update-7of12.patch deleted file mode 100644 index e4638b4..0000000 --- a/gdb-rhel-86801-binutils-z17-update-7of12.patch +++ /dev/null @@ -1,97 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jens Remus -Date: Mon, 28 Apr 2025 11:23:22 -0700 -Subject: gdb-rhel-86801-binutils-z17-update-7of12.patch - -;; Backkport "s390: Provide IBM z16 (arch14) instruction descriptions" -;; (Jens Remus, RHEL-86801) - -Provide descriptions for instructions introduced with commit ba2b480f103 -("IBM Z: Implement instruction set extensions"). This complements commit -69341966def ("IBM zSystems: Add support for z16 as CPU name."). Use -instruction names from IBM z/Architecture Principles of Operation [1] as -instruction description. - -[1]: IBM z/Architecture Principles of Operation, SA22-7832-13, IBM z16, - https://publibfp.dhe.ibm.com/epubs/pdf/a227832d.pdf - -opcodes/ - * s390-opc.txt: Add descriptions for IBM z16 (arch14) - instructions. - -Signed-off-by: Jens Remus -Reviewed-by: Andreas Krebbel - -diff --git a/opcodes/s390-opc.txt b/opcodes/s390-opc.txt ---- a/opcodes/s390-opc.txt -+++ b/opcodes/s390-opc.txt -@@ -2034,31 +2034,41 @@ e60000000052 vcvbg VRR_RV0UU "vector convert to binary 64 bit" arch13 zarch optp - b93a kdsa RRE_RR "compute digital signature authentication" arch13 zarch - - --# arch14 instructions -- --e60000000074 vschp VRR_VVV0U0U " " arch14 zarch --e60000002074 vschsp VRR_VVV0U0 " " arch14 zarch --e60000003074 vschdp VRR_VVV0U0 " " arch14 zarch --e60000004074 vschxp VRR_VVV0U0 " " arch14 zarch --e6000000007c vscshp VRR_VVV " " arch14 zarch --e6000000007d vcsph VRR_VVV0U0 " " arch14 zarch --e60000000051 vclzdp VRR_VV0U2 " " arch14 zarch --e60000000070 vpkzr VRI_VVV0UU2 " " arch14 zarch --e60000000072 vsrpr VRI_VVV0UU2 " " arch14 zarch --e60000000054 vupkzh VRR_VV0U2 " " arch14 zarch --e6000000005c vupkzl VRR_VV0U2 " " arch14 zarch -- --b93b nnpa RRE_00 " " arch14 zarch --e60000000056 vclfnh VRR_VV0UU2 " " arch14 zarch --e6000000005e vclfnl VRR_VV0UU2 " " arch14 zarch --e60000000075 vcrnf VRR_VVV0UU " " arch14 zarch --e6000000005d vcfn VRR_VV0UU2 " " arch14 zarch --e60000000055 vcnf VRR_VV0UU2 " " arch14 zarch -- --b98B rdp RRF_RURR2 " " arch14 zarch optparm -- --eb0000000071 lpswey SIY_RD " " arch14 zarch --b200 lbear S_RD " " arch14 zarch --b201 stbear S_RD " " arch14 zarch -- --b28f qpaci S_RD " " arch14 zarch -+# arch14 (z16) instructions -+ -+# Vector-Packed-Decimal-Enhancement Facility 2 -+ -+e60000000074 vschp VRR_VVV0U0U "decimal scale and convert to hfp" arch14 zarch -+e60000002074 vschsp VRR_VVV0U0 "decimal scale and convert to short hfp" arch14 zarch -+e60000003074 vschdp VRR_VVV0U0 "decimal scale and convert to long hfp" arch14 zarch -+e60000004074 vschxp VRR_VVV0U0 "decimal scale and convert to extended hfp" arch14 zarch -+e6000000007c vscshp VRR_VVV "decimal scale and convert and split to hfp" arch14 zarch -+e6000000007d vcsph VRR_VVV0U0 "vector convert hfp to scaled decimal" arch14 zarch -+e60000000051 vclzdp VRR_VV0U2 "vector count leading zero digits" arch14 zarch -+e60000000070 vpkzr VRI_VVV0UU2 "vector pack zoned register" arch14 zarch -+e60000000072 vsrpr VRI_VVV0UU2 "vector shift and round decimal register" arch14 zarch -+e60000000054 vupkzh VRR_VV0U2 "vector unpack zoned high" arch14 zarch -+e6000000005c vupkzl VRR_VV0U2 "vector unpack zoned low" arch14 zarch -+ -+# Neural-Network-Processing-Assist Facility -+ -+b93b nnpa RRE_00 "neural network processing assist" arch14 zarch -+e60000000056 vclfnh VRR_VV0UU2 "vector fp convert and lengthen from nnp high" arch14 zarch -+e6000000005e vclfnl VRR_VV0UU2 "vector fp convert and lengthen from nnp low" arch14 zarch -+e60000000075 vcrnf VRR_VVV0UU "vector fp convert and round to nnp" arch14 zarch -+e6000000005d vcfn VRR_VV0UU2 "vector fp convert from nnp" arch14 zarch -+e60000000055 vcnf VRR_VV0UU2 "vector fp convert to nnp" arch14 zarch -+ -+# Reset-DAT-Protection Facility -+ -+b98B rdp RRF_RURR2 "reset dat protection" arch14 zarch optparm -+ -+# BEAR-Enhancement Facility -+ -+eb0000000071 lpswey SIY_RD "load PSW extended" arch14 zarch -+b200 lbear S_RD "load bear" arch14 zarch -+b201 stbear S_RD "store bear" arch14 zarch -+ -+# Processor-Activity-Instrumentation Facility -+ -+b28f qpaci S_RD "query processor activity counter information" arch14 zarch diff --git a/gdb-rhel-86801-binutils-z17-update-8of12.patch b/gdb-rhel-86801-binutils-z17-update-8of12.patch deleted file mode 100644 index bd889df..0000000 --- a/gdb-rhel-86801-binutils-z17-update-8of12.patch +++ /dev/null @@ -1,25 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jens Remus -Date: Mon, 28 Apr 2025 11:23:22 -0700 -Subject: gdb-rhel-86801-binutils-z17-update-8of12.patch - -;; Backkport "s390: Align opcodes to lower-case" -;; (Jens Remus, RHEL-86801) - -opcodes/ - * s390-opc.txt (rdp): Change opcode to lower-case. - -Signed-off-by: Jens Remus - -diff --git a/opcodes/s390-opc.txt b/opcodes/s390-opc.txt ---- a/opcodes/s390-opc.txt -+++ b/opcodes/s390-opc.txt -@@ -2061,7 +2061,7 @@ e60000000055 vcnf VRR_VV0UU2 "vector fp convert to nnp" arch14 zarch - - # Reset-DAT-Protection Facility - --b98B rdp RRF_RURR2 "reset dat protection" arch14 zarch optparm -+b98b rdp RRF_RURR2 "reset dat protection" arch14 zarch optparm - - # BEAR-Enhancement Facility - diff --git a/gdb-rhel-86801-binutils-z17-update-9of12.patch b/gdb-rhel-86801-binutils-z17-update-9of12.patch deleted file mode 100644 index 34afaf1..0000000 --- a/gdb-rhel-86801-binutils-z17-update-9of12.patch +++ /dev/null @@ -1,151 +0,0 @@ -From FEDORA_PATCHES Mon Sep 17 00:00:00 2001 -From: Jens Remus -Date: Mon, 28 Apr 2025 11:23:22 -0700 -Subject: gdb-rhel-86801-binutils-z17-update-9of12.patch - -;; Backkport "s390: Simplify (dis)assembly of insn operands with const bits" -;; (Jens Remus, RHEL-86801) - -Simplify assembly and disassembly of extended mnemonics with operands -with constant ORed bits: -Their instruction template already contains the respective constant -operand bits, as they are significant to distinguish the extended from -their base mnemonic. Operands are ORed into the instruction template. -Therefore it is not necessary to OR the constant bits into the operand -value during assembly in s390_insert_operand. -Additionally the constant operand bits from the instruction template -can be used to mask them from the operand value during disassembly in -s390_print_insn_with_opcode. For now do so for non-length unsigned -integer operands only. - -The separate instruction formats need to be retained, as their masks -differ, which is relevant during disassembly to distinguish the base -and extended mnemonics from each other. - -This affects the following extended mnemonics: -- vfaebs, vfaehs, vfaefs -- vfaezb, vfaezh, vfaezf -- vfaezbs, vfaezhs, vfaezfs -- vstrcbs, vstrchs, vstrcfs -- vstrczb, vstrczh, vstrczf -- vstrczbs, vstrczhs, vstrczfs -- wcefb, wcdgb -- wcelfb, wcdlgb -- wcfeb, wcgdb -- wclfeb, wclgdb -- wfisb, wfidb, wfixb -- wledb, wflrd, wflrx - -include/ - * opcode/s390.h (S390_OPERAND_OR1, S390_OPERAND_OR2, - S390_OPERAND_OR8): Remove. - -opcodes/ - * s390-opc.c (U4_OR1_24, U4_OR2_24, U4_OR8_28): Remove. - (INSTR_VRR_VVV0U1, INSTR_VRR_VVV0U2, INSTR_VRR_VVV0U3): Define - as INSTR_VRR_VVV0U0 while retaining respective insn fmt mask. - (INSTR_VRR_VV0UU8): Define as INSTR_VRR_VV0UU while retaining - respective insn fmt mask. - (INSTR_VRR_VVVU0VB1, INSTR_VRR_VVVU0VB2, INSTR_VRR_VVVU0VB3): - Define as INSTR_VRR_VVVU0VB while retaining respective insn fmt - mask. - * s390-dis.c (s390_print_insn_with_opcode): Mask constant - operand bits set in insn template of non-length unsigned - integer operands. - -gas/ - * config/tc-s390.c (s390_insert_operand): Do not OR constant - operand value bits. - -Signed-off-by: Jens Remus - -diff --git a/include/opcode/s390.h b/include/opcode/s390.h ---- a/include/opcode/s390.h -+++ b/include/opcode/s390.h -@@ -168,8 +168,4 @@ extern const struct s390_operand s390_operands[]; - - #define S390_OPERAND_CP16 0x1000 - --#define S390_OPERAND_OR1 0x2000 --#define S390_OPERAND_OR2 0x4000 --#define S390_OPERAND_OR8 0x8000 -- - #endif /* S390_H */ -diff --git a/opcodes/s390-dis.c b/opcodes/s390-dis.c ---- a/opcodes/s390-dis.c -+++ b/opcodes/s390-dis.c -@@ -277,12 +277,14 @@ s390_print_insn_with_opcode (bfd_vma memaddr, - { - enum disassembler_style style; - -- if (flags & S390_OPERAND_OR1) -- val.u &= ~1; -- if (flags & S390_OPERAND_OR2) -- val.u &= ~2; -- if (flags & S390_OPERAND_OR8) -- val.u &= ~8; -+ if (!(flags & S390_OPERAND_LENGTH)) -+ { -+ union operand_value insn_opval; -+ -+ /* Mask any constant operand bits set in insn template. */ -+ insn_opval = s390_extract_operand (opcode->opcode, operand); -+ val.u &= ~insn_opval.u; -+ } - - if ((opcode->flags & S390_INSTR_FLAG_OPTPARM) - && val.u == 0 -diff --git a/opcodes/s390-opc.c b/opcodes/s390-opc.c ---- a/opcodes/s390-opc.c -+++ b/opcodes/s390-opc.c -@@ -208,17 +208,9 @@ const struct s390_operand s390_operands[] = - { 4, 20, 0 }, - #define U4_24 (U4_20 + 1) /* 4 bit unsigned value starting at 24 */ - { 4, 24, 0 }, --#define U4_OR1_24 (U4_24 + 1) /* 4 bit unsigned value ORed with 1 */ -- { 4, 24, S390_OPERAND_OR1 }, /* starting at 24 */ --#define U4_OR2_24 (U4_OR1_24+1) /* 4 bit unsigned value ORed with 2 */ -- { 4, 24, S390_OPERAND_OR2 }, /* starting at 24 */ --#define U4_OR3_24 (U4_OR2_24+1) /* 4 bit unsigned value ORed with 3 */ -- { 4, 24, S390_OPERAND_OR1 | S390_OPERAND_OR2 }, /* starting at 24 */ --#define U4_28 (U4_OR3_24+1) /* 4 bit unsigned value starting at 28 */ -+#define U4_28 (U4_24+1) /* 4 bit unsigned value starting at 28 */ - { 4, 28, 0 }, --#define U4_OR8_28 (U4_28 + 1) /* 4 bit unsigned value ORed with 8 */ -- { 4, 28, S390_OPERAND_OR8 }, /* starting at 28 */ --#define U4_32 (U4_OR8_28+1) /* 4 bit unsigned value starting at 32 */ -+#define U4_32 (U4_28+1) /* 4 bit unsigned value starting at 32 */ - { 4, 32, 0 }, - #define U4_36 (U4_32 + 1) /* 4 bit unsigned value starting at 36 */ - { 4, 36, 0 }, -@@ -512,23 +504,23 @@ unused_s390_operands_static_asserts (void) - #define INSTR_VRR_VRR 6, { V_8,R_12,R_16,0,0,0 } /* e.g. vlvgp */ - #define INSTR_VRR_VVV0U 6, { V_8,V_12,V_16,U4_32,0,0 } /* e.g. vmrh */ - #define INSTR_VRR_VVV0U0 6, { V_8,V_12,V_16,U4_24,0,0 } /* e.g. vfaeb */ --#define INSTR_VRR_VVV0U1 6, { V_8,V_12,V_16,U4_OR1_24,0,0 } /* e.g. vfaebs*/ --#define INSTR_VRR_VVV0U2 6, { V_8,V_12,V_16,U4_OR2_24,0,0 } /* e.g. vfaezb*/ --#define INSTR_VRR_VVV0U3 6, { V_8,V_12,V_16,U4_OR3_24,0,0 } /* e.g. vfaezbs*/ -+#define INSTR_VRR_VVV0U1 INSTR_VRR_VVV0U0 /* e.g. vfaebs*/ -+#define INSTR_VRR_VVV0U2 INSTR_VRR_VVV0U0 /* e.g. vfaezb*/ -+#define INSTR_VRR_VVV0U3 INSTR_VRR_VVV0U0 /* e.g. vfaezbs*/ - #define INSTR_VRR_VVV 6, { V_8,V_12,V_16,0,0,0 } /* e.g. vmrhb */ - #define INSTR_VRR_VVV2 6, { V_8,V_CP16_12,0,0,0,0 } /* e.g. vnot */ - #define INSTR_VRR_VV0U 6, { V_8,V_12,U4_32,0,0,0 } /* e.g. vseg */ - #define INSTR_VRR_VV0U2 6, { V_8,V_12,U4_24,0,0,0 } /* e.g. vistrb*/ - #define INSTR_VRR_VV0UU 6, { V_8,V_12,U4_28,U4_24,0,0 } /* e.g. vcdgb */ - #define INSTR_VRR_VV0UU2 6, { V_8,V_12,U4_32,U4_28,0,0 } /* e.g. wfc */ --#define INSTR_VRR_VV0UU8 6, { V_8,V_12,U4_OR8_28,U4_24,0,0 } /* e.g. wcdgb */ -+#define INSTR_VRR_VV0UU8 INSTR_VRR_VV0UU /* e.g. wcdgb */ - #define INSTR_VRR_VV 6, { V_8,V_12,0,0,0,0 } /* e.g. vsegb */ - #define INSTR_VRR_VVVUU0V 6, { V_8,V_12,V_16,V_32,U4_20,U4_24 } /* e.g. vstrc */ - #define INSTR_VRR_VVVU0V 6, { V_8,V_12,V_16,V_32,U4_20,0 } /* e.g. vac */ - #define INSTR_VRR_VVVU0VB 6, { V_8,V_12,V_16,V_32,U4_24,0 } /* e.g. vstrcb*/ --#define INSTR_VRR_VVVU0VB1 6, { V_8,V_12,V_16,V_32,U4_OR1_24,0 } /* e.g. vstrcbs*/ --#define INSTR_VRR_VVVU0VB2 6, { V_8,V_12,V_16,V_32,U4_OR2_24,0 } /* e.g. vstrczb*/ --#define INSTR_VRR_VVVU0VB3 6, { V_8,V_12,V_16,V_32,U4_OR3_24,0 } /* e.g. vstrczbs*/ -+#define INSTR_VRR_VVVU0VB1 INSTR_VRR_VVVU0VB /* e.g. vstrcbs*/ -+#define INSTR_VRR_VVVU0VB2 INSTR_VRR_VVVU0VB /* e.g. vstrczb*/ -+#define INSTR_VRR_VVVU0VB3 INSTR_VRR_VVVU0VB /* e.g. vstrczbs*/ - #define INSTR_VRR_VVV0V 6, { V_8,V_12,V_16,V_32,0,0 } /* e.g. vacq */ - #define INSTR_VRR_VVV0U0U 6, { V_8,V_12,V_16,U4_32,U4_24,0 } /* e.g. vfae */ - #define INSTR_VRR_VVVV 6, { V_8,V_12,V_16,V_32,0,0 } /* e.g. vfmadb*/ diff --git a/gdb-simultaneous-step-resume-breakpoint-test.patch b/gdb-simultaneous-step-resume-breakpoint-test.patch deleted file mode 100644 index 5e1315b..0000000 --- a/gdb-simultaneous-step-resume-breakpoint-test.patch +++ /dev/null @@ -1,162 +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-simultaneous-step-resume-breakpoint-test.patch - -;; New test for step-resume breakpoint placed in multiple threads at once. -;;=fedoratest - -diff --git a/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.c b/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.c -@@ -0,0 +1,79 @@ -+/* Copyright 2009 Free Software Foundation, Inc. -+ -+ Written by Fred Fish of Cygnus Support -+ Contributed by Cygnus Support -+ -+ This file is part of GDB. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+/* Test multiple threads stepping into a .debug_line-less function with -+ a breakpoint placed on its return-to-caller point. */ -+ -+#include -+#include -+#include -+#include -+#include -+ -+#define THREADS 3 -+ -+static void * -+func (void *unused) -+{ -+ int i; -+ -+ errno = 0; -+ i = 0xdeadf00d; -+ i = sleep (THREADS); /* sleep-call */ -+ if (errno != 0) /* sleep-after */ -+ perror ("sleep"); -+ -+ /* The GDB bug with forgotten step-resume breakpoint could leave stale -+ breakpoint on the I assignment making it a nop. */ -+ if (i == 0xdeadf00d) -+ assert (0); -+ -+ assert (i == 0); -+ -+ pthread_exit (NULL); -+} -+ -+int -+main (void) -+{ -+ pthread_t threads[THREADS]; -+ int threadi; -+ -+ for (threadi = 0; threadi < THREADS; threadi++) -+ { -+ int i; -+ -+ i = pthread_create (&threads[threadi], NULL, func, NULL); -+ assert (i == 0); -+ -+ i = sleep (1); -+ assert (i == 0); -+ } -+ -+ for (threadi = 0; threadi < THREADS; threadi++) -+ { -+ int i; -+ -+ i = pthread_join (threads[threadi], NULL); -+ assert (i == 0); -+ } -+ -+ return 0; /* final-exit */ -+} -diff --git a/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.exp b/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.threads/simultaneous-step-resume-breakpoint.exp -@@ -0,0 +1,65 @@ -+# Copyright (C) 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . */ -+ -+# Test multiple threads stepping into a .debug_line-less function with -+# a breakpoint placed on its return-to-caller point. -+ -+set testfile simultaneous-step-resume-breakpoint -+set srcfile ${testfile}.c -+set binfile [standard_output_file ${testfile}] -+ -+if {[gdb_compile_pthreads "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {debug}] != "" } { -+ return -1 -+} -+ -+gdb_exit -+gdb_start -+gdb_reinitialize_dir $srcdir/$subdir -+ -+# Ensure we have no debuginfo for the `sleep' call itself (=for libc). -+gdb_test "set debug-file-directory /DoesNotExist" -+ -+gdb_load ${binfile} -+if ![runto_main] { -+ return -1 -+} -+ -+# Red Hat vendor patch does set it to "step" by default. -+gdb_test "set scheduler-locking off" -+ -+gdb_breakpoint [gdb_get_line_number "final-exit"] -+ -+gdb_breakpoint [gdb_get_line_number "sleep-call"] -+gdb_continue_to_breakpoint "sleep-call" -+ -+gdb_test "step" "sleep-call.*" "step thread 1" -+gdb_test "step" "sleep-call.*" "step thread 2" -+gdb_test "step" "sleep-after.*" "step thread 3" -+ -+set test "first continue" -+gdb_test_multiple "continue" $test { -+ -re "final-exit.*$gdb_prompt $" { -+ # gdb-7.0. -+ pass $test -+ return -+ } -+ -re "sleep-after.*$gdb_prompt $" { -+ # Fedora/RHEL branch. -+ pass $test -+ } -+} -+ -+gdb_test "continue" "sleep-after.*" "second continue" -+gdb_test "continue" "final-exit.*" "third continue" diff --git a/gdb-test-bt-cfi-without-die.patch b/gdb-test-bt-cfi-without-die.patch deleted file mode 100644 index 6167c14..0000000 --- a/gdb-test-bt-cfi-without-die.patch +++ /dev/null @@ -1,214 +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-test-bt-cfi-without-die.patch - -;; [delayed-symfile] Test a backtrace regression on CFIs without DIE (BZ 614604). -;;=fedoratest - -http://sourceware.org/ml/archer/2010-q3/msg00028.html - -On Wed, 25 Feb 2009 00:14:29 +0100, Jan Kratochvil wrote: -> commit 6a37c2b9962258ecf9299cc34a650e64a06acaa5 -> -> There was a regression on gdb.base/savedregs.exp. -> -> quick_addrmap/require_partial_symbols should be used even for the unwind debug -> info checking as its load has been also delayed by this branch. -[...] -> --- a/gdb/dwarf2-frame.c -> +++ b/gdb/dwarf2-frame.c -[...] -> @@ -1499,6 +1500,14 @@ dwarf2_frame_find_fde (CORE_ADDR *pc) -> struct dwarf2_fde *fde; -> CORE_ADDR offset; -> -> + if (objfile->quick_addrmap) -> + { -> + if (!addrmap_find (objfile->quick_addrmap, *pc)) -> + continue; -> + } -> + /* FIXME: Read-in only .debug_frame/.eh_frame without .debug_info? */ -> + require_partial_symbols (objfile); -> + - -but this has caused a different regression (as discussed in the confcall). - -QUICK_ADDRMAP is built only from .debug_aranges. But we can have existing -built .debug_aranges for CUs in OBJFILE but still some CUs do not need to have -DWARF at all while they can feature CFIs (.eh_frame or .debug_frame). -It has been described by Daniel Jacobowitz at: - Re: [2/4] RFC: check psymtabs_addrmap before reading FDEs - http://sourceware.org/ml/gdb-patches/2010-07/msg00012.html - -Sorry for this regression by me (in that fix of a different regression). - -Fixed it the "slow way" as this branch is now obsoleted by .gdb-index. - -No regressions on {x86_64,x86_64-m32,i686}-fedora13-linux-gnu. - -Checked-in. - -Thanks, -Jan - -eb8df8566acc1ed963e3e9b77c13b9c2c3db03fb - -Test CFI is parsed even for range (function) not described by any DIE. - -https://bugzilla.redhat.com/show_bug.cgi?id=614028 - -gdb/ - * dwarf2-frame.c (dwarf2_frame_find_fde): Remove the - OBJFILE->QUICK_ADDRMAP check. New comment why. - -gdb/testsuite/ - * gdb.base/cfi-without-die.exp, gdb.base/cfi-without-die-main.c, - gdb.base/cfi-without-die-caller.c: New files. - -diff --git a/gdb/testsuite/gdb.base/cfi-without-die-caller.c b/gdb/testsuite/gdb.base/cfi-without-die-caller.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/cfi-without-die-caller.c -@@ -0,0 +1,28 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+typedef int (*callback_t) (void); -+ -+int -+caller (callback_t callback) -+{ -+ /* Ensure some frame content to push away the return address. */ -+ volatile const long one = 1; -+ -+ /* Modify the return value to prevent any tail-call optimization. */ -+ return (*callback) () - one; -+} -diff --git a/gdb/testsuite/gdb.base/cfi-without-die-main.c b/gdb/testsuite/gdb.base/cfi-without-die-main.c -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/cfi-without-die-main.c -@@ -0,0 +1,32 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2005, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+typedef int (*callback_t) (void); -+ -+extern int caller (callback_t callback); -+ -+int -+callback (void) -+{ -+ return 1; -+} -+ -+int -+main (void) -+{ -+ return caller (callback); -+} -diff --git a/gdb/testsuite/gdb.base/cfi-without-die.exp b/gdb/testsuite/gdb.base/cfi-without-die.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.base/cfi-without-die.exp -@@ -0,0 +1,71 @@ -+# Copyright 2010 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Test CFI is parsed even for range (function) not described by any DIE. -+ -+set testfile cfi-without-die -+set srcmainfile ${testfile}-main.c -+set srccallerfile ${testfile}-caller.c -+set executable ${testfile} -+set objmainfile [standard_output_file ${testfile}-main.o] -+set objcallerfile [standard_output_file ${testfile}-caller.o] -+set binfile [standard_output_file ${executable}] -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srccallerfile}" ${objcallerfile} \ -+ object [list {additional_flags=-fomit-frame-pointer -fno-unwind-tables -fno-asynchronous-unwind-tables}]] != "" -+ || [gdb_compile "${srcdir}/${subdir}/${srcmainfile}" ${objmainfile} object {debug}] != "" -+ || [gdb_compile "${objmainfile} ${objcallerfile}" ${binfile} executable {}] != "" } { -+ untested ${testfile}.exp -+ return -1 -+} -+ -+clean_restart $executable -+ -+if ![runto callback] then { -+ fail "verify unwinding: Can't run to callback" -+ return 0 -+} -+set test "verify unwinding breaks without CFI" -+gdb_test_multiple "bt" $test { -+ -re " in \[?\]\[?\] .*\r\n$gdb_prompt $" { -+ # It may backtrace through some random frames even to main(). -+ pass $test -+ } -+ -re " in main .*\r\n$gdb_prompt $" { -+ fail $test -+ } -+ -re "\r\n$gdb_prompt $" { -+ pass $test -+ } -+} -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srccallerfile}" ${objcallerfile} \ -+ object [list {additional_flags=-fomit-frame-pointer -funwind-tables -fasynchronous-unwind-tables}]] != "" -+ || [gdb_compile "${srcdir}/${subdir}/${srcmainfile}" ${objmainfile} object {debug}] != "" -+ || [gdb_compile "${objmainfile} ${objcallerfile}" ${binfile} executable {}] != "" } { -+ untested ${testfile}.exp -+ return -1 -+} -+ -+clean_restart $executable -+ -+if ![runto callback] then { -+ fail "test CFI without DIEs: Can't run to callback" -+ return 0 -+} -+# #0 callback () at ... -+# #1 0x00000000004004e9 in caller () -+# #2 0x00000000004004cd in main () at ... -+gdb_test "bt" "#0 +callback \[^\r\n\]+\r\n#1 \[^\r\n\]+ in caller \[^\r\n\]+\r\n#2 \[^\r\n\]+ in main \[^\r\n\]+" "verify unwindin works for CFI without DIEs" diff --git a/gdb-test-dw2-aranges.patch b/gdb-test-dw2-aranges.patch deleted file mode 100644 index 458e8ba..0000000 --- a/gdb-test-dw2-aranges.patch +++ /dev/null @@ -1,220 +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-test-dw2-aranges.patch - -;; [archer-tromey-delayed-symfile] New test gdb.dwarf2/dw2-aranges.exp. -;;=fedoratest - -[archer-tromey-delayed-symfile] - -commit 77fa7778a37b0d28a7e4e5235f074a10ecf1815d -Author: Jan Kratochvil -Date: Sat Aug 15 15:05:54 2009 +0200 - - Test for "handle incorrect aranges". - - readelf: - Contents of the .debug_aranges section: - - Length: 8 - Version: 2 - Offset into .debug_info: 0x0 - Pointer Size: 0 - Segment Size: 0 - - Address Length - Floating point exception - - * gdb.dwarf2/dw2-aranges.exp, gdb.dwarf2/dw2-aranges.S: New files. - -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-aranges.S b/gdb/testsuite/gdb.dwarf2/dw2-aranges.S -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-aranges.S -@@ -0,0 +1,140 @@ -+/* This testcase is part of GDB, the GNU debugger. -+ -+ Copyright 2004, 2007, 2008, 2009 Free Software Foundation, Inc. -+ -+ This program is free software; you can redistribute it and/or modify -+ it under the terms of the GNU General Public License as published by -+ the Free Software Foundation; either version 3 of the License, or -+ (at your option) any later version. -+ -+ This program is distributed in the hope that it will be useful, -+ but WITHOUT ANY WARRANTY; without even the implied warranty of -+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+ GNU General Public License for more details. -+ -+ You should have received a copy of the GNU General Public License -+ along with this program. If not, see . */ -+ -+/* Test .debug_aranges containing zero address_size. */ -+ -+/* Dummy function to provide debug information for. */ -+ -+ .text -+.Lbegin_text1: -+ .globl main -+ .type main, %function -+main: -+.Lbegin_main: -+ .int 0 -+.Lend_main: -+ .size main, .-main -+.Lend_text1: -+ -+/* Debug information */ -+ -+ .section .debug_info -+.Lcu1_begin: -+ /* CU header */ -+ .4byte .Lcu1_end - .Lcu1_start /* Length of Compilation Unit */ -+.Lcu1_start: -+ .2byte 2 /* DWARF Version */ -+ .4byte .Labbrev1_begin /* Offset into abbrev section */ -+ .byte 4 /* Pointer size */ -+ -+ /* CU die */ -+ .uleb128 1 /* Abbrev: DW_TAG_compile_unit */ -+ .4byte .Lend_text1 /* DW_AT_high_pc */ -+ .4byte .Lbegin_text1 /* DW_AT_low_pc */ -+ .ascii "file1.txt\0" /* DW_AT_name */ -+ .ascii "GNU C 3.3.3\0" /* DW_AT_producer */ -+ .byte 1 /* DW_AT_language (C) */ -+ -+ /* main */ -+ .uleb128 2 /* Abbrev: DW_TAG_subprogram */ -+ .byte 1 /* DW_AT_external */ -+ .byte 1 /* DW_AT_decl_file */ -+ .byte 2 /* DW_AT_decl_line */ -+ .ascii "main\0" /* DW_AT_name */ -+ .4byte .Ltype_int-.Lcu1_begin /* DW_AT_type */ -+ .4byte .Lbegin_main /* DW_AT_low_pc */ -+ .4byte .Lend_main /* DW_AT_high_pc */ -+ .byte 1 /* DW_AT_frame_base: length */ -+ .byte 0x55 /* DW_AT_frame_base: DW_OP_reg5 */ -+ -+.Ltype_int: -+ .uleb128 3 /* Abbrev: DW_TAG_base_type */ -+ .ascii "int\0" /* DW_AT_name */ -+ .byte 4 /* DW_AT_byte_size */ -+ .byte 5 /* DW_AT_encoding */ -+ -+ .byte 0 /* End of children of CU */ -+ -+.Lcu1_end: -+ -+/* Abbrev table */ -+ .section .debug_abbrev -+.Labbrev1_begin: -+ .uleb128 1 /* Abbrev code */ -+ .uleb128 0x11 /* DW_TAG_compile_unit */ -+ .byte 1 /* has_children */ -+ .uleb128 0x12 /* DW_AT_high_pc */ -+ .uleb128 0x1 /* DW_FORM_addr */ -+ .uleb128 0x11 /* DW_AT_low_pc */ -+ .uleb128 0x1 /* DW_FORM_addr */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0x25 /* DW_AT_producer */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0x13 /* DW_AT_language */ -+ .uleb128 0xb /* DW_FORM_data1 */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ -+ .uleb128 2 /* Abbrev code */ -+ .uleb128 0x2e /* DW_TAG_subprogram */ -+ .byte 0 /* has_children */ -+ .uleb128 0x3f /* DW_AT_external */ -+ .uleb128 0xc /* DW_FORM_flag */ -+ .uleb128 0x3a /* DW_AT_decl_file */ -+ .uleb128 0xb /* DW_FORM_data1 */ -+ .uleb128 0x3b /* DW_AT_decl_line */ -+ .uleb128 0xb /* DW_FORM_data1 */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0x49 /* DW_AT_type */ -+ .uleb128 0x13 /* DW_FORM_ref4 */ -+ .uleb128 0x11 /* DW_AT_low_pc */ -+ .uleb128 0x1 /* DW_FORM_addr */ -+ .uleb128 0x12 /* DW_AT_high_pc */ -+ .uleb128 0x1 /* DW_FORM_addr */ -+ .uleb128 0x40 /* DW_AT_frame_base */ -+ .uleb128 0xa /* DW_FORM_block1 */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ -+ .uleb128 3 /* Abbrev code */ -+ .uleb128 0x24 /* DW_TAG_base_type */ -+ .byte 0 /* has_children */ -+ .uleb128 0x3 /* DW_AT_name */ -+ .uleb128 0x8 /* DW_FORM_string */ -+ .uleb128 0xb /* DW_AT_byte_size */ -+ .uleb128 0xb /* DW_FORM_data1 */ -+ .uleb128 0x3e /* DW_AT_encoding */ -+ .uleb128 0xb /* DW_FORM_data1 */ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ -+ .byte 0x0 /* Terminator */ -+ .byte 0x0 /* Terminator */ -+ -+/* aranges table */ -+ .section .debug_aranges -+ .long .Laranges_end - 1f -+1: -+ .2byte 2 /* aranges Version */ -+ .4byte .Lcu1_begin - .debug_info /* Offset into .debug_info section */ -+ /* The GDB crasher is this zero value. */ -+ .byte 0 /* aranges address_size */ -+ .byte 0 /* aranges segment_size */ -+ -+.Laranges_end: -diff --git a/gdb/testsuite/gdb.dwarf2/dw2-aranges.exp b/gdb/testsuite/gdb.dwarf2/dw2-aranges.exp -new file mode 100644 ---- /dev/null -+++ b/gdb/testsuite/gdb.dwarf2/dw2-aranges.exp -@@ -0,0 +1,40 @@ -+# Copyright 2004, 2005, 2007, 2008, 2009 Free Software Foundation, Inc. -+ -+# This program is free software; you can redistribute it and/or modify -+# it under the terms of the GNU General Public License as published by -+# the Free Software Foundation; either version 3 of the License, or -+# (at your option) any later version. -+# -+# This program is distributed in the hope that it will be useful, -+# but WITHOUT ANY WARRANTY; without even the implied warranty of -+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -+# GNU General Public License for more details. -+# -+# You should have received a copy of the GNU General Public License -+# along with this program. If not, see . -+ -+# Test .debug_aranges containing zero address_size. -+ -+# This test can only be run on targets which support DWARF-2 and use gas. -+# For now pick a sampling of likely targets. -+if {![istarget *-*-linux*] -+ && ![istarget *-*-gnu*] -+ && ![istarget *-*-elf*] -+ && ![istarget *-*-openbsd*] -+ && ![istarget arm-*-eabi*] -+ && ![istarget powerpc-*-eabi*]} { -+ return 0 -+} -+ -+set testfile "dw2-aranges" -+set srcfile ${testfile}.S -+set binfile [standard_output_file ${testfile}] -+ -+if { [gdb_compile "${srcdir}/${subdir}/${srcfile}" "${binfile}" executable {nodebug}] != "" } { -+ return -1 -+} -+ -+clean_restart $testfile -+ -+# Failed gdb_load would abort the testcase execution earlier. -+pass "file loaded" diff --git a/gdb.spec b/gdb.spec index 7436be1..7852495 100644 --- a/gdb.spec +++ b/gdb.spec @@ -14,18 +14,6 @@ # Disable LTO until upstream fixes GDB's ODR woes. %define _lto_cflags %{nil} -# Only build on x86 for RHEL6 SCL, defining missing parallel make macros. -%if 0%{?scl:1} && 0%{?el6:1} -ExclusiveArch: %{ix86} x86_64 -%global make_build make %{?_smp_mflags} -%global make_install make %{?_smp_mflags} install DESTDIR=$RPM_BUILD_ROOT -%endif - -# Exclude aarch64 on RHEL7. -%if 0%{?scl:1} && 0%{?el7:1} -ExcludeArch: aarch64 -%endif - %{?scl:%scl_package gdb} %{!?scl: %global pkg_name %{name} @@ -37,13 +25,13 @@ ExcludeArch: aarch64 # If we're on Fedora or RHEL 9+, we will build the gdb-minimal package. # Never build the -minimal package on SCLs, since it's unneeded there. %if 0%{?fedora} || (0%{?rhel} > 8 && 0%{!?scl:1}) -%global _build_minimal 1 + %global _build_minimal 1 %endif # Include support for Guile? This is enabled on RHEL 8 and # Fedora < 38. %if (0%{?fedora:1} && 0%{?fedora} < 38) || (0%{?rhel:1} && 0%{?rhel} == 8) -%define use_guile 1 + %define use_guile 1 %endif Name: %{?scl_prefix}gdb @@ -53,16 +41,15 @@ Name: %{?scl_prefix}gdb # See timestamp of source gnulib installed into gnulib/ . %global snapgnulib 20220501 %global tarname gdb-%{version} -Version: 14.2 +Version: 16.3 # The release always contains a leading reserved number, start it at 1. # `upstream' is not a part of `name' to stay fully rpm dependencies compatible for the testing. -Release: 4.1%{?dist} +Release: 1%{?dist} -License: GPL-3.0-or-later AND BSD-3-Clause AND FSFAP AND LGPL-2.1-or-later AND GPL-2.0-or-later AND LGPL-2.0-or-later AND LicenseRef-Fedora-Public-Domain AND GFDL-1.3-or-later AND LGPL-2.0-or-later WITH GCC-exception-2.0 AND GPL-3.0-or-later WITH GCC-exception-3.1 AND GPL-2.0-or-later WITH GNU-compiler-exception +License: GPL-3.0-or-later AND BSD-3-Clause AND FSFAP AND LGPL-2.1-or-later AND GPL-2.0-or-later AND LGPL-2.0-or-later AND LicenseRef-Fedora-Public-Domain AND GFDL-1.3-or-later AND LGPL-2.0-or-later WITH GCC-exception-2.0 AND GPL-3.0-or-later WITH GCC-exception-3.1 AND GPL-2.0-or-later WITH GNU-compiler-exception AND MIT # Do not provide URL for snapshots as the file lasts there only for 2 days. # ftp://sourceware.org/pub/gdb/releases/FIXME{tarname}.tar.xz -#Source: %{tarname}.tar.xz Source: ftp://sourceware.org/pub/gdb/releases/%{tarname}.tar.xz URL: https://gnu.org/software/gdb/ @@ -70,8 +57,8 @@ URL: https://gnu.org/software/gdb/ %global gdb_src %{tarname} %global gdb_build build-%{_target_platform} %if 0%{?_build_minimal} -%global gdb_build_minimal %{gdb_build}-minimal -%endif # 0%{?_build_minimal} + %global gdb_build_minimal %{gdb_build}-minimal +%endif # error: Installed (but unpackaged) file(s) found: /usr/lib/debug/usr/bin/gdb-gdb.py # https://lists.fedoraproject.org/archives/list/devel@lists.fedoraproject.org/message/PBOJDOFMWTRV3ZOKNV5HN7IBX5EPHDHF/ @@ -83,12 +70,6 @@ Recommends: dnf-command(debuginfo-install) %endif %if 0%{!?scl:1} -# when manpages were moved from -headless to main -# https://bugzilla.redhat.com/show_bug.cgi?id=1402554 -# theoretically should not be required due to versioned dependeny -# below, but it cannot hurt either -- rdieter -Conflicts: gdb-headless < 7.12-29 - Summary: A GNU source-level debugger for C, C++, Fortran, Go and other languages Requires: gdb-headless%{?_isa} = %{version}-%{release} @@ -102,26 +83,19 @@ the 'gdb' package which will install 'gdb-headless' and possibly other useful packages too. %package headless + +# gdb-add-index also uses 'readelf' and 'objcopy', both of which are +# in the binutils package. (BZ 2275274) +Requires: binutils %endif +# endif !scl Summary: A GNU source-level debugger for C, C++, Fortran, Go and other languages -# Make sure we get rid of the old package gdb64, now that we have unified -# support for 32-64 bits in one single 64-bit gdb. -%ifarch ppc64 -Obsoletes: gdb64 < 5.3.91 -%endif - %ifarch %{arm} riscv64 -%global have_inproctrace 0 + %global have_inproctrace 0 %else -%global have_inproctrace 1 -%endif - -# gdb-add-index cannot be run even for SCL package on RHEL<=6. -%if 0%{!?rhel:1} || 0%{?rhel} > 6 -# eu-strip: -g recognizes .gdb_index as a debugging section. (#631997) -Conflicts: elfutils < 0.149 + %global have_inproctrace 1 %endif # https://fedorahosted.org/fpc/ticket/43 https://fedorahosted.org/fpc/ticket/109 @@ -136,55 +110,18 @@ Provides: bundled(md5-gcc) = %{snapsrc} # https://fedoraproject.org/wiki/Packaging:Guidelines#BuildRequires_and_.25.7B_isa.7D %if 0%{?_with_buildisa:1} || 0%{?_with_testsuite:1} -%global buildisa %{?_isa} + %global buildisa %{?_isa} %else -%global buildisa %{nil} + %global buildisa %{nil} %endif -%if 0%{!?rhel:1} || 0%{?rhel} > 7 # https://bugzilla.redhat.com/show_bug.cgi?id=1209492 Recommends: default-yama-scope -%endif -%if 0%{?el6:1} -%global librpmver 1 -%else -# FIXME: %elif does not work. -%if 0%{?el7:1} -%global librpmver 3 -%else -%if 0%{?fedora} >= 27 || 0%{?rhel} > 7 -%global librpmver 8 -%else -%global librpmver 7 -%endif -%if 0%{?fedora} >= 31 || 0%{?rhel} >= 9 -%global librpmver 9 -%endif -%if 0%{?fedora} >= 39 || 0%{?rhel} >= 10 -%global librpmver 10 -%endif -%endif -%endif -%if 0%{?__isa_bits} == 64 -%global librpmname librpm.so.%{librpmver}()(64bit) -%else -%global librpmname librpm.so.%{librpmver} -%endif -BuildRequires: rpm-libs%{buildisa} -%if 0%{?_with_buildisa:1} -BuildRequires: %{librpmname} -%endif -%if 0%{!?rhel:1} || 0%{?rhel} > 7 -Recommends: %{librpmname} -%endif +# rpm-suggestions.py needs to import rpm which is found in python3-rpm. +Recommends: python3-rpm -%if 0%{?el6:1} || 0%{?el7:1} -# GDB C++11 requires devtoolset gcc. -BuildRequires: %{?scl_prefix}gcc-c++ -%else BuildRequires: gcc-c++ -%endif # GDB patches have the format `gdb--bz-.patch'. # They should be created using patch level 1: diff -up ./gdb (or gdb-6.3/gdb). @@ -206,117 +143,58 @@ Source3: gdb-gstack.man #=fedora Source4: gdbinit -# libstdc++ pretty printers from GCC SVN. -%global libstdcxxpython gdb-libstdc++-v3-python-8.1.1-20180626 -#=fedora -Source5: %{libstdcxxpython}.tar.xz - -# Provide gdbtui for RHEL-5 and RHEL-6 as it is removed upstream (BZ 797664). -#=fedora -Source6: gdbtui - -# libipt: Intel Processor Trace Decoder Library -%global libipt_version 2.0.5 -#=fedora -Source7: v%{libipt_version}.tar.gz - # Include the auto-generated file containing the "Patch:" directives. # See README.local-patches for more details. -Patch9998: _gdb.spec.Patch.include -Patch9999: _gdb.spec.patch.include -%include %{PATCH9998} +Source9998: _gdb.spec.Patch.include +Source9999: _gdb.spec.patch.include +%include %{SOURCE9998} -# System readline is too old prior to RHEL8. -%if 0%{!?rhel:1} || 0%{?rhel} > 7 -%global use_system_readline 1 BuildRequires: readline-devel%{buildisa} >= 7.0 -%else -%global use_system_readline 0 -%endif - BuildRequires: ncurses-devel%{buildisa} texinfo gettext flex bison BuildRequires: expat-devel%{buildisa} -%if 0%{!?rhel:1} || 0%{?rhel} > 6 +# gdb/minidebug.c uses the xz library to handle compressed debuginfo. BuildRequires: xz-devel%{buildisa} -%endif # dlopen() no longer makes rpm-libsFIXME{?_isa} (it's .so) a mandatory dependency. BuildRequires: rpm-devel%{buildisa} BuildRequires: zlib-devel%{buildisa} libselinux-devel%{buildisa} %if 0%{!?_without_python:1} -%if 0%{?rhel:1} && 0%{?rhel} <= 7 -BuildRequires: python-devel%{buildisa} -%global __python /usr/bin/python2 -%else -%global __python %{__python3} + %global __python %{__python3} BuildRequires: python3-devel%{buildisa} %endif -%if 0%{?rhel:1} && 0%{?rhel} <= 7 -# Temporarily before python files get moved to libstdc++.rpm -# libstdc++%{bits_other} is not present in Koji, the .spec script generating -# gdb/python/libstdcxx/ also does not depend on the %{bits_other} files. -BuildRequires: libstdc++%{buildisa} -%endif # 0%{?rhel:1} && 0%{?rhel} <= 7 -%endif # 0%{!?_without_python:1} # gdb-doc in PDF, see: https://bugzilla.redhat.com/show_bug.cgi?id=919891#c10 BuildRequires: texinfo-tex -%if 0%{!?rhel:1} || 0%{?rhel} > 6 BuildRequires: texlive-collection-latexrecommended -%endif # Permit rebuilding *.[0-9] files even if they are distributed in gdb-*.tar: BuildRequires: /usr/bin/pod2man -%if 0%{!?rhel:1} || 0%{?rhel} > 7 BuildRequires: libbabeltrace-devel%{buildisa} - %if %{defined use_guile} - %if 0%{!?rhel:1} +%if %{defined use_guile} + %if 0%{!?rhel:1} BuildRequires: guile22-devel%{buildisa} - %endif - # Guile is only supported prior to RHEL9, where it was called "guile". - %if 0%{?rhel:1} && 0%{?rhel} < 9 + %endif + # Guile is only supported prior to RHEL9, where it was called "guile". + %if 0%{?rhel:1} && 0%{?rhel} < 9 BuildRequires: guile-devel%{buildisa} - %endif %endif %endif +# Add support for Intel Processor Trace on eligible architectures. %global have_libipt 0 -%if 0%{!?rhel:1} || 0%{?rhel} > 7 || (0%{?rhel} == 7 && 0%{?scl:1}) %ifarch %{ix86} x86_64 %global have_libipt 1 -%if 0%{?el7:1} && 0%{?scl:1} -BuildRequires: cmake -%else BuildRequires: libipt-devel%{buildisa} %endif -%endif -%endif -%if 0%{!?rhel:1} || 0%{?rhel} > 6 + # See https://bugzilla.redhat.com/show_bug.cgi?id=1593280 # DTS RHEL-6 has mpfr-2 while GDB requires mpfr-3 on RHEL-7, RHEL-8, and # Fedora < 32, and mpfr-4 on Fedora 32+ and RHEL-9+. BuildRequires: mpfr-devel%{buildisa} -%endif -# RHEL6 doesn't have source-highlight. -%if 0%{!?rhel:1} || 0%{?rhel} > 6 BuildRequires: source-highlight-devel -%endif %if 0%{!?rhel:1} BuildRequires: xxhash-devel %endif -# Special case: on RHEL8+, we simply require the system debuginfod. -# Otherwise, we require the SCL version. Except on RHEL6, where debuginfod -# is not supported at all. -%global have_debuginfod 0 -%global use_scl_for_debuginfod 0 -%if 0%{!?rhel:1} || 0%{?rhel} >= 8 -%global have_debuginfod 1 +# Include debuginfod support. BuildRequires: elfutils-debuginfod-client-devel -%else -%if 0%{!?el6:1} && 0%{?scl:1} -%global have_debuginfod 1 -%global use_scl_for_debuginfod 1 -BuildRequires: elfutils-debuginfod-client-devel -%endif -%endif # Workaround for missing boost-devel dependency (rhbz 1718480) BuildRequires: boost-devel @@ -326,117 +204,66 @@ BuildRequires: boost-devel # Ensure the devel libraries are installed for both multilib arches. %global bits_local %{?_isa} %global bits_other %{?_isa} -%ifarch s390x -%if 0%{?rhel:1} && 0%{?rhel} < 8 -%global bits_other (%{__isa_name}-32) -%endif -%else #!s390x %ifarch ppc -%global bits_other (%{__isa_name}-64) -%else #!ppc -%ifarch sparc64 ppc64 s390x x86_64 -%global bits_other (%{__isa_name}-32) -%endif #sparc64 ppc64 s390x x86_64 -%endif #!ppc -%endif #!s390x + %global bits_other (%{__isa_name}-64) +%endif + +%ifarch ppc64 x86_64 + %global bits_other (%{__isa_name}-32) +%endif BuildRequires: sharutils dejagnu -# gcc-objc++ is not covered by the GDB testsuite. + # Test supported SCL toolchain components. BuildRequires: %{?scl_testing_prefix}gcc %{?scl_testing_prefix}gcc-c++ %{?scl_testing_prefix}gcc-gfortran -%if 0%{!?rhel:1} || 0%{?rhel} < 8 +# Fedora supports Objective C. +%if 0%{!?rhel:1} BuildRequires: gcc-objc %endif + # We don't support gcc-gdb-plugin on RHEL anymore. %if 0%{!?rhel:1} -BuildRequires: %{?scl_prefix}gcc-gdb-plugin%{?_isa} +BuildRequires: gcc-gdb-plugin%{?_isa} %endif -%if 0%{?rhel:1} && 0%{?rhel} < 7 -BuildRequires: gcc-java libgcj%{bits_local} libgcj%{bits_other} -# for gcc-java linkage: -BuildRequires: zlib-devel%{bits_local} zlib-devel%{bits_other} -%endif -# Exception for RHEL<=7 -%ifarch aarch64 -%if 0%{!?rhel:1} -BuildRequires: gcc-go -BuildRequires: libgo-devel%{bits_local} libgo-devel%{bits_other} -%endif -%else -%if 0%{!?rhel:1} || 0%{?rhel} == 7 -BuildRequires: gcc-go -BuildRequires: libgo-devel%{bits_local} libgo-devel%{bits_other} -%endif -%endif -# archer-sergiodj-stap-patch-split + BuildRequires: systemtap-sdt-devel -%if 0%{?rhel:1} && 0%{?rhel} <= 7 -# Copied from prelink-0.4.2-3.fc13. -# Prelink is not yet ported to ppc64le. -%ifarch %{ix86} alpha sparc sparcv9 sparc64 s390 s390x x86_64 ppc ppc64 -# Prelink is broken on sparcv9/sparc64. -%ifnarch sparc sparcv9 sparc64 -BuildRequires: prelink -%endif -%endif -%endif -%if 0%{!?rhel:1} || 0%{?rhel} > 7 BuildRequires: opencl-headers ocl-icd-devel%{bits_local} ocl-icd-devel%{bits_other} -%endif + %if 0%{!?rhel:1} -# Fedora arm+ppc64le+s390x do not yet have fpc built. -%ifnarch %{arm} ppc64le s390x +BuildRequires: gcc-go +BuildRequires: libgo-devel%{bits_local} libgo-devel%{bits_other} +%endif + +%if 0%{!?rhel:1} + %ifnarch s390x +# Fedora s390x does not support fpc. BuildRequires: fpc + %endif %endif -%endif -# Copied from: gcc-6.2.1-1.fc26 -# Exception for RHEL<=7 -%ifarch s390x + %if 0%{!?rhel:1} BuildRequires: gcc-gnat BuildRequires: libgnat%{bits_local} libgnat%{bits_other} %endif -%else -%ifarch %{ix86} x86_64 ia64 ppc %{power64} alpha s390x %{arm} aarch64 riscv64 -%if 0%{!?rhel:1} -BuildRequires: gcc-gnat -BuildRequires: libgnat%{bits_local} libgnat%{bits_other} -%endif -%endif -%endif BuildRequires: glibc-devel%{bits_local} glibc-devel%{bits_other} BuildRequires: libgcc%{bits_local} libgcc%{bits_other} BuildRequires: libgfortran%{bits_local} libgfortran%{bits_other} # libstdc++-devel of matching bits is required only for g++ -static. BuildRequires: libstdc++%{bits_local} libstdc++%{bits_other} -%if 0%{!?rhel:1} || 0%{?rhel} > 6 %ifarch %{ix86} x86_64 BuildRequires: libquadmath%{bits_local} libquadmath%{bits_other} %endif -%endif # multilib glibc-static is open Bug 488472: -%if 0%{?rhel} > 6 +%if 0%{?rhel:1} BuildRequires: glibc-static%{bits_other} %endif -%ifarch s390x -BuildRequires: valgrind%{bits_local} -%if 0%{!?rhel:1} || 0%{?rhel} > 7 BuildRequires: valgrind%{bits_local} valgrind%{bits_other} -%endif -%else -BuildRequires:valgrind%{bits_local} valgrind%{bits_other} -%endif -%if 0%{!?rhel:1} || 0%{?rhel} > 6 BuildRequires: xz -%endif -%if 0%{!?rhel:1} || 0%{?rhel} > 7 BuildRequires: rust -%endif -%if 0%{!?el6:1} BuildRequires: elfutils-debuginfod %endif -%endif # 0%{?_with_testsuite:1} +# endif _with_testsuite BuildRequires: make gmp-devel %{?scl:Requires:%scl_runtime} @@ -468,7 +295,8 @@ fashion and printing their data. This package provides a minimal version of GDB, tailored to be used by the Fedora buildroot. It should probably not be used by end users. -%endif # 0%{?_build_minimal} +%endif +# endif _build_minimal %package gdbserver Summary: A standalone server for GDB (the GNU source-level debugger) @@ -503,27 +331,18 @@ This package provides INFO, HTML and PDF user manual for GDB. %prep %setup -q -n %{gdb_src} -%if 0%{?rhel:1} && 0%{?rhel} <= 7 -# libstdc++ pretty printers. -tar xJf %{SOURCE5} -%endif # 0%{?rhel:1} && 0%{?rhel} <= 7 - -%if 0%{have_libipt} && 0%{?el7:1} && 0%{?scl:1} -tar xzf %{SOURCE7} -%endif - # Files have `# ' statements breaking VPATH / find-debuginfo.sh . (cd gdb;rm -fv $(perl -pe 's/\\\n/ /' 7 -CFLAGS="$CFLAGS -DDNF_DEBUGINFO_INSTALL" -%endif - -%if 0%{have_libipt} && 0%{?el7:1} && 0%{?scl:1} -( - mkdir libipt-%{libipt_version}-root - mkdir libipt-%{libipt_version}-build - cd libipt-%{libipt_version}-build - # -DPTUNIT:BOOL=ON has no effect on ctest. - %cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo \ - -DPTUNIT:BOOL=OFF \ - -DDEVBUILD:BOOL=ON \ - -DBUILD_SHARED_LIBS=OFF \ - ../../libipt-%{libipt_version} - make VERBOSE=1 %{?_smp_mflags} - ctest -V %{?_smp_mflags} - make install DESTDIR=../libipt-%{libipt_version}-root -) -# There is also: --with-libipt-prefix -CFLAGS="$CFLAGS -I$PWD/libipt-%{libipt_version}-root%{_includedir}" -LDFLAGS="$LDFLAGS -L$PWD/libipt-%{libipt_version}-root%{_libdir}" -%endif - export CXXFLAGS="$CFLAGS" -# For DTS11+, gcc defaults to c++17, causing issues with system-installed -# headers, e.g., python. Force to c++11. We coerce all builds to use c++11 -# to facilitate testing. -%if 0%{?rhel:1} && 0%{?rhel} < 8 -export CXXFLAGS="$CXXFLAGS -std=gnu++11" -%endif - # The configure flags we will use when building the full GDB. GDB_FULL_CONFIGURE_FLAGS="\ - --with-system-gdbinit=%{_sysconfdir}/gdbinit \ -%if 0%{!?rhel:1} || 0%{?rhel} > 7 - --with-babeltrace \ -%else - --without-babeltrace \ -%endif - --with-expat \ -$(: ppc64 host build crashes on ppc variant of libexpat.so ) \ - --without-libexpat-prefix \ - --enable-tui \ + --with-system-gdbinit=%{_sysconfdir}/gdbinit \ + --with-babeltrace \ + --with-expat \ +$(: ppc64 host build crashes on ppc variant of libexpat.so ) \ + --without-libexpat-prefix \ + --enable-tui \ %if 0%{!?_without_python:1} - --with-python=%{__python} \ + --with-python=%{__python} \ %else - --without-python \ + --without-python \ %endif %if %{defined use_guile} - --with-guile \ + --with-guile \ %else - --without-guile \ + --without-guile \ %endif %if %{have_inproctrace} - --enable-inprocess-agent \ + --enable-inprocess-agent \ %else - --disable-inprocess-agent \ + --disable-inprocess-agent \ %endif %if %{have_libipt} - --with-intel-pt \ + --with-intel-pt \ %else - --without-intel-pt \ + --without-intel-pt \ %endif %if 0%{!?rhel:1} - --with-xxhash \ + --with-xxhash \ %endif - --with-rpm=librpm.so.%{librpmver} \ - --enable-unit-tests" + --enable-unit-tests" -# --htmldir and --pdfdir are not used as they are used from %{gdb_build}. -../configure \ - ${COMMON_GDB_CONFIGURE_FLAGS} \ - ${GDB_FULL_CONFIGURE_FLAGS} \ +# --htmldir and --pdfdir are not used as they are used from GDB_BUILD. +../configure \ + ${COMMON_GDB_CONFIGURE_FLAGS} \ + ${GDB_FULL_CONFIGURE_FLAGS} \ %if 0%{?pkgversion_configure_flag:1} - "%{pkgversion_configure_flag}" \ -%endif - --with-auto-load-dir='$debugdir:$datadir/auto-load%{?scl::%{_root_datadir}/gdb/auto-load}' \ - --with-auto-load-safe-path='$debugdir:$datadir/auto-load%{?scl::%{_root_datadir}/gdb/auto-load}' \ -%ifarch sparc sparcv9 - sparc-%{_vendor}-%{_target_os}%{?_gnu} -%else - --enable-targets=s390-linux-gnu,powerpc-linux-gnu,arm-linux-gnu,aarch64-linux-gnu \ - %{_target_platform} + "%{pkgversion_configure_flag}" \ %endif + --with-auto-load-dir='$debugdir:$datadir/auto-load%{?scl::%{_root_datadir}/gdb/auto-load}' \ + --with-auto-load-safe-path='$debugdir:$datadir/auto-load%{?scl::%{_root_datadir}/gdb/auto-load}' \ + --enable-targets=s390-linux-gnu,powerpc-linux-gnu,arm-linux-gnu,aarch64-linux-gnu,riscv64-linux-gnu,x86_64-redhat-linux-gnu \ + %{_target_platform} if [ -z "%{!?_with_profile:no}" ] then @@ -863,7 +603,7 @@ fi cd .. -done # fprofile +done # fprofile cd %{gdb_build} @@ -874,7 +614,7 @@ cd %{gdb_build} cp $RPM_BUILD_DIR/%{gdb_src}/gdb/NEWS $RPM_BUILD_DIR/%{gdb_src} %check -# Initially we're in the %{gdb_src} directory. +# Initially we're in the GDB_SRC directory. cd %{gdb_build} # We always run the unittests. @@ -929,9 +669,9 @@ gcc -o ./orphanripper %{SOURCE2} -Wall -lutil -ggdb2 # Disable some problematic testcases. # RUNTESTFLAGS='--ignore ...' is not used below as it gets separated by the # `check//...' target spawn and too much escaping there would be dense. - for test in \ - gdb.base/readline-overflow.exp \ - gdb.base/bigcore.exp \ + for test in \ + gdb.base/readline-overflow.exp \ + gdb.base/bigcore.exp \ %if 0%{?rhel} < 7 gdb.base/gnu-debugdata.exp \ gdb.base/access-mem-running.exp \ @@ -968,9 +708,10 @@ uuencode gdb-%{_target_platform}.tar.bz2 gdb-%{_target_platform}.tar.bz2 cd ../.. echo ====================TESTING END===================== %endif +# endif _testsuite %install -# Initially we're in the %{gdb_src} directory. +# Initially we're in the GDB_SRC directory. %if 0%{?_build_minimal} cd %{gdb_build_minimal} rm -rf $RPM_BUILD_ROOT @@ -984,7 +725,8 @@ rm -fv $RPM_BUILD_ROOT%{_bindir}/{gcore,gdbserver,gstack,gdb-add-index} mv $RPM_BUILD_ROOT%{_bindir}/gdb $RPM_BUILD_ROOT%{_bindir}/gdb.minimal cd .. -%endif # 0%{?_build_minimal} +%endif +# endif _build_minimal # Install the full build. @@ -994,11 +736,6 @@ cd %{gdb_build} # building gdb-minimal. %if 0%{!?_build_minimal} rm -rf $RPM_BUILD_ROOT -%endif # 0%{!?_build_minimal} - -%if 0%{?el6:1} -# GDB C++11 requires devtoolset gcc. -%{?scl:PATH=%{_bindir}${PATH:+:${PATH}}} %endif %make_install %{?_smp_mflags} @@ -1006,24 +743,8 @@ rm -rf $RPM_BUILD_ROOT %if 0%{!?scl:1} mkdir -p $RPM_BUILD_ROOT%{_prefix}/libexec mv -f $RPM_BUILD_ROOT%{_bindir}/gdb $RPM_BUILD_ROOT%{_prefix}/libexec/gdb -%if 0%{?rhel:1} && 0%{?rhel} <= 6 -# RHEL-6: ln: invalid option -- 'r': https://bugzilla.redhat.com/show_bug.cgi?id=1384947 -# RHEL-6 also does not have: /usr/bin/realpath -ln -s $( - perl -le 'sub x{$_=$_[0];s{/+}{/}g;s{/$}{};return split "/";}@a=x shift;@b=x shift;while($a[0] eq $b[0]){shift @a;shift @b;}print join "/",map("..",@a),@b;' \ - $RPM_BUILD_ROOT%{_bindir} $RPM_BUILD_ROOT%{_prefix}/libexec/gdb -) $RPM_BUILD_ROOT%{_bindir}/gdb -%else -ln -s -r $RPM_BUILD_ROOT%{_prefix}/libexec/gdb $RPM_BUILD_ROOT%{_bindir}/gdb +ln -s -r $RPM_BUILD_ROOT%{_prefix}/libexec/gdb $RPM_BUILD_ROOT%{_bindir}/gdb %endif -%endif - -# Provide gdbtui for RHEL-5 and RHEL-6 as it is removed upstream (BZ 797664). -%if 0%{?rhel:1} && 0%{?rhel} <= 6 -test ! -e $RPM_BUILD_ROOT%{_prefix}/bin/gdbtui -install -m 755 %{SOURCE6} $RPM_BUILD_ROOT%{_prefix}/bin/gdbtui -ln -sf gdb.1 $RPM_BUILD_ROOT%{_mandir}/man1/gdbtui.1 -%endif # 0%{?rhel:1} && 0%{?rhel} <= 6 mkdir -p $RPM_BUILD_ROOT%{_sysconfdir}/gdbinit.d touch -r %{SOURCE4} $RPM_BUILD_ROOT%{_sysconfdir}/gdbinit.d @@ -1043,15 +764,12 @@ for pyo in "" "-O";do # RHEL-5: AttributeError: 'module' object has no attribute 'compile_file' %{__python} $pyo -c 'import compileall, re, sys; sys.exit (not compileall.compile_dir("'"$RPM_BUILD_ROOT/usr/lib/debug%{_bindir}"'", 1, "'"/usr/lib/debug%{_bindir}"'"))' done -%endif # 0%{?_enable_debug_packages:1} && 0%{!?_without_python:1} - -# Compile python files -%if 0%{!?_without_python:1} && (0%{!?rhel:1} || 0%{?rhel} > 7) -%py_byte_compile %{__python3} %{buildroot}%{_datadir}/gdb/python/gdb %endif +# Compile python files %if 0%{!?_without_python:1} -%if 0%{!?rhel:1} || 0%{?rhel} > 6 +%py_byte_compile %{__python3} %{buildroot}%{_datadir}/gdb/python/gdb + # BZ 999645: /usr/share/gdb/auto-load/ needs filesystem symlinks for i in $(echo bin lib $(basename %{_libdir}) sbin|tr ' ' '\n'|sort -u);do # mkdir to satisfy dangling symlinks build check. @@ -1059,36 +777,15 @@ for i in $(echo bin lib $(basename %{_libdir}) sbin|tr ' ' '\n'|sort -u);do ln -s $(echo %{_root_prefix}|sed 's#^/*##')/$i \ $RPM_BUILD_ROOT%{_datadir}/gdb/auto-load/$i done -%endif # 0%{!?rhel:1} || 0%{?rhel} > 6 -%if 0%{?rhel:1} && 0%{?rhel} <= 7 -# Temporarily now: -for LIB in $(echo lib $(basename %{_libdir})|tr ' ' '\n'|sort -u);do - LIBPATH="$RPM_BUILD_ROOT%{_datadir}/gdb/auto-load%{_root_prefix}/$LIB" - mkdir -p $LIBPATH - # basename is being run only for the native (non-biarch) file. - sed -e 's,@pythondir@,%{_datadir}/gdb/python,' \ - -e 's,@toolexeclibdir@,%{_root_prefix}/'"$LIB," \ - < $RPM_BUILD_DIR/%{gdb_src}/%{libstdcxxpython}/hook.in \ - > $LIBPATH/$(basename %{_root_prefix}/%{_lib}/libstdc++.so.6.*)-gdb.py - # Test the filename 'libstdc++.so.6.*' has matched. - test -f $LIBPATH/libstdc++.so.6.[0-9]*-gdb.py -done -test ! -e $RPM_BUILD_ROOT%{_datadir}/gdb/python/libstdcxx -cp -a $RPM_BUILD_DIR/%{gdb_src}/%{libstdcxxpython}/libstdcxx \ - $RPM_BUILD_ROOT%{_datadir}/gdb/python/libstdcxx -%endif # 0%{?rhel:1} && 0%{?rhel} <= 7 for i in `find $RPM_BUILD_ROOT%{_datadir}/gdb -name "*.py"`; do # Files are installed by install(1) not preserving the timestamps. touch -r $RPM_BUILD_DIR/%{gdb_src}/gdb/version.in $i done -%endif # 0%{!?_without_python:1} - -# gdb-add-index cannot be run even for SCL package on RHEL<=6. -%if 0%{?rhel:1} && 0%{?rhel} <= 6 -rm -f $RPM_BUILD_ROOT%{_bindir}/gdb-add-index -rm -f $RPM_BUILD_ROOT%{_mandir}/*/gdb-add-index.1* %endif +# Create the folder where GDB expects to find custom JIT readers. +mkdir -p %{buildroot}%{_libdir}/gdb + # Remove the files that are part of a gdb build but that are owned and # provided by other packages. # These are part of binutils @@ -1112,9 +809,7 @@ ln -s gstack $RPM_BUILD_ROOT%{_bindir}/pstack # Packaged GDB is not a cross-target one. (cd $RPM_BUILD_ROOT%{_datadir}/gdb/syscalls rm -f mips*.xml -%ifnarch sparc sparcv9 sparc64 rm -f sparc*.xml -%endif %ifnarch x86_64 rm -f amd64-linux.xml %endif @@ -1133,12 +828,6 @@ rm -f $RPM_BUILD_ROOT%{_infodir}/ctf-spec* rm -f $RPM_BUILD_ROOT%{_infodir}/dir -%if 0%{?rhel:1} && 0%{?rhel} <= 7 -# /usr/share/gdb/guile/ gets installed even --without-guile -# https://sourceware.org/bugzilla/show_bug.cgi?id=17105 -rm -rf $RPM_BUILD_ROOT%{_datadir}/gdb/guile -%endif - # These files are unrelated to Fedora Linux. rm -f $RPM_BUILD_ROOT%{_datadir}/gdb/system-gdbinit/elinos.py rm -f $RPM_BUILD_ROOT%{_datadir}/gdb/system-gdbinit/wrs-linux.py @@ -1146,11 +835,7 @@ rmdir $RPM_BUILD_ROOT%{_datadir}/gdb/system-gdbinit %files # File must begin with "/": {GFDL,COPYING3,COPYING,COPYING.LIB,COPYING3.LIB} -%if 0%{!?el6:1} %license COPYING3 COPYING COPYING.LIB COPYING3.LIB -%else -%doc COPYING3 COPYING COPYING.LIB COPYING3.LIB -%endif %doc README NEWS %{_bindir}/gdb %{_bindir}/gcore @@ -1162,6 +847,8 @@ rmdir $RPM_BUILD_ROOT%{_datadir}/gdb/system-gdbinit # Provide gdb/jit-reader.h so that users are able to write their own GDB JIT # plugins. %{_includedir}/gdb +# Export the folder where JIT readers should be placed. +%dir %{_libdir}/gdb %if 0%{!?scl:1} %files headless %{_prefix}/libexec/gdb @@ -1170,16 +857,8 @@ rmdir $RPM_BUILD_ROOT%{_datadir}/gdb/system-gdbinit %{_mandir}/*/gdb.1* %{_sysconfdir}/gdbinit.d %{_mandir}/*/gdbinit.5* -# gdb-add-index cannot be run even for SCL package on RHEL<=6. -%if 0%{!?rhel:1} || 0%{?rhel} > 6 %{_bindir}/gdb-add-index %{_mandir}/*/gdb-add-index.1* -%endif -# Provide gdbtui for RHEL-5 and RHEL-6 as it is removed upstream (BZ 797664). -%if 0%{?rhel:1} && 0%{?rhel} <= 6 -%{_bindir}/gdbtui -%{_mandir}/*/gdbtui.1* -%endif # 0%{?rhel:1} && 0%{?rhel} <= 6 %{_datadir}/gdb # don't include the files in include, they are part of binutils @@ -1188,15 +867,13 @@ rmdir $RPM_BUILD_ROOT%{_datadir}/gdb/system-gdbinit %files minimal %{_bindir}/gdb.minimal %{_bindir}/gdb-add-index -%endif # 0%{?_build_minimal} +%endif -%ifnarch sparc sparcv9 %files gdbserver %{_bindir}/gdbserver %{_mandir}/*/gdbserver.1* %if %{have_inproctrace} %{_libdir}/libinproctrace.so -%endif # %{have_inproctrace} %endif %if 0%{!?_without_python:1} @@ -1213,8 +890,8 @@ for i in $(echo bin lib $(basename %{_libdir}) sbin|tr ' ' '\n'|sort -u);do fi fi done -%endif # 0%{!?rhel:1} -%endif # 0%{!?_without_python:1} +%endif +%endif %files doc %doc %{gdb_build}/gdb/doc/{gdb,annotate}.{html,pdf} @@ -1248,50 +925,302 @@ then fi fi %endif +# endif scl %changelog -* Tue May 6 2025 Keith Seitz - 14.2-4.1.el9 -- Backport IBM z17 binutils patches - (Jens Remus et al, RHEL-89863) +* Wed May 28 2025 Guinevere Larsen - 16.3-1.el9 +- Rebase RHEL 9's GDB from 14.2 to 16.3 + Resolves: RHEL-91381 + Resolves: RHEL-50069 -* Thu Jan 9 2025 Keith Seitz - 14.2-4.el9 -- gdb-add-index.patch: Use "command -v" instead of "which". - (Keith Seitz, RHEL-73209) +* Tue May 13 2025 Alexandra Hájková - 16.3-1 +- Rebase to FSF GDB 16.3. + Deleted: gdb-rhbz2354997-gstack-drop-readnever.patch -* Fri May 31 2024 Guinevere Larsen - 14.2-1.el9 -- Rebase to gdb-14.2 and update all bug references - (Resolves: RHEL-39554) - (Resolves: RHEL-39553) - (Resolves: RHEL-10550) - (Resolves: RHEL-39555) - (Resolves: RHEL-39585) - (Resolves: RHEL-36211) +* Fri Mar 28 2025 Keith Seitz - 16.2-3 +- Backport "Fix gstack issues" from upstream. + (Keith Seitz, RH BZ 2354997) -* Wed May 29 2024 Guinevere Larsen - 14.2-3.el8 -- Remove riscv64-linux-gnu target. It was never meant to be added. +* Thu Feb 13 2025 Alexandra Hájková - 16.2-2 +- Bump the release number. -* Thu May 16 2024 Guinevere Larsen - 14.2-2.el8 -- Backport "better support for $pc not saved" - (Andrew Burgess, RHEL-19390) +* Tue Feb 11 2025 Alexandra Hájková - 16.2-1 +- Rebase to FSF GDB 16.2. + Dropped: gdb-backport-buildid-related-changes.patch + gdb-catchpoint-re-set.patch + gdb-remove-qnx-neutrino-support.patch + Modified: gdb-add-rpm-suggestion-script.patch -* Mon May 13 2024 Guinevere Larsen -- Backport series Infcalls from B/P conditions in multi-threaded inferiors - (Andrew Burgess, RHEL-13298) +* Thu Jan 23 2025 Alexandra Hájková +- Remove upstreamed gdb-6.3-gstack-20050411.patch. -* Mon May 13 2024 Keith Seitz -- Backport "gdb: s390: Add arch14 record/replay support" - (Andreas Arnez, RHEL-36225) -- Backport "Add support for Power11 options" - (Peter Bergner, RHEL-36518) -- Backport "Sync x86 disassembler with (proposed) gdb-15.1 release." - (many authors, RHEL-36527) +* Fri Jan 17 2025 Guinevere Larsen +- remove gdb-test-bt-cfi-without-die.patch. This test has been + accepted upstream and will make its way back to testing with + the GDB 17 release. -* Tue Apr 23 2024 Guinevere Larsen - 14.2-1.el8 -- Initial import for GTS14. +* Thu Jan 16 2025 Fedora Release Engineering +- Rebuilt for https://fedoraproject.org/wiki/Fedora_42_Mass_Rebuild -* Tue Mar 12 2024 Alexandra Hájková - 14.2-1 +* Tue Jan 07 2025 Andrew Burgess +- Remove gdb-rhbz1261564-aarch64-hw-watchpoint-test.patch. This test + should be covered by gdb.base/watchpoint-unaligned.exp which was + added upstream in commit a3b60e4588606354b93508a0008a5. + +* Thu Jan 02 2025 Guinevere Larsen +- Remove gdb-rhbz1156192-recursive-dlopen-test.patch. + +* Thu Jan 02 2025 Andrew Burgess +- Update generate-patches-from-git-repo.sh script, and regenerate + patches. This changed gdb-add-rpm-suggestion-script.patch, + gdb-backport-buildid-related-changes.patch, and + gdb-remove-qnx-neutrino-support.patch. In each case, there is no + significant change, only the diff header itself changed. + +* Wed Dec 11 2024 Andrew Burgess +- Remove gdb-6.6-buildid-locate-tests.patch patch, merge the tests + from this patch into gdb-add-rpm-suggestion-script.patch. The tests + from the removed patch all relate to RPM suggestion, and so should + live with the rpm suggestion script. + +* Wed Dec 11 2024 Andrew Burgess +- This REMOVES the 'set/show build-id-verbose' command. Users should + instead use 'set/show rpm-suggestion enabled'. The old + build-id-verbose setting took an integer, but only 0 or 1 had + meaning. The new setting is a boolean, and takes 'on' or 'off'. + The old setting was undocumented, while the new setting has a manual + entry. + +* Wed Dec 11 2024 Andrew Burgess +- Remove gdb-add-deprecated-settings-py-script.patch. This REMOVES + the 'set/show build-id-core-load' setting from GDB. This setting + has had no effect on GDB since commit a5d2c85367e544d446 back in + 2020. Lets finally drop this setting. + +* Tue Dec 10 2024 Andrew Burgess +- Remove + gdb-6.6-buildid-locate-misleading-warning-missing-debuginfo-rhbz981154.patch, + gdb-6.6-buildid-locate.patch, + gdb-6.6-buildid-locate-solib-missing-ids.patch, and + gdb-remove-use-of-py-isascii. Add new patches + gdb-add-deprecated-settings-py-script.patch, + gdb-backport-buildid-related-changes.patch, + gdb-remove-qnx-neutrino-support.patch, and + gdb-6.6-buildid-locate-tests.patch. Update + gdb-add-rpm-suggestion-script.patch and + gdb-rhbz1156192-recursive-dlopen-test.patch. All of the RPM + suggestion feature is now provided via a Python extension. I + believe that the existing functionality should be covered by the new + implementation, but with no real tests for the existing code, we + cannot be certain. There are new GDB commands added as part of this + change related to controlling the RPM suggestion feature. These are + documented within the gdb-add-rpm-suggestion-script.patch patch by + changes to the GDB manual. + +* Thu Nov 14 2024 Kevin Buettner +- Remove gdb-6.5-bz243845-stale-testing-zombie-test.patch. This was a + test for a fix to a function that was named linux_test_for_tracefork, + which was removed in 2022 in upstream commit a288518611d. + +* Wed Nov 13 2024 Alexandra Hájková +- Remove upstreamed (21dc8b8d287) gdb-test-dw2-aranges.patch. + +* Wed Nov 13 2024 Andrew Burgess +- Add x86_64-redhat-linux-gnu to --enable-targets for full GDB build + in gdb.spec, this ensures we can remote debug x86-64 targets from + non-x86-64 hosts. This fixes rhbz 2308522. + +* Tue Nov 12 2024 Andrew Burgess +- Remove gdb-6.6-testsuite-timeouts.patch. I updated the upstream + tests in commit 06b8b0ad976 so this patch is no longer useful. + +* Wed Nov 6 2024 Mark Wielaard - 15.2-2 +- Resolves: rhbz#2323513 + - gdb-add-index.patch: Replace which with command -v + - Remove which Requires which was only there for gdb-add-index + +* Tue Nov 5 2024 Guinevere Larsen +- Remove gdb-simultaneous-step-resume-breakpoint.patch + This test is covered by a combination of upstream tests already. + +* Thu Oct 24 2024 Guinevere Larsen +- Make the GDB package provide the libdir/gdb folder, so that packages + that provide a JIT reader don't need to create it on their own. + +* Fri Oct 4 2024 Alexandra Hájková - 15.2-2 +- Rebase to FSF GDB 15.2. + +* Thu Sep 26 2024 Andrew Burgess +- Remove gdb-rhbz1007614-memleak-infpy_read_memory-test.patch. An + equivalent test was pushed upstream in commit f4b29c2f610. + +* Wed Sep 11 2024 Kevin Buettner +- Remove local patch gdb-6.5-section-num-fixup-test.patch. This + patch contained a test case which should be covered by upstream + test gdb.base/ctxobj.exp. + +* Mon Sep 9 2024 Andrew Burgess +- Backport upstream commit a92e943014f to fix rhbz2304296. + +* Wed Aug 21 2024 Alexandra Hájková - 15.1-22 +- Add x86_64-redhat-linux-gnu to --enable-targets= in gdb.spec. + This enables to connect to gdbserver running on x86 using the x86 binary + running GDB from a different architecture. (RHBZ 2308522) + +* Wed Aug 21 2024 Alexandra Hájková +- Remove gdb-6.6-bz229517-gcore-without-terminal.patch + This test was upstreamed. + +* Thu Aug 8 2024 Guinevere Larsen +- Remove gdb-6.7-ppc-clobbered-registers-O2-test.patch + This test is already upstreamed in gdb.opt +- Remove gdb-rhbz947564-findvar-assertion-frame-failed-testcase.patch + This is already covered by gdb.thread/tls.exp + +* Wed Jul 24 2024 Alexandra Hájková - 15.1-1 +- Rebase to FSF GDB 15.1. +- Update local patches: + gdb-6.3-gstack-20050411.patch + gdb-6.6-buildid-locate-solib-missing-ids.patch + gdb-6.6-buildid-locate.patch + gdb-add-missing-debug-ext-lang-hook.patch + gdb-add-rpm-suggestion-script.patch + gdb-merge-debug-symbol-lookup.patch +- Dropped: + gdb-add-missing-debug-ext-lang-hook.patch + gdb-add-missing-debug-info-python-hook.patch + gdb-do-not-import-py-curses-ascii-module.patch + gdb-ftbs-swapped-calloc-args.patch + gdb-handle-no-python-gdb-module.patch + gdb-refactor-find-and-add-separate-symbol-file.patch + gdb-reformat-missing-debug-py-file.patch + gdb-remove-path-in-test-name.patch + gdb-remove-use-of-py-isascii + gdb-rhbz-2232086-cpp-ify-mapped-symtab.patch + gdb-rhbz-2232086-generate-dwarf-5-index-consistently.patch + gdb-rhbz-2232086-generate-gdb-index-consistently.patch + gdb-rhbz-2232086-reduce-size-of-gdb-index.patch + gdb-rhbz2232086-refactor-selftest-support.patch + gdb-rhbz2250652-avoid-PyOS_ReadlineTState.patch + gdb-rhbz2250652-gdbpy_gil.patch + gdb-rhbz2261580-intrusive_list-assertion-fix.patch + gdb-rhbz2277160-apx-disasm.patch + gdb-rhel2295897-pre-read-DWZ-file-in-DWARF-reader.patch + gdb-sync-coffread-with-elfread.patch + +* Thu Jul 18 2024 Fedora Release Engineering +- Rebuilt for https://fedoraproject.org/wiki/Fedora_41_Mass_Rebuild + +* Fri Jul 5 2024 Guinevere Larsen - 14.2-14 +- backport commit 91874afabcd to solve RHEL-2295897 + This fixes a double free when debugging mysql-workbench + +* Thu Jun 27 2024 Kevin Buettner - 14.2-13 +- Revise rpm-suggestions.py script so that message regarding + a not-found 'rpm' module is deferred until just prior to + printing the GDB prompt. (RHBZ 2275274) + +* Wed Jun 19 2024 Guinevere Larsen +- Drop gdb-glibc-strstr-workaround.patch + +* Tue Jun 18 2024 Kevin Buettner +- Remove gdb-core-open-vdso-warning.patch. This tests added by this + patch are similar to those of upstream test gdb.base/vdso-warning.exp. + +* Tue Jun 18 2024 Kevin Buettner - 14.2-12 +- Revise rpm-suggestions.py script so that message regarding + a not-found 'rpm' module is output to stderr. (RHBZ 2275274) + +* Sat Jun 08 2024 Python Maint +- Rebuilt for Python 3.13 + +* Thu Jun 06 2024 Python Maint - 14.2-10 +- Bootstrap for Python 3.13 + +* Thu May 23 2024 Kevin Buettner - 14.2-9 +- Revise rpm-suggestions.py script so that a message is printed when + the 'rpm' module (found in the python3-rpm package) isn't found. + In particular, the ModuleNotFoundError will be caught, avoiding + a potential python import error. (RHBZ 2275274) + +* Wed May 22 2024 Guinevere Larsen +- Remove gdb-fedora-libncursesw.patch, this workaround isn't needed + anymore. + +* Wed May 15 2024 Keith Seitz - 14.2-8 +- Sync x86 disassembler with (proposed) gdb-15.1 release. + (many authors, RHBZ 2277160) + +* Tue Apr 30 2024 Keith Seitz - 14.2-7 +- Remove bundled copy of libipt. +- Remove bundled copy of libstdc++ pretty-printers. +- Always include debuginfod support. +- Purge RHEL < 8. + +* Thu Apr 25 2024 Kevin Buettner - 14.2-6 +- Further changes for fixing RHBZ 2275274: Add a + 'Requires: binutils' which is needed because gdb-add-index uses + readelf and objcopy. Also, delete librpm related stuff since + gdb/build-id.c no longer attempts to dlopen a librpm library. Add + 'Recommends python3-rpm' so that rpm-suggestions.py will find the + required python module. + +* Tue Apr 23 2024 Kevin Buettner - 14.2-5 +- Add "Requires: which" for RHBZ 2275274. + +* Mon Apr 22 2024 Keith Seitz +- Remove gdb-linux_perf-bundle.patch. + +* Thu Mar 28 2024 Kevin Buettner +- Drop gdb-6.5-bz185337-resolve-tls-without-debuginfo-v2.patch. I've + rewritten and expanded the test case and have submitted it for + upstream consideration. The hack which rewrote 'errno' into a + dereference of a call to '__errno_location' does still fix a problem + with printing errno in statically linked binaries. But it will fail + when attempting to debug a core file. The original test case + associated with this bug now works correctly due changes to glibc. + +* Tue Mar 19 2024 Andrew Burgess +- Drop gdb-bz634108-solib_address.patch. This is a test only patch. + I've pushed upstream commit 52ca06e807b which covers this test case, + we'll pick up the upstream test next time Fedora is rebased. + +* Tue Mar 19 2024 Andrew Burgess +- Drop gdb-container-rh-pkg.patch. This patch gave a warning when + connecting to very old gdbserver. The warning mentioned specific + RHEL versions, all of which are no longer supported. As such the + warning seems pointless. + +* Mon Mar 18 2024 Andrew Burgess +- Drop gdb-6.3-attach-see-vdso-test.patch, this is a test only patch. + Upstream commit 93eb6c64ec4a6ea includes a similar test, and will be + picked up as part of the next rebase. + +* Wed Mar 13 2024 Andrew Burgess +- Remove the use of librpm from GDB's C++ code, and instead provide + similar RPM suggestion feature using a Python extension. The Python + extension feature that supports this is an upstream feature which + has been back-ported (along with several dependencies and related + fixes). The actual RPM suggestion is now provided as a Python + script which is auto-loaded by GDB. Removing the use of librpm from + the C++ code allows some cleanup of the configure scripts. + +* Fri Mar 8 2024 Andrew Burgess +- Reduce gdb-6.6-buildid-locate.patch by removing some unnecessary + casts added to bfd/ source files. + +* Fri Mar 8 2024 Andrew Burgess +- Reduce gdb-6.6-buildid-locate.patch by removing the build_id_bfd_get + to build_id_bfd_shdr_get change. This was only changing the name of + a function, so seems pointless. + +* Wed Mar 6 2024 Alexandra Hájková - 14.2-1 - Rebase to FSF GDB 14.2. +* Mon Mar 4 2024 Alexandra Hájková - 14.1-10 +- Replace zlib to zlib-ng package in a debug-toolset-binary Fedora CI + test (RHBZ 2266910). + * Wed Feb 21 2024 Richard W.M. Jones - Bump and rebuild for riscv64 @@ -1539,7 +1468,7 @@ fi - Update gdb-6.6-buildid-locate.patch. - Update gdb-6.6-buildid-locate-rpm.patch. - Remove 'Recommends: ' line for gcc-gdb-plugin for BZ2149246. -- Add 'define _lto_cflags %{nil}' to avoid ODR violations. +- Define _lto_cflags to nil to avoid ODR violations. - Add -Wno-stringop-overflow to --enable-gdb-build-warnings to work around gcc problem. @@ -4430,7 +4359,7 @@ fi - Archer backport: c2d5c4a39b10994d86d8f2f90dfed769e8f216f3 - Fix parsing DW_AT_const_value using DW_FORM_string - Archer backport: 8d9ab68fc0955c9de6320bec2821a21e3244600d - + db41e11ae0a3aec7120ad6ce86450d838af74dd6 + + db41e11ae0a3aec7120ad6ce86450d838af74dd6 - Fix Fortran modules/namespaces parsing (but no change was visible in F11). - Archer backport: 000db8b7bfef8581ef099ccca8689cfddfea1be8 - Fix "some Python error when displaying some C++ objects" (BZ 504356). @@ -4438,7 +4367,7 @@ fi - testsuite: gdb-orphanripper.c: Fix uninitialized `termios.c_line'. - Fix crashes due to (missing) varobj revalidation, for VLA (for BZ 377541). - Archer backport: 58dcda94ac5d6398f47382505e9d3d9d866d79bf - + f3de7bbd655337fe6705aeaafcc970deff3dd5d5 + + f3de7bbd655337fe6705aeaafcc970deff3dd5d5 - Implement Fortran modules namespaces (BZ 466118). - Fix crash in the charset support. @@ -4479,10 +4408,10 @@ fi - Archer backport: c14d9ab7eef43281b2052c885f89d2db96fb5f8e - Revert a change regressing: gdb.objc/basicclass.exp - Archer backport: ebd649b96e61a1fb481801b65d827bca998c6633 - + 1f080e897996d60ab7fde20423e2947512115667 - + 1948198702b51b31d79793fc49434b529b4e245f - + e107fb9687bb1e7f74170aa3d19c4a8f6edbb10f - + 1e012c996e121cb35053d239a46bd5dc65b0ce60 + + 1f080e897996d60ab7fde20423e2947512115667 + + 1948198702b51b31d79793fc49434b529b4e245f + + e107fb9687bb1e7f74170aa3d19c4a8f6edbb10f + + 1e012c996e121cb35053d239a46bd5dc65b0ce60 - Update the Python API from upstream. - Archer backport: d3c83ad5ec9f7672b87af9ad29279f459e53da11 - Fix a Python branch crash. diff --git a/generate-git-repo-from-patches.sh b/generate-git-repo-from-patches.sh index 8477e30..8646c4e 100755 --- a/generate-git-repo-from-patches.sh +++ b/generate-git-repo-from-patches.sh @@ -51,12 +51,12 @@ test -f _patch_order || die "Cannot find _patch_order file." last_ancestor_commit=`cat _git_upstream_commit` +f=`pwd` cd $1 git name-rev $last_ancestor_commit test $? -eq 0 || die "Could not find $last_ancestor_commit in the repository $1. Did you run 'git fetch'?" -f=`cd .. && pwd` # Create a branch for the checkout if using stgit; use the distro name in # the name of this branch. @@ -69,8 +69,8 @@ fi git checkout $branch $last_ancestor_commit echo "Applying patches..." -for p in `cat ../_patch_order` ; do - git am ../$p +for p in `cat $f/_patch_order` ; do + git am $f/$p test $? -eq 0 || die "Could not apply patch '$p'." done diff --git a/generate-patches-from-git-repo.sh b/generate-patches-from-git-repo.sh index 55944e4..1937a3c 100755 --- a/generate-patches-from-git-repo.sh +++ b/generate-patches-from-git-repo.sh @@ -50,6 +50,7 @@ for f in `cat _patch_order` ; do git rm -f $f done +orig_dir=`pwd` cd $1 # If patches were uncommitted when the patches were applied, @@ -82,8 +83,18 @@ for c in `git rev-list --reverse ${common_ancestor}..HEAD` ; do # before, even if nothing has changed. This is bad, so we replace # the commit hash by something constant (the string # "FEDORA_PATCHES"). - git format-patch --no-signature --no-stat --keep-subject -1 --stdout --no-base $c | sed -e '1 s/^From [0-9a-f]\+ \(.*\)/From FEDORA_PATCHES \1/' -e '/^index [0-9a-f]\+\.\.[0-9a-f]\+.*$/d' -e '/^Message-ID:.*$/d' > ../$fname - (cd .. && git add $fname) + # + # Also, different users, or systems, might configure git in + # different ways (e.g. the diff.*.xfuncname setting), which can + # mean the generated diff files will change from system to system. + # Avoid this by disabling all config file reading, this relies on + # git 2.32 or later. + GIT_CONFIG_SYSTEM=/dev/null GIT_CONFIG_GLOBAL=/dev/null \ + git format-patch --no-base --no-thread --no-signature --no-stat \ + --keep-subject -1 --stdout $c \ + | sed -e '1 s/^From [0-9a-f]\+ \(.*\)/From FEDORA_PATCHES \1/' \ + -e '/^index [0-9a-f]\+\.\.[0-9a-f]\+.*$/d' > $orig_dir/$fname + (cd $orig_dir && git add $fname) cat >> $temp_PATCH_file <