gdb/amdgpu: add precise-memory support
authorSimon Marchi <simon.marchi@efficios.com>
Wed, 6 Sep 2023 13:41:45 +0000 (09:41 -0400)
committerSimon Marchi <simon.marchi@efficios.com>
Fri, 15 Sep 2023 20:19:22 +0000 (16:19 -0400)
commit607c90c7389f2b9a887a638613f6a311311d42b5
tree20d08e56100eaae4fede5969116493e047399c5f
parent947e047fac434621264f7212bbaa97580490d4fd
gdb/amdgpu: add precise-memory support

The amd-dbgapi library exposes a setting called "memory precision" for
AMD GPUs [1].  Here's a copy of the description of the setting:

    The AMD GPU can overlap the execution of memory instructions with other
    instructions.  This can result in a wave stopping due to a memory violation
    or hardware data watchpoint hit with a program counter beyond the
    instruction that caused the wave to stop.

    Some architectures allow the hardware to be configured to always wait for
    memory operations to complete before continuing.  This will result in the
    wave stopping at the instruction immediately after the one that caused the
    stop event.  Enabling this mode can make execution of waves significantly
    slower.

Expose this option through a new "amdgpu precise-memory" setting.

The precise memory setting is per inferior.  The setting is transferred
from one inferior to another when using the clone-inferior command, or
when a new inferior is created following an exec or a fork.

It can be set before starting the inferior, in which case GDB will
attempt to apply what the user wants when attaching amd-dbgapi.  If the
user has requested to enable precise memory, but it can't be enabled
(not all hardware supports it), GDB prints a warning.

If precise memory is disabled, GDB prints a warning when hitting a
memory exception (translated into GDB_SIGNAL_SEGV or GDB_SIGNAL_BUS),
saying that the stop location may not be precise.

Note that the precise memory setting also affects memory watchpoint
reporting, but the watchpoint support for AMD GPUs hasn't been
upstreamed to GDB yet.  When we do upstream watchpoint support, GDB will
produce a similar warning message when stopping due to a watchpoint if
precise memory is disabled.

Add a handful of tests.  Add a util proc
"hip_devices_support_precise_memory", which indicates if all devices
used for testing support that feature.

[1] https://github.com/ROCm-Developer-Tools/ROCdbgapi/blob/687374258a27b5aab1309a7e8ded719e2f1ed3b1/include/amd-dbgapi.h.in#L6300-L6317

Change-Id: Ife1a99c0e960513da375ced8f8afaf8e47a61b3f
Approved-By: Lancelot Six <lancelot.six@amd.com>
12 files changed:
gdb/amd-dbgapi-target.c
gdb/doc/gdb.texinfo
gdb/testsuite/gdb.rocm/precise-memory-exec.c [new file with mode: 0644]
gdb/testsuite/gdb.rocm/precise-memory-exec.exp [new file with mode: 0644]
gdb/testsuite/gdb.rocm/precise-memory-fork.c [new file with mode: 0644]
gdb/testsuite/gdb.rocm/precise-memory-fork.exp [new file with mode: 0644]
gdb/testsuite/gdb.rocm/precise-memory-multi-inferiors.exp [new file with mode: 0644]
gdb/testsuite/gdb.rocm/precise-memory-warning-sigsegv.cpp [new file with mode: 0644]
gdb/testsuite/gdb.rocm/precise-memory-warning-sigsegv.exp [new file with mode: 0644]
gdb/testsuite/gdb.rocm/precise-memory.cpp [new file with mode: 0644]
gdb/testsuite/gdb.rocm/precise-memory.exp [new file with mode: 0644]
gdb/testsuite/lib/rocm.exp