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 (c) 2019, Joyent, Inc. 14 */ 15 16 /* 17 * Verify that we can properly handle forward declarations. 18 * 19 * In test-forward.c barp is declared as a union, not a struct. However, today 20 * the CTF tooling does not contain enough information to know whether a forward 21 * declaration was for a struct or a union, only that it was a forward. 22 * Therefore, the type printing information assumes at the moment that the type 23 * is a struct. In a future revision of the CTF type data, we should encode this 24 * information in the equivalent of ctt_info so we can properly distinguish 25 * between these. 26 */ 27 28 #include "check-common.h" 29 30 static check_symbol_t check_syms[] = { 31 { "forward", "struct forward" }, 32 { "foop", "struct foo *" }, 33 { "barp", "struct bar *" }, 34 { "bazp", "enum baz *" }, 35 { NULL } 36 }; 37 38 static check_member_t check_member_forward[] = { 39 #ifdef TARGET_LP64 40 { "prev", "struct foo *", 0 }, 41 { "next", "struct foo *", 8 * NBBY }, 42 { "data", "struct bar *", 16 * NBBY }, 43 { "tag", "enum baz *", 24 * NBBY }, 44 #else 45 { "prev", "struct foo *", 0 }, 46 { "next", "struct foo *", 4 * NBBY }, 47 { "data", "struct bar *", 8 * NBBY }, 48 { "tag", "enum baz *", 12 * NBBY }, 49 #endif 50 { NULL } 51 }; 52 53 54 static check_member_test_t members[] = { 55 #ifdef TARGET_LP64 56 { "struct forward", CTF_K_STRUCT, 32, check_member_forward }, 57 #else 58 { "struct forward", CTF_K_STRUCT, 16, check_member_forward }, 59 #endif 60 { NULL } 61 }; 62 63 static check_descent_t check_descent_foo[] = { 64 { "struct foo *", CTF_K_POINTER }, 65 { "struct foo", CTF_K_FORWARD }, 66 { NULL } 67 }; 68 69 static check_descent_t check_descent_bar[] = { 70 { "struct bar *", CTF_K_POINTER }, 71 { "struct bar", CTF_K_FORWARD }, 72 { NULL } 73 }; 74 75 static check_descent_t check_descent_baz[] = { 76 { "enum baz *", CTF_K_POINTER }, 77 { "enum baz", CTF_K_ENUM }, 78 { NULL } 79 }; 80 81 static check_descent_test_t descents[] = { 82 { "foop", check_descent_foo }, 83 { "barp", check_descent_bar }, 84 { "bazp", check_descent_baz }, 85 { NULL } 86 }; 87 int 88 main(int argc, char *argv[]) 89 { 90 int i, ret = 0; 91 92 if (argc < 2) { 93 errx(EXIT_FAILURE, "missing test files"); 94 } 95 96 for (i = 1; i < argc; i++) { 97 ctf_file_t *fp; 98 uint_t j; 99 100 if ((fp = ctf_open(argv[i], &ret)) == NULL) { 101 warnx("failed to open %s: %s", argv[i], 102 ctf_errmsg(ret)); 103 ret = EXIT_FAILURE; 104 continue; 105 } 106 107 if (!ctftest_check_symbols(fp, check_syms)) 108 ret = EXIT_FAILURE; 109 110 for (j = 0; descents[j].cdt_sym != NULL; j++) { 111 if (!ctftest_check_descent(descents[j].cdt_sym, fp, 112 descents[j].cdt_tests)) { 113 ret = EXIT_FAILURE; 114 } 115 } 116 117 118 for (j = 0; members[j].cmt_type != NULL; j++) { 119 if (!ctftest_check_members(members[j].cmt_type, fp, 120 members[j].cmt_kind, members[j].cmt_size, 121 members[j].cmt_members)) { 122 ret = EXIT_FAILURE; 123 } 124 } 125 126 ctf_close(fp); 127 } 128 129 return (ret); 130 } 131