1 | // SPDX-License-Identifier: GPL-2.0 |
2 | |
3 | #include <stdio.h> |
4 | #include <string.h> |
5 | #include <sdt.h> |
6 | |
7 | #define __PASTE(a, b) a##b |
8 | #define PASTE(a, b) __PASTE(a, b) |
9 | |
10 | #define NAME(name, idx) PASTE(name, idx) |
11 | |
12 | #define DEF(name, idx) int NAME(name, idx)(void) { return 0; } |
13 | #define CALL(name, idx) NAME(name, idx)(); |
14 | |
15 | #define F(body, name, idx) body(name, idx) |
16 | |
17 | #define F10(body, name, idx) \ |
18 | F(body, PASTE(name, idx), 0) F(body, PASTE(name, idx), 1) F(body, PASTE(name, idx), 2) \ |
19 | F(body, PASTE(name, idx), 3) F(body, PASTE(name, idx), 4) F(body, PASTE(name, idx), 5) \ |
20 | F(body, PASTE(name, idx), 6) F(body, PASTE(name, idx), 7) F(body, PASTE(name, idx), 8) \ |
21 | F(body, PASTE(name, idx), 9) |
22 | |
23 | #define F100(body, name, idx) \ |
24 | F10(body, PASTE(name, idx), 0) F10(body, PASTE(name, idx), 1) F10(body, PASTE(name, idx), 2) \ |
25 | F10(body, PASTE(name, idx), 3) F10(body, PASTE(name, idx), 4) F10(body, PASTE(name, idx), 5) \ |
26 | F10(body, PASTE(name, idx), 6) F10(body, PASTE(name, idx), 7) F10(body, PASTE(name, idx), 8) \ |
27 | F10(body, PASTE(name, idx), 9) |
28 | |
29 | #define F1000(body, name, idx) \ |
30 | F100(body, PASTE(name, idx), 0) F100(body, PASTE(name, idx), 1) F100(body, PASTE(name, idx), 2) \ |
31 | F100(body, PASTE(name, idx), 3) F100(body, PASTE(name, idx), 4) F100(body, PASTE(name, idx), 5) \ |
32 | F100(body, PASTE(name, idx), 6) F100(body, PASTE(name, idx), 7) F100(body, PASTE(name, idx), 8) \ |
33 | F100(body, PASTE(name, idx), 9) |
34 | |
35 | #define F10000(body, name, idx) \ |
36 | F1000(body, PASTE(name, idx), 0) F1000(body, PASTE(name, idx), 1) F1000(body, PASTE(name, idx), 2) \ |
37 | F1000(body, PASTE(name, idx), 3) F1000(body, PASTE(name, idx), 4) F1000(body, PASTE(name, idx), 5) \ |
38 | F1000(body, PASTE(name, idx), 6) F1000(body, PASTE(name, idx), 7) F1000(body, PASTE(name, idx), 8) \ |
39 | F1000(body, PASTE(name, idx), 9) |
40 | |
41 | F10000(DEF, uprobe_multi_func_, 0) |
42 | F10000(DEF, uprobe_multi_func_, 1) |
43 | F10000(DEF, uprobe_multi_func_, 2) |
44 | F10000(DEF, uprobe_multi_func_, 3) |
45 | F10000(DEF, uprobe_multi_func_, 4) |
46 | |
47 | static int bench(void) |
48 | { |
49 | F10000(CALL, uprobe_multi_func_, 0) |
50 | F10000(CALL, uprobe_multi_func_, 1) |
51 | F10000(CALL, uprobe_multi_func_, 2) |
52 | F10000(CALL, uprobe_multi_func_, 3) |
53 | F10000(CALL, uprobe_multi_func_, 4) |
54 | return 0; |
55 | } |
56 | |
57 | #define PROBE STAP_PROBE(test, usdt); |
58 | |
59 | #define PROBE10 PROBE PROBE PROBE PROBE PROBE \ |
60 | PROBE PROBE PROBE PROBE PROBE |
61 | #define PROBE100 PROBE10 PROBE10 PROBE10 PROBE10 PROBE10 \ |
62 | PROBE10 PROBE10 PROBE10 PROBE10 PROBE10 |
63 | #define PROBE1000 PROBE100 PROBE100 PROBE100 PROBE100 PROBE100 \ |
64 | PROBE100 PROBE100 PROBE100 PROBE100 PROBE100 |
65 | #define PROBE10000 PROBE1000 PROBE1000 PROBE1000 PROBE1000 PROBE1000 \ |
66 | PROBE1000 PROBE1000 PROBE1000 PROBE1000 PROBE1000 |
67 | |
68 | static int usdt(void) |
69 | { |
70 | PROBE10000 |
71 | PROBE10000 |
72 | PROBE10000 |
73 | PROBE10000 |
74 | PROBE10000 |
75 | return 0; |
76 | } |
77 | |
78 | int main(int argc, char **argv) |
79 | { |
80 | if (argc != 2) |
81 | goto error; |
82 | |
83 | if (!strcmp("bench" , argv[1])) |
84 | return bench(); |
85 | if (!strcmp("usdt" , argv[1])) |
86 | return usdt(); |
87 | |
88 | error: |
89 | fprintf(stderr, "usage: %s <bench|usdt>\n" , argv[0]); |
90 | return -1; |
91 | } |
92 | |