]> Git Repo - binutils.git/blob - libctf/testsuite/libctf-regression/type-add-unnamed-struct.c
libctf, ld: fix symtypetab and var section population under ld -r
[binutils.git] / libctf / testsuite / libctf-regression / type-add-unnamed-struct.c
1 #include <ctf-api.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4
5 int
6 main (int argc, char *argv[])
7 {
8   ctf_dict_t *fp;
9   ctf_archive_t *ctf;
10   ctf_dict_t *dyn;
11   ctf_next_t *i = NULL;
12   ctf_id_t type;
13   ctf_id_t newtype;
14   const char *memb;
15   ctf_membinfo_t mi;
16   const char *membs[] = { "bar", "baz", NULL };
17   const char **walk;
18   int err;
19
20   if (argc != 2)
21     {
22       fprintf (stderr, "Syntax: %s PROGRAM\n", argv[0]);
23       exit(1);
24     }
25
26   if ((ctf = ctf_open (argv[1], NULL, &err)) == NULL)
27     goto open_err;
28
29   if ((fp = ctf_dict_open (ctf, NULL, &err)) == NULL)
30     goto open_err;
31
32   if ((dyn = ctf_create (&err)) == NULL)
33     goto create_err;
34
35   /* Copy 'struct foo' into the dynamic dict, then make sure we can look up a
36      member situated inside an unnamed struct.  */
37
38   if ((type = ctf_lookup_by_name (fp, "struct foo")) == CTF_ERR)
39     {
40       fprintf (stderr, "Cannot look up struct foo: %s\n", ctf_errmsg (ctf_errno (dyn)));
41       return 1;
42     }
43
44   if ((newtype = ctf_add_type (dyn, fp, type)) == CTF_ERR)
45     goto copy_err;
46
47   for (walk = membs; *walk != NULL; walk++)
48     {
49       if (ctf_member_info (dyn, newtype, *walk, &mi) < 0)
50         goto lookup_err;
51       printf ("Looked up %s, type %lx, offset %lx\n", *walk, (long) mi.ctm_type, mi.ctm_offset);
52     }
53
54   ctf_dict_close (dyn);
55   ctf_dict_close (fp);
56   ctf_close (ctf);
57
58   return 0;
59
60  open_err:
61   fprintf (stderr, "%s: cannot open: %s\n", argv[0], ctf_errmsg (err));
62   return 1;
63  create_err:
64   fprintf (stderr, "%s: cannot create: %s\n", argv[0], ctf_errmsg (err));
65   return 1;
66  copy_err:
67   fprintf (stderr, "Type addition failed: %s\n", ctf_errmsg (ctf_errno (dyn)));
68   return 1;
69  lookup_err:
70   fprintf (stderr, "Cannot look up %s: %s\n", *walk, ctf_errmsg (ctf_errno (dyn)));
71   return 1;
72 }
This page took 0.028302 seconds and 4 git commands to generate.