20 static volatile uint64_t
sink;
26 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i;
28 extern "C" __attribute__((noinline))
void resume_catch_marker(
int i) {
29 __asm__ __volatile__(
"" :::
"memory");
sink ^= (uint64_t)i << 8;
34 if ((i & 1) == 0)
throw i;
44 resume_catch_marker(i);
54 post_marker[i] = ((uint64_t)i * 0x1111ULL) ^ 0xF00DBABE;
57 int main(
int argc,
char** argv) {
58 (void)argc; (void)argv;
59 for (
int i = 0; i <
ITERS; ++i) {
68 for (
int i = 0; i <
ITERS; ++i) {
69 uint64_t expected_pre = (i & 1) ? (0xAAAAULL | 0x00BB0000ULL) : 0xAAAAULL;
70 uint64_t expected_catch = (i & 1) ? 0ULL : ((uint64_t)i ^ 0xCCCCCCCCULL);
71 uint64_t expected_post = ((uint64_t)i * 0x1111ULL) ^ 0xF00DBABEULL;
77 fprintf(stderr,
"exc_catch_and_resume: ok=%d/%d sink=%llx\n",
79 return ok ==
ITERS ? 0 : 1;
static uint64_t pre_marker[ITERS]
static void post_catch_worker(int i)
int main(int argc, char **argv)
__attribute__((noinline)) void resume_try_marker(int i)
static uint64_t post_marker[ITERS]
static void may_throw(int i)
static uint64_t catch_marker[ITERS]
static void resume_after_catch(int i)
static volatile uint64_t sink