aboutsummaryrefslogtreecommitdiff
path: root/libctf/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'libctf/testsuite')
-rw-r--r--libctf/testsuite/libctf-lookup/struct-iteration-ctf.c28
-rw-r--r--libctf/testsuite/libctf-lookup/struct-iteration.c92
-rw-r--r--libctf/testsuite/libctf-lookup/struct-iteration.lk24
-rw-r--r--libctf/testsuite/libctf-lookup/struct-lookup.c60
-rw-r--r--libctf/testsuite/libctf-lookup/struct-lookup.lk4
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]*