210 lines · plain
1; RUN: llc %s -o - -mtriple x86_64-sie-ps5 -emit-jump-table-sizes-section -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=PS5-CHECK %s2; RUN: llc %s -o - -mtriple x86_64-sie-ps5 -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOFLAG %s3; RUN: llc %s -o - -mtriple x86_64-sie-ps5 -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOTABLE %s4 5; RUN: llc %s -o - -mtriple x86_64-unknown-linux-gnu -emit-jump-table-sizes-section -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=ELF-CHECK %s6; RUN: llc %s -o - -mtriple x86_64-unknown-linux-gnu -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOFLAG %s7; RUN: llc %s -o - -mtriple x86_64-unknown-linux-gnu -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOTABLE %s8 9; RUN: llc %s -o - -mtriple x86_64-pc-windows-msvc -emit-jump-table-sizes-section -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=COFF-CHECK %s10; RUN: llc %s -o - -mtriple x86_64-pc-windows-msvc -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOFLAG %s11; RUN: llc %s -o - -mtriple x86_64-pc-windows-msvc -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOTABLE %s12 13; This test verifies the jump table size section. Currently only enabled by default on the PS5 target.14 15$foo1 = comdat any16 17; Ensure proper comdat handling.18define void @foo1(i32 %x, ptr %to) comdat {19 20; PS5-CHECK-LABEL: foo121; PS5-CHECK: .section .llvm_jump_table_sizes,"G",@llvm_jt_sizes,foo1,comdat22; PS5-CHECK-NEXT: .quad .LJTI0_023; PS5-CHECK-NEXT: .quad 624 25; ELF-CHECK-LABEL: foo126; ELF-CHECK: .section .llvm_jump_table_sizes,"G",@llvm_jt_sizes,foo1,comdat27; ELF-CHECK-NEXT: .quad .LJTI0_028; ELF-CHECK-NEXT: .quad 629 30; COFF-CHECK-LABEL: foo131; COFF-CHECK: .section .llvm_jump_table_sizes,"drD",associative,foo132; COFF-CHECK-NEXT: .quad .LJTI0_033; COFF-CHECK-NEXT: .quad 634 35; NOFLAG-LABEL: foo136; NOFLAG-NOT: .section .llvm_jump_table_sizes37 38entry:39 switch i32 %x, label %default [40 i32 0, label %bb041 i32 1, label %bb142 i32 2, label %bb243 i32 3, label %bb344 i32 4, label %bb445 i32 5, label %bb446 ]47bb0:48 store i32 0, ptr %to49 br label %exit50bb1:51 store i32 1, ptr %to52 br label %exit53bb2:54 store i32 2, ptr %to55 br label %exit56bb3:57 store i32 3, ptr %to58 br label %exit59bb4:60 store i32 4, ptr %to61 br label %exit62exit:63 ret void64default:65 unreachable66}67 68define void @foo2(i32 %x, ptr %to) {69 70; PS5-CHECK-LABEL: foo271; PS5-CHECK: .section .llvm_jump_table_sizes,"",@llvm_jt_sizes72; PS5-CHECK-NEXT: .quad .LJTI1_073; PS5-CHECK-NEXT: .quad 574 75; ELF-CHECK-LABEL: foo276; ELF-CHECK: .section .llvm_jump_table_sizes,"",@llvm_jt_sizes77; ELF-CHECK-NEXT: .quad .LJTI1_078; ELF-CHECK-NEXT: .quad 579 80; COFF-CHECK-LABEL: foo281; COFF-CHECK: .section .llvm_jump_table_sizes,"drD"82; COFF-CHECK-NEXT: .quad .LJTI1_083; COFF-CHECK-NEXT: .quad 584 85; NOFLAG-LABEL: foo186; NOFLAG-NOT: .section .llvm_jump_table_sizes87 88entry:89 switch i32 %x, label %default [90 i32 0, label %bb091 i32 1, label %bb192 i32 2, label %bb293 i32 3, label %bb394 i32 4, label %bb495 ]96bb0:97 store i32 0, ptr %to98 br label %exit99bb1:100 store i32 1, ptr %to101 br label %exit102bb2:103 store i32 2, ptr %to104 br label %exit105bb3:106 store i32 3, ptr %to107 br label %exit108bb4:109 store i32 4, ptr %to110 br label %exit111exit:112 ret void113default:114 unreachable115}116 117; Ensure that the section isn't produced if there is no jump table.118 119define void @foo3(i32 %x, ptr %to) {120 121; NOTABLE-LABEL: foo3122; NOTABLE-NOT: .section .llvm_jump_table_sizes123 124exit:125 ret void126}127 128; Ensure we can deal with nested jump tables.129 130define void @nested(i32 %x, i32 %y, ptr %to) {131 132; PS5-CHECK-LABEL: nested133; PS5-CHECK: .section .llvm_jump_table_sizes,"",@llvm_jt_sizes134; PS5-CHECK-NEXT: .quad .LJTI3_0135; PS5-CHECK-NEXT: .quad 5136; PS5-CHECK-NEXT: .quad .LJTI3_1137; PS5-CHECK-NEXT: .quad 6138 139; ELF-CHECK-LABEL: nested140; ELF-CHECK: .section .llvm_jump_table_sizes,"",@llvm_jt_sizes141; ELF-CHECK-NEXT: .quad .LJTI3_0142; ELF-CHECK-NEXT: .quad 5143; ELF-CHECK-NEXT: .quad .LJTI3_1144; ELF-CHECK-NEXT: .quad 6145 146; COFF-CHECK-LABEL: nested147; COFF-CHECK: .section .llvm_jump_table_sizes,"drD"148; COFF-CHECK-NEXT: .quad .LJTI3_0149; COFF-CHECK-NEXT: .quad 5150; COFF-CHECK-NEXT: .quad .LJTI3_1151; COFF-CHECK-NEXT: .quad 6152 153; NOFLAG-LABEL: nested154; NOFLAG-NOT: .section .llvm_jump_table_sizes155 156entry:157 switch i32 %x, label %default [158 i32 0, label %bb0159 i32 1, label %bb1160 i32 2, label %bb2161 i32 3, label %bb3162 i32 4, label %bb4163 ]164bb0:165 store i32 0, ptr %to166 br label %exit167bb1:168 store i32 1, ptr %to169 br label %exit170bb2:171 store i32 2, ptr %to172 br label %exit173bb3:174 store i32 3, ptr %to175 br label %exit176bb4:177 switch i32 %y, label %default [178 i32 1, label %bb5179 i32 2, label %bb6180 i32 3, label %bb7181 i32 4, label %bb8182 i32 5, label %bb9183 i32 6, label %bb10184 ]185 br label %exit2186bb5:187 store i32 4, ptr %to188 br label %exit189bb6:190 store i32 4, ptr %to191 br label %exit192bb7:193 store i32 4, ptr %to194 br label %exit195bb8:196 store i32 4, ptr %to197 br label %exit198bb9:199 store i32 4, ptr %to200 br label %exit201bb10:202 store i32 4, ptr %to203 br label %exit204exit:205 ret void206exit2:207 ret void208default:209 unreachable210}