xref: /illumos-gate/usr/src/test/util-tests/tests/ctf/check-common.h (revision 8b184c19c5f61fa8890900f7bab686bf19b543d3)
1 /*
2  * This file and its contents are supplied under the terms of the
3  * Common Development and Distribution License ("CDDL"), version 1.0.
4  * You may only use this file in accordance with the terms of version
5  * 1.0 of the CDDL.
6  *
7  * A full copy of the text of the CDDL should have accompanied this
8  * source.  A copy of the CDDL is also available via the Internet at
9  * http://www.illumos.org/license/CDDL.
10  */
11 
12 /*
13  * Copyright 2020 Joyent, Inc.
14  */
15 
16 #ifndef _CHECK_COMMON_H
17 #define	_CHECK_COMMON_H
18 
19 /*
20  * Common definitions for the CTF tests
21  */
22 
23 #include <stdlib.h>
24 #include <unistd.h>
25 #include <libctf.h>
26 #include <err.h>
27 #include <strings.h>
28 #include <sys/param.h>
29 
30 #ifdef __cplusplus
31 extern "C" {
32 #endif
33 
34 /*
35  * A set of bits that can be set on tests to indicate that the test should be
36  * skipped when dealing with a certain compiler. These should be added as
37  * needed. Right now this is here because of the clang bitfield bug that is
38  * triggered by check-sou.c.
39  */
40 typedef enum {
41 	SKIP_CLANG	= 1 << 0
42 } check_skip_t;
43 
44 typedef struct check_number {
45 	const char *cn_tname;
46 	uint_t cn_kind;
47 	uint_t cn_flags;
48 	uint_t cn_offset;
49 	uint_t cn_size;
50 	check_skip_t cn_skips;
51 } check_number_t;
52 
53 typedef struct check_symbol {
54 	const char *cs_symbol;
55 	const char *cs_type;
56 } check_symbol_t;
57 
58 typedef struct check_descent {
59 	const char *cd_tname;
60 	uint_t cd_kind;
61 	const char *cd_contents;
62 	uint_t cd_nents;
63 } check_descent_t;
64 
65 typedef struct check_descent_test {
66 	const char *cdt_sym;
67 	const check_descent_t *cdt_tests;
68 } check_descent_test_t;
69 
70 typedef struct check_enum {
71 	const char *ce_name;
72 	int64_t ce_value;
73 } check_enum_t;
74 
75 typedef struct check_enum_test {
76 	const char *cet_type;
77 	const check_enum_t *cet_tests;
78 } check_enum_test_t;
79 
80 typedef struct check_member {
81 	const char *cm_name;
82 	const char *cm_type;
83 	ulong_t cm_offset;
84 } check_member_t;
85 
86 typedef struct check_member_test {
87 	const char *cmt_type;
88 	int cmt_kind;
89 	size_t cmt_size;
90 	const check_member_t *cmt_members;
91 	check_skip_t cmt_skips;
92 } check_member_test_t;
93 
94 typedef struct check_function_test {
95 	const char *cft_name;
96 	const char *cft_rtype;
97 	uint_t cft_nargs;
98 	uint_t cft_flags;
99 	const char **cft_args;
100 } check_function_test_t;
101 
102 typedef struct check_size_test {
103 	const char *cst_name;
104 	size_t cst_size;
105 } check_size_test_t;
106 
107 /*
108  * Looks up each type and verifies that it matches the expected type.
109  */
110 extern boolean_t ctftest_check_numbers(ctf_file_t *, const check_number_t *);
111 
112 /*
113  * Looks at each symbol specified and verifies that it matches the expected
114  * type.
115  */
116 extern boolean_t ctftest_check_symbols(ctf_file_t *, const check_symbol_t *);
117 
118 /*
119  * Given a symbol name which refers to a type, walks all the references of that
120  * type and checks against it with each subsequent entry.
121  */
122 extern boolean_t ctftest_check_descent(const char *, ctf_file_t *,
123     const check_descent_t *, boolean_t);
124 
125 /*
126  * Checks that all of the listed members of an enum are present and have the
127  * right values.
128  */
129 extern boolean_t ctftest_check_enum(const char *, ctf_file_t *,
130     const check_enum_t *);
131 
132 /*
133  * Checks that all of the members of a structure or union are present and have
134  * the right types and byte offsets. This can be used for either structures or
135  * unions. The second version of this instead uses ctf_member_info() to look at
136  * and evaluate that function.
137  */
138 extern boolean_t ctftest_check_members(const char *, ctf_file_t *, int, size_t,
139     const check_member_t *);
140 extern boolean_t ctftest_check_member_info(const char *, ctf_file_t *, int,
141     size_t, const check_member_t *);
142 
143 /*
144  * Check that the named function or function pointer has the correct return
145  * type, arguments, and function flags.
146  */
147 extern boolean_t ctftest_check_function(const char *, ctf_file_t *,
148     const char *, uint_t, uint_t, const char **);
149 extern boolean_t ctftest_check_fptr(const char *, ctf_file_t *,
150     const char *, uint_t, uint_t, const char **);
151 
152 /*
153  * Check size of types.
154  */
155 extern boolean_t ctftest_check_size(const char *, ctf_file_t *, size_t);
156 
157 /*
158  * Determine whether or not we have a duplicate type or not based on its name.
159  */
160 extern boolean_t ctftest_duplicates(ctf_file_t *);
161 
162 /*
163  * Determine whether or not we should skip a given test.
164  */
165 extern boolean_t ctftest_skip(check_skip_t);
166 
167 #ifdef __cplusplus
168 }
169 #endif
170 
171 #endif /* _CHECK_COMMON_H */
172