| /* { dg-do run } */ |
| /* { dg-options "-O3 -march=z10 --save-temps -mindirect-branch-call=thunk -mindirect-branch-table" } */ |
| |
| int gl; |
| |
| void __attribute__((noinline,noclone)) |
| foo (int a) |
| { |
| gl = a + 40; |
| } |
| |
| int __attribute__((noinline,noclone)) |
| foo_value (int a) |
| { |
| return a + 40; |
| } |
| |
| void* __attribute__((noinline,noclone)) |
| get_fptr (int a) |
| { |
| switch (a) |
| { |
| case 0: return &foo; break; |
| case 1: return &foo_value; break; |
| default: __builtin_abort (); |
| } |
| } |
| |
| void (*f) (int); |
| int (*g) (int); |
| |
| int |
| main () |
| { |
| int res; |
| |
| f = get_fptr(0); |
| f (2); |
| if (gl != 42) |
| __builtin_abort (); |
| |
| g = get_fptr(1); |
| if (g (2) != 42) |
| __builtin_abort (); |
| |
| return 0; |
| } |
| |
| /* 2 x main |
| /* { dg-final { scan-assembler-times "brasl\t%r\[0-9\]*,__s390_indirect_jump" 2 } } */ |
| /* { dg-final { scan-assembler "exrl" } } */ |
| |
| /* { dg-final { scan-assembler-not "section\t.s390_indirect_jump" } } */ |
| /* { dg-final { scan-assembler "section\t.s390_indirect_call" } } */ |
| /* { dg-final { scan-assembler-not "section\t.s390_return_reg" } } */ |
| /* { dg-final { scan-assembler-not "section\t.s390_return_mem" } } */ |