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