1/* Functional tests for the function hotpatching feature.  */
2
3/* { dg-do compile } */
4/* { dg-options "-mzarch" } */
5
6typedef long (*fn_t)(void);
7
8__attribute__ ((hotpatch(1,2)))
9fn_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