1 ; RUN: llc <%s -jump-table-type=single | FileCheck %s 2 target triple = "x86_64-unknown-linux-gnu" 3 define i32 @f() unnamed_addr jumptable { 4 ret i32 0 5 } 6 7 define i32 @g(i8* %a) unnamed_addr jumptable { 8 ret i32 0 9 } 10 11 define void @h(void ()* %func) unnamed_addr jumptable { 12 ret void 13 } 14 15 define i32 @main() { 16 %g = alloca i32 (...)*, align 8 17 store i32 (...)* bitcast (i32 ()* @f to i32 (...)*), i32 (...)** %g, align 8 18 ; CHECK: movq $__llvm_jump_instr_table_0_[[ENTRY:1|2|3]], (%rsp) 19 ; CHECK: movl $__llvm_jump_instr_table_0_[[ENTRY]], %ecx 20 %1 = load i32 (...)** %g, align 8 21 %call = call i32 (...)* %1() 22 call void (void ()*)* @h(void ()* bitcast (void (void ()*)* @h to void ()*)) 23 ; CHECK: movl $__llvm_jump_instr_table_0_{{1|2|3}}, %edi 24 ; CHECK: callq h 25 26 %a = call i32 (i32*)* bitcast (i32 (i8*)* @g to i32(i32*)*)(i32* null) 27 ; CHECK: callq g 28 ret i32 %a 29 } 30 31 ; CHECK: .globl __llvm_jump_instr_table_0_1 32 ; CHECK: .align 8, 0x90 33 ; CHECK: .type __llvm_jump_instr_table_0_1,@function 34 ; CHECK: __llvm_jump_instr_table_0_1: 35 ; CHECK: jmp {{f|g|h}}@PLT 36 ; CHECK: .globl __llvm_jump_instr_table_0_2 37 ; CHECK: .align 8, 0x90 38 ; CHECK: .type __llvm_jump_instr_table_0_2,@function 39 ; CHECK: __llvm_jump_instr_table_0_2: 40 ; CHECK: jmp {{f|g|h}}@PLT 41 ; CHECK: .globl __llvm_jump_instr_table_0_3 42 ; CHECK: .align 8, 0x90 43 ; CHECK: .type __llvm_jump_instr_table_0_3,@function 44 ; CHECK: __llvm_jump_instr_table_0_3: 45 ; CHECK: jmp {{f|g|h}}@PLT 46 47