]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blobdiff - libctf/testsuite/libctf-lookup/enum-symbol.c
libctf, include: find types of symbols by name
[thirdparty/binutils-gdb.git] / libctf / testsuite / libctf-lookup / enum-symbol.c
index 4f63b61b8039acb24aa7b0849028af789bac4292..c67478fe780f3d2b2082089da80e5aca40526ba0 100644 (file)
@@ -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;