Skip to content

Commit a6fecc9

Browse files
eddyz87Yonghong Song
authored andcommitted
[BPF] add test cases for jump tables
- one testing a general structure of the generated code; - another testing that several jump tables within the same functions are generated independently.
1 parent 024f351 commit a6fecc9

File tree

2 files changed

+164
-0
lines changed

2 files changed

+164
-0
lines changed
Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
; RUN: llc -O2 -bpf-min-jump-table-entries=1 -mtriple=bpfel -mcpu=v4 < %s | FileCheck %s
2+
3+
; Check that two jump tables of different size are generated
4+
5+
define i64 @foo(i64 %v1, i64 %v2) {
6+
; CHECK: .LBPF.JX.0.0:
7+
; CHECK-NEXT: .reloc 0, FK_SecRel_8, BPF.JT.0.0
8+
; CHECK-NEXT: gotox r1
9+
10+
; CHECK: .LBPF.JX.0.1:
11+
; CHECK-NEXT: .reloc 0, FK_SecRel_8, BPF.JT.0.1
12+
; CHECK-NEXT: gotox r2
13+
14+
; CHECK: .section .jumptables,"",@progbits
15+
16+
; CHECK-NEXT: [[m1:.*]] = (({{.*}}-.LBPF.JX.0.0)>>3)-1
17+
; CHECK-NEXT: [[m2:.*]] = (({{.*}}-.LBPF.JX.0.0)>>3)-1
18+
; CHECK-NEXT: BPF.JT.0.0:
19+
; CHECK-NEXT: .long [[m1]]
20+
; CHECK-NEXT: .long [[m2]]
21+
; CHECK-NEXT: .size BPF.JT.0.0, 8
22+
23+
; CHECK-NEXT: [[m1:.*]] = (({{.*}}-.LBPF.JX.0.1)>>3)-1
24+
; CHECK-NEXT: [[m2:.*]] = (({{.*}}-.LBPF.JX.0.1)>>3)-1
25+
; CHECK-NEXT: [[m3:.*]] = (({{.*}}-.LBPF.JX.0.1)>>3)-1
26+
; CHECK-NEXT: BPF.JT.0.1:
27+
; CHECK-NEXT: .long [[m1]]
28+
; CHECK-NEXT: .long [[m2]]
29+
; CHECK-NEXT: .long [[m3]]
30+
; CHECK-NEXT: .size BPF.JT.0.1, 12
31+
32+
entry:
33+
switch i64 %v1, label %sw.default [
34+
i64 0, label %sw.bb1
35+
i64 1, label %sw.bb2
36+
]
37+
38+
sw.bb1:
39+
br label %sw.epilog
40+
41+
sw.bb2:
42+
br label %sw.epilog
43+
44+
sw.default:
45+
br label %sw.epilog
46+
47+
sw.epilog:
48+
%ret = phi i64 [ 42, %sw.default ], [ 3, %sw.bb1 ], [ 5, %sw.bb2 ]
49+
switch i64 %v2, label %sw.default.1 [
50+
i64 0, label %sw.bb1.1
51+
i64 1, label %sw.bb2.1
52+
i64 2, label %sw.bb3.1
53+
]
54+
55+
sw.bb1.1:
56+
br label %sw.epilog.1
57+
58+
sw.bb2.1:
59+
br label %sw.epilog.1
60+
61+
sw.bb3.1:
62+
br label %sw.epilog.1
63+
64+
sw.default.1:
65+
br label %sw.epilog.1
66+
67+
sw.epilog.1:
68+
%ret.1 = phi i64 [ 42, %sw.default.1 ], [ 3, %sw.bb1.1 ], [ 5, %sw.bb2.1 ], [ 7, %sw.bb3.1 ]
69+
%ret.2 = add i64 %ret, %ret.1
70+
ret i64 %ret.2
71+
}
72+
73+
!llvm.module.flags = !{!0, !1}
74+
!llvm.ident = !{!2}
75+
76+
!0 = !{i32 1, !"wchar_size", i32 4}
77+
!1 = !{i32 7, !"frame-pointer", i32 2}
78+
!2 = !{!"clang some version"}
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
; Checks generated using command:
2+
;
3+
; llvm/utils/update_test_body.py llvm/test/CodeGen/BPF/jump-table-simple.ll
4+
;
5+
; RUN: rm -rf %t && split-file %s %t && cd %t
6+
; RUN: llc -O2 -bpf-min-jump-table-entries=1 -mtriple=bpfel -mcpu=v4 < test.ll | FileCheck %s
7+
;
8+
; Check general program structure generated for a jump table
9+
10+
.ifdef GEN
11+
;--- test.ll
12+
define i64 @foo(i64 %v) {
13+
entry:
14+
switch i64 %v, label %sw.default [
15+
i64 0, label %sw.epilog
16+
i64 1, label %sw.bb1
17+
i64 2, label %sw.bb1
18+
i64 3, label %sw.bb2
19+
]
20+
21+
sw.bb1:
22+
br label %sw.epilog
23+
24+
sw.bb2:
25+
br label %sw.epilog
26+
27+
sw.default:
28+
br label %sw.epilog
29+
30+
sw.epilog:
31+
%ret = phi i64 [ 42, %sw.default ], [ 3, %sw.bb1 ], [ 5, %sw.bb2 ], [ 7, %entry ]
32+
ret i64 %ret
33+
}
34+
35+
!llvm.module.flags = !{!0, !1}
36+
!llvm.ident = !{!2}
37+
38+
!0 = !{i32 1, !"wchar_size", i32 4}
39+
!1 = !{i32 7, !"frame-pointer", i32 2}
40+
!2 = !{!"clang some version"}
41+
42+
;--- gen
43+
echo ""
44+
echo "; Generated checks follow"
45+
echo ";"
46+
llc -O2 -bpf-min-jump-table-entries=1 -mtriple=bpfel -mcpu=v4 < test.ll \
47+
| awk '/# -- End function/ {p=0} /@function/ {p=1} p {print "; CHECK" ": " $0}'
48+
.endif
49+
50+
; Generated checks follow
51+
;
52+
; CHECK: .type foo,@function
53+
; CHECK: foo: # @foo
54+
; CHECK: .cfi_startproc
55+
; CHECK: # %bb.0: # %entry
56+
; CHECK: if r1 > 3 goto LBB0_5
57+
; CHECK: # %bb.1: # %entry
58+
; CHECK: .LBPF.JX.0.0:
59+
; CHECK: .reloc 0, FK_SecRel_8, BPF.JT.0.0
60+
; CHECK: gotox r1
61+
; CHECK: LBB0_3: # %sw.bb1
62+
; CHECK: r0 = 3
63+
; CHECK: goto LBB0_6
64+
; CHECK: LBB0_2:
65+
; CHECK: r0 = 7
66+
; CHECK: goto LBB0_6
67+
; CHECK: LBB0_4: # %sw.bb2
68+
; CHECK: r0 = 5
69+
; CHECK: goto LBB0_6
70+
; CHECK: LBB0_5: # %sw.default
71+
; CHECK: r0 = 42
72+
; CHECK: LBB0_6: # %sw.epilog
73+
; CHECK: exit
74+
; CHECK: .Lfunc_end0:
75+
; CHECK: .size foo, .Lfunc_end0-foo
76+
; CHECK: .cfi_endproc
77+
; CHECK: .section .jumptables,"",@progbits
78+
; CHECK: .L0_0_set_2 = ((LBB0_2-.LBPF.JX.0.0)>>3)-1
79+
; CHECK: .L0_0_set_3 = ((LBB0_3-.LBPF.JX.0.0)>>3)-1
80+
; CHECK: .L0_0_set_4 = ((LBB0_4-.LBPF.JX.0.0)>>3)-1
81+
; CHECK: BPF.JT.0.0:
82+
; CHECK: .long .L0_0_set_2
83+
; CHECK: .long .L0_0_set_3
84+
; CHECK: .long .L0_0_set_3
85+
; CHECK: .long .L0_0_set_4
86+
; CHECK: .size BPF.JT.0.0, 16

0 commit comments

Comments
 (0)