Home | History | Annotate | Download | only in X86
      1 ; RUN: llc <%s -jump-table-type=single | FileCheck --check-prefix=SINGLE %s
      2 ; RUN: llc <%s -jump-table-type=arity | FileCheck --check-prefix=ARITY %s
      3 ; RUN: llc <%s -jump-table-type=simplified | FileCheck --check-prefix=SIMPL %s
      4 ; RUN: llc <%s -jump-table-type=full | FileCheck --check-prefix=FULL %s
      5 
      6 target triple = "x86_64-unknown-linux-gnu"
      7 
      8 %struct.fun_struct = type { i32 (...)* }
      9 
     10 define void @indirect_fun() unnamed_addr jumptable {
     11   ret void
     12 }
     13 
     14 define void @indirect_fun_match() unnamed_addr jumptable {
     15   ret void
     16 }
     17 
     18 define i32 @indirect_fun_i32() unnamed_addr jumptable {
     19   ret i32 0
     20 }
     21 
     22 define i32 @indirect_fun_i32_1(i32 %a) unnamed_addr jumptable {
     23   ret i32 %a
     24 }
     25 
     26 define i32 @indirect_fun_i32_2(i32 %a, i32 %b) unnamed_addr jumptable {
     27   ret i32 %a
     28 }
     29 
     30 define i32* @indirect_fun_i32S_2(i32* %a, i32 %b) unnamed_addr jumptable {
     31   ret i32* %a
     32 }
     33 
     34 define void @indirect_fun_struct(%struct.fun_struct %fs) unnamed_addr jumptable {
     35   ret void
     36 }
     37 
     38 define void @indirect_fun_fun(i32 (...)* %fun, i32 %a) unnamed_addr jumptable {
     39   ret void
     40 }
     41 
     42 define i32 @indirect_fun_fun_ret(i32 (...)* %fun, i32 %a) unnamed_addr jumptable {
     43   ret i32 %a
     44 }
     45 
     46 define void @indirect_fun_array([19 x i8] %a) unnamed_addr jumptable {
     47   ret void
     48 }
     49 
     50 define void @indirect_fun_vec(<3 x i32> %a) unnamed_addr jumptable {
     51   ret void
     52 }
     53 
     54 define void @indirect_fun_vec_2(<4 x float> %a) unnamed_addr jumptable {
     55   ret void
     56 }
     57 
     58 define i32 @m(void ()* %fun) {
     59   call void ()* %fun()
     60   ret i32 0
     61 }
     62 
     63 define void ()* @get_fun() {
     64   ret void ()* @indirect_fun
     65 ; SINGLE: movl    $__llvm_jump_instr_table_0_
     66 ; ARITY: movl    $__llvm_jump_instr_table_
     67 ; SIMPL: movl    $__llvm_jump_instr_table_
     68 ; FULL: movl    $__llvm_jump_instr_table_
     69 }
     70 
     71 define i32 @main(i32 %argc, i8** %argv) {
     72   %f = call void ()* ()* @get_fun()
     73   %a = call i32 @m(void ()* %f)
     74   ret i32 %a
     75 }
     76 
     77 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_1
     78 ; SINGLE-DAG:         .align  8, 0x90
     79 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_1,@function
     80 ; SINGLE-DAG: __llvm_jump_instr_table_0_1:
     81 ; SINGLE-DAG:         jmp     indirect_fun_array@PLT
     82 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_2
     83 ; SINGLE-DAG:         .align  8, 0x90
     84 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_2,@function
     85 ; SINGLE-DAG: __llvm_jump_instr_table_0_2:
     86 ; SINGLE-DAG:         jmp     indirect_fun_i32_2@PLT
     87 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_3
     88 ; SINGLE-DAG:         .align  8, 0x90
     89 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_3,@function
     90 ; SINGLE-DAG: __llvm_jump_instr_table_0_3:
     91 ; SINGLE-DAG:         jmp     indirect_fun_vec_2@PLT
     92 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_4
     93 ; SINGLE-DAG:         .align  8, 0x90
     94 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_4,@function
     95 ; SINGLE-DAG: __llvm_jump_instr_table_0_4:
     96 ; SINGLE-DAG:         jmp     indirect_fun_i32S_2@PLT
     97 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_5
     98 ; SINGLE-DAG:         .align  8, 0x90
     99 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_5,@function
    100 ; SINGLE-DAG: __llvm_jump_instr_table_0_5:
    101 ; SINGLE-DAG:         jmp     indirect_fun_struct@PLT
    102 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_6
    103 ; SINGLE-DAG:         .align  8, 0x90
    104 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_6,@function
    105 ; SINGLE-DAG: __llvm_jump_instr_table_0_6:
    106 ; SINGLE-DAG:         jmp     indirect_fun_i32_1@PLT
    107 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_7
    108 ; SINGLE-DAG:         .align  8, 0x90
    109 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_7,@function
    110 ; SINGLE-DAG: __llvm_jump_instr_table_0_7:
    111 ; SINGLE-DAG:         jmp     indirect_fun_i32@PLT
    112 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_8
    113 ; SINGLE-DAG:         .align  8, 0x90
    114 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_8,@function
    115 ; SINGLE-DAG: __llvm_jump_instr_table_0_8:
    116 ; SINGLE-DAG:         jmp     indirect_fun_fun@PLT
    117 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_9
    118 ; SINGLE-DAG:         .align  8, 0x90
    119 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_9,@function
    120 ; SINGLE-DAG: __llvm_jump_instr_table_0_9:
    121 ; SINGLE-DAG:         jmp     indirect_fun_fun_ret@PLT
    122 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_10
    123 ; SINGLE-DAG:         .align  8, 0x90
    124 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_10,@function
    125 ; SINGLE-DAG: __llvm_jump_instr_table_0_10:
    126 ; SINGLE-DAG:         jmp     indirect_fun@PLT
    127 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_11
    128 ; SINGLE-DAG:         .align  8, 0x90
    129 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_11,@function
    130 ; SINGLE-DAG: __llvm_jump_instr_table_0_11:
    131 ; SINGLE-DAG:         jmp     indirect_fun_match@PLT
    132 ; SINGLE-DAG:         .globl  __llvm_jump_instr_table_0_12
    133 ; SINGLE-DAG:         .align  8, 0x90
    134 ; SINGLE-DAG:         .type   __llvm_jump_instr_table_0_12,@function
    135 ; SINGLE-DAG: __llvm_jump_instr_table_0_12:
    136 ; SINGLE-DAG:         jmp     indirect_fun_vec@PLT
    137 ; SINGLE-DAG:         .align  8, 0x90
    138 ; SINGLE-DAG:         ud2
    139 ; SINGLE-DAG:         .align  8, 0x90
    140 ; SINGLE-DAG:         ud2
    141 ; SINGLE-DAG:         .align  8, 0x90
    142 ; SINGLE-DAG:         ud2
    143 ; SINGLE-DAG:         .align  8, 0x90
    144 ; SINGLE-DAG:         ud2
    145 
    146 
    147 ; ARITY-DAG:         .globl  __llvm_jump_instr_table_2_1
    148 ; ARITY-DAG:         .align  8, 0x90
    149 ; ARITY-DAG:         .type   __llvm_jump_instr_table_2_1,@function
    150 ; ARITY-DAG: __llvm_jump_instr_table_2_1:
    151 ; ARITY-DAG:         jmp     indirect_fun{{.*}}@PLT
    152 ; ARITY-DAG:         .align  8, 0x90
    153 ; ARITY-DAG:         ud2
    154 ; ARITY-DAG:         .globl  __llvm_jump_instr_table_0_1
    155 ; ARITY-DAG:         .align  8, 0x90
    156 ; ARITY-DAG:         .type   __llvm_jump_instr_table_0_1,@function
    157 ; ARITY-DAG: __llvm_jump_instr_table_0_1:
    158 ; ARITY-DAG:         jmp     indirect_fun{{.*}}@PLT
    159 ; ARITY-DAG:         .globl  __llvm_jump_instr_table_1_1
    160 ; ARITY-DAG:         .align  8, 0x90
    161 ; ARITY-DAG:         .type   __llvm_jump_instr_table_1_1,@function
    162 ; ARITY-DAG: __llvm_jump_instr_table_1_1:
    163 ; ARITY-DAG:         jmp     indirect_fun{{.*}}@PLT
    164 
    165 ; SIMPL-DAG:         .globl  __llvm_jump_instr_table_2_1
    166 ; SIMPL-DAG:         .align  8, 0x90
    167 ; SIMPL-DAG:         .type   __llvm_jump_instr_table_2_1,@function
    168 ; SIMPL-DAG: __llvm_jump_instr_table_2_1:
    169 ; SIMPL-DAG:         jmp     indirect_fun{{.*}}@PLT
    170 ; SIMPL-DAG:         .align  8, 0x90
    171 ; SIMPL-DAG:         ud2
    172 ; SIMPL-DAG:         .globl  __llvm_jump_instr_table_0_1
    173 ; SIMPL-DAG:         .align  8, 0x90
    174 ; SIMPL-DAG:         .type   __llvm_jump_instr_table_0_1,@function
    175 ; SIMPL-DAG: __llvm_jump_instr_table_0_1:
    176 ; SIMPL-DAG:         jmp     indirect_fun{{.*}}@PLT
    177 ; SIMPL-DAG:         .globl  __llvm_jump_instr_table_1_1
    178 ; SIMPL-DAG:         .align  8, 0x90
    179 ; SIMPL-DAG:         .type   __llvm_jump_instr_table_1_1,@function
    180 ; SIMPL-DAG: __llvm_jump_instr_table_1_1:
    181 ; SIMPL-DAG:         jmp     indirect_fun{{.*}}@PLT
    182 ; SIMPL-DAG:         .globl  __llvm_jump_instr_table_3_1
    183 ; SIMPL-DAG:         .align  8, 0x90
    184 ; SIMPL-DAG:         .type   __llvm_jump_instr_table_3_1,@function
    185 ; SIMPL-DAG: __llvm_jump_instr_table_3_1:
    186 ; SIMPL-DAG:         jmp     indirect_fun{{.*}}@PLT
    187 ; SIMPL-DAG:         .globl  __llvm_jump_instr_table_4_1
    188 ; SIMPL-DAG:         .align  8, 0x90
    189 ; SIMPL-DAG:         .type   __llvm_jump_instr_table_4_1,@function
    190 ; SIMPL-DAG: __llvm_jump_instr_table_4_1:
    191 ; SIMPL-DAG:         jmp     indirect_fun{{.*}}@PLT
    192 
    193 
    194 ; FULL-DAG:        .globl  __llvm_jump_instr_table_10_1
    195 ; FULL-DAG:        .align  8, 0x90
    196 ; FULL-DAG:        .type   __llvm_jump_instr_table_10_1,@function
    197 ; FULL-DAG:__llvm_jump_instr_table_10_1:
    198 ; FULL-DAG:        jmp     indirect_fun_i32_1@PLT
    199 ; FULL-DAG:        .align  8, 0x90
    200 ; FULL-DAG:        ud2
    201 ; FULL-DAG:        .globl  __llvm_jump_instr_table_9_1
    202 ; FULL-DAG:        .align  8, 0x90
    203 ; FULL-DAG:        .type   __llvm_jump_instr_table_9_1,@function
    204 ; FULL-DAG:__llvm_jump_instr_table_9_1:
    205 ; FULL-DAG:        jmp     indirect_fun_i32_2@PLT
    206 ; FULL-DAG:        .align  8, 0x90
    207 ; FULL-DAG:        ud2
    208 ; FULL-DAG:        .globl  __llvm_jump_instr_table_7_1
    209 ; FULL-DAG:        .align  8, 0x90
    210 ; FULL-DAG:        .type   __llvm_jump_instr_table_7_1,@function
    211 ; FULL-DAG:__llvm_jump_instr_table_7_1:
    212 ; FULL-DAG:        jmp     indirect_fun_i32S_2@PLT
    213 ; FULL-DAG:        .align  8, 0x90
    214 ; FULL-DAG:        ud2
    215 ; FULL-DAG:        .globl  __llvm_jump_instr_table_3_1
    216 ; FULL-DAG:        .align  8, 0x90
    217 ; FULL-DAG:        .type   __llvm_jump_instr_table_3_1,@function
    218 ; FULL-DAG:__llvm_jump_instr_table_3_1:
    219 ; FULL-DAG:        jmp     indirect_fun_vec_2@PLT
    220 ; FULL-DAG:        .align  8, 0x90
    221 ; FULL-DAG:        ud2
    222 ; FULL-DAG:        .globl  __llvm_jump_instr_table_2_1
    223 ; FULL-DAG:        .align  8, 0x90
    224 ; FULL-DAG:        .type   __llvm_jump_instr_table_2_1,@function
    225 ; FULL-DAG:__llvm_jump_instr_table_2_1:
    226 ; FULL-DAG:        jmp     indirect_fun@PLT
    227 ; FULL-DAG:        .align  8, 0x90
    228 ; FULL-DAG:        ud2
    229 ; FULL-DAG:        .align  8, 0x90
    230 ; FULL-DAG:        ud2
    231 ; FULL-DAG:        .globl  __llvm_jump_instr_table_8_1
    232 ; FULL-DAG:        .align  8, 0x90
    233 ; FULL-DAG:        .type   __llvm_jump_instr_table_8_1,@function
    234 ; FULL-DAG:__llvm_jump_instr_table_8_1:
    235 ; FULL-DAG:        jmp     indirect_fun_i32@PLT
    236 ; FULL-DAG:        .align  8, 0x90
    237 ; FULL-DAG:        ud2
    238 ; FULL-DAG:        .globl  __llvm_jump_instr_table_1_1
    239 ; FULL-DAG:        .align  8, 0x90
    240 ; FULL-DAG:        .type   __llvm_jump_instr_table_1_1,@function
    241 ; FULL-DAG:__llvm_jump_instr_table_1_1:
    242 ; FULL-DAG:        jmp     indirect_fun_array@PLT
    243 ; FULL-DAG:        .align  8, 0x90
    244 ; FULL-DAG:        ud2
    245 ; FULL-DAG:        .globl  __llvm_jump_instr_table_0_1
    246 ; FULL-DAG:        .align  8, 0x90
    247 ; FULL-DAG:        .type   __llvm_jump_instr_table_0_1,@function
    248 ; FULL-DAG:__llvm_jump_instr_table_0_1:
    249 ; FULL-DAG:        jmp     indirect_fun_vec@PLT
    250 ; FULL-DAG:        .align  8, 0x90
    251 ; FULL-DAG:        ud2
    252 ; FULL-DAG:        .globl  __llvm_jump_instr_table_6_1
    253 ; FULL-DAG:        .align  8, 0x90
    254 ; FULL-DAG:        .type   __llvm_jump_instr_table_6_1,@function
    255 ; FULL-DAG:__llvm_jump_instr_table_6_1:
    256 ; FULL-DAG:        jmp     indirect_fun_struct@PLT
    257 ; FULL-DAG:        .align  8, 0x90
    258 ; FULL-DAG:        ud2
    259 ; FULL-DAG:        .globl  __llvm_jump_instr_table_5_1
    260 ; FULL-DAG:        .align  8, 0x90
    261 ; FULL-DAG:        .type   __llvm_jump_instr_table_5_1,@function
    262 ; FULL-DAG:__llvm_jump_instr_table_5_1:
    263 ; FULL-DAG:        jmp     indirect_fun_fun@PLT
    264 ; FULL-DAG:        .align  8, 0x90
    265 ; FULL-DAG:        ud2
    266 ; FULL-DAG:        .globl  __llvm_jump_instr_table_4_1
    267 ; FULL-DAG:        .align  8, 0x90
    268 ; FULL-DAG:        .type   __llvm_jump_instr_table_4_1,@function
    269 ; FULL-DAG:__llvm_jump_instr_table_4_1:
    270 ; FULL-DAG:        jmp     indirect_fun_fun_ret@PLT
    271 ; FULL-DAG:        .align  8, 0x90
    272 ; FULL-DAG:        ud2
    273