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 /*
136ef284f1SJohn Levon  * Copyright 2019, Joyent, Inc.
145bb525f4SRobert Mustacchi  */
155bb525f4SRobert Mustacchi 
165bb525f4SRobert Mustacchi /*
175bb525f4SRobert Mustacchi  * Check that we properly handle structures and unions.
185bb525f4SRobert Mustacchi  */
195bb525f4SRobert Mustacchi 
205bb525f4SRobert Mustacchi #include "check-common.h"
215bb525f4SRobert Mustacchi 
225bb525f4SRobert Mustacchi static check_number_t check_bitfields[] = {
235bb525f4SRobert Mustacchi #ifdef	TARGET_LP64
245bb525f4SRobert Mustacchi 	{ "unsigned long:1", CTF_K_INTEGER, 0, 0, 1 },
255bb525f4SRobert Mustacchi 	{ "unsigned long:2", CTF_K_INTEGER,  0, 0, 2 },
265bb525f4SRobert Mustacchi 	{ "unsigned long:4", CTF_K_INTEGER,  0, 0, 4 },
275bb525f4SRobert Mustacchi 	{ "unsigned long:5", CTF_K_INTEGER,  0, 0, 5 },
285bb525f4SRobert Mustacchi 	{ "unsigned long:8", CTF_K_INTEGER,  0, 0, 8 },
295bb525f4SRobert Mustacchi 	{ "unsigned long:16", CTF_K_INTEGER,  0, 0, 16 },
305bb525f4SRobert Mustacchi 	{ "unsigned long:19", CTF_K_INTEGER,  0, 0, 19 },
315bb525f4SRobert Mustacchi 	{ "unsigned long:32", CTF_K_INTEGER,  0, 0, 32 },
325bb525f4SRobert Mustacchi #else
335bb525f4SRobert Mustacchi 	{ "unsigned long long:1", CTF_K_INTEGER, 0, 0, 1 },
345bb525f4SRobert Mustacchi 	{ "unsigned long long:2", CTF_K_INTEGER,  0, 0, 2 },
355bb525f4SRobert Mustacchi 	{ "unsigned long long:4", CTF_K_INTEGER,  0, 0, 4 },
365bb525f4SRobert Mustacchi 	{ "unsigned long long:5", CTF_K_INTEGER,  0, 0, 5 },
375bb525f4SRobert Mustacchi 	{ "unsigned long long:8", CTF_K_INTEGER,  0, 0, 8 },
385bb525f4SRobert Mustacchi 	{ "unsigned long long:16", CTF_K_INTEGER,  0, 0, 16 },
395bb525f4SRobert Mustacchi 	{ "unsigned long long:19", CTF_K_INTEGER,  0, 0, 19 },
405bb525f4SRobert Mustacchi 	{ "unsigned long long:32", CTF_K_INTEGER,  0, 0, 32 },
415bb525f4SRobert Mustacchi #endif
425bb525f4SRobert Mustacchi 	{ "unsigned short:1", CTF_K_INTEGER, 0, 0, 1 },
435bb525f4SRobert Mustacchi 	{ "unsigned int:7", CTF_K_INTEGER, 0, 0, 7 },
44*3cec9822SRobert Mustacchi 	/*
45*3cec9822SRobert Mustacchi 	 * Skipped on clang as it doesn't process csts correctly. See
46*3cec9822SRobert Mustacchi 	 * check_members_csts.
47*3cec9822SRobert Mustacchi 	 */
48*3cec9822SRobert Mustacchi 	{ "unsigned int:32", CTF_K_INTEGER, 0, 0, 32, SKIP_CLANG },
495bb525f4SRobert Mustacchi 	{ "int:3", CTF_K_INTEGER, CTF_INT_SIGNED, 0, 3 },
505bb525f4SRobert Mustacchi 	{ NULL }
515bb525f4SRobert Mustacchi };
525bb525f4SRobert Mustacchi 
535bb525f4SRobert Mustacchi static check_symbol_t check_syms[] = {
545bb525f4SRobert Mustacchi 	{ "foo", "struct foo" },
555bb525f4SRobert Mustacchi 	{ "head", "nlist_t" },
565bb525f4SRobert Mustacchi 	{ "forward", "const forward_t" },
575bb525f4SRobert Mustacchi 	{ "oot", "struct round_up" },
585bb525f4SRobert Mustacchi 	{ "botw", "struct fixed_up" },
595bb525f4SRobert Mustacchi 	{ "sophie", "struct mysterious_barrel" },
605bb525f4SRobert Mustacchi 	{ "ayesha", "struct dusk_barrel" },
615bb525f4SRobert Mustacchi 	{ "stats", "struct stats" },
625bb525f4SRobert Mustacchi 	{ "ring", "struct fellowship" },
635bb525f4SRobert Mustacchi 	{ "rings", "struct rings" },
645bb525f4SRobert Mustacchi 	{ "nvme", "struct csts" },
655bb525f4SRobert Mustacchi 	{ "games", "union jrpg" },
665bb525f4SRobert Mustacchi 	{ "nier", "union nier" },
675bb525f4SRobert Mustacchi 	{ "kh", "union kh" },
685bb525f4SRobert Mustacchi 	{ "ct", "struct trigger" },
695bb525f4SRobert Mustacchi 	{ "regress", "const union regress [9]" },
705bb525f4SRobert Mustacchi 	{ NULL }
715bb525f4SRobert Mustacchi };
725bb525f4SRobert Mustacchi 
735bb525f4SRobert Mustacchi static check_member_t check_member_foo[] = {
745bb525f4SRobert Mustacchi 	{ "a", "int", 0 },
755bb525f4SRobert Mustacchi 	{ "b", "float", 4 * NBBY },
765bb525f4SRobert Mustacchi 	{ "c", "const char *", 8 * NBBY },
775bb525f4SRobert Mustacchi 	{ NULL }
785bb525f4SRobert Mustacchi };
795bb525f4SRobert Mustacchi 
805bb525f4SRobert Mustacchi static check_member_t check_member_node[] = {
815bb525f4SRobert Mustacchi 	{ "prev", "struct node *", 0 },
825bb525f4SRobert Mustacchi #ifdef	TARGET_LP64
835bb525f4SRobert Mustacchi 	{ "next", "struct node *", 8 * NBBY },
845bb525f4SRobert Mustacchi #else
855bb525f4SRobert Mustacchi 	{ "next", "struct node *", 4 * NBBY },
865bb525f4SRobert Mustacchi #endif
875bb525f4SRobert Mustacchi 	{ NULL }
885bb525f4SRobert Mustacchi };
895bb525f4SRobert Mustacchi 
905bb525f4SRobert Mustacchi static check_member_t check_member_nlist[] = {
915bb525f4SRobert Mustacchi 	{ "size", "size_t", 0 },
925bb525f4SRobert Mustacchi #ifdef	TARGET_LP64
935bb525f4SRobert Mustacchi 	{ "off", "size_t", 8 * NBBY },
945bb525f4SRobert Mustacchi 	{ "head", "struct node", 16 * NBBY },
955bb525f4SRobert Mustacchi #else
965bb525f4SRobert Mustacchi 	{ "off", "size_t", 4 * NBBY },
975bb525f4SRobert Mustacchi 	{ "head", "struct node", 8 * NBBY },
985bb525f4SRobert Mustacchi #endif
995bb525f4SRobert Mustacchi 	{ NULL }
1005bb525f4SRobert Mustacchi };
1015bb525f4SRobert Mustacchi 
1025bb525f4SRobert Mustacchi static check_member_t check_member_forward[] = {
1035bb525f4SRobert Mustacchi 	{ "past", "void *", 0 },
1045bb525f4SRobert Mustacchi #ifdef	TARGET_LP64
1055bb525f4SRobert Mustacchi 	{ "present", "void *", 8 * NBBY },
1065bb525f4SRobert Mustacchi 	{ "future", "void *", 16 * NBBY },
1075bb525f4SRobert Mustacchi #else
1085bb525f4SRobert Mustacchi 	{ "present", "void *", 4 * NBBY },
1095bb525f4SRobert Mustacchi 	{ "future", "void *", 8 * NBBY },
1105bb525f4SRobert Mustacchi #endif
1115bb525f4SRobert Mustacchi 	{ NULL }
1125bb525f4SRobert Mustacchi };
1135bb525f4SRobert Mustacchi 
1145bb525f4SRobert Mustacchi static check_member_t check_member_round_up[] = {
1155bb525f4SRobert Mustacchi 	{ "triforce", "uint8_t", 0 },
1165bb525f4SRobert Mustacchi 	{ "link", "uint32_t", 4 * NBBY },
1175bb525f4SRobert Mustacchi 	{ "zelda", "uint8_t", 8 * NBBY },
1185bb525f4SRobert Mustacchi 	{ "ganon", "uint8_t", 9 * NBBY },
1195bb525f4SRobert Mustacchi 	{ NULL }
1205bb525f4SRobert Mustacchi };
1215bb525f4SRobert Mustacchi 
1225bb525f4SRobert Mustacchi static check_member_t check_member_fixed_up[] = {
1235bb525f4SRobert Mustacchi 	{ "triforce", "uint8_t", 0 },
1245bb525f4SRobert Mustacchi 	{ "link", "uint32_t", 1 * NBBY },
1255bb525f4SRobert Mustacchi 	{ "zelda", "uint8_t", 5 * NBBY },
1265bb525f4SRobert Mustacchi 	{ "ganon", "uint8_t", 6 * NBBY },
1275bb525f4SRobert Mustacchi 	{ NULL }
1285bb525f4SRobert Mustacchi };
1295bb525f4SRobert Mustacchi 
1305bb525f4SRobert Mustacchi #ifdef	TARGET_LP64
1315bb525f4SRobert Mustacchi static check_member_t check_member_component[] = {
1325bb525f4SRobert Mustacchi 	{ "m", "enum material", 0 },
1335bb525f4SRobert Mustacchi 	{ "grade", "uint64_t", 8 * NBBY },
1345bb525f4SRobert Mustacchi 	{ "count", "uint64_t", 16 * NBBY },
1355bb525f4SRobert Mustacchi 	{ "locations", "const char *[4]", 24 * NBBY },
1365bb525f4SRobert Mustacchi 	{ NULL }
1375bb525f4SRobert Mustacchi };
1385bb525f4SRobert Mustacchi 
1395bb525f4SRobert Mustacchi static check_member_t check_member_mysterious[] = {
1405bb525f4SRobert Mustacchi 	{ "name", "const char *", 0 },
1415bb525f4SRobert Mustacchi 	{ "capacity", "size_t", 8 * NBBY },
1425bb525f4SRobert Mustacchi 	{ "optional", "struct component [0]", 16 * NBBY },
1435bb525f4SRobert Mustacchi 	{ NULL }
1445bb525f4SRobert Mustacchi };
1455bb525f4SRobert Mustacchi 
1465bb525f4SRobert Mustacchi static check_member_t check_member_dusk[] = {
1475bb525f4SRobert Mustacchi 	{ "name", "const char *", 0 },
1485bb525f4SRobert Mustacchi 	{ "opacity", "size_t", 8 * NBBY },
1495bb525f4SRobert Mustacchi 	{ "optional", "struct component [0]", 16 * NBBY },
1505bb525f4SRobert Mustacchi 	{ NULL }
1515bb525f4SRobert Mustacchi };
1525bb525f4SRobert Mustacchi 
1535bb525f4SRobert Mustacchi 
1545bb525f4SRobert Mustacchi static check_member_t check_member_stats[] = {
1555bb525f4SRobert Mustacchi 	{ "hp", "unsigned long:16", 0 },
1565bb525f4SRobert Mustacchi 	{ "mp", "unsigned long:16", 16 },
1575bb525f4SRobert Mustacchi 	{ "str", "unsigned long:8", 32 },
1585bb525f4SRobert Mustacchi 	{ "dex", "unsigned long:4", 40 },
1595bb525f4SRobert Mustacchi 	{ "con", "unsigned long:1", 44 },
1605bb525f4SRobert Mustacchi 	{ "inte", "unsigned long:2", 45 },
1615bb525f4SRobert Mustacchi 	{ "wis", "unsigned long:1", 47 },
1625bb525f4SRobert Mustacchi 	{ "cha", "unsigned long:4", 48 },
1635bb525f4SRobert Mustacchi 	{ "sanity", "unsigned long:1", 52 },
1645bb525f4SRobert Mustacchi 	{ "attack", "unsigned long:2", 53 },
1655bb525f4SRobert Mustacchi 	{ "mattack", "unsigned long:1", 55 },
1665bb525f4SRobert Mustacchi 	{ "defense", "unsigned long:8", 56 },
1675bb525f4SRobert Mustacchi 	{ "mdefense", "unsigned long:32", 64 },
1685bb525f4SRobert Mustacchi 	{ "evasion", "unsigned long:8", 96 },
1695bb525f4SRobert Mustacchi 	{ "crit", "unsigned long:5", 104 },
1705bb525f4SRobert Mustacchi 	{ "luck", "unsigned long:19", 109 },
1715bb525f4SRobert Mustacchi 	{ NULL }
1725bb525f4SRobert Mustacchi };
1735bb525f4SRobert Mustacchi #else
1745bb525f4SRobert Mustacchi static check_member_t check_member_component[] = {
1755bb525f4SRobert Mustacchi 	{ "m", "enum material", 0 },
1765bb525f4SRobert Mustacchi 	{ "grade", "uint64_t", 4 * NBBY },
1775bb525f4SRobert Mustacchi 	{ "count", "uint64_t", 12 * NBBY },
1785bb525f4SRobert Mustacchi 	{ "locations", "const char *[4]", 20 * NBBY },
1795bb525f4SRobert Mustacchi 	{ NULL }
1805bb525f4SRobert Mustacchi };
1815bb525f4SRobert Mustacchi 
1825bb525f4SRobert Mustacchi static check_member_t check_member_mysterious[] = {
1835bb525f4SRobert Mustacchi 	{ "name", "const char *", 0 },
1845bb525f4SRobert Mustacchi 	{ "capacity", "size_t", 4 * NBBY },
1855bb525f4SRobert Mustacchi 	{ "optional", "struct component [0]", 8 * NBBY },
1865bb525f4SRobert Mustacchi 	{ NULL }
1875bb525f4SRobert Mustacchi };
1885bb525f4SRobert Mustacchi 
1895bb525f4SRobert Mustacchi static check_member_t check_member_dusk[] = {
1905bb525f4SRobert Mustacchi 	{ "name", "const char *", 0 },
1915bb525f4SRobert Mustacchi 	{ "opacity", "size_t", 4 * NBBY },
1925bb525f4SRobert Mustacchi 	{ "optional", "struct component [0]", 8 * NBBY },
1935bb525f4SRobert Mustacchi 	{ NULL }
1945bb525f4SRobert Mustacchi };
1955bb525f4SRobert Mustacchi 
1965bb525f4SRobert Mustacchi 
1975bb525f4SRobert Mustacchi static check_member_t check_member_stats[] = {
1985bb525f4SRobert Mustacchi 	{ "hp", "unsigned long long:16", 0 },
1995bb525f4SRobert Mustacchi 	{ "mp", "unsigned long long:16", 16 },
2005bb525f4SRobert Mustacchi 	{ "str", "unsigned long long:8", 32 },
2015bb525f4SRobert Mustacchi 	{ "dex", "unsigned long long:4", 40 },
2025bb525f4SRobert Mustacchi 	{ "con", "unsigned long long:1", 44 },
2035bb525f4SRobert Mustacchi 	{ "inte", "unsigned long long:2", 45 },
2045bb525f4SRobert Mustacchi 	{ "wis", "unsigned long long:1", 47 },
2055bb525f4SRobert Mustacchi 	{ "cha", "unsigned long long:4", 48 },
2065bb525f4SRobert Mustacchi 	{ "sanity", "unsigned long long:1", 52 },
2075bb525f4SRobert Mustacchi 	{ "attack", "unsigned long long:2", 53 },
2085bb525f4SRobert Mustacchi 	{ "mattack", "unsigned long long:1", 55 },
2095bb525f4SRobert Mustacchi 	{ "defense", "unsigned long long:8", 56 },
2105bb525f4SRobert Mustacchi 	{ "mdefense", "unsigned long long:32", 64 },
2115bb525f4SRobert Mustacchi 	{ "evasion", "unsigned long long:8", 96 },
2125bb525f4SRobert Mustacchi 	{ "crit", "unsigned long long:5", 104 },
2135bb525f4SRobert Mustacchi 	{ "luck", "unsigned long long:19", 109 },
2145bb525f4SRobert Mustacchi 	{ NULL }
2155bb525f4SRobert Mustacchi };
2165bb525f4SRobert Mustacchi #endif
2175bb525f4SRobert Mustacchi 
2185bb525f4SRobert Mustacchi static check_member_t check_member_fellowship[] = {
2195bb525f4SRobert Mustacchi 	{ "frodo", "unsigned short:1", 0 },
2205bb525f4SRobert Mustacchi 	{ "sam", "unsigned short:1", 1 },
2215bb525f4SRobert Mustacchi 	{ "merry", "unsigned short:1", 2 },
2225bb525f4SRobert Mustacchi 	{ "pippin", "unsigned short:1", 3 },
2235bb525f4SRobert Mustacchi 	{ "aragorn", "unsigned short:1", 4 },
2245bb525f4SRobert Mustacchi 	{ "boromir", "unsigned short:1", 5 },
2255bb525f4SRobert Mustacchi 	{ "legolas", "unsigned short:1", 6 },
2265bb525f4SRobert Mustacchi 	{ "gimli", "unsigned short:1", 7 },
2275bb525f4SRobert Mustacchi 	{ "gandalf", "unsigned short:1", 8 },
2285bb525f4SRobert Mustacchi 	{ NULL }
2295bb525f4SRobert Mustacchi };
2305bb525f4SRobert Mustacchi 
2315bb525f4SRobert Mustacchi static check_member_t check_member_rings[] = {
2325bb525f4SRobert Mustacchi 	{ "elves", "unsigned int:3", 0 },
2335bb525f4SRobert Mustacchi 	{ "dwarves", "unsigned int:7", 3 },
2345bb525f4SRobert Mustacchi 	{ "men", "unsigned int:9", 10 },
2355bb525f4SRobert Mustacchi 	{ "one", "uint8_t", 3 * NBBY },
2365bb525f4SRobert Mustacchi 	{ "silmarils", "uint8_t [3]", 4 * NBBY },
2375bb525f4SRobert Mustacchi 	{ NULL }
2385bb525f4SRobert Mustacchi };
2395bb525f4SRobert Mustacchi 
240*3cec9822SRobert Mustacchi /*
241*3cec9822SRobert Mustacchi  * Unfortunately this test case fails with clang in at least versions 8-10. See
242*3cec9822SRobert Mustacchi  * https://bugs.llvm.org/show_bug.cgi?id=44601 for more information on the bug.
243*3cec9822SRobert Mustacchi  */
2445bb525f4SRobert Mustacchi static check_member_t check_member_csts[] = {
2455bb525f4SRobert Mustacchi 	{ "rdy", "unsigned int:7", 0 },
2465bb525f4SRobert Mustacchi 	{ "csts", "unsigned int:32", 7 },
2475bb525f4SRobert Mustacchi 	{ NULL }
2485bb525f4SRobert Mustacchi };
2495bb525f4SRobert Mustacchi 
2505bb525f4SRobert Mustacchi static check_member_t check_member_jrpg[] = {
2515bb525f4SRobert Mustacchi 	{ "ff", "int", 0 },
2525bb525f4SRobert Mustacchi 	{ "atelier", "double [4]", 0 },
2535bb525f4SRobert Mustacchi 	{ "tales", "const char *", 0 },
2545bb525f4SRobert Mustacchi 	{ "chrono", "int (*)()", 0 },
2555bb525f4SRobert Mustacchi 	{ "xeno", "struct rings", 0 },
2565bb525f4SRobert Mustacchi 	{ NULL }
2575bb525f4SRobert Mustacchi };
2585bb525f4SRobert Mustacchi 
2595bb525f4SRobert Mustacchi static check_member_t check_member_android[] = {
2605bb525f4SRobert Mustacchi 	{ "_2b", "unsigned int:16", 0 },
2615bb525f4SRobert Mustacchi 	{ "_9s", "unsigned int:16", 16 },
2625bb525f4SRobert Mustacchi 	{ NULL }
2635bb525f4SRobert Mustacchi };
2645bb525f4SRobert Mustacchi 
2655bb525f4SRobert Mustacchi static check_member_t check_member_nier[] = {
2665bb525f4SRobert Mustacchi 	{ "automata", "uint32_t", 0 },
2675bb525f4SRobert Mustacchi 	{ "android", "struct android", 0 },
2685bb525f4SRobert Mustacchi 	{ NULL }
2695bb525f4SRobert Mustacchi };
2705bb525f4SRobert Mustacchi 
2715bb525f4SRobert Mustacchi static check_member_t check_member_kh[] = {
2725bb525f4SRobert Mustacchi 	{ "sora", "int:3", 0 },
2735bb525f4SRobert Mustacchi 	{ "riku", "char:7", 0 },
2745bb525f4SRobert Mustacchi 	{ "kairi", "double", 0 },
2755bb525f4SRobert Mustacchi 	{ "namine", "complex double", 0 },
2765bb525f4SRobert Mustacchi 	{ NULL }
2775bb525f4SRobert Mustacchi };
2785bb525f4SRobert Mustacchi 
2795bb525f4SRobert Mustacchi static check_member_t check_member_trigger[] = {
2805bb525f4SRobert Mustacchi 	{ "chrono", "uint8_t", 0 },
2815bb525f4SRobert Mustacchi 	{ "cross", "uint8_t", 8 },
2825bb525f4SRobert Mustacchi 	/*
2835bb525f4SRobert Mustacchi 	 * This test has an anonymous union. Unfortunately, there's not a great
2845bb525f4SRobert Mustacchi 	 * way to distinguish between various anonymous unions in this form.
2855bb525f4SRobert Mustacchi 	 */
2865bb525f4SRobert Mustacchi #ifdef	TARGET_LP64
2875bb525f4SRobert Mustacchi 	{ "", "union ", 64 },
2885bb525f4SRobert Mustacchi #else
2895bb525f4SRobert Mustacchi 	{ "", "union ", 32 },
2905bb525f4SRobert Mustacchi #endif
2915bb525f4SRobert Mustacchi 	{ NULL }
2925bb525f4SRobert Mustacchi };
2935bb525f4SRobert Mustacchi 
2945bb525f4SRobert Mustacchi static check_member_t check_member_regress[] = {
2955bb525f4SRobert Mustacchi 	{ "i", "unsigned int [3]", 0 },
2965bb525f4SRobert Mustacchi 	{ "e", "long double", 0 },
2975bb525f4SRobert Mustacchi 	{ NULL }
2985bb525f4SRobert Mustacchi };
2995bb525f4SRobert Mustacchi 
3005bb525f4SRobert Mustacchi static check_member_test_t members[] = {
3015bb525f4SRobert Mustacchi #ifdef	TARGET_LP64
3025bb525f4SRobert Mustacchi 	{ "struct foo", CTF_K_STRUCT, 16, check_member_foo },
3035bb525f4SRobert Mustacchi 	{ "struct node", CTF_K_STRUCT, 16, check_member_node },
3045bb525f4SRobert Mustacchi 	{ "struct nlist", CTF_K_STRUCT, 32, check_member_nlist },
3055bb525f4SRobert Mustacchi 	{ "struct forward", CTF_K_STRUCT, 24, check_member_forward },
3065bb525f4SRobert Mustacchi #else
3075bb525f4SRobert Mustacchi 	{ "struct foo", CTF_K_STRUCT, 12, check_member_foo },
3085bb525f4SRobert Mustacchi 	{ "struct node", CTF_K_STRUCT, 8, check_member_node },
3095bb525f4SRobert Mustacchi 	{ "struct nlist", CTF_K_STRUCT, 16, check_member_nlist },
3105bb525f4SRobert Mustacchi 	{ "struct forward", CTF_K_STRUCT, 12, check_member_forward },
3115bb525f4SRobert Mustacchi #endif
3125bb525f4SRobert Mustacchi 	{ "struct round_up", CTF_K_STRUCT, 12, check_member_round_up },
3135bb525f4SRobert Mustacchi 	{ "struct fixed_up", CTF_K_STRUCT, 7, check_member_fixed_up },
3145bb525f4SRobert Mustacchi #ifdef	TARGET_LP64
3155bb525f4SRobert Mustacchi 	{ "struct component", CTF_K_STRUCT, 56, check_member_component },
3165bb525f4SRobert Mustacchi 	{ "struct mysterious_barrel", CTF_K_STRUCT, 16,
3175bb525f4SRobert Mustacchi 	    check_member_mysterious },
3185bb525f4SRobert Mustacchi 	{ "struct dusk_barrel", CTF_K_STRUCT, 16, check_member_dusk },
3195bb525f4SRobert Mustacchi #else
3205bb525f4SRobert Mustacchi 	{ "struct component", CTF_K_STRUCT, 36, check_member_component },
3215bb525f4SRobert Mustacchi 	{ "struct mysterious_barrel", CTF_K_STRUCT, 8,
3225bb525f4SRobert Mustacchi 	    check_member_mysterious },
3235bb525f4SRobert Mustacchi 	{ "struct dusk_barrel", CTF_K_STRUCT, 8, check_member_dusk },
3245bb525f4SRobert Mustacchi #endif
3255bb525f4SRobert Mustacchi 	{ "struct stats", CTF_K_STRUCT, 16, check_member_stats },
3265bb525f4SRobert Mustacchi 	{ "struct fellowship", CTF_K_STRUCT, 2, check_member_fellowship },
3275bb525f4SRobert Mustacchi 	{ "struct rings", CTF_K_STRUCT, 8, check_member_rings },
328*3cec9822SRobert Mustacchi 	{ "struct csts", CTF_K_STRUCT, 5, check_member_csts, SKIP_CLANG },
3295bb525f4SRobert Mustacchi 	{ "union jrpg", CTF_K_UNION, 32, check_member_jrpg },
3305bb525f4SRobert Mustacchi 	{ "struct android", CTF_K_STRUCT, 4, check_member_android },
3315bb525f4SRobert Mustacchi 	{ "union nier", CTF_K_UNION, 4, check_member_nier },
3325bb525f4SRobert Mustacchi 	{ "union kh", CTF_K_UNION, 16, check_member_kh },
3335bb525f4SRobert Mustacchi #ifdef	TARGET_LP64
3345bb525f4SRobert Mustacchi 	{ "struct trigger", CTF_K_STRUCT, 32, check_member_trigger },
3355bb525f4SRobert Mustacchi 	{ "union regress", CTF_K_UNION, 16, check_member_regress },
3365bb525f4SRobert Mustacchi #else
3375bb525f4SRobert Mustacchi 	{ "struct trigger", CTF_K_STRUCT, 28, check_member_trigger },
3385bb525f4SRobert Mustacchi 	{ "union regress", CTF_K_UNION, 12, check_member_regress },
3395bb525f4SRobert Mustacchi #endif
3405bb525f4SRobert Mustacchi 	{ NULL }
3415bb525f4SRobert Mustacchi };
3425bb525f4SRobert Mustacchi 
3435bb525f4SRobert Mustacchi static check_descent_t check_descent_head[] = {
3445bb525f4SRobert Mustacchi 	{ "nlist_t", CTF_K_TYPEDEF },
3455bb525f4SRobert Mustacchi 	{ "struct nlist", CTF_K_STRUCT },
3465bb525f4SRobert Mustacchi 	{ NULL }
3475bb525f4SRobert Mustacchi };
3485bb525f4SRobert Mustacchi 
3495bb525f4SRobert Mustacchi static check_descent_t check_descent_forward[] = {
3505bb525f4SRobert Mustacchi 	{ "const forward_t", CTF_K_CONST },
3515bb525f4SRobert Mustacchi 	{ "forward_t", CTF_K_TYPEDEF },
3525bb525f4SRobert Mustacchi 	{ "struct forward", CTF_K_STRUCT },
3535bb525f4SRobert Mustacchi 	{ NULL }
3545bb525f4SRobert Mustacchi };
3555bb525f4SRobert Mustacchi 
3566ef284f1SJohn Levon static check_descent_test_t descents[] = {
3576ef284f1SJohn Levon 	{ "head", check_descent_head },
3586ef284f1SJohn Levon 	{ "forward", check_descent_forward },
3596ef284f1SJohn Levon 	{ NULL }
3606ef284f1SJohn Levon };
3616ef284f1SJohn Levon 
3626ef284f1SJohn Levon static check_descent_t check_descent_regress_gcc4[] = {
3635bb525f4SRobert Mustacchi 	{ "const union regress [9]", CTF_K_CONST },
3645bb525f4SRobert Mustacchi 	{ "union regress [9]", CTF_K_ARRAY, "union regress", 9 },
3655bb525f4SRobert Mustacchi 	{ "union regress", CTF_K_UNION },
3665bb525f4SRobert Mustacchi 	{ NULL }
3675bb525f4SRobert Mustacchi };
3685bb525f4SRobert Mustacchi 
3696ef284f1SJohn Levon static check_descent_t check_descent_regress_gcc7[] = {
3706ef284f1SJohn Levon 	{ "const union regress [9]", CTF_K_ARRAY, "const union regress", 9 },
3716ef284f1SJohn Levon 	{ "const union regress", CTF_K_CONST },
3726ef284f1SJohn Levon 	{ "union regress", CTF_K_UNION },
3736ef284f1SJohn Levon 	{ NULL }
3746ef284f1SJohn Levon };
3756ef284f1SJohn Levon 
3766ef284f1SJohn Levon /*
3776ef284f1SJohn Levon  * See needed_array_qualifier(): applying this fix means the qualifier order is
3786ef284f1SJohn Levon  * different between GCC versions. Accept either form.
3796ef284f1SJohn Levon  */
3806ef284f1SJohn Levon static check_descent_test_t alt_descents[] = {
3816ef284f1SJohn Levon 	{ "regress", check_descent_regress_gcc4 },
3826ef284f1SJohn Levon 	{ "regress", check_descent_regress_gcc7 },
3835bb525f4SRobert Mustacchi 	{ NULL }
3845bb525f4SRobert Mustacchi };
3855bb525f4SRobert Mustacchi 
3865bb525f4SRobert Mustacchi int
main(int argc,char * argv[])3875bb525f4SRobert Mustacchi main(int argc, char *argv[])
3885bb525f4SRobert Mustacchi {
3895bb525f4SRobert Mustacchi 	int i, ret = 0;
3905bb525f4SRobert Mustacchi 
3915bb525f4SRobert Mustacchi 	if (argc < 2) {
3925bb525f4SRobert Mustacchi 		errx(EXIT_FAILURE, "missing test files");
3935bb525f4SRobert Mustacchi 	}
3945bb525f4SRobert Mustacchi 
3955bb525f4SRobert Mustacchi 	for (i = 1; i < argc; i++) {
3965bb525f4SRobert Mustacchi 		ctf_file_t *fp;
3976ef284f1SJohn Levon 		int alt_ok = 0;
3985bb525f4SRobert Mustacchi 		uint_t j;
3995bb525f4SRobert Mustacchi 
4005bb525f4SRobert Mustacchi 		if ((fp = ctf_open(argv[i], &ret)) == NULL) {
4015bb525f4SRobert Mustacchi 			warnx("failed to open %s: %s", argv[i],
4025bb525f4SRobert Mustacchi 			    ctf_errmsg(ret));
4035bb525f4SRobert Mustacchi 			ret = EXIT_FAILURE;
4045bb525f4SRobert Mustacchi 			continue;
4055bb525f4SRobert Mustacchi 		}
4065bb525f4SRobert Mustacchi 
4075bb525f4SRobert Mustacchi 		if (!ctftest_check_numbers(fp, check_bitfields))
4085bb525f4SRobert Mustacchi 			ret = EXIT_FAILURE;
4095bb525f4SRobert Mustacchi 		if (!ctftest_check_symbols(fp, check_syms))
4105bb525f4SRobert Mustacchi 			ret = EXIT_FAILURE;
4115bb525f4SRobert Mustacchi 		for (j = 0; descents[j].cdt_sym != NULL; j++) {
4125bb525f4SRobert Mustacchi 			if (!ctftest_check_descent(descents[j].cdt_sym, fp,
4136ef284f1SJohn Levon 			    descents[j].cdt_tests, B_FALSE)) {
4145bb525f4SRobert Mustacchi 				ret = EXIT_FAILURE;
4155bb525f4SRobert Mustacchi 			}
4165bb525f4SRobert Mustacchi 		}
4175bb525f4SRobert Mustacchi 
4186ef284f1SJohn Levon 		for (j = 0; alt_descents[j].cdt_sym != NULL; j++) {
4196ef284f1SJohn Levon 			if (ctftest_check_descent(alt_descents[j].cdt_sym, fp,
4206ef284f1SJohn Levon 			    alt_descents[j].cdt_tests, B_TRUE)) {
4216ef284f1SJohn Levon 				alt_ok = 1;
4226ef284f1SJohn Levon 				break;
4236ef284f1SJohn Levon 			}
4246ef284f1SJohn Levon 		}
4256ef284f1SJohn Levon 
4266ef284f1SJohn Levon 		if (!alt_ok) {
4276ef284f1SJohn Levon 			warnx("all descents failed for %s",
4286ef284f1SJohn Levon 			    alt_descents[0].cdt_sym);
4296ef284f1SJohn Levon 			ret = EXIT_FAILURE;
4306ef284f1SJohn Levon 		}
4316ef284f1SJohn Levon 
4325bb525f4SRobert Mustacchi 		for (j = 0; members[j].cmt_type != NULL; j++) {
433*3cec9822SRobert Mustacchi 			if (ctftest_skip(members[j].cmt_skips)) {
434*3cec9822SRobert Mustacchi 				warnx("skipping members test %s due to "
435*3cec9822SRobert Mustacchi 				    "known compiler issue",
436*3cec9822SRobert Mustacchi 				    members[j].cmt_type);
437*3cec9822SRobert Mustacchi 				continue;
438*3cec9822SRobert Mustacchi 			}
439*3cec9822SRobert Mustacchi 
4405bb525f4SRobert Mustacchi 			if (!ctftest_check_members(members[j].cmt_type, fp,
4415bb525f4SRobert Mustacchi 			    members[j].cmt_kind, members[j].cmt_size,
4425bb525f4SRobert Mustacchi 			    members[j].cmt_members)) {
4435bb525f4SRobert Mustacchi 				ret = EXIT_FAILURE;
4445bb525f4SRobert Mustacchi 			}
4455bb525f4SRobert Mustacchi 		}
4465bb525f4SRobert Mustacchi 
4475bb525f4SRobert Mustacchi 		ctf_close(fp);
4485bb525f4SRobert Mustacchi 	}
4495bb525f4SRobert Mustacchi 
4505bb525f4SRobert Mustacchi 	return (ret);
4515bb525f4SRobert Mustacchi }
452