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 %s 2; RUN: llc %s -o - -mtriple x86_64-sie-ps5 -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOFLAG %s 3; RUN: llc %s -o - -mtriple x86_64-sie-ps5 -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOTABLE %s 4 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 %s 6; RUN: llc %s -o - -mtriple x86_64-unknown-linux-gnu -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOFLAG %s 7; RUN: llc %s -o - -mtriple x86_64-unknown-linux-gnu -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOTABLE %s 8 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 %s 10; RUN: llc %s -o - -mtriple x86_64-pc-windows-msvc -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOFLAG %s 11; RUN: llc %s -o - -mtriple x86_64-pc-windows-msvc -verify-machineinstrs --relocation-model=pic | FileCheck --check-prefix=NOTABLE %s 12 13; This test verifies the jump table size section. Currently only enabled by default on the PS5 target. 14 15$foo1 = comdat any 16 17; Ensure proper comdat handling. 18define void @foo1(i32 %x, ptr %to) comdat { 19 20; PS5-CHECK-LABEL: foo1 21; PS5-CHECK: .section .llvm_jump_table_sizes,"G",@llvm_jt_sizes,foo1,comdat 22; PS5-CHECK-NEXT: .quad .LJTI0_0 23; PS5-CHECK-NEXT: .quad 6 24 25; ELF-CHECK-LABEL: foo1 26; ELF-CHECK: .section .llvm_jump_table_sizes,"G",@llvm_jt_sizes,foo1,comdat 27; ELF-CHECK-NEXT: .quad .LJTI0_0 28; ELF-CHECK-NEXT: .quad 6 29 30; COFF-CHECK-LABEL: foo1 31; COFF-CHECK: .section .llvm_jump_table_sizes,"drD",associative,foo1 32; COFF-CHECK-NEXT: .quad .LJTI0_0 33; COFF-CHECK-NEXT: .quad 6 34 35; NOFLAG-LABEL: foo1 36; NOFLAG-NOT: .section .llvm_jump_table_sizes 37 38entry: 39 switch i32 %x, label %default [ 40 i32 0, label %bb0 41 i32 1, label %bb1 42 i32 2, label %bb2 43 i32 3, label %bb3 44 i32 4, label %bb4 45 i32 5, label %bb4 46 ] 47bb0: 48 store i32 0, ptr %to 49 br label %exit 50bb1: 51 store i32 1, ptr %to 52 br label %exit 53bb2: 54 store i32 2, ptr %to 55 br label %exit 56bb3: 57 store i32 3, ptr %to 58 br label %exit 59bb4: 60 store i32 4, ptr %to 61 br label %exit 62exit: 63 ret void 64default: 65 unreachable 66} 67 68define void @foo2(i32 %x, ptr %to) { 69 70; PS5-CHECK-LABEL: foo2 71; PS5-CHECK: .section .llvm_jump_table_sizes,"",@llvm_jt_sizes 72; PS5-CHECK-NEXT: .quad .LJTI1_0 73; PS5-CHECK-NEXT: .quad 5 74 75; ELF-CHECK-LABEL: foo2 76; ELF-CHECK: .section .llvm_jump_table_sizes,"",@llvm_jt_sizes 77; ELF-CHECK-NEXT: .quad .LJTI1_0 78; ELF-CHECK-NEXT: .quad 5 79 80; COFF-CHECK-LABEL: foo2 81; COFF-CHECK: .section .llvm_jump_table_sizes,"drD" 82; COFF-CHECK-NEXT: .quad .LJTI1_0 83; COFF-CHECK-NEXT: .quad 5 84 85; NOFLAG-LABEL: foo1 86; NOFLAG-NOT: .section .llvm_jump_table_sizes 87 88entry: 89 switch i32 %x, label %default [ 90 i32 0, label %bb0 91 i32 1, label %bb1 92 i32 2, label %bb2 93 i32 3, label %bb3 94 i32 4, label %bb4 95 ] 96bb0: 97 store i32 0, ptr %to 98 br label %exit 99bb1: 100 store i32 1, ptr %to 101 br label %exit 102bb2: 103 store i32 2, ptr %to 104 br label %exit 105bb3: 106 store i32 3, ptr %to 107 br label %exit 108bb4: 109 store i32 4, ptr %to 110 br label %exit 111exit: 112 ret void 113default: 114 unreachable 115} 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: foo3 122; NOTABLE-NOT: .section .llvm_jump_table_sizes 123 124exit: 125 ret void 126} 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: nested 133; PS5-CHECK: .section .llvm_jump_table_sizes,"",@llvm_jt_sizes 134; PS5-CHECK-NEXT: .quad .LJTI3_0 135; PS5-CHECK-NEXT: .quad 5 136; PS5-CHECK-NEXT: .quad .LJTI3_1 137; PS5-CHECK-NEXT: .quad 6 138 139; ELF-CHECK-LABEL: nested 140; ELF-CHECK: .section .llvm_jump_table_sizes,"",@llvm_jt_sizes 141; ELF-CHECK-NEXT: .quad .LJTI3_0 142; ELF-CHECK-NEXT: .quad 5 143; ELF-CHECK-NEXT: .quad .LJTI3_1 144; ELF-CHECK-NEXT: .quad 6 145 146; COFF-CHECK-LABEL: nested 147; COFF-CHECK: .section .llvm_jump_table_sizes,"drD" 148; COFF-CHECK-NEXT: .quad .LJTI3_0 149; COFF-CHECK-NEXT: .quad 5 150; COFF-CHECK-NEXT: .quad .LJTI3_1 151; COFF-CHECK-NEXT: .quad 6 152 153; NOFLAG-LABEL: nested 154; NOFLAG-NOT: .section .llvm_jump_table_sizes 155 156entry: 157 switch i32 %x, label %default [ 158 i32 0, label %bb0 159 i32 1, label %bb1 160 i32 2, label %bb2 161 i32 3, label %bb3 162 i32 4, label %bb4 163 ] 164bb0: 165 store i32 0, ptr %to 166 br label %exit 167bb1: 168 store i32 1, ptr %to 169 br label %exit 170bb2: 171 store i32 2, ptr %to 172 br label %exit 173bb3: 174 store i32 3, ptr %to 175 br label %exit 176bb4: 177 switch i32 %y, label %default [ 178 i32 1, label %bb5 179 i32 2, label %bb6 180 i32 3, label %bb7 181 i32 4, label %bb8 182 i32 5, label %bb9 183 i32 6, label %bb10 184 ] 185 br label %exit2 186bb5: 187 store i32 4, ptr %to 188 br label %exit 189bb6: 190 store i32 4, ptr %to 191 br label %exit 192bb7: 193 store i32 4, ptr %to 194 br label %exit 195bb8: 196 store i32 4, ptr %to 197 br label %exit 198bb9: 199 store i32 4, ptr %to 200 br label %exit 201bb10: 202 store i32 4, ptr %to 203 br label %exit 204exit: 205 ret void 206exit2: 207 ret void 208default: 209 unreachable 210}