| /* { dg-do compile } */ |
| /* { dg-require-ifunc "" } */ |
| /* { dg-require-effective-target aarch64_variant_pcs } */ |
| |
| /* Test that .variant_pcs is emitted for vector PCS symbol references. */ |
| |
| #define ATTR __attribute__ ((aarch64_vector_pcs)) |
| |
| static void f_local_basepcs (void) |
| { |
| } |
| |
| static void (*f_ifunc_basepcs_resolver ()) (void) |
| { |
| return (void (*)(void))f_local_basepcs; |
| } |
| |
| __attribute__ ((ifunc ("f_ifunc_basepcs_resolver"))) |
| void f_ifunc_basepcs (void); |
| |
| ATTR static void f_local_vpcs (void) |
| { |
| } |
| |
| static void (*f_ifunc_vpcs_resolver ()) (void) |
| { |
| return (void (*)(void))f_local_vpcs; |
| } |
| |
| __attribute__ ((ifunc ("f_ifunc_vpcs_resolver"))) |
| ATTR void f_ifunc_vpcs (void); |
| |
| __attribute__ ((visibility ("hidden"))) |
| __attribute__ ((ifunc ("f_ifunc_vpcs_resolver"))) |
| ATTR void f_hidden_ifunc_vpcs (void); |
| |
| __attribute__ ((ifunc ("f_ifunc_vpcs_resolver"))) |
| ATTR static void f_local_ifunc_vpcs (void); |
| |
| void (*refs_basepcs[]) (void) = { |
| f_ifunc_basepcs, |
| }; |
| |
| void (*ATTR refs_vpcs[]) (void) = { |
| f_ifunc_vpcs, |
| f_hidden_ifunc_vpcs, |
| f_local_ifunc_vpcs, |
| }; |
| |
| /* Note: local symbols don't need .variant_pcs, but gcc generates it, so |
| we check them here. */ |
| |
| /* { dg-final { scan-assembler-not {\.variant_pcs\tf_local_basepcs} } } */ |
| /* { dg-final { scan-assembler-not {\.variant_pcs\tf_ifunc_basepcs} } } */ |
| /* { dg-final { scan-assembler-times {\.variant_pcs\tf_local_vpcs} 1 } } */ |
| /* { dg-final { scan-assembler-times {\.variant_pcs\tf_ifunc_vpcs} 1 } } */ |
| /* { dg-final { scan-assembler-times {\.variant_pcs\tf_hidden_ifunc_vpcs} 1 } } */ |
| /* { dg-final { scan-assembler-times {\.variant_pcs\tf_local_ifunc_vpcs} 1 } } */ |