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 * Check that we properly handle functions and function pointers.
18 */
19
20 #include "check-common.h"
21
22 static const char *one_args[] = { "int" };
23 static const char *two_args[] = { "int", "const char *" };
24 static const char *three_args[] = { "int", "const char *", "float" };
25 static const char *argument_args[] = { "uintptr_t" };
26 static const char *vararg_args[] = { "const char *" };
27
28 static check_function_test_t functions[] = {
29 { "simple_func", "void", 0, 0, NULL },
30 { "one", "void", 1, 0, one_args },
31 { "two", "void", 2, 0, two_args },
32 { "three", "void", 3, 0, three_args },
33 { "noarg", "const char *", 0, 0, NULL },
34 { "argument", "const char *", 1, 0, argument_args },
35 { "vararg", "void", 1, CTF_FUNC_VARARG, vararg_args },
36 { "vararg_ret", "uintptr_t", 1, CTF_FUNC_VARARG, vararg_args },
37 { NULL }
38 };
39
40 static const char *strfunc_args[] = { "const char *", "const char *" };
41
42 static check_function_test_t fptrs[] = {
43 { "strfunc_t", "int", 2, 0, strfunc_args },
44 { "vararg_t", "void", 1, CTF_FUNC_VARARG, vararg_args },
45 { NULL }
46 };
47
48 int
49 main(int argc, char *argv[])
50 {
51 int i, ret = 0;
52
53 if (argc < 2) {
54 errx(EXIT_FAILURE, "missing test files");
55 }
56
57 for (i = 1; i < argc; i++) {
58 ctf_file_t *fp;
59 uint_t j;
60
61 if ((fp = ctf_open(argv[i], &ret)) == NULL) {
62 warnx("failed to open %s: %s", argv[i],
63 ctf_errmsg(ret));
64 ret = EXIT_FAILURE;
65 continue;
66 }
67
68 for (j = 0; functions[j].cft_name != NULL; j++) {
69 if (!ctftest_check_function(functions[j].cft_name, fp,
70 functions[j].cft_rtype, functions[j].cft_nargs,
71 functions[j].cft_flags, functions[j].cft_args)) {
72 ret = EXIT_FAILURE;
73 }
74 }
75
76 for (j = 0; fptrs[j].cft_name != NULL; j++) {
77 if (!ctftest_check_fptr(fptrs[j].cft_name, fp,
78 fptrs[j].cft_rtype, fptrs[j].cft_nargs,
79 fptrs[j].cft_flags, fptrs[j].cft_args)) {
80 ret = EXIT_FAILURE;
81 }
82 }
83
84 ctf_close(fp);
85 }
86
87 return (ret);
88 }