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