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