/* { dg-do compile } */ /* -Os to create jump table. */ /* { dg-options "-Os" } */ /* { dg-require-effective-target arm_arch_v8_1m_main_ok } */ /* { dg-add-options arm_arch_v8_1m_main } */ /* { dg-additional-options "-mfloat-abi=softfp -mbranch-protection=bti --save-temps" } */ extern int f1 (void); extern int f2 (void); extern int f3 (void); extern int f4 (void); extern int f5 (void); extern int f6 (void); extern int f7 (void); extern int f8 (void); extern int f9 (void); extern int f10 (void); int (*ptr) (void); int f_jump_table (int y, int n) { int i; for (i = 0; i < n ;i ++) { switch (y) { case 0 : ptr = f1; break; case 1 : ptr = f2; break; case 2 : ptr = f3; break; case 3 : ptr = f4; break; case 4 : ptr = f5; break; case 5 : ptr = f6; break; case 6 : ptr = f7; break; case 7 : ptr = f8; break; case 8 : ptr = f9; break; case 9 : ptr = f10; break; default: break; } y += ptr (); } return (y == 0)? y+1:4; } int f_label_address () { static void * addr = &&lab1; goto *addr; lab1: addr = &&lab2; return 1; lab2: addr = &&lab1; return 2; } /* { dg-final { scan-assembler-times "\tbti" 14 } } */