diff options
Diffstat (limited to 'libctf/testsuite')
-rw-r--r-- | libctf/testsuite/libctf-writable/pptrtab-writable-page-deep-lookup.c | 68 | ||||
-rw-r--r-- | libctf/testsuite/libctf-writable/pptrtab-writable-page-deep-lookup.lk | 2 |
2 files changed, 70 insertions, 0 deletions
diff --git a/libctf/testsuite/libctf-writable/pptrtab-writable-page-deep-lookup.c b/libctf/testsuite/libctf-writable/pptrtab-writable-page-deep-lookup.c new file mode 100644 index 0000000..ca42065 --- /dev/null +++ b/libctf/testsuite/libctf-writable/pptrtab-writable-page-deep-lookup.c @@ -0,0 +1,68 @@ +/* Make sure we can look up a pointer-to-type where the type is more than a page + into the parent and the child has never had a lookup before. */ + +#include <ctf-api.h> +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +int +main (void) +{ + ctf_dict_t *pfp, *cfp; + ctf_encoding_t e = { CTF_INT_SIGNED, 0, sizeof (long) }; + ctf_id_t ptype, ptrtype, type, foo; + size_t i; + int err; + + if ((pfp = ctf_create (&err)) == NULL) + goto create_err; + + if ((ptype = ctf_add_integer (pfp, CTF_ADD_NONROOT, "blah", &e)) == CTF_ERR) + goto create_parent; + + for (i = 0; i < 4096; i++) + if ((foo = ctf_add_pointer (pfp, CTF_ADD_NONROOT, ptype)) == CTF_ERR) + goto create_parent; + + if ((cfp = ctf_create (&err)) == NULL) + goto create_err; + + if (ctf_import (cfp, pfp) < 0) + goto create_child; + + if ((ptype = ctf_add_integer (pfp, CTF_ADD_ROOT, "foo", &e)) == CTF_ERR) + goto create_parent; + + if ((ptrtype = ctf_add_pointer (pfp, CTF_ADD_ROOT, ptype)) == CTF_ERR) + goto create_parent; + + if ((type = ctf_lookup_by_name (cfp, "*foo")) != CTF_ERR) + { + fprintf (stderr, "Type lookup unexpectedly succeeded: %s\n", ctf_errmsg (ctf_errno (cfp))); + exit (1); + } + + if ((type = ctf_lookup_by_name (cfp, "foo *")) == CTF_ERR) + { + fprintf (stderr, "Type lookup error: %s\n", ctf_errmsg (ctf_errno (cfp))); + exit (1); + } + + ctf_dict_close (cfp); + ctf_dict_close (pfp); + + printf ("Type lookup succeeded.\n"); + + return 0; + + create_err: + fprintf (stderr, "Creation failed: %s\n", ctf_errmsg (err)); + exit (1); + create_parent: + fprintf (stderr, "Cannot create parent type: %s\n", ctf_errmsg (ctf_errno (pfp))); + exit (1); + create_child: + fprintf (stderr, "Cannot create child type: %s\n", ctf_errmsg (ctf_errno (cfp))); + exit (1); +} diff --git a/libctf/testsuite/libctf-writable/pptrtab-writable-page-deep-lookup.lk b/libctf/testsuite/libctf-writable/pptrtab-writable-page-deep-lookup.lk new file mode 100644 index 0000000..4f23d14 --- /dev/null +++ b/libctf/testsuite/libctf-writable/pptrtab-writable-page-deep-lookup.lk @@ -0,0 +1,2 @@ +Type lookup succeeded. + |