random errors on aarch64 when executing __aarch64_cas8_acq_rel
Hello,
Since I upgraded to qemu-5.0 when executing the GCC testsuite, I've noticed random failures of g++.dg/ext/sync-4.C.
I'm attaching the source of the testcase, the binary executable and the qemu traces (huge, 111MB!) starting at main (with qemu-aarch64 -cpu cortex-a57 -R 0 -d in_asm,int,exec,cpu,unimp,guest_errors,nochain)
The traces where generated by a CI build, I built the executable manually but I expect it to be the same as the one executed by CI.
In seems the problem occurs in f13, which leads to a call to abort()
The preprocessed version of f13/t13 are as follows:
static bool f13 (void *p) __attribute__ ((noinline));
static bool f13 (void *p)
{
return (__sync_bool_compare_and_swap((ditype*)p, 1, 2));
}
static void t13 ()
{
try {
f13(0);
}
catch (...) {
return;
}
abort();
}
When looking at the execution traces at address 0x00400c9c, main calls f13, which in turn calls __aarch64_cas8_acq_rel
(at 0x00401084)
__aarch64_cas8_acq_rel
returns to f13 (address 0x0040113c), then f13 returns to main (0x0040108c) which then calls abort (0x00400ca0)
I'm not quite sure what's wrong :-(
I've not noticed such random problems with native aarch64 hardware.