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