1 /* Functional tests for the function hotpatching feature.  */
2 
3 /* { dg-do compile } */
4 /* { dg-options "-mzarch" } */
5 
6 typedef long (*fn_t)(void);
7 
8 __attribute__ ((hotpatch(1,2)))
outer(void)9 fn_t outer(void)
10 {
11   __attribute__ ((hotpatch(4,8)))
12   long nested1(void)
13   {
14     __attribute__ ((hotpatch(16,32)))
15     long nested2(void)
16     {
17       return 2;
18     }
19     return (long)(void *)nested2;
20   }
21 
22   return nested1;
23 }
24 
25 /* { dg-final { scan-assembler "pre-label.*(1 halfwords)" } } */
26 /* { dg-final { scan-assembler "pre-label.*(4 halfwords)" } } */
27 /* { dg-final { scan-assembler "pre-label.*(16 halfwords)" } } */
28 /* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(2 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*nopr\t" } } */
29 /* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(8 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*brcl\t0, 0" } } */
30 /* { dg-final { scan-assembler "^\[^.\].*:\n.*post-label.*(32 halfwords).*\n\(\(.L.*:\n\)\|\(\[\[:space:\]\]*.cfi_.*\n\)\)*\[\[:space:\]\]*brcl\t0, 0" } } */
31 /* { dg-final { scan-assembler-times "alignment for hotpatch" 3 } } */
32 /* { dg-final { scan-assembler "nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr.*\n.*nopr" } } */
33