xref: /aosp_15_r20/external/bcc/tests/lua/test_clang.lua (revision 387f9dfdfa2baef462e92476d413c7bc2470293e)
1*387f9dfdSAndroid Build Coastguard Workerlocal suite = require("test_helper")
2*387f9dfdSAndroid Build Coastguard Workerlocal TestClang = {}
3*387f9dfdSAndroid Build Coastguard Worker
4*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_read1()
5*387f9dfdSAndroid Build Coastguard Worker  local text = [[
6*387f9dfdSAndroid Build Coastguard Worker#include <linux/sched.h>
7*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
8*387f9dfdSAndroid Build Coastguard Workerint count_sched(struct pt_regs *ctx, struct task_struct *prev) {
9*387f9dfdSAndroid Build Coastguard Worker    pid_t p = prev->pid;
10*387f9dfdSAndroid Build Coastguard Worker    return (p != -1);
11*387f9dfdSAndroid Build Coastguard Worker}
12*387f9dfdSAndroid Build Coastguard Worker]]
13*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text, debug=0}
14*387f9dfdSAndroid Build Coastguard Worker  local fn = b:load_func("count_sched", 'BPF_PROG_TYPE_KPROBE')
15*387f9dfdSAndroid Build Coastguard Workerend
16*387f9dfdSAndroid Build Coastguard Worker
17*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_read2()
18*387f9dfdSAndroid Build Coastguard Worker  local text = [[
19*387f9dfdSAndroid Build Coastguard Worker#include <linux/sched.h>
20*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
21*387f9dfdSAndroid Build Coastguard Workerint count_foo(struct pt_regs *ctx, unsigned long a, unsigned long b) {
22*387f9dfdSAndroid Build Coastguard Worker    return (a != b);
23*387f9dfdSAndroid Build Coastguard Worker}
24*387f9dfdSAndroid Build Coastguard Worker]]
25*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text, debug=0}
26*387f9dfdSAndroid Build Coastguard Worker  local fn = b:load_func("count_foo", 'BPF_PROG_TYPE_KPROBE')
27*387f9dfdSAndroid Build Coastguard Workerend
28*387f9dfdSAndroid Build Coastguard Worker
29*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_read_keys()
30*387f9dfdSAndroid Build Coastguard Worker  local text = [[
31*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
32*387f9dfdSAndroid Build Coastguard Worker#include <linux/blkdev.h>
33*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(start, struct request *);
34*387f9dfdSAndroid Build Coastguard Workerint do_request(struct pt_regs *ctx, struct request *req) {
35*387f9dfdSAndroid Build Coastguard Worker  u64 ts = bpf_ktime_get_ns();
36*387f9dfdSAndroid Build Coastguard Worker  start.update(&req, &ts);
37*387f9dfdSAndroid Build Coastguard Worker  return 0;
38*387f9dfdSAndroid Build Coastguard Worker}
39*387f9dfdSAndroid Build Coastguard Worker
40*387f9dfdSAndroid Build Coastguard Workerint do_completion(struct pt_regs *ctx, struct request *req) {
41*387f9dfdSAndroid Build Coastguard Worker  u64 *tsp = start.lookup(&req);
42*387f9dfdSAndroid Build Coastguard Worker  if (tsp != 0) {
43*387f9dfdSAndroid Build Coastguard Worker    start.delete(&req);
44*387f9dfdSAndroid Build Coastguard Worker  }
45*387f9dfdSAndroid Build Coastguard Worker  return 0;
46*387f9dfdSAndroid Build Coastguard Worker}
47*387f9dfdSAndroid Build Coastguard Worker  ]]
48*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text, debug=0}
49*387f9dfdSAndroid Build Coastguard Worker  local fns = b:load_funcs('BPF_PROG_TYPE_KPROBE')
50*387f9dfdSAndroid Build Coastguard Workerend
51*387f9dfdSAndroid Build Coastguard Worker
52*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_sscanf()
53*387f9dfdSAndroid Build Coastguard Worker  local text = [[
54*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(stats, int, struct { u64 a; u64 b; u32 c:18; u32 d:14; struct { u32 a; u32 b; } s; }, 10);
55*387f9dfdSAndroid Build Coastguard Worker
56*387f9dfdSAndroid Build Coastguard Workerint foo(void *ctx) {
57*387f9dfdSAndroid Build Coastguard Worker    return 0;
58*387f9dfdSAndroid Build Coastguard Worker}
59*387f9dfdSAndroid Build Coastguard Worker]]
60*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text, debug=0}
61*387f9dfdSAndroid Build Coastguard Worker  local fn = b:load_func("foo", 'BPF_PROG_TYPE_KPROBE')
62*387f9dfdSAndroid Build Coastguard Worker  local t = b:get_table("stats")
63*387f9dfdSAndroid Build Coastguard Worker  local s1 = t:key_sprintf(2)
64*387f9dfdSAndroid Build Coastguard Worker
65*387f9dfdSAndroid Build Coastguard Worker  assert_equals(s1, "0x2")
66*387f9dfdSAndroid Build Coastguard Worker
67*387f9dfdSAndroid Build Coastguard Worker  local s2 = t:leaf_sprintf({{2, 3, 4, 1, {5, 6}}})
68*387f9dfdSAndroid Build Coastguard Worker  local l = t:leaf_scanf(s2)
69*387f9dfdSAndroid Build Coastguard Worker
70*387f9dfdSAndroid Build Coastguard Worker  assert_equals(tonumber(l.a), 2)
71*387f9dfdSAndroid Build Coastguard Worker  assert_equals(tonumber(l.b), 3)
72*387f9dfdSAndroid Build Coastguard Worker  assert_equals(tonumber(l.c), 4)
73*387f9dfdSAndroid Build Coastguard Worker  assert_equals(tonumber(l.d), 1)
74*387f9dfdSAndroid Build Coastguard Worker  assert_equals(tonumber(l.s.a), 5)
75*387f9dfdSAndroid Build Coastguard Worker  assert_equals(tonumber(l.s.b), 6)
76*387f9dfdSAndroid Build Coastguard Workerend
77*387f9dfdSAndroid Build Coastguard Worker
78*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_sscanf_array()
79*387f9dfdSAndroid Build Coastguard Worker  local text = [[ BPF_HASH(stats, int, struct { u32 a[3]; u32 b; }, 10); ]]
80*387f9dfdSAndroid Build Coastguard Worker
81*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text, debug=0}
82*387f9dfdSAndroid Build Coastguard Worker  local t = b:get_table("stats")
83*387f9dfdSAndroid Build Coastguard Worker
84*387f9dfdSAndroid Build Coastguard Worker  local s1 = t:key_sprintf(2)
85*387f9dfdSAndroid Build Coastguard Worker  assert_equals(s1, "0x2")
86*387f9dfdSAndroid Build Coastguard Worker
87*387f9dfdSAndroid Build Coastguard Worker  local s2 = t:leaf_sprintf({{{1, 2, 3}, 4}})
88*387f9dfdSAndroid Build Coastguard Worker  assert_equals(s2, "{ [ 0x1 0x2 0x3 ] 0x4 }")
89*387f9dfdSAndroid Build Coastguard Worker
90*387f9dfdSAndroid Build Coastguard Worker  local l = t:leaf_scanf(s2)
91*387f9dfdSAndroid Build Coastguard Worker  assert_equals(l.a[0], 1)
92*387f9dfdSAndroid Build Coastguard Worker  assert_equals(l.a[1], 2)
93*387f9dfdSAndroid Build Coastguard Worker  assert_equals(l.a[2], 3)
94*387f9dfdSAndroid Build Coastguard Worker  assert_equals(l.b, 4)
95*387f9dfdSAndroid Build Coastguard Workerend
96*387f9dfdSAndroid Build Coastguard Worker
97*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_iosnoop()
98*387f9dfdSAndroid Build Coastguard Worker  local text = [[
99*387f9dfdSAndroid Build Coastguard Worker#include <linux/blkdev.h>
100*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
101*387f9dfdSAndroid Build Coastguard Worker
102*387f9dfdSAndroid Build Coastguard Workerstruct key_t {
103*387f9dfdSAndroid Build Coastguard Worker    struct request *req;
104*387f9dfdSAndroid Build Coastguard Worker};
105*387f9dfdSAndroid Build Coastguard Worker
106*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(start, struct key_t, u64, 1024);
107*387f9dfdSAndroid Build Coastguard Workerint do_request(struct pt_regs *ctx, struct request *req) {
108*387f9dfdSAndroid Build Coastguard Worker    struct key_t key = {};
109*387f9dfdSAndroid Build Coastguard Worker
110*387f9dfdSAndroid Build Coastguard Worker    bpf_trace_printk("traced start %d\\n", req->__data_len);
111*387f9dfdSAndroid Build Coastguard Worker
112*387f9dfdSAndroid Build Coastguard Worker    return 0;
113*387f9dfdSAndroid Build Coastguard Worker}
114*387f9dfdSAndroid Build Coastguard Worker]]
115*387f9dfdSAndroid Build Coastguard Worker
116*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text, debug=0}
117*387f9dfdSAndroid Build Coastguard Worker  local fn = b:load_func("do_request", 'BPF_PROG_TYPE_KPROBE')
118*387f9dfdSAndroid Build Coastguard Workerend
119*387f9dfdSAndroid Build Coastguard Worker
120*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_blk_start_request()
121*387f9dfdSAndroid Build Coastguard Worker  local text = [[
122*387f9dfdSAndroid Build Coastguard Worker#include <linux/blkdev.h>
123*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
124*387f9dfdSAndroid Build Coastguard Workerint do_request(struct pt_regs *ctx, int req) {
125*387f9dfdSAndroid Build Coastguard Worker    bpf_trace_printk("req ptr: 0x%x\n", req);
126*387f9dfdSAndroid Build Coastguard Worker    return 0;
127*387f9dfdSAndroid Build Coastguard Worker}
128*387f9dfdSAndroid Build Coastguard Worker]]
129*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text, debug=0}
130*387f9dfdSAndroid Build Coastguard Worker  local fn = b:load_func("do_request", 'BPF_PROG_TYPE_KPROBE')
131*387f9dfdSAndroid Build Coastguard Workerend
132*387f9dfdSAndroid Build Coastguard Worker
133*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_bpf_hash()
134*387f9dfdSAndroid Build Coastguard Worker  local text = [[
135*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(table1);
136*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(table2, u32);
137*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(table3, u32, int);
138*387f9dfdSAndroid Build Coastguard Worker]]
139*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text, debug=0}
140*387f9dfdSAndroid Build Coastguard Workerend
141*387f9dfdSAndroid Build Coastguard Worker
142*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_consecutive_probe_read()
143*387f9dfdSAndroid Build Coastguard Worker  local text = [[
144*387f9dfdSAndroid Build Coastguard Worker#include <linux/fs.h>
145*387f9dfdSAndroid Build Coastguard Worker#include <linux/mount.h>
146*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(table1, struct super_block *);
147*387f9dfdSAndroid Build Coastguard Workerint trace_entry(struct pt_regs *ctx, struct file *file) {
148*387f9dfdSAndroid Build Coastguard Worker    if (!file) return 0;
149*387f9dfdSAndroid Build Coastguard Worker    struct vfsmount *mnt = file->f_path.mnt;
150*387f9dfdSAndroid Build Coastguard Worker    if (mnt) {
151*387f9dfdSAndroid Build Coastguard Worker        struct super_block *k = mnt->mnt_sb;
152*387f9dfdSAndroid Build Coastguard Worker        u64 zero = 0;
153*387f9dfdSAndroid Build Coastguard Worker        table1.update(&k, &zero);
154*387f9dfdSAndroid Build Coastguard Worker        k = mnt->mnt_sb;
155*387f9dfdSAndroid Build Coastguard Worker        table1.update(&k, &zero);
156*387f9dfdSAndroid Build Coastguard Worker    }
157*387f9dfdSAndroid Build Coastguard Worker
158*387f9dfdSAndroid Build Coastguard Worker    return 0;
159*387f9dfdSAndroid Build Coastguard Worker}
160*387f9dfdSAndroid Build Coastguard Worker]]
161*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text, debug=0}
162*387f9dfdSAndroid Build Coastguard Worker  local fn = b:load_func("trace_entry", 'BPF_PROG_TYPE_KPROBE')
163*387f9dfdSAndroid Build Coastguard Workerend
164*387f9dfdSAndroid Build Coastguard Worker
165*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_nested_probe_read()
166*387f9dfdSAndroid Build Coastguard Worker  local text = [[
167*387f9dfdSAndroid Build Coastguard Worker#include <linux/fs.h>
168*387f9dfdSAndroid Build Coastguard Workerint trace_entry(struct pt_regs *ctx, struct file *file) {
169*387f9dfdSAndroid Build Coastguard Worker    if (!file) return 0;
170*387f9dfdSAndroid Build Coastguard Worker    const char *name = file->f_path.dentry->d_name.name;
171*387f9dfdSAndroid Build Coastguard Worker    bpf_trace_printk("%s\\n", name);
172*387f9dfdSAndroid Build Coastguard Worker    return 0;
173*387f9dfdSAndroid Build Coastguard Worker}
174*387f9dfdSAndroid Build Coastguard Worker]]
175*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text, debug=0}
176*387f9dfdSAndroid Build Coastguard Worker  local fn = b:load_func("trace_entry", 'BPF_PROG_TYPE_KPROBE')
177*387f9dfdSAndroid Build Coastguard Workerend
178*387f9dfdSAndroid Build Coastguard Worker
179*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_char_array_probe()
180*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=[[#include <linux/blkdev.h>
181*387f9dfdSAndroid Build Coastguard Workerint kprobe__blk_update_request(struct pt_regs *ctx, struct request *req) {
182*387f9dfdSAndroid Build Coastguard Worker    bpf_trace_printk("%s\\n", req->rq_disk->disk_name);
183*387f9dfdSAndroid Build Coastguard Worker    return 0;
184*387f9dfdSAndroid Build Coastguard Worker}]]}
185*387f9dfdSAndroid Build Coastguard Workerend
186*387f9dfdSAndroid Build Coastguard Worker
187*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_read_helper()
188*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=[[
189*387f9dfdSAndroid Build Coastguard Worker#include <linux/fs.h>
190*387f9dfdSAndroid Build Coastguard Workerstatic void print_file_name(struct file *file) {
191*387f9dfdSAndroid Build Coastguard Worker    if (!file) return;
192*387f9dfdSAndroid Build Coastguard Worker    const char *name = file->f_path.dentry->d_name.name;
193*387f9dfdSAndroid Build Coastguard Worker    bpf_trace_printk("%s\\n", name);
194*387f9dfdSAndroid Build Coastguard Worker}
195*387f9dfdSAndroid Build Coastguard Workerstatic void print_file_name2(int unused, struct file *file) {
196*387f9dfdSAndroid Build Coastguard Worker    print_file_name(file);
197*387f9dfdSAndroid Build Coastguard Worker}
198*387f9dfdSAndroid Build Coastguard Workerint trace_entry1(struct pt_regs *ctx, struct file *file) {
199*387f9dfdSAndroid Build Coastguard Worker    print_file_name(file);
200*387f9dfdSAndroid Build Coastguard Worker    return 0;
201*387f9dfdSAndroid Build Coastguard Worker}
202*387f9dfdSAndroid Build Coastguard Workerint trace_entry2(struct pt_regs *ctx, int unused, struct file *file) {
203*387f9dfdSAndroid Build Coastguard Worker    print_file_name2(unused, file);
204*387f9dfdSAndroid Build Coastguard Worker    return 0;
205*387f9dfdSAndroid Build Coastguard Worker}
206*387f9dfdSAndroid Build Coastguard Worker]]}
207*387f9dfdSAndroid Build Coastguard Worker  local fn1 = b:load_func("trace_entry1", 'BPF_PROG_TYPE_KPROBE')
208*387f9dfdSAndroid Build Coastguard Worker  local fn2 = b:load_func("trace_entry2", 'BPF_PROG_TYPE_KPROBE')
209*387f9dfdSAndroid Build Coastguard Workerend
210*387f9dfdSAndroid Build Coastguard Worker
211*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_struct_assign()
212*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text = [[
213*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
214*387f9dfdSAndroid Build Coastguard Workerstruct args_t {
215*387f9dfdSAndroid Build Coastguard Worker    const char *filename;
216*387f9dfdSAndroid Build Coastguard Worker    int flags;
217*387f9dfdSAndroid Build Coastguard Worker    int mode;
218*387f9dfdSAndroid Build Coastguard Worker};
219*387f9dfdSAndroid Build Coastguard Workerint kprobe__sys_open(struct pt_regs *ctx, const char *filename,
220*387f9dfdSAndroid Build Coastguard Worker        int flags, int mode) {
221*387f9dfdSAndroid Build Coastguard Worker    struct args_t args = {};
222*387f9dfdSAndroid Build Coastguard Worker    args.filename = filename;
223*387f9dfdSAndroid Build Coastguard Worker    args.flags = flags;
224*387f9dfdSAndroid Build Coastguard Worker    args.mode = mode;
225*387f9dfdSAndroid Build Coastguard Worker    bpf_trace_printk("%s\\n", args.filename);
226*387f9dfdSAndroid Build Coastguard Worker    return 0;
227*387f9dfdSAndroid Build Coastguard Worker};
228*387f9dfdSAndroid Build Coastguard Worker]]}
229*387f9dfdSAndroid Build Coastguard Workerend
230*387f9dfdSAndroid Build Coastguard Worker
231*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_task_switch()
232*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=[[
233*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
234*387f9dfdSAndroid Build Coastguard Worker#include <linux/sched.h>
235*387f9dfdSAndroid Build Coastguard Workerstruct key_t {
236*387f9dfdSAndroid Build Coastguard Worker  u32 prev_pid;
237*387f9dfdSAndroid Build Coastguard Worker  u32 curr_pid;
238*387f9dfdSAndroid Build Coastguard Worker};
239*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(stats, struct key_t, u64, 1024);
240*387f9dfdSAndroid Build Coastguard Workerint kprobe__finish_task_switch(struct pt_regs *ctx, struct task_struct *prev) {
241*387f9dfdSAndroid Build Coastguard Worker  struct key_t key = {};
242*387f9dfdSAndroid Build Coastguard Worker  u64 zero = 0, *val;
243*387f9dfdSAndroid Build Coastguard Worker  key.curr_pid = bpf_get_current_pid_tgid();
244*387f9dfdSAndroid Build Coastguard Worker  key.prev_pid = prev->pid;
245*387f9dfdSAndroid Build Coastguard Worker
246*387f9dfdSAndroid Build Coastguard Worker  val = stats.lookup_or_try_init(&key, &zero);
247*387f9dfdSAndroid Build Coastguard Worker  if (val) {
248*387f9dfdSAndroid Build Coastguard Worker    (*val)++;
249*387f9dfdSAndroid Build Coastguard Worker  }
250*387f9dfdSAndroid Build Coastguard Worker  return 0;
251*387f9dfdSAndroid Build Coastguard Worker}
252*387f9dfdSAndroid Build Coastguard Worker]]}
253*387f9dfdSAndroid Build Coastguard Workerend
254*387f9dfdSAndroid Build Coastguard Worker
255*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_probe_simple_assign()
256*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=[[
257*387f9dfdSAndroid Build Coastguard Worker#include <uapi/linux/ptrace.h>
258*387f9dfdSAndroid Build Coastguard Worker#include <linux/gfp.h>
259*387f9dfdSAndroid Build Coastguard Workerstruct leaf { size_t size; };
260*387f9dfdSAndroid Build Coastguard WorkerBPF_HASH(simple_map, u32, struct leaf);
261*387f9dfdSAndroid Build Coastguard Workerint kprobe____kmalloc(struct pt_regs *ctx, size_t size) {
262*387f9dfdSAndroid Build Coastguard Worker    u32 pid = bpf_get_current_pid_tgid();
263*387f9dfdSAndroid Build Coastguard Worker    struct leaf* leaf = simple_map.lookup(&pid);
264*387f9dfdSAndroid Build Coastguard Worker    if (leaf)
265*387f9dfdSAndroid Build Coastguard Worker        leaf->size += size;
266*387f9dfdSAndroid Build Coastguard Worker    return 0;
267*387f9dfdSAndroid Build Coastguard Worker}]]}
268*387f9dfdSAndroid Build Coastguard Workerend
269*387f9dfdSAndroid Build Coastguard Worker
270*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_unop_probe_read()
271*387f9dfdSAndroid Build Coastguard Worker  local text = [[
272*387f9dfdSAndroid Build Coastguard Worker#include <linux/blkdev.h>
273*387f9dfdSAndroid Build Coastguard Workerint trace_entry(struct pt_regs *ctx, struct request *req) {
274*387f9dfdSAndroid Build Coastguard Worker    if (!(req->bio->bi_flags & 1))
275*387f9dfdSAndroid Build Coastguard Worker        return 1;
276*387f9dfdSAndroid Build Coastguard Worker    if (((req->bio->bi_flags)))
277*387f9dfdSAndroid Build Coastguard Worker        return 1;
278*387f9dfdSAndroid Build Coastguard Worker    return 0;
279*387f9dfdSAndroid Build Coastguard Worker}
280*387f9dfdSAndroid Build Coastguard Worker]]
281*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text}
282*387f9dfdSAndroid Build Coastguard Worker  local fn = b:load_func("trace_entry", 'BPF_PROG_TYPE_KPROBE')
283*387f9dfdSAndroid Build Coastguard Workerend
284*387f9dfdSAndroid Build Coastguard Worker
285*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_complex_leaf_types()
286*387f9dfdSAndroid Build Coastguard Worker  local text = [[
287*387f9dfdSAndroid Build Coastguard Workerstruct list;
288*387f9dfdSAndroid Build Coastguard Workerstruct list {
289*387f9dfdSAndroid Build Coastguard Worker  struct list *selfp;
290*387f9dfdSAndroid Build Coastguard Worker  struct list *another_selfp;
291*387f9dfdSAndroid Build Coastguard Worker  struct list *selfp_array[2];
292*387f9dfdSAndroid Build Coastguard Worker};
293*387f9dfdSAndroid Build Coastguard Workerstruct empty {
294*387f9dfdSAndroid Build Coastguard Worker};
295*387f9dfdSAndroid Build Coastguard Workerunion emptyu {
296*387f9dfdSAndroid Build Coastguard Worker  struct empty *em1;
297*387f9dfdSAndroid Build Coastguard Worker  struct empty em2;
298*387f9dfdSAndroid Build Coastguard Worker  struct empty em3;
299*387f9dfdSAndroid Build Coastguard Worker  struct empty em4;
300*387f9dfdSAndroid Build Coastguard Worker};
301*387f9dfdSAndroid Build Coastguard WorkerBPF_ARRAY(t1, struct list, 1);
302*387f9dfdSAndroid Build Coastguard WorkerBPF_ARRAY(t2, struct list *, 1);
303*387f9dfdSAndroid Build Coastguard WorkerBPF_ARRAY(t3, union emptyu, 1);
304*387f9dfdSAndroid Build Coastguard Worker]]
305*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text}
306*387f9dfdSAndroid Build Coastguard Worker  local ffi = require("ffi")
307*387f9dfdSAndroid Build Coastguard Worker
308*387f9dfdSAndroid Build Coastguard Worker  -- TODO: ptrs?
309*387f9dfdSAndroid Build Coastguard Worker  assert_equals(ffi.sizeof(b:get_table("t3").c_leaf), 8)
310*387f9dfdSAndroid Build Coastguard Workerend
311*387f9dfdSAndroid Build Coastguard Worker
312*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_cflags()
313*387f9dfdSAndroid Build Coastguard Worker  local text = [[
314*387f9dfdSAndroid Build Coastguard Worker#ifndef MYFLAG
315*387f9dfdSAndroid Build Coastguard Worker#error "MYFLAG not set as expected"
316*387f9dfdSAndroid Build Coastguard Worker#endif
317*387f9dfdSAndroid Build Coastguard Worker]]
318*387f9dfdSAndroid Build Coastguard Worker  local b = BPF:new{text=text, cflags={"-DMYFLAG"}}
319*387f9dfdSAndroid Build Coastguard Workerend
320*387f9dfdSAndroid Build Coastguard Worker
321*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_exported_maps()
322*387f9dfdSAndroid Build Coastguard Worker  local b1 = BPF{text=[[BPF_TABLE_PUBLIC("hash", int, int, table1, 10);]]}
323*387f9dfdSAndroid Build Coastguard Worker  local b2 = BPF{text=[[BPF_TABLE("extern", int, int, table1, 10);]]}
324*387f9dfdSAndroid Build Coastguard Workerend
325*387f9dfdSAndroid Build Coastguard Worker
326*387f9dfdSAndroid Build Coastguard Workerfunction TestClang:test_syntax_error()
327*387f9dfdSAndroid Build Coastguard Worker  assert_error_msg_contains(
328*387f9dfdSAndroid Build Coastguard Worker    "failed to compile BPF module",
329*387f9dfdSAndroid Build Coastguard Worker    BPF.new,
330*387f9dfdSAndroid Build Coastguard Worker    BPF, {text=[[int failure(void *ctx) { if (); return 0; }]]})
331*387f9dfdSAndroid Build Coastguard Workerend
332*387f9dfdSAndroid Build Coastguard Worker
333*387f9dfdSAndroid Build Coastguard Workersuite("TestClang", TestClang)
334