File: bpf-fastcall-regmask-1.ll

package info (click to toggle)
llvm-toolchain-21 1%3A21.1.6-2
  • links: PTS, VCS
  • area: main
  • in suites: forky
  • size: 2,245,044 kB
  • sloc: cpp: 7,619,726; ansic: 1,434,018; asm: 1,058,748; python: 252,740; f90: 94,671; objc: 70,685; lisp: 42,813; pascal: 18,401; sh: 8,601; ml: 5,111; perl: 4,720; makefile: 3,666; awk: 3,523; javascript: 2,409; xml: 892; fortran: 770
file content (110 lines) | stat: -rw-r--r-- 4,172 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
; RUN: llc -O2 --mtriple=bpfel \
; RUN:   -print-after=stack-slot-coloring %s \
; RUN:   -o /dev/null 2>&1 | FileCheck %s

; Generated from the following C code:
;
;   #define __bpf_fastcall __attribute__((bpf_fastcall))
;
;   void bar1(void) __bpf_fastcall;
;   void buz1(long i, long j, long k);
;   void foo1(long i, long j, long k) {
;     bar1();
;     buz1(i, j, k);
;   }
;
;   long bar2(void) __bpf_fastcall;
;   void buz2(long i, long j, long k);
;   void foo2(long i, long j, long k) {
;     bar2();
;     buz2(i, j, k);
;   }
;
;   void bar3(long) __bpf_fastcall;
;   void buz3(long i, long j, long k);
;   void foo3(long i, long j, long k) {
;     bar3(i);
;     buz3(i, j, k);
;   }
;
;   long bar4(long, long) __bpf_fastcall;
;   void buz4(long i, long j, long k);
;   void foo4(long i, long j, long k) {
;     bar4(i, j);
;     buz4(i, j, k);
;   }
;
; Using the following command:
;
;   clang --target=bpf -emit-llvm -O2 -S -o - t.c
;
; (unnecessary attrs removed maually)

; Check regmask for calls to functions marked with bpf_fastcall:
; - void function w/o parameters
; - non-void function w/o parameters
; - void function with parameters
; - non-void function with parameters

declare dso_local void @bar1() #0
declare dso_local void @buz1(i64 noundef, i64 noundef, i64 noundef)
define dso_local void @foo1(i64 noundef %i, i64 noundef %j, i64 noundef %k) {
entry:
  tail call void @bar1() #1
  tail call void @buz1(i64 noundef %i, i64 noundef %j, i64 noundef %k)
  ret void
}

; CHECK:      JAL @bar1, <regmask $r0 $r1 $r2 $r3 $r4 $r5 $r6 $r7 $r8 $r9 $r10
; CHECK-SAME:                     $w0 $w1 $w2 $w3 $w4 $w5 $w6 $w7 $w8 $w9 $w10>
; CHECK-SAME:          , implicit $r11, implicit-def $r11
; CHECK:      JAL @buz1, <regmask $r6 $r7 $r8 $r9 $r10 $w6 $w7 $w8 $w9 $w10>
; CHECK-SAME:          , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11

declare dso_local i64 @bar2() #0
declare dso_local void @buz2(i64 noundef, i64 noundef, i64 noundef)
define dso_local void @foo2(i64 noundef %i, i64 noundef %j, i64 noundef %k) {
entry:
  tail call i64 @bar2() #1
  tail call void @buz2(i64 noundef %i, i64 noundef %j, i64 noundef %k)
  ret void
}

; CHECK:      JAL @bar2, <regmask $r1 $r2 $r3 $r4 $r5 $r6 $r7 $r8 $r9 $r10
; CHECK-SAME:                     $w1 $w2 $w3 $w4 $w5 $w6 $w7 $w8 $w9 $w10>
; CHECK-SAME:          , implicit $r11, implicit-def $r11, implicit-def dead $r0
; CHECK:      JAL @buz2, <regmask $r6 $r7 $r8 $r9 $r10 $w6 $w7 $w8 $w9 $w10>
; CHECK-SAME:          , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11

declare dso_local void @bar3(i64) #0
declare dso_local void @buz3(i64 noundef, i64 noundef, i64 noundef)
define dso_local void @foo3(i64 noundef %i, i64 noundef %j, i64 noundef %k) {
entry:
  tail call void @bar3(i64 noundef %i) #1
  tail call void @buz3(i64 noundef %i, i64 noundef %j, i64 noundef %k)
  ret void
}

; CHECK:      JAL @bar3, <regmask $r0 $r2 $r3 $r4 $r5 $r6 $r7 $r8 $r9 $r10
; CHECK-SAME:                     $w0 $w2 $w3 $w4 $w5 $w6 $w7 $w8 $w9 $w10>
; CHECK-SAME:          , implicit $r11, implicit $r1, implicit-def $r11
; CHECK:      JAL @buz3, <regmask $r6 $r7 $r8 $r9 $r10 $w6 $w7 $w8 $w9 $w10>
; CHECK-SAME:          , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11

declare dso_local i64 @bar4(i64 noundef, i64 noundef) #0
declare dso_local void @buz4(i64 noundef, i64 noundef, i64 noundef)
define dso_local void @foo4(i64 noundef %i, i64 noundef %j, i64 noundef %k) {
entry:
  tail call i64 @bar4(i64 noundef %i, i64 noundef %j) #1
  tail call void @buz4(i64 noundef %i, i64 noundef %j, i64 noundef %k)
  ret void
}

; CHECK:      JAL @bar4, <regmask $r3 $r4 $r5 $r6 $r7 $r8 $r9 $r10
; CHECK-SAME:                     $w3 $w4 $w5 $w6 $w7 $w8 $w9 $w10>
; CHECK-SAME:          , implicit $r11, implicit $r1, implicit $r2, implicit-def $r11, implicit-def dead $r0
; CHECK:      JAL @buz4, <regmask $r6 $r7 $r8 $r9 $r10 $w6 $w7 $w8 $w9 $w10>
; CHECK-SAME:          , implicit $r11, implicit $r1, implicit $r2, implicit $r3, implicit-def $r11

attributes #0 = { "bpf_fastcall" }
attributes #1 = { nounwind "bpf_fastcall" }