blob: a89f33678f4b82c46b97ed15fda96e9682ea8ab8 [file]
/* This testcase is part of GDB, the GNU debugger.
Copyright 2026 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 <http://www.gnu.org/licenses/>. */
#include <hip/hip_runtime.h>
#include "rocm-test-utils.h"
__global__ void
kernel (int *val1, int *val2)
{
*val1 += 10;
WAIT_MEM;
*val2 += 100;
WAIT_MEM;
*val1 += 20;
WAIT_MEM;
*val2 += 200;
WAIT_MEM;
/* Some devices that don't support "precise memory" miss watchpoints when
they would trigger near the end of the kernel. Execute a bunch of sleeps
to make sure this doesn't happen. Just a handful of instructions should
be enough, but this executes quickly anyway. */
for (int i = 0; i < 100000; ++i)
__builtin_amdgcn_s_sleep (8);
}
/* Global pointers for the test to watch. */
int *global_ptr1;
int *global_ptr2;
int host_global = 5;
int
main ()
{
/* Break before runtime load. */
CHECK (hipMalloc (&global_ptr1, sizeof (int)));
CHECK (hipMalloc (&global_ptr2, sizeof (int)));
CHECK (hipMemset (global_ptr1, 0, sizeof (int)));
CHECK (hipMemset (global_ptr2, 0, sizeof (int)));
/* Break after malloc. */
kernel<<<1, 1>>> (global_ptr1, global_ptr2);
CHECK (hipDeviceSynchronize ());
host_global += 12;
/* Break before second launch. */
kernel<<<1, 1>>> (global_ptr1, global_ptr2);
CHECK (hipDeviceSynchronize ());
CHECK (hipFree (global_ptr1));
CHECK (hipFree (global_ptr2));
return 0;
}