1f08c3bdfSopenharmony_ci
2f08c3bdfSopenharmony_ci# define __ASM_FORM(x)  " " #x " "
3f08c3bdfSopenharmony_ci# define JUMP_LABEL_INITIAL_NOP ".byte 0xe9 \n\t .long 0\n\t"
4f08c3bdfSopenharmony_ci# define __ASM_SEL(a,b) __ASM_FORM(b)
5f08c3bdfSopenharmony_ci#define _ASM_PTR        __ASM_SEL(.long, .quad)
6f08c3bdfSopenharmony_ci
7f08c3bdfSopenharmony_ci# define JUMP_LABEL(key, label)                                 \
8f08c3bdfSopenharmony_ci       do {                                                    \
9f08c3bdfSopenharmony_ci               asm goto("1:"                                   \
10f08c3bdfSopenharmony_ci                       JUMP_LABEL_INITIAL_NOP                  \
11f08c3bdfSopenharmony_ci                       ".pushsection __jump_table,  \"a\" \n\t"\
12f08c3bdfSopenharmony_ci                       _ASM_PTR "1b, %l[" #label "], %c0 \n\t" \
13f08c3bdfSopenharmony_ci                       ".popsection \n\t"                      \
14f08c3bdfSopenharmony_ci                       : :  "i" (key) :  : label);             \
15f08c3bdfSopenharmony_ci       } while (0)
16f08c3bdfSopenharmony_ci
17f08c3bdfSopenharmony_ciint main(int argc, char *argv[])
18f08c3bdfSopenharmony_ci{
19f08c3bdfSopenharmony_ci       JUMP_LABEL("1", do_trace );
20f08c3bdfSopenharmony_ci       return 1;
21f08c3bdfSopenharmony_cido_trace:
22f08c3bdfSopenharmony_ci       return 0;
23f08c3bdfSopenharmony_ci}
24f08c3bdfSopenharmony_ci
25f08c3bdfSopenharmony_ci/*
26f08c3bdfSopenharmony_ci * check-name: Asm with goto labels.
27f08c3bdfSopenharmony_ci */
28f08c3bdfSopenharmony_ci
29