diff options
Diffstat (limited to 'libctf/testsuite')
-rw-r--r-- | libctf/testsuite/libctf-lookup/struct-iteration-ctf.c | 28 | ||||
-rw-r--r-- | libctf/testsuite/libctf-lookup/struct-iteration.c | 92 | ||||
-rw-r--r-- | libctf/testsuite/libctf-lookup/struct-iteration.lk | 24 | ||||
-rw-r--r-- | libctf/testsuite/libctf-lookup/struct-lookup.c | 60 | ||||
-rw-r--r-- | libctf/testsuite/libctf-lookup/struct-lookup.lk | 4 |
5 files changed, 208 insertions, 0 deletions
diff --git a/libctf/testsuite/libctf-lookup/struct-iteration-ctf.c b/libctf/testsuite/libctf-lookup/struct-iteration-ctf.c new file mode 100644 index 0000000..7df67ad --- /dev/null +++ b/libctf/testsuite/libctf-lookup/struct-iteration-ctf.c @@ -0,0 +1,28 @@ +#include <unistd.h> + +struct foo_t +{ + int foo; + size_t bar; + const char *baz; + struct foo_t *self; + union + { + double should_not_appear; + char *nor_should_this; + } named; + struct + { + long unnamed_sub_member; + union + { + double one_more_level; + long yes_really_one_more; + }; + }; + struct {}; /* Empty ones */ + union {}; + int after_the_end; +}; + +struct foo_t used; diff --git a/libctf/testsuite/libctf-lookup/struct-iteration.c b/libctf/testsuite/libctf-lookup/struct-iteration.c new file mode 100644 index 0000000..0375060 --- /dev/null +++ b/libctf/testsuite/libctf-lookup/struct-iteration.c @@ -0,0 +1,92 @@ +#include <ctf-api.h> +#include <stdio.h> +#include <stdlib.h> + +static int +print_struct (const char *name, ctf_id_t membtype, unsigned long offset, + void *fp_) +{ + ctf_dict_t *fp = (ctf_dict_t *) fp_; + char *type_name = ctf_type_aname (fp, membtype); + + printf ("iter test: %s, offset %lx, has type %lx/%s\n", + name, offset, membtype, type_name); + free (type_name); + + return 0; +} + +int +main (int argc, char *argv[]) +{ + ctf_dict_t *fp; + ctf_archive_t *ctf; + ctf_id_t type; + ctf_next_t *i = NULL; + const char *name; + ctf_id_t membtype; + ssize_t offset; + ssize_t icount = 0; + int err; + + if (argc != 2) + { + fprintf (stderr, "Syntax: %s PROGRAM\n", argv[0]); + exit(1); + } + + if ((ctf = ctf_open (argv[1], NULL, &err)) == NULL) + goto open_err; + if ((fp = ctf_dict_open (ctf, NULL, &err)) == NULL) + goto open_err; + + /* Iterate over the structure members with each iterator type in turn. */ + + if ((type = ctf_lookup_by_name (fp, "struct foo_t") ) == CTF_ERR) + goto err; + + if (ctf_member_iter (fp, type, print_struct, fp) < 0) + goto ierr; + + while ((offset = ctf_member_next (fp, type, &i, &name, &membtype, + CTF_MN_RECURSE)) >= 0) + { + char *type_name = ctf_type_aname (fp, membtype); + + printf ("next test: %s, offset %lx, has type %lx/%s\n", + name, offset, membtype, type_name); + free (type_name); + } + if (ctf_errno (fp) != ECTF_NEXT_END) + goto nerr; + + /* Now make sure the count of members does not include any recursive + members. */ + while ((offset = ctf_member_next (fp, type, &i, &name, &membtype, 0)) >= 0) + icount++; + + if (ctf_errno (fp) != ECTF_NEXT_END) + goto nerr; + + if (icount != ctf_member_count (fp, type)) + printf ("member counts differ: %li by direct iteration, " + "%li by ctf_member_count\n", icount, ctf_member_count (fp, type)); + + ctf_dict_close (fp); + ctf_close (ctf); + + return 0; + + open_err: + fprintf (stderr, "%s: cannot open: %s\n", argv[0], ctf_errmsg (err)); + return 1; + err: + fprintf (stderr, "Lookup failed: %s\n", ctf_errmsg (ctf_errno (fp))); + return 1; + ierr: + fprintf (stderr, "_iter iteration failed: %s\n", ctf_errmsg (ctf_errno (fp))); + return 1; + nerr: + fprintf (stderr, "_next iteration failed: %s\n", ctf_errmsg (ctf_errno (fp))); + return 1; +} diff --git a/libctf/testsuite/libctf-lookup/struct-iteration.lk b/libctf/testsuite/libctf-lookup/struct-iteration.lk new file mode 100644 index 0000000..fd64454 --- /dev/null +++ b/libctf/testsuite/libctf-lookup/struct-iteration.lk @@ -0,0 +1,24 @@ +# source: struct-iteration-ctf.c +# link: on +iter test: foo, offset [0-9a-f]*, has type [0-9a-f]*/int +iter test: bar, offset [0-9a-f]*, has type [0-9a-f]*/size_t +iter test: baz, offset [0-9a-f]*, has type [0-9a-f]*/const char \* +iter test: self, offset [0-9a-f]*, has type [0-9a-f]*/struct foo_t \* +iter test: named, offset [0-9a-f]*, has type [0-9a-f]*/union +iter test: , offset [0-9a-f]*, has type [0-9a-f]*/struct +iter test: , offset [0-9a-f]*, has type [0-9a-f]*/struct +iter test: , offset [0-9a-f]*, has type [0-9a-f]*/union +iter test: after_the_end, offset [0-9a-f]*, has type [0-9a-f]*/int +next test: foo, offset [0-9a-f]*, has type [0-9a-f]*/int +next test: bar, offset [0-9a-f]*, has type [0-9a-f]*/size_t +next test: baz, offset [0-9a-f]*, has type [0-9a-f]*/const char \* +next test: self, offset [0-9a-f]*, has type [0-9a-f]*/struct foo_t \* +next test: named, offset [0-9a-f]*, has type [0-9a-f]*/union +next test: , offset [0-9a-f]*, has type [0-9a-f]*/struct +next test: unnamed_sub_member, offset [0-9a-f]*, has type [0-9a-f]*/long int +next test: , offset [0-9a-f]*, has type [0-9a-f]*/union +next test: one_more_level, offset [0-9a-f]*, has type [0-9a-f]*/double +next test: yes_really_one_more, offset [0-9a-f]*, has type [0-9a-f]*/long int +next test: , offset [0-9a-f]*, has type [0-9a-f]*/struct +next test: , offset [0-9a-f]*, has type [0-9a-f]*/union +next test: after_the_end, offset [0-9a-f]*, has type [0-9a-f]*/int diff --git a/libctf/testsuite/libctf-lookup/struct-lookup.c b/libctf/testsuite/libctf-lookup/struct-lookup.c new file mode 100644 index 0000000..9b95317 --- /dev/null +++ b/libctf/testsuite/libctf-lookup/struct-lookup.c @@ -0,0 +1,60 @@ +#include <ctf-api.h> +#include <stdio.h> +#include <stdlib.h> + +int +main (int argc, char *argv[]) +{ + ctf_dict_t *fp; + ctf_archive_t *ctf; + ctf_id_t type; + char *type_name; + ctf_membinfo_t mi; + int err; + + if (argc != 2) + { + fprintf (stderr, "Syntax: %s PROGRAM\n", argv[0]); + exit(1); + } + + if ((ctf = ctf_open (argv[1], NULL, &err)) == NULL) + goto open_err; + if ((fp = ctf_dict_open (ctf, NULL, &err)) == NULL) + goto open_err; + + /* Dig out some strucutre members by name. */ + + if ((type = ctf_lookup_by_name (fp, "struct foo_t") ) == CTF_ERR) + goto err; + + if (ctf_member_info (fp, type, "baz", &mi) < 0) + goto err; + + type_name = ctf_type_aname (fp, mi.ctm_type); + printf ("baz is of type %s, at offset %lx\n", type_name, mi.ctm_offset); + free (type_name); + + if (ctf_member_info (fp, type, "one_more_level", &mi) < 0) + goto err; + + type_name = ctf_type_aname (fp, mi.ctm_type); + printf ("one_more_level is of type %s, at offset %lx\n", type_name, mi.ctm_offset); + free (type_name); + + if (ctf_member_info (fp, type, "should_not_appear", &mi) >= 0 + || ctf_errno (fp) != ECTF_NOMEMBNAM) + fprintf (stderr, "should_not_appear appeared.\n"); + + ctf_dict_close (fp); + ctf_close (ctf); + + return 0; + + open_err: + fprintf (stderr, "%s: cannot open: %s\n", argv[0], ctf_errmsg (err)); + return 1; + err: + fprintf (stderr, "Lookup failed: %s\n", ctf_errmsg (ctf_errno (fp))); + return 1; +} diff --git a/libctf/testsuite/libctf-lookup/struct-lookup.lk b/libctf/testsuite/libctf-lookup/struct-lookup.lk new file mode 100644 index 0000000..b848823 --- /dev/null +++ b/libctf/testsuite/libctf-lookup/struct-lookup.lk @@ -0,0 +1,4 @@ +# source: struct-iteration-ctf.c +# link: on +baz is of type const char \*, at offset [0-9a-z]* +one_more_level is of type double, at offset [0-9a-z]* |