aboutsummaryrefslogtreecommitdiff
path: root/libctf/testsuite
diff options
context:
space:
mode:
Diffstat (limited to 'libctf/testsuite')
-rw-r--r--libctf/testsuite/libctf-lookup/conflicting-type-syms-a.c5
-rw-r--r--libctf/testsuite/libctf-lookup/conflicting-type-syms-b.c5
-rw-r--r--libctf/testsuite/libctf-lookup/conflicting-type-syms.c99
-rw-r--r--libctf/testsuite/libctf-lookup/conflicting-type-syms.lk7
-rw-r--r--libctf/testsuite/libctf-lookup/enum-symbol-obj.lk5
-rw-r--r--libctf/testsuite/libctf-lookup/enum-symbol.c115
-rw-r--r--libctf/testsuite/libctf-writable/symtypetab-nonlinker-writeout.c34
7 files changed, 169 insertions, 101 deletions
diff --git a/libctf/testsuite/libctf-lookup/conflicting-type-syms-a.c b/libctf/testsuite/libctf-lookup/conflicting-type-syms-a.c
new file mode 100644
index 0000000..6541487
--- /dev/null
+++ b/libctf/testsuite/libctf-lookup/conflicting-type-syms-a.c
@@ -0,0 +1,5 @@
+typedef long a_t;
+typedef long b_t;
+
+a_t *a;
+b_t ignore2;
diff --git a/libctf/testsuite/libctf-lookup/conflicting-type-syms-b.c b/libctf/testsuite/libctf-lookup/conflicting-type-syms-b.c
new file mode 100644
index 0000000..e458021
--- /dev/null
+++ b/libctf/testsuite/libctf-lookup/conflicting-type-syms-b.c
@@ -0,0 +1,5 @@
+typedef long a_t;
+typedef long b_t;
+
+a_t b;
+b_t ignore1;
diff --git a/libctf/testsuite/libctf-lookup/conflicting-type-syms.c b/libctf/testsuite/libctf-lookup/conflicting-type-syms.c
new file mode 100644
index 0000000..ffe6983
--- /dev/null
+++ b/libctf/testsuite/libctf-lookup/conflicting-type-syms.c
@@ -0,0 +1,99 @@
+#include "config.h"
+#include <ctf-api.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+int
+main (int argc, char *argv[])
+{
+ ctf_archive_t *ctf;
+ ctf_dict_t *a_fp, *ignore1_fp, *b_fp, *ignore2_fp, *tmp_fp;
+ int err;
+ ctf_id_t a, b, ignore1, ignore2, tmp;
+ char *foo;
+ ctf_next_t *i = NULL;
+ const char *name;
+ int val;
+
+ 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;
+
+ /* Fish out each symbol in turn: also try to fish out a nonexistent one. */
+
+ if ((a_fp = ctf_arc_lookup_symbol_name (ctf, "a", &a, &err)) == NULL)
+ goto sym_err;
+ printf ("Type of a is %s\n", foo = ctf_type_aname (a_fp, a));
+
+ if ((b_fp = ctf_arc_lookup_symbol_name (ctf, "b", &b, &err)) == NULL)
+ goto sym_err;
+ printf ("Type of b is %s\n", foo = ctf_type_aname (b_fp, b));
+
+ if ((ignore1_fp = ctf_arc_lookup_symbol_name (ctf, "ignore1", &ignore1, &err)) == NULL)
+ goto sym_err;
+ printf ("Type of ignore1 is %s\n", foo = ctf_type_aname (ignore1_fp, ignore1));
+
+ if ((ignore2_fp = ctf_arc_lookup_symbol_name (ctf, "ignore2", &ignore2, &err)) == NULL)
+ goto sym_err;
+ printf ("Type of ignore2 is %s\n", foo = ctf_type_aname (ignore2_fp, ignore1));
+
+ /* Try a call in just-get-the-dict mode and make sure it doesn't fail. */
+ if ((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "ignore2", NULL, &err)) == NULL)
+ goto sym_err;
+ ctf_dict_close (tmp_fp);
+
+ /* Make sure failures fail. */
+ if ((ctf_arc_lookup_symbol_name (ctf, "nonexistent", NULL, &err) != NULL)
+ || err != ECTF_NOTYPEDAT)
+ goto nosym_err;
+
+ /* Fish them out again to check the caching layer. */
+ if (((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "a", &tmp, &err)) != a_fp)
+ || (tmp != a))
+ goto sym_cache_err;
+ ctf_dict_close (tmp_fp);
+
+ if (((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "b", &tmp, &err)) != b_fp)
+ || (tmp != b))
+ goto sym_cache_err;
+ ctf_dict_close (tmp_fp);
+
+ if (((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "ignore1", &tmp, &err)) != ignore1_fp)
+ || (tmp != ignore1))
+ goto sym_cache_err;
+ ctf_dict_close (tmp_fp);
+
+ if (((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "ignore2", &tmp, &err)) != ignore2_fp)
+ || (tmp != ignore2))
+ goto sym_cache_err;
+ ctf_dict_close (tmp_fp);
+
+ ctf_dict_close (a_fp);
+ ctf_dict_close (b_fp);
+ ctf_dict_close (ignore1_fp);
+ ctf_dict_close (ignore2_fp);
+ ctf_close (ctf);
+
+ return 0;
+
+ open_err:
+ fprintf (stderr, "%s: cannot open: %s\n", argv[0], ctf_errmsg (err));
+ return 1;
+ sym_err:
+ fprintf (stderr, "%s: Symbol lookup error: %s\n", argv[0], ctf_errmsg (err));
+ return 1;
+ nosym_err:
+ fprintf (stderr, "%s: Nonexistent symbol lookup unexpected error: %s\n", argv[0],
+ ctf_errmsg (err));
+ return 1;
+ sym_cache_err:
+ fprintf (stderr, "%s: Symbol re-lookup error (caching bug): %s\n", argv[0],
+ ctf_errmsg (err));
+ return 1;
+}
diff --git a/libctf/testsuite/libctf-lookup/conflicting-type-syms.lk b/libctf/testsuite/libctf-lookup/conflicting-type-syms.lk
new file mode 100644
index 0000000..09b41df
--- /dev/null
+++ b/libctf/testsuite/libctf-lookup/conflicting-type-syms.lk
@@ -0,0 +1,7 @@
+# lookup: conflicting-type-syms.c
+# source: conflicting-type-syms-a.c
+# source: conflicting-type-syms-b.c
+Type of a is a_t \*
+Type of b is a_t
+Type of ignore1 is b_t
+Type of ignore2 is b_t
diff --git a/libctf/testsuite/libctf-lookup/enum-symbol-obj.lk b/libctf/testsuite/libctf-lookup/enum-symbol-obj.lk
new file mode 100644
index 0000000..548d67b
--- /dev/null
+++ b/libctf/testsuite/libctf-lookup/enum-symbol-obj.lk
@@ -0,0 +1,5 @@
+# lookup: enum-symbol.c
+# source: enum-symbol-ctf.c
+red1 has value 0
+green1 has value 1
+blue1 has value 2
diff --git a/libctf/testsuite/libctf-lookup/enum-symbol.c b/libctf/testsuite/libctf-lookup/enum-symbol.c
index 4f63b61..c67478f 100644
--- a/libctf/testsuite/libctf-lookup/enum-symbol.c
+++ b/libctf/testsuite/libctf-lookup/enum-symbol.c
@@ -1,71 +1,19 @@
#include "config.h"
-#include <bfd.h>
-#include <elf.h>
#include <ctf-api.h>
-#include <swap.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-ssize_t symidx_64 (ctf_sect_t *s, ctf_sect_t *strsect, int little_endian, const char *name)
-{
- const char *strs = (const char *) strsect->cts_data;
- size_t i;
- Elf64_Sym *sym = (Elf64_Sym *) s->cts_data;
- for (i = 0; i < s->cts_size / s->cts_entsize; i++, sym++)
- {
- Elf64_Word nameoff = sym->st_name;
-#ifdef WORDS_BIGENDIAN
- if (little_endian)
- swap_thing (nameoff);
-#else
- if (!little_endian)
- swap_thing (nameoff);
-#endif
- if (strcmp (strs + nameoff, name) == 0)
- return i;
- }
- return -1;
-}
-
-ssize_t symidx_32 (ctf_sect_t *s, ctf_sect_t *strsect, int little_endian, const char *name)
-{
- const char *strs = (const char *) strsect->cts_data;
- size_t i;
- Elf32_Sym *sym = (Elf32_Sym *) s->cts_data;
- for (i = 0; i < s->cts_size / s->cts_entsize; i++, sym++)
- {
- Elf32_Word nameoff = sym->st_name;
-#ifdef WORDS_BIGENDIAN
- if (little_endian)
- swap_thing (nameoff);
-#else
- if (!little_endian)
- swap_thing (nameoff);
-#endif
- if (strcmp (strs + nameoff, name) == 0)
- return i;
- }
- return -1;
-}
-
int
main (int argc, char *argv[])
{
- ctf_dict_t *fp;
- bfd *abfd;
ctf_archive_t *ctf;
- ctf_sect_t symsect;
- ctf_sect_t strsect;
- ssize_t symidx;
+ ctf_dict_t *fp, *tmp_fp;
int err;
- ctf_id_t type;
+ ctf_id_t type, tmp;
ctf_next_t *i = NULL;
const char *name;
int val;
- int little_endian;
-
- ssize_t (*get_sym) (ctf_sect_t *s, ctf_sect_t *strsect, int little_endian, const char *name);
if (argc != 2)
{
@@ -73,53 +21,12 @@ main (int argc, char *argv[])
exit(1);
}
- /* Figure out the endianness of the symtab(s). */
- if ((abfd = bfd_openr (argv[1], NULL)) == NULL
- || !bfd_check_format (abfd, bfd_object))
- goto bfd_open_err;
- little_endian = bfd_little_endian (abfd);
- bfd_close_all_done (abfd);
-
if ((ctf = ctf_open (argv[1], NULL, &err)) == NULL)
goto open_err;
- if ((fp = ctf_dict_open (ctf, NULL, &err)) == NULL)
- goto open_err;
-
- symsect = ctf_getsymsect (fp);
- strsect = ctf_getstrsect (fp);
- if (symsect.cts_data == NULL
- || strsect.cts_data == NULL)
- {
- fprintf (stderr, "%s: no symtab or strtab\n", argv[0]);
- return 1;
- }
-
- ctf_dict_close (fp);
-
- if (symsect.cts_entsize != sizeof (Elf64_Sym) &&
- symsect.cts_entsize != sizeof (Elf32_Sym))
- {
- fprintf (stderr, "%s: unknown symsize: %lx\n", argv[0],
- symsect.cts_size);
- return 1;
- }
-
- switch (symsect.cts_entsize)
- {
- case sizeof (Elf64_Sym): get_sym = symidx_64; break;
- case sizeof (Elf32_Sym): get_sym = symidx_32; break;
- }
-
- if ((symidx = get_sym (&symsect, &strsect, little_endian, "primary1")) < 0)
- {
- fprintf (stderr, "%s: symbol not found: primary1\n", argv[0]);
- return 1;
- }
-
- /* Fish it out, then fish out all its enumerand/value pairs. */
+ /* Fish out the enumerator, then fish out all its enumerand/value pairs. */
- if ((fp = ctf_arc_lookup_symbol (ctf, symidx, &type, &err)) == NULL)
+ if ((fp = ctf_arc_lookup_symbol_name (ctf, "primary1", &type, &err)) == NULL)
goto sym_err;
while ((name = ctf_enum_next (fp, type, &i, &val)) != NULL)
@@ -129,21 +36,27 @@ main (int argc, char *argv[])
if (ctf_errno (fp) != ECTF_NEXT_END)
goto nerr;
+ /* Fish it out again to check the caching layer. */
+ if (((tmp_fp = ctf_arc_lookup_symbol_name (ctf, "primary1", &tmp, &err)) != fp)
+ || (tmp != type))
+ goto sym_cache_err;
+
+ ctf_dict_close (tmp_fp);
ctf_dict_close (fp);
ctf_close (ctf);
return 0;
- bfd_open_err:
- fprintf (stderr, "%s: cannot open: %s\n", argv[0], bfd_errmsg (bfd_get_error ()));
- return 1;
-
open_err:
fprintf (stderr, "%s: cannot open: %s\n", argv[0], ctf_errmsg (err));
return 1;
sym_err:
fprintf (stderr, "%s: Symbol lookup error: %s\n", argv[0], ctf_errmsg (err));
return 1;
+ sym_cache_err:
+ fprintf (stderr, "%s: Symbol re-lookup error (caching bug): %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-writable/symtypetab-nonlinker-writeout.c b/libctf/testsuite/libctf-writable/symtypetab-nonlinker-writeout.c
index d339963..98144de 100644
--- a/libctf/testsuite/libctf-writable/symtypetab-nonlinker-writeout.c
+++ b/libctf/testsuite/libctf-writable/symtypetab-nonlinker-writeout.c
@@ -98,6 +98,21 @@ try_maybe_reporting (int report)
if (ctf_errno (fp) != ECTF_NEXT_END)
goto iter_err;
+ /* Look up all the symbols by name and make sure that works. */
+
+ if (ctf_lookup_by_symbol_name (fp, "data_a") != base2)
+ goto lookup_syms_err;
+ if (ctf_lookup_by_symbol_name (fp, "data_b") != base3)
+ goto lookup_syms_err;
+ if (ctf_lookup_by_symbol_name (fp, "data_c") != base)
+ goto lookup_syms_err;
+ if (ctf_lookup_by_symbol_name (fp, "func_a") != func2)
+ goto lookup_syms_err;
+ if (ctf_lookup_by_symbol_name (fp, "func_b") != func3)
+ goto lookup_syms_err;
+ if (ctf_lookup_by_symbol_name (fp, "func_c") != func)
+ goto lookup_syms_err;
+
/* Possibly report some but not all of the symbols, as if we are a linker (no
real program would do this without using the ctf_link APIs, but it's not
*prohibited*, just useless, and if they do we don't want things to
@@ -121,6 +136,21 @@ try_maybe_reporting (int report)
if (report_sym (fp, &sym, "func_c", 4, 2) < 0 ||
report_sym (fp, &sym, "func_a", 5, 2) < 0)
goto report_err;
+
+ /* Look up all the symbols by name now we have reported symbols. */
+
+ if (ctf_lookup_by_symbol_name (fp, "data_a") != base2)
+ goto lookup_syms_err;
+ if (ctf_lookup_by_symbol_name (fp, "data_b") != base3)
+ goto lookup_syms_err;
+ if (ctf_lookup_by_symbol_name (fp, "data_c") != base)
+ goto lookup_syms_err;
+ if (ctf_lookup_by_symbol_name (fp, "func_a") != func2)
+ goto lookup_syms_err;
+ if (ctf_lookup_by_symbol_name (fp, "func_b") != func3)
+ goto lookup_syms_err;
+ if (ctf_lookup_by_symbol_name (fp, "func_c") != func)
+ goto lookup_syms_err;
}
/* Write out, to memory. */
@@ -203,6 +233,10 @@ try_maybe_reporting (int report)
expected_overshoot_err:
fprintf (stderr, "Too many symbols in post-writeout comparison\n");
exit (1);
+ lookup_syms_err:
+ fprintf (stderr, "Explicit lookup of symbols by name failed: %s\n",
+ ctf_errmsg (ctf_errno (fp)));
+ exit (1);
expected_compar_err:
fprintf (stderr, "Non-dynamic iteration comparison failure: %s "
"(type %lx): expected %s (type %lx)\n", symname, symtype,