30 static volatile uint64_t
sink;
34 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i;
36 extern "C" __attribute__((noinline))
void rectry_deep_marker(
int i) {
37 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i << 4;
39 extern "C" __attribute__((noinline))
void rectry_catch_marker(
int i) {
40 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i << 8;
42 extern "C" __attribute__((noinline))
void rectry_after_marker(
int i) {
43 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i << 12;
45 extern "C" __attribute__((noinline))
void rectry_outer_try(
int i) {
46 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i << 16;
48 extern "C" __attribute__((noinline))
void rectry_outer_catch(
int i) {
49 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i << 20;
52 static void rec(
int depth,
int iter) {
54 volatile uint64_t local = (uint64_t)depth * 0x101ULL + (uint64_t)iter;
56 rectry_deep_marker(iter);
61 rectry_try_marker(iter);
63 rectry_after_marker(iter);
65 rectry_catch_marker(iter);
66 buf[iter] ^= (uint64_t)v;
71 int main(
int argc,
char** argv) {
72 (void)argc; (void)argv;
74 for (
int i = 0; i <
ITERS; ++i) {
79 rectry_outer_catch(i);
84 fprintf(stderr,
"exc_recurse_trycatch: depth=%d iters=%d caught=%d sink=%llx\n",
86 return caught ==
ITERS ? 0 : 1;
int main(int argc, char **argv)
static uint64_t buf[ITERS]
__attribute__((noinline)) void rectry_try_marker(int i)
static void rec(int depth, int iter)
static volatile uint64_t sink