Skip to content

Commit cc70bda

Browse files
author
Yonghong Song
committed
[BPF] Add some selftests
1 parent 618cd48 commit cc70bda

File tree

3 files changed

+218
-0
lines changed

3 files changed

+218
-0
lines changed
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
; RUN: llc -march=bpf -mcpu=v4 < %s | FileCheck %s
2+
;
3+
; Source code:
4+
; int bar(int a) {
5+
; __label__ l1, l2;
6+
; void * volatile tgt;
7+
; int ret = 0;
8+
; if (a)
9+
; tgt = &&l1; // synthetic jump table generated here
10+
; else
11+
; tgt = &&l2; // another synthetic jump table
12+
; goto *tgt;
13+
; l1: ret += 1;
14+
; l2: ret += 2;
15+
; return ret;
16+
; }
17+
;
18+
; Compilation Flags:
19+
; clang --target=bpf -mcpu=v4 -O2 -emit-llvm -S test.c
20+
21+
define dso_local range(i32 2, 4) i32 @bar(i32 noundef %a) local_unnamed_addr{
22+
entry:
23+
%tgt = alloca ptr, align 8
24+
%tobool.not = icmp eq i32 %a, 0
25+
%. = select i1 %tobool.not, ptr blockaddress(@bar, %l2), ptr blockaddress(@bar, %l1)
26+
store volatile ptr %., ptr %tgt, align 8
27+
%tgt.0.tgt.0.tgt.0.tgt.0. = load volatile ptr, ptr %tgt, align 8
28+
indirectbr ptr %tgt.0.tgt.0.tgt.0.tgt.0., [label %l1, label %l2]
29+
30+
l1: ; preds = %entry
31+
br label %l2
32+
33+
l2: ; preds = %l1, %entry
34+
%ret.0 = phi i32 [ 3, %l1 ], [ 2, %entry ]
35+
ret i32 %ret.0
36+
}
37+
38+
; CHECK: r2 = BPF.JT.0.0 ll
39+
; CHECK-NEXT: r2 = *(u64 *)(r2 + 0)
40+
; CHECK-NEXT: r3 = BPF.JT.0.1 ll
41+
; CHECK-NEXT: r3 = *(u64 *)(r3 + 0)
42+
; CHECK-NEXT: if w1 == 0 goto LBB0_2
43+
; CHECK: r3 = r2
44+
; CHECK-NEXT: LBB0_2: # %entry
45+
; CHECK-NEXT: *(u64 *)(r10 - 8) = r3
46+
; CHECK-NEXT: r1 = *(u64 *)(r10 - 8)
47+
; CHECK-NEXT: gotox r1
48+
; CHECK-NEXT: .Ltmp0: # Block address taken
49+
; CHECK-NEXT: LBB0_3: # %l1
50+
; CHECK-NEXT: w0 = 3
51+
; CHECK-NEXT: goto LBB0_5
52+
; CHECK-NEXT: .Ltmp1: # Block address taken
53+
; CHECK-NEXT: LBB0_4: # %l2
54+
; CHECK-NEXT: w0 = 2
55+
; CHECK-NEXT: LBB0_5: # %.split
56+
; CHECK-NEXT: exit
57+
;
58+
; CHECK: .section .jumptables,"",@progbits
59+
; CHECK-NEXT: BPF.JT.0.0:
60+
; CHECK-NEXT: .quad LBB0_3
61+
; CHECK-NEXT: .size BPF.JT.0.0, 8
62+
; CHECK-NEXT: BPF.JT.0.1:
63+
; CHECK-NEXT: .quad LBB0_4
64+
; CHECK-NEXT: .size BPF.JT.0.1, 8
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
; RUN: llc -march=bpf -mcpu=v4 < %s | FileCheck %s
2+
;
3+
; Source code:
4+
; int foo(unsigned a) {
5+
; __label__ l1, l2;
6+
; void *jt1[] = {[0]=&&l1, [1]=&&l2};
7+
; int ret = 0;
8+
;
9+
; goto *jt1[a % 2];
10+
; l1: ret += 1;
11+
; l2: ret += 3;
12+
; return ret;
13+
; }
14+
;
15+
; Compilation Flags:
16+
; clang --target=bpf -mcpu=v4 -O2 -emit-llvm -S test.c
17+
18+
@__const.foo.jt1 = private unnamed_addr constant [2 x ptr] [ptr blockaddress(@foo, %l1), ptr blockaddress(@foo, %l2)], align 8
19+
20+
define dso_local range(i32 3, 5) i32 @foo(i32 noundef %a) local_unnamed_addr {
21+
entry:
22+
%rem = and i32 %a, 1
23+
%idxprom = zext nneg i32 %rem to i64
24+
%arrayidx = getelementptr inbounds nuw [2 x ptr], ptr @__const.foo.jt1, i64 0, i64 %idxprom
25+
%0 = load ptr, ptr %arrayidx, align 8
26+
indirectbr ptr %0, [label %l1, label %l2]
27+
28+
l1: ; preds = %entry
29+
br label %l2
30+
31+
l2: ; preds = %l1, %entry
32+
%ret.0 = phi i32 [ 4, %l1 ], [ 3, %entry ]
33+
ret i32 %ret.0
34+
}
35+
36+
; CHECK: w1 &= 1
37+
; CHECK-NEXT: r1 <<= 3
38+
; CHECK-NEXT: r2 = BPF.JT.0.0 ll
39+
; CHECK-NEXT: r2 += r1
40+
; CHECK-NEXT: r1 = *(u64 *)(r2 + 0)
41+
; CHECK-NEXT: gotox r1
42+
; CHECK-NEXT: .Ltmp0: # Block address taken
43+
; CHECK-NEXT: LBB0_1: # %l1
44+
; CHECK-NEXT: w0 = 4
45+
; CHECK-NEXT: goto LBB0_3
46+
; CHECK-NEXT: .Ltmp1: # Block address taken
47+
; CHECK-NEXT: LBB0_2: # %l2
48+
; CHECK-NEXT: w0 = 3
49+
; CHECK-NEXT: LBB0_3: # %.split
50+
; CHECK-NEXT: exit
51+
;
52+
; CHECK: .section .jumptables,"",@progbits
53+
; CHECK-NEXT: BPF.JT.0.0:
54+
; CHECK-NEXT: .quad LBB0_1
55+
; CHECK-NEXT: .quad LBB0_2
56+
; CHECK-NEXT: .size BPF.JT.0.0, 16
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
; RUN: llc -march=bpf -mcpu=v4 -bpf-min-jump-table-entries=3 < %s | FileCheck %s
2+
;
3+
; Source code:
4+
; int ret_user;
5+
; int foo(int a)
6+
; {
7+
; switch (a) {
8+
; case 1: ret_user = 18; break;
9+
; case 20: ret_user = 6; break;
10+
; case 30: ret_user = 2; break;
11+
; default: break;
12+
; }
13+
; return 0;
14+
; }
15+
;
16+
; Compilation Flags:
17+
; clang --target=bpf -mcpu=v4 -O2 -emit-llvm -S test.c
18+
19+
@ret_user = dso_local local_unnamed_addr global i32 0, align 4
20+
21+
define dso_local noundef i32 @foo(i32 noundef %a) local_unnamed_addr {
22+
entry:
23+
switch i32 %a, label %sw.epilog [
24+
i32 1, label %sw.epilog.sink.split
25+
i32 20, label %sw.bb1
26+
i32 30, label %sw.bb2
27+
]
28+
29+
sw.bb1: ; preds = %entry
30+
br label %sw.epilog.sink.split
31+
32+
sw.bb2: ; preds = %entry
33+
br label %sw.epilog.sink.split
34+
35+
sw.epilog.sink.split: ; preds = %entry, %sw.bb1, %sw.bb2
36+
%.sink = phi i32 [ 2, %sw.bb2 ], [ 6, %sw.bb1 ], [ 18, %entry ]
37+
store i32 %.sink, ptr @ret_user, align 4
38+
br label %sw.epilog
39+
40+
sw.epilog: ; preds = %sw.epilog.sink.split, %entry
41+
ret i32 0
42+
}
43+
44+
; CHECK: w1 += -1
45+
; CHECK-NEXT: if w1 > 29 goto LBB0_5
46+
; CHECK: w2 = 18
47+
; CHECK-NEXT: r1 <<= 3
48+
; CHECK-NEXT: r3 = BPF.JT.0.0 ll
49+
; CHECK-NEXT: r4 = BPF.JT.0.0 ll
50+
; CHECK-NEXT: r4 += r1
51+
; CHECK-NEXT: r1 = *(u64 *)(r4 + 0)
52+
; CHECK-NEXT: r3 += r1
53+
; CHECK-NEXT: gotox r3
54+
; CHECK-NEXT: LBB0_2: # %sw.bb1
55+
; CHECK-NEXT: w2 = 6
56+
; CHECK-NEXT: goto LBB0_4
57+
; CHECK-NEXT: LBB0_3: # %sw.bb2
58+
; CHECK-NEXT: w2 = 2
59+
; CHECK-NEXT: LBB0_4: # %sw.epilog.sink.split
60+
; CHECK-NEXT: r1 = ret_user ll
61+
; CHECK-NEXT: *(u32 *)(r1 + 0) = w2
62+
; CHECK-NEXT: LBB0_5: # %sw.epilog
63+
; CHECK-NEXT: w0 = 0
64+
; CHECK-NEXT: exit
65+
66+
; CHECK: .section .jumptables,"",@progbits
67+
; CHECK-NEXT: BPF.JT.0.0:
68+
; CHECK-NEXT: .quad LBB0_4
69+
; CHECK-NEXT: .quad LBB0_5
70+
; CHECK-NEXT: .quad LBB0_5
71+
; CHECK-NEXT: .quad LBB0_5
72+
; CHECK-NEXT: .quad LBB0_5
73+
; CHECK-NEXT: .quad LBB0_5
74+
; CHECK-NEXT: .quad LBB0_5
75+
; CHECK-NEXT: .quad LBB0_5
76+
; CHECK-NEXT: .quad LBB0_5
77+
; CHECK-NEXT: .quad LBB0_5
78+
; CHECK-NEXT: .quad LBB0_5
79+
; CHECK-NEXT: .quad LBB0_5
80+
; CHECK-NEXT: .quad LBB0_5
81+
; CHECK-NEXT: .quad LBB0_5
82+
; CHECK-NEXT: .quad LBB0_5
83+
; CHECK-NEXT: .quad LBB0_5
84+
; CHECK-NEXT: .quad LBB0_5
85+
; CHECK-NEXT: .quad LBB0_5
86+
; CHECK-NEXT: .quad LBB0_5
87+
; CHECK-NEXT: .quad LBB0_2
88+
; CHECK-NEXT: .quad LBB0_5
89+
; CHECK-NEXT: .quad LBB0_5
90+
; CHECK-NEXT: .quad LBB0_5
91+
; CHECK-NEXT: .quad LBB0_5
92+
; CHECK-NEXT: .quad LBB0_5
93+
; CHECK-NEXT: .quad LBB0_5
94+
; CHECK-NEXT: .quad LBB0_5
95+
; CHECK-NEXT: .quad LBB0_5
96+
; CHECK-NEXT: .quad LBB0_5
97+
; CHECK-NEXT: .quad LBB0_3
98+
; CHECK-NEXT: .size BPF.JT.0.0, 240

0 commit comments

Comments
 (0)