15bb525f4SRobert Mustacchi /*
25bb525f4SRobert Mustacchi  * This file and its contents are supplied under the terms of the
35bb525f4SRobert Mustacchi  * Common Development and Distribution License ("CDDL"), version 1.0.
45bb525f4SRobert Mustacchi  * You may only use this file in accordance with the terms of version
55bb525f4SRobert Mustacchi  * 1.0 of the CDDL.
65bb525f4SRobert Mustacchi  *
75bb525f4SRobert Mustacchi  * A full copy of the text of the CDDL should have accompanied this
85bb525f4SRobert Mustacchi  * source.  A copy of the CDDL is also available via the Internet at
95bb525f4SRobert Mustacchi  * http://www.illumos.org/license/CDDL.
105bb525f4SRobert Mustacchi  */
115bb525f4SRobert Mustacchi 
125bb525f4SRobert Mustacchi /*
13fe2dc8bdSJohn Levon  * Copyright 2020 Joyent, Inc.
145bb525f4SRobert Mustacchi  */
155bb525f4SRobert Mustacchi 
165bb525f4SRobert Mustacchi #ifndef _CHECK_COMMON_H
175bb525f4SRobert Mustacchi #define	_CHECK_COMMON_H
185bb525f4SRobert Mustacchi 
195bb525f4SRobert Mustacchi /*
205bb525f4SRobert Mustacchi  * Common definitions for the CTF tests
215bb525f4SRobert Mustacchi  */
225bb525f4SRobert Mustacchi 
235bb525f4SRobert Mustacchi #include <stdlib.h>
245bb525f4SRobert Mustacchi #include <unistd.h>
255bb525f4SRobert Mustacchi #include <libctf.h>
265bb525f4SRobert Mustacchi #include <err.h>
275bb525f4SRobert Mustacchi #include <strings.h>
285bb525f4SRobert Mustacchi #include <sys/param.h>
295bb525f4SRobert Mustacchi 
305bb525f4SRobert Mustacchi #ifdef __cplusplus
315bb525f4SRobert Mustacchi extern "C" {
325bb525f4SRobert Mustacchi #endif
335bb525f4SRobert Mustacchi 
34*3cec9822SRobert Mustacchi /*
35*3cec9822SRobert Mustacchi  * A set of bits that can be set on tests to indicate that the test should be
36*3cec9822SRobert Mustacchi  * skipped when dealing with a certain compiler. These should be added as
37*3cec9822SRobert Mustacchi  * needed. Right now this is here because of the clang bitfield bug that is
38*3cec9822SRobert Mustacchi  * triggered by check-sou.c.
39*3cec9822SRobert Mustacchi  */
40*3cec9822SRobert Mustacchi typedef enum {
41*3cec9822SRobert Mustacchi 	SKIP_CLANG	= 1 << 0
42*3cec9822SRobert Mustacchi } check_skip_t;
43*3cec9822SRobert Mustacchi 
445bb525f4SRobert Mustacchi typedef struct check_number {
455bb525f4SRobert Mustacchi 	const char *cn_tname;
465bb525f4SRobert Mustacchi 	uint_t cn_kind;
475bb525f4SRobert Mustacchi 	uint_t cn_flags;
485bb525f4SRobert Mustacchi 	uint_t cn_offset;
495bb525f4SRobert Mustacchi 	uint_t cn_size;
50*3cec9822SRobert Mustacchi 	check_skip_t cn_skips;
515bb525f4SRobert Mustacchi } check_number_t;
525bb525f4SRobert Mustacchi 
535bb525f4SRobert Mustacchi typedef struct check_symbol {
545bb525f4SRobert Mustacchi 	const char *cs_symbol;
555bb525f4SRobert Mustacchi 	const char *cs_type;
565bb525f4SRobert Mustacchi } check_symbol_t;
575bb525f4SRobert Mustacchi 
585bb525f4SRobert Mustacchi typedef struct check_descent {
595bb525f4SRobert Mustacchi 	const char *cd_tname;
605bb525f4SRobert Mustacchi 	uint_t cd_kind;
615bb525f4SRobert Mustacchi 	const char *cd_contents;
625bb525f4SRobert Mustacchi 	uint_t cd_nents;
635bb525f4SRobert Mustacchi } check_descent_t;
645bb525f4SRobert Mustacchi 
655bb525f4SRobert Mustacchi typedef struct check_descent_test {
665bb525f4SRobert Mustacchi 	const char *cdt_sym;
675bb525f4SRobert Mustacchi 	const check_descent_t *cdt_tests;
685bb525f4SRobert Mustacchi } check_descent_test_t;
695bb525f4SRobert Mustacchi 
705bb525f4SRobert Mustacchi typedef struct check_enum {
715bb525f4SRobert Mustacchi 	const char *ce_name;
725bb525f4SRobert Mustacchi 	int64_t ce_value;
735bb525f4SRobert Mustacchi } check_enum_t;
745bb525f4SRobert Mustacchi 
755bb525f4SRobert Mustacchi typedef struct check_enum_test {
765bb525f4SRobert Mustacchi 	const char *cet_type;
775bb525f4SRobert Mustacchi 	const check_enum_t *cet_tests;
785bb525f4SRobert Mustacchi } check_enum_test_t;
795bb525f4SRobert Mustacchi 
805bb525f4SRobert Mustacchi typedef struct check_member {
815bb525f4SRobert Mustacchi 	const char *cm_name;
825bb525f4SRobert Mustacchi 	const char *cm_type;
835bb525f4SRobert Mustacchi 	ulong_t cm_offset;
845bb525f4SRobert Mustacchi } check_member_t;
855bb525f4SRobert Mustacchi 
865bb525f4SRobert Mustacchi typedef struct check_member_test {
875bb525f4SRobert Mustacchi 	const char *cmt_type;
885bb525f4SRobert Mustacchi 	int cmt_kind;
895bb525f4SRobert Mustacchi 	size_t cmt_size;
905bb525f4SRobert Mustacchi 	const check_member_t *cmt_members;
91*3cec9822SRobert Mustacchi 	check_skip_t cmt_skips;
925bb525f4SRobert Mustacchi } check_member_test_t;
935bb525f4SRobert Mustacchi 
945bb525f4SRobert Mustacchi typedef struct check_function_test {
955bb525f4SRobert Mustacchi 	const char *cft_name;
965bb525f4SRobert Mustacchi 	const char *cft_rtype;
975bb525f4SRobert Mustacchi 	uint_t cft_nargs;
985bb525f4SRobert Mustacchi 	uint_t cft_flags;
995bb525f4SRobert Mustacchi 	const char **cft_args;
1005bb525f4SRobert Mustacchi } check_function_test_t;
1015bb525f4SRobert Mustacchi 
102fe2dc8bdSJohn Levon typedef struct check_size_test {
103fe2dc8bdSJohn Levon 	const char *cst_name;
104fe2dc8bdSJohn Levon 	size_t cst_size;
105fe2dc8bdSJohn Levon } check_size_test_t;
106fe2dc8bdSJohn Levon 
1075bb525f4SRobert Mustacchi /*
1085bb525f4SRobert Mustacchi  * Looks up each type and verifies that it matches the expected type.
1095bb525f4SRobert Mustacchi  */
1105bb525f4SRobert Mustacchi extern boolean_t ctftest_check_numbers(ctf_file_t *, const check_number_t *);
1115bb525f4SRobert Mustacchi 
1125bb525f4SRobert Mustacchi /*
1135bb525f4SRobert Mustacchi  * Looks at each symbol specified and verifies that it matches the expected
1145bb525f4SRobert Mustacchi  * type.
1155bb525f4SRobert Mustacchi  */
1165bb525f4SRobert Mustacchi extern boolean_t ctftest_check_symbols(ctf_file_t *, const check_symbol_t *);
1175bb525f4SRobert Mustacchi 
1185bb525f4SRobert Mustacchi /*
1195bb525f4SRobert Mustacchi  * Given a symbol name which refers to a type, walks all the references of that
1205bb525f4SRobert Mustacchi  * type and checks against it with each subsequent entry.
1215bb525f4SRobert Mustacchi  */
1225bb525f4SRobert Mustacchi extern boolean_t ctftest_check_descent(const char *, ctf_file_t *,
1236ef284f1SJohn Levon     const check_descent_t *, boolean_t);
1245bb525f4SRobert Mustacchi 
1255bb525f4SRobert Mustacchi /*
1265bb525f4SRobert Mustacchi  * Checks that all of the listed members of an enum are present and have the
1275bb525f4SRobert Mustacchi  * right values.
1285bb525f4SRobert Mustacchi  */
1295bb525f4SRobert Mustacchi extern boolean_t ctftest_check_enum(const char *, ctf_file_t *,
1305bb525f4SRobert Mustacchi     const check_enum_t *);
1315bb525f4SRobert Mustacchi 
1325bb525f4SRobert Mustacchi /*
1335bb525f4SRobert Mustacchi  * Checks that all of the members of a structure or union are present and have
1345bb525f4SRobert Mustacchi  * the right types and byte offsets. This can be used for either structures or
1355bb525f4SRobert Mustacchi  * unions.
1365bb525f4SRobert Mustacchi  */
1375bb525f4SRobert Mustacchi extern boolean_t ctftest_check_members(const char *, ctf_file_t *, int, size_t,
1385bb525f4SRobert Mustacchi     const check_member_t *);
1395bb525f4SRobert Mustacchi 
1405bb525f4SRobert Mustacchi /*
1415bb525f4SRobert Mustacchi  * Check that the named function or function pointer has the correct return
1425bb525f4SRobert Mustacchi  * type, arguments, and function flags.
1435bb525f4SRobert Mustacchi  */
1445bb525f4SRobert Mustacchi extern boolean_t ctftest_check_function(const char *, ctf_file_t *,
1455bb525f4SRobert Mustacchi     const char *, uint_t, uint_t, const char **);
1465bb525f4SRobert Mustacchi extern boolean_t ctftest_check_fptr(const char *, ctf_file_t *,
1475bb525f4SRobert Mustacchi     const char *, uint_t, uint_t, const char **);
1485bb525f4SRobert Mustacchi 
149fe2dc8bdSJohn Levon /*
150fe2dc8bdSJohn Levon  * Check size of types.
151fe2dc8bdSJohn Levon  */
152fe2dc8bdSJohn Levon extern boolean_t ctftest_check_size(const char *, ctf_file_t *, size_t);
153fe2dc8bdSJohn Levon 
1545bb525f4SRobert Mustacchi /*
1555bb525f4SRobert Mustacchi  * Determine whether or not we have a duplicate type or not based on its name.
1565bb525f4SRobert Mustacchi  */
1575bb525f4SRobert Mustacchi extern boolean_t ctftest_duplicates(ctf_file_t *);
1585bb525f4SRobert Mustacchi 
159*3cec9822SRobert Mustacchi /*
160*3cec9822SRobert Mustacchi  * Determine whether or not we should skip a given test.
161*3cec9822SRobert Mustacchi  */
162*3cec9822SRobert Mustacchi extern boolean_t ctftest_skip(check_skip_t);
163*3cec9822SRobert Mustacchi 
1645bb525f4SRobert Mustacchi #ifdef __cplusplus
1655bb525f4SRobert Mustacchi }
1665bb525f4SRobert Mustacchi #endif
1675bb525f4SRobert Mustacchi 
1685bb525f4SRobert Mustacchi #endif /* _CHECK_COMMON_H */
169