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.
18+ define 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+
38+ entry:
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+ ]
47+ bb0:
48+ store i32 0 , ptr %to
49+ br label %exit
50+ bb1:
51+ store i32 1 , ptr %to
52+ br label %exit
53+ bb2:
54+ store i32 2 , ptr %to
55+ br label %exit
56+ bb3:
57+ store i32 3 , ptr %to
58+ br label %exit
59+ bb4:
60+ store i32 4 , ptr %to
61+ br label %exit
62+ exit:
63+ ret void
64+ default:
65+ unreachable
66+ }
67+
68+ define 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+
88+ entry:
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+ ]
96+ bb0:
97+ store i32 0 , ptr %to
98+ br label %exit
99+ bb1:
100+ store i32 1 , ptr %to
101+ br label %exit
102+ bb2:
103+ store i32 2 , ptr %to
104+ br label %exit
105+ bb3:
106+ store i32 3 , ptr %to
107+ br label %exit
108+ bb4:
109+ store i32 4 , ptr %to
110+ br label %exit
111+ exit:
112+ ret void
113+ default:
114+ unreachable
115+ }
116+
117+ ; Ensure that the section isn't produced if there is no jump table.
118+
119+ define void @foo3 (i32 %x , ptr %to ) {
120+
121+ ; NOTABLE-LABEL: foo3
122+ ; NOTABLE-NOT: .section .llvm_jump_table_sizes
123+
124+ exit:
125+ ret void
126+ }
127+
128+ ; Ensure we can deal with nested jump tables.
129+
130+ define 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+
156+ entry:
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+ ]
164+ bb0:
165+ store i32 0 , ptr %to
166+ br label %exit
167+ bb1:
168+ store i32 1 , ptr %to
169+ br label %exit
170+ bb2:
171+ store i32 2 , ptr %to
172+ br label %exit
173+ bb3:
174+ store i32 3 , ptr %to
175+ br label %exit
176+ bb4:
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
186+ bb5:
187+ store i32 4 , ptr %to
188+ br label %exit
189+ bb6:
190+ store i32 4 , ptr %to
191+ br label %exit
192+ bb7:
193+ store i32 4 , ptr %to
194+ br label %exit
195+ bb8:
196+ store i32 4 , ptr %to
197+ br label %exit
198+ bb9:
199+ store i32 4 , ptr %to
200+ br label %exit
201+ bb10:
202+ store i32 4 , ptr %to
203+ br label %exit
204+ exit:
205+ ret void
206+ exit2:
207+ ret void
208+ default:
209+ unreachable
210+ }
0 commit comments