]> Git Repo - binutils.git/blob - libctf/ctf-create.c
libctf, create: empty dicts are dirty to start with
[binutils.git] / libctf / ctf-create.c
1 /* CTF file creation.
2    Copyright (C) 2019-2020 Free Software Foundation, Inc.
3
4    This file is part of libctf.
5
6    libctf is free software; you can redistribute it and/or modify it under
7    the terms of the GNU General Public License as published by the Free
8    Software Foundation; either version 3, or (at your option) any later
9    version.
10
11    This program is distributed in the hope that it will be useful, but
12    WITHOUT ANY WARRANTY; without even the implied warranty of
13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14    See the GNU General Public License for more details.
15
16    You should have received a copy of the GNU General Public License
17    along with this program; see the file COPYING.  If not see
18    <http://www.gnu.org/licenses/>.  */
19
20 #include <ctf-impl.h>
21 #include <sys/param.h>
22 #include <assert.h>
23 #include <string.h>
24 #include <unistd.h>
25 #include <zlib.h>
26
27 #ifndef roundup
28 #define roundup(x, y)  ((((x) + ((y) - 1)) / (y)) * (y))
29 #endif
30
31 /* Make sure the ptrtab has enough space for at least one more type.
32
33    We start with 4KiB of ptrtab, enough for a thousand types, then grow it 25%
34    at a time.  */
35
36 static int
37 ctf_grow_ptrtab (ctf_file_t *fp)
38 {
39   size_t new_ptrtab_len = fp->ctf_ptrtab_len;
40
41   /* We allocate one more ptrtab entry than we need, for the initial zero,
42      plus one because the caller will probably allocate a new type.  */
43
44   if (fp->ctf_ptrtab == NULL)
45     new_ptrtab_len = 1024;
46   else if ((fp->ctf_typemax + 2) > fp->ctf_ptrtab_len)
47     new_ptrtab_len = fp->ctf_ptrtab_len * 1.25;
48
49   if (new_ptrtab_len != fp->ctf_ptrtab_len)
50     {
51       uint32_t *new_ptrtab;
52
53       if ((new_ptrtab = realloc (fp->ctf_ptrtab,
54                                  new_ptrtab_len * sizeof (uint32_t))) == NULL)
55         return (ctf_set_errno (fp, ENOMEM));
56
57       fp->ctf_ptrtab = new_ptrtab;
58       memset (fp->ctf_ptrtab + fp->ctf_ptrtab_len, 0,
59               (new_ptrtab_len - fp->ctf_ptrtab_len) * sizeof (uint32_t));
60       fp->ctf_ptrtab_len = new_ptrtab_len;
61     }
62   return 0;
63 }
64
65 /* To create an empty CTF container, we just declare a zeroed header and call
66    ctf_bufopen() on it.  If ctf_bufopen succeeds, we mark the new container r/w
67    and initialize the dynamic members.  We start assigning type IDs at 1 because
68    type ID 0 is used as a sentinel and a not-found indicator.  */
69
70 ctf_file_t *
71 ctf_create (int *errp)
72 {
73   static const ctf_header_t hdr = { .cth_preamble = { CTF_MAGIC, CTF_VERSION, 0 } };
74
75   ctf_dynhash_t *dthash;
76   ctf_dynhash_t *dvhash;
77   ctf_dynhash_t *structs = NULL, *unions = NULL, *enums = NULL, *names = NULL;
78   ctf_sect_t cts;
79   ctf_file_t *fp;
80
81   libctf_init_debug();
82   dthash = ctf_dynhash_create (ctf_hash_integer, ctf_hash_eq_integer,
83                                NULL, NULL);
84   if (dthash == NULL)
85     {
86       ctf_set_open_errno (errp, EAGAIN);
87       goto err;
88     }
89
90   dvhash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
91                                NULL, NULL);
92   if (dvhash == NULL)
93     {
94       ctf_set_open_errno (errp, EAGAIN);
95       goto err_dt;
96     }
97
98   structs = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
99                                 NULL, NULL);
100   unions = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
101                                NULL, NULL);
102   enums = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
103                               NULL, NULL);
104   names = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
105                               NULL, NULL);
106   if (!structs || !unions || !enums || !names)
107     {
108       ctf_set_open_errno (errp, EAGAIN);
109       goto err_dv;
110     }
111
112   cts.cts_name = _CTF_SECTION;
113   cts.cts_data = &hdr;
114   cts.cts_size = sizeof (hdr);
115   cts.cts_entsize = 1;
116
117   if ((fp = ctf_bufopen_internal (&cts, NULL, NULL, NULL, 1, errp)) == NULL)
118     goto err_dv;
119
120   fp->ctf_structs.ctn_writable = structs;
121   fp->ctf_unions.ctn_writable = unions;
122   fp->ctf_enums.ctn_writable = enums;
123   fp->ctf_names.ctn_writable = names;
124   fp->ctf_dthash = dthash;
125   fp->ctf_dvhash = dvhash;
126   fp->ctf_dtoldid = 0;
127   fp->ctf_snapshots = 1;
128   fp->ctf_snapshot_lu = 0;
129   fp->ctf_flags |= LCTF_DIRTY;
130
131   ctf_set_ctl_hashes (fp);
132   ctf_setmodel (fp, CTF_MODEL_NATIVE);
133   if (ctf_grow_ptrtab (fp) < 0)
134     {
135       ctf_set_open_errno (errp, ctf_errno (fp));
136       ctf_file_close (fp);
137       return NULL;
138     }
139
140   return fp;
141
142  err_dv:
143   ctf_dynhash_destroy (structs);
144   ctf_dynhash_destroy (unions);
145   ctf_dynhash_destroy (enums);
146   ctf_dynhash_destroy (names);
147   ctf_dynhash_destroy (dvhash);
148  err_dt:
149   ctf_dynhash_destroy (dthash);
150  err:
151   return NULL;
152 }
153
154 static unsigned char *
155 ctf_copy_smembers (ctf_file_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
156 {
157   ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
158   ctf_member_t ctm;
159
160   for (; dmd != NULL; dmd = ctf_list_next (dmd))
161     {
162       ctf_member_t *copied;
163
164       ctm.ctm_name = 0;
165       ctm.ctm_type = (uint32_t) dmd->dmd_type;
166       ctm.ctm_offset = (uint32_t) dmd->dmd_offset;
167
168       memcpy (t, &ctm, sizeof (ctm));
169       copied = (ctf_member_t *) t;
170       if (dmd->dmd_name)
171         ctf_str_add_ref (fp, dmd->dmd_name, &copied->ctm_name);
172
173       t += sizeof (ctm);
174     }
175
176   return t;
177 }
178
179 static unsigned char *
180 ctf_copy_lmembers (ctf_file_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
181 {
182   ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
183   ctf_lmember_t ctlm;
184
185   for (; dmd != NULL; dmd = ctf_list_next (dmd))
186     {
187       ctf_lmember_t *copied;
188
189       ctlm.ctlm_name = 0;
190       ctlm.ctlm_type = (uint32_t) dmd->dmd_type;
191       ctlm.ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (dmd->dmd_offset);
192       ctlm.ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (dmd->dmd_offset);
193
194       memcpy (t, &ctlm, sizeof (ctlm));
195       copied = (ctf_lmember_t *) t;
196       if (dmd->dmd_name)
197         ctf_str_add_ref (fp, dmd->dmd_name, &copied->ctlm_name);
198
199       t += sizeof (ctlm);
200     }
201
202   return t;
203 }
204
205 static unsigned char *
206 ctf_copy_emembers (ctf_file_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
207 {
208   ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
209   ctf_enum_t cte;
210
211   for (; dmd != NULL; dmd = ctf_list_next (dmd))
212     {
213       ctf_enum_t *copied;
214
215       cte.cte_value = dmd->dmd_value;
216       memcpy (t, &cte, sizeof (cte));
217       copied = (ctf_enum_t *) t;
218       ctf_str_add_ref (fp, dmd->dmd_name, &copied->cte_name);
219       t += sizeof (cte);
220     }
221
222   return t;
223 }
224
225 /* Sort a newly-constructed static variable array.  */
226
227 typedef struct ctf_sort_var_arg_cb
228 {
229   ctf_file_t *fp;
230   ctf_strs_t *strtab;
231 } ctf_sort_var_arg_cb_t;
232
233 static int
234 ctf_sort_var (const void *one_, const void *two_, void *arg_)
235 {
236   const ctf_varent_t *one = one_;
237   const ctf_varent_t *two = two_;
238   ctf_sort_var_arg_cb_t *arg = arg_;
239
240   return (strcmp (ctf_strraw_explicit (arg->fp, one->ctv_name, arg->strtab),
241                   ctf_strraw_explicit (arg->fp, two->ctv_name, arg->strtab)));
242 }
243
244 /* Compatibility: just update the threshold for ctf_discard.  */
245 int
246 ctf_update (ctf_file_t *fp)
247 {
248   if (!(fp->ctf_flags & LCTF_RDWR))
249     return (ctf_set_errno (fp, ECTF_RDONLY));
250
251   fp->ctf_dtoldid = fp->ctf_typemax;
252   return 0;
253 }
254
255 /* If the specified CTF container is writable and has been modified, reload this
256    container with the updated type definitions, ready for serialization.  In
257    order to make this code and the rest of libctf as simple as possible, we
258    perform updates by taking the dynamic type definitions and creating an
259    in-memory CTF file containing the definitions, and then call
260    ctf_simple_open_internal() on it.  We perform one extra trick here for the
261    benefit of callers and to keep our code simple: ctf_simple_open_internal()
262    will return a new ctf_file_t, but we want to keep the fp constant for the
263    caller, so after ctf_simple_open_internal() returns, we use memcpy to swap
264    the interior of the old and new ctf_file_t's, and then free the old.  */
265 int
266 ctf_serialize (ctf_file_t *fp)
267 {
268   ctf_file_t ofp, *nfp;
269   ctf_header_t hdr, *hdrp;
270   ctf_dtdef_t *dtd;
271   ctf_dvdef_t *dvd;
272   ctf_varent_t *dvarents;
273   ctf_strs_writable_t strtab;
274
275   unsigned char *t;
276   unsigned long i;
277   size_t buf_size, type_size, nvars;
278   unsigned char *buf, *newbuf;
279   int err;
280
281   if (!(fp->ctf_flags & LCTF_RDWR))
282     return (ctf_set_errno (fp, ECTF_RDONLY));
283
284   /* Update required?  */
285   if (!(fp->ctf_flags & LCTF_DIRTY))
286     return 0;
287
288   /* Fill in an initial CTF header.  We will leave the label, object,
289      and function sections empty and only output a header, type section,
290      and string table.  The type section begins at a 4-byte aligned
291      boundary past the CTF header itself (at relative offset zero).  */
292
293   memset (&hdr, 0, sizeof (hdr));
294   hdr.cth_magic = CTF_MAGIC;
295   hdr.cth_version = CTF_VERSION;
296
297   /* Iterate through the dynamic type definition list and compute the
298      size of the CTF type section we will need to generate.  */
299
300   for (type_size = 0, dtd = ctf_list_next (&fp->ctf_dtdefs);
301        dtd != NULL; dtd = ctf_list_next (dtd))
302     {
303       uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
304       uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
305
306       if (dtd->dtd_data.ctt_size != CTF_LSIZE_SENT)
307         type_size += sizeof (ctf_stype_t);
308       else
309         type_size += sizeof (ctf_type_t);
310
311       switch (kind)
312         {
313         case CTF_K_INTEGER:
314         case CTF_K_FLOAT:
315           type_size += sizeof (uint32_t);
316           break;
317         case CTF_K_ARRAY:
318           type_size += sizeof (ctf_array_t);
319           break;
320         case CTF_K_SLICE:
321           type_size += sizeof (ctf_slice_t);
322           break;
323         case CTF_K_FUNCTION:
324           type_size += sizeof (uint32_t) * (vlen + (vlen & 1));
325           break;
326         case CTF_K_STRUCT:
327         case CTF_K_UNION:
328           if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH)
329             type_size += sizeof (ctf_member_t) * vlen;
330           else
331             type_size += sizeof (ctf_lmember_t) * vlen;
332           break;
333         case CTF_K_ENUM:
334           type_size += sizeof (ctf_enum_t) * vlen;
335           break;
336         }
337     }
338
339   /* Computing the number of entries in the CTF variable section is much
340      simpler.  */
341
342   for (nvars = 0, dvd = ctf_list_next (&fp->ctf_dvdefs);
343        dvd != NULL; dvd = ctf_list_next (dvd), nvars++);
344
345   /* Compute the size of the CTF buffer we need, sans only the string table,
346      then allocate a new buffer and memcpy the finished header to the start of
347      the buffer.  (We will adjust this later with strtab length info.)  */
348
349   hdr.cth_typeoff = hdr.cth_varoff + (nvars * sizeof (ctf_varent_t));
350   hdr.cth_stroff = hdr.cth_typeoff + type_size;
351   hdr.cth_strlen = 0;
352
353   buf_size = sizeof (ctf_header_t) + hdr.cth_stroff + hdr.cth_strlen;
354
355   if ((buf = malloc (buf_size)) == NULL)
356     return (ctf_set_errno (fp, EAGAIN));
357
358   memcpy (buf, &hdr, sizeof (ctf_header_t));
359   t = (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_varoff;
360
361   hdrp = (ctf_header_t *) buf;
362   if ((fp->ctf_flags & LCTF_CHILD) && (fp->ctf_parname != NULL))
363     ctf_str_add_ref (fp, fp->ctf_parname, &hdrp->cth_parname);
364   if (fp->ctf_cuname != NULL)
365     ctf_str_add_ref (fp, fp->ctf_cuname, &hdrp->cth_cuname);
366
367   /* Work over the variable list, translating everything into ctf_varent_t's and
368      prepping the string table.  */
369
370   dvarents = (ctf_varent_t *) t;
371   for (i = 0, dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL;
372        dvd = ctf_list_next (dvd), i++)
373     {
374       ctf_varent_t *var = &dvarents[i];
375
376       ctf_str_add_ref (fp, dvd->dvd_name, &var->ctv_name);
377       var->ctv_type = (uint32_t) dvd->dvd_type;
378     }
379   assert (i == nvars);
380
381   t += sizeof (ctf_varent_t) * nvars;
382
383   assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_typeoff);
384
385   /* We now take a final lap through the dynamic type definition list and copy
386      the appropriate type records to the output buffer, noting down the
387      strings as we go.  */
388
389   for (dtd = ctf_list_next (&fp->ctf_dtdefs);
390        dtd != NULL; dtd = ctf_list_next (dtd))
391     {
392       uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
393       uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
394
395       ctf_array_t cta;
396       uint32_t encoding;
397       size_t len;
398       ctf_stype_t *copied;
399       const char *name;
400
401       if (dtd->dtd_data.ctt_size != CTF_LSIZE_SENT)
402         len = sizeof (ctf_stype_t);
403       else
404         len = sizeof (ctf_type_t);
405
406       memcpy (t, &dtd->dtd_data, len);
407       copied = (ctf_stype_t *) t;  /* name is at the start: constant offset.  */
408       if (copied->ctt_name
409           && (name = ctf_strraw (fp, copied->ctt_name)) != NULL)
410         ctf_str_add_ref (fp, name, &copied->ctt_name);
411       t += len;
412
413       switch (kind)
414         {
415         case CTF_K_INTEGER:
416         case CTF_K_FLOAT:
417           if (kind == CTF_K_INTEGER)
418             {
419               encoding = CTF_INT_DATA (dtd->dtd_u.dtu_enc.cte_format,
420                                        dtd->dtd_u.dtu_enc.cte_offset,
421                                        dtd->dtd_u.dtu_enc.cte_bits);
422             }
423           else
424             {
425               encoding = CTF_FP_DATA (dtd->dtd_u.dtu_enc.cte_format,
426                                       dtd->dtd_u.dtu_enc.cte_offset,
427                                       dtd->dtd_u.dtu_enc.cte_bits);
428             }
429           memcpy (t, &encoding, sizeof (encoding));
430           t += sizeof (encoding);
431           break;
432
433         case CTF_K_SLICE:
434           memcpy (t, &dtd->dtd_u.dtu_slice, sizeof (struct ctf_slice));
435           t += sizeof (struct ctf_slice);
436           break;
437
438         case CTF_K_ARRAY:
439           cta.cta_contents = (uint32_t) dtd->dtd_u.dtu_arr.ctr_contents;
440           cta.cta_index = (uint32_t) dtd->dtd_u.dtu_arr.ctr_index;
441           cta.cta_nelems = dtd->dtd_u.dtu_arr.ctr_nelems;
442           memcpy (t, &cta, sizeof (cta));
443           t += sizeof (cta);
444           break;
445
446         case CTF_K_FUNCTION:
447           {
448             uint32_t *argv = (uint32_t *) (uintptr_t) t;
449             uint32_t argc;
450
451             for (argc = 0; argc < vlen; argc++)
452               *argv++ = dtd->dtd_u.dtu_argv[argc];
453
454             if (vlen & 1)
455               *argv++ = 0;      /* Pad to 4-byte boundary.  */
456
457             t = (unsigned char *) argv;
458             break;
459           }
460
461         case CTF_K_STRUCT:
462         case CTF_K_UNION:
463           if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH)
464             t = ctf_copy_smembers (fp, dtd, t);
465           else
466             t = ctf_copy_lmembers (fp, dtd, t);
467           break;
468
469         case CTF_K_ENUM:
470           t = ctf_copy_emembers (fp, dtd, t);
471           break;
472         }
473     }
474   assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_stroff);
475
476   /* Construct the final string table and fill out all the string refs with the
477      final offsets.  Then purge the refs list, because we're about to move this
478      strtab onto the end of the buf, invalidating all the offsets.  */
479   strtab = ctf_str_write_strtab (fp);
480   ctf_str_purge_refs (fp);
481
482   if (strtab.cts_strs == NULL)
483     {
484       free (buf);
485       return (ctf_set_errno (fp, EAGAIN));
486     }
487
488   /* Now the string table is constructed, we can sort the buffer of
489      ctf_varent_t's.  */
490   ctf_sort_var_arg_cb_t sort_var_arg = { fp, (ctf_strs_t *) &strtab };
491   ctf_qsort_r (dvarents, nvars, sizeof (ctf_varent_t), ctf_sort_var,
492                &sort_var_arg);
493
494   if ((newbuf = ctf_realloc (fp, buf, buf_size + strtab.cts_len)) == NULL)
495     {
496       free (buf);
497       free (strtab.cts_strs);
498       return (ctf_set_errno (fp, EAGAIN));
499     }
500   buf = newbuf;
501   memcpy (buf + buf_size, strtab.cts_strs, strtab.cts_len);
502   hdrp = (ctf_header_t *) buf;
503   hdrp->cth_strlen = strtab.cts_len;
504   buf_size += hdrp->cth_strlen;
505   free (strtab.cts_strs);
506
507   /* Finally, we are ready to ctf_simple_open() the new container.  If this
508      is successful, we then switch nfp and fp and free the old container.  */
509
510   if ((nfp = ctf_simple_open_internal ((char *) buf, buf_size, NULL, 0,
511                                        0, NULL, 0, fp->ctf_syn_ext_strtab,
512                                        1, &err)) == NULL)
513     {
514       free (buf);
515       return (ctf_set_errno (fp, err));
516     }
517
518   (void) ctf_setmodel (nfp, ctf_getmodel (fp));
519   (void) ctf_import (nfp, fp->ctf_parent);
520
521   nfp->ctf_refcnt = fp->ctf_refcnt;
522   nfp->ctf_flags |= fp->ctf_flags & ~LCTF_DIRTY;
523   if (nfp->ctf_dynbase == NULL)
524     nfp->ctf_dynbase = buf;             /* Make sure buf is freed on close.  */
525   nfp->ctf_dthash = fp->ctf_dthash;
526   nfp->ctf_dtdefs = fp->ctf_dtdefs;
527   nfp->ctf_dvhash = fp->ctf_dvhash;
528   nfp->ctf_dvdefs = fp->ctf_dvdefs;
529   nfp->ctf_dtoldid = fp->ctf_dtoldid;
530   nfp->ctf_add_processing = fp->ctf_add_processing;
531   nfp->ctf_snapshots = fp->ctf_snapshots + 1;
532   nfp->ctf_specific = fp->ctf_specific;
533   nfp->ctf_ptrtab = fp->ctf_ptrtab;
534   nfp->ctf_ptrtab_len = fp->ctf_ptrtab_len;
535   nfp->ctf_link_inputs = fp->ctf_link_inputs;
536   nfp->ctf_link_outputs = fp->ctf_link_outputs;
537   nfp->ctf_str_prov_offset = fp->ctf_str_prov_offset;
538   nfp->ctf_syn_ext_strtab = fp->ctf_syn_ext_strtab;
539   nfp->ctf_link_cu_mapping = fp->ctf_link_cu_mapping;
540   nfp->ctf_link_type_mapping = fp->ctf_link_type_mapping;
541   nfp->ctf_link_memb_name_changer = fp->ctf_link_memb_name_changer;
542   nfp->ctf_link_memb_name_changer_arg = fp->ctf_link_memb_name_changer_arg;
543
544   nfp->ctf_snapshot_lu = fp->ctf_snapshots;
545
546   memcpy (&nfp->ctf_lookups, fp->ctf_lookups, sizeof (fp->ctf_lookups));
547   nfp->ctf_structs = fp->ctf_structs;
548   nfp->ctf_unions = fp->ctf_unions;
549   nfp->ctf_enums = fp->ctf_enums;
550   nfp->ctf_names = fp->ctf_names;
551
552   fp->ctf_dthash = NULL;
553   ctf_str_free_atoms (nfp);
554   nfp->ctf_str_atoms = fp->ctf_str_atoms;
555   nfp->ctf_prov_strtab = fp->ctf_prov_strtab;
556   fp->ctf_str_atoms = NULL;
557   fp->ctf_prov_strtab = NULL;
558   memset (&fp->ctf_dtdefs, 0, sizeof (ctf_list_t));
559   fp->ctf_add_processing = NULL;
560   fp->ctf_ptrtab = NULL;
561   fp->ctf_link_inputs = NULL;
562   fp->ctf_link_outputs = NULL;
563   fp->ctf_syn_ext_strtab = NULL;
564   fp->ctf_link_cu_mapping = NULL;
565   fp->ctf_link_type_mapping = NULL;
566
567   fp->ctf_dvhash = NULL;
568   memset (&fp->ctf_dvdefs, 0, sizeof (ctf_list_t));
569   memset (fp->ctf_lookups, 0, sizeof (fp->ctf_lookups));
570   fp->ctf_structs.ctn_writable = NULL;
571   fp->ctf_unions.ctn_writable = NULL;
572   fp->ctf_enums.ctn_writable = NULL;
573   fp->ctf_names.ctn_writable = NULL;
574
575   memcpy (&ofp, fp, sizeof (ctf_file_t));
576   memcpy (fp, nfp, sizeof (ctf_file_t));
577   memcpy (nfp, &ofp, sizeof (ctf_file_t));
578
579   nfp->ctf_refcnt = 1;          /* Force nfp to be freed.  */
580   ctf_file_close (nfp);
581
582   return 0;
583 }
584
585 ctf_names_t *
586 ctf_name_table (ctf_file_t *fp, int kind)
587 {
588   switch (kind)
589     {
590     case CTF_K_STRUCT:
591       return &fp->ctf_structs;
592     case CTF_K_UNION:
593       return &fp->ctf_unions;
594     case CTF_K_ENUM:
595       return &fp->ctf_enums;
596     default:
597       return &fp->ctf_names;
598     }
599 }
600
601 int
602 ctf_dtd_insert (ctf_file_t *fp, ctf_dtdef_t *dtd, int flag, int kind)
603 {
604   const char *name;
605   if (ctf_dynhash_insert (fp->ctf_dthash, (void *) dtd->dtd_type, dtd) < 0)
606     return -1;
607
608   if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name
609       && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL)
610     {
611       if (ctf_dynhash_insert (ctf_name_table (fp, kind)->ctn_writable,
612                               (char *) name, (void *) dtd->dtd_type) < 0)
613         {
614           ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type);
615           return -1;
616         }
617     }
618   ctf_list_append (&fp->ctf_dtdefs, dtd);
619   return 0;
620 }
621
622 void
623 ctf_dtd_delete (ctf_file_t *fp, ctf_dtdef_t *dtd)
624 {
625   ctf_dmdef_t *dmd, *nmd;
626   int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
627   int name_kind = kind;
628   const char *name;
629
630   ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type);
631
632   switch (kind)
633     {
634     case CTF_K_STRUCT:
635     case CTF_K_UNION:
636     case CTF_K_ENUM:
637       for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
638            dmd != NULL; dmd = nmd)
639         {
640           if (dmd->dmd_name != NULL)
641               free (dmd->dmd_name);
642           nmd = ctf_list_next (dmd);
643           free (dmd);
644         }
645       break;
646     case CTF_K_FUNCTION:
647       free (dtd->dtd_u.dtu_argv);
648       break;
649     case CTF_K_FORWARD:
650       name_kind = dtd->dtd_data.ctt_type;
651       break;
652     }
653
654   if (dtd->dtd_data.ctt_name
655       && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
656       && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
657     {
658       ctf_dynhash_remove (ctf_name_table (fp, name_kind)->ctn_writable,
659                           name);
660       ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
661     }
662
663   ctf_list_delete (&fp->ctf_dtdefs, dtd);
664   free (dtd);
665 }
666
667 ctf_dtdef_t *
668 ctf_dtd_lookup (const ctf_file_t *fp, ctf_id_t type)
669 {
670   return (ctf_dtdef_t *) ctf_dynhash_lookup (fp->ctf_dthash, (void *) type);
671 }
672
673 ctf_dtdef_t *
674 ctf_dynamic_type (const ctf_file_t *fp, ctf_id_t id)
675 {
676   ctf_id_t idx;
677
678   if (!(fp->ctf_flags & LCTF_RDWR))
679     return NULL;
680
681   if ((fp->ctf_flags & LCTF_CHILD) && LCTF_TYPE_ISPARENT (fp, id))
682     fp = fp->ctf_parent;
683
684   idx = LCTF_TYPE_TO_INDEX(fp, id);
685
686   if ((unsigned long) idx <= fp->ctf_typemax)
687     return ctf_dtd_lookup (fp, id);
688   return NULL;
689 }
690
691 int
692 ctf_dvd_insert (ctf_file_t *fp, ctf_dvdef_t *dvd)
693 {
694   if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0)
695     return -1;
696   ctf_list_append (&fp->ctf_dvdefs, dvd);
697   return 0;
698 }
699
700 void
701 ctf_dvd_delete (ctf_file_t *fp, ctf_dvdef_t *dvd)
702 {
703   ctf_dynhash_remove (fp->ctf_dvhash, dvd->dvd_name);
704   free (dvd->dvd_name);
705
706   ctf_list_delete (&fp->ctf_dvdefs, dvd);
707   free (dvd);
708 }
709
710 ctf_dvdef_t *
711 ctf_dvd_lookup (const ctf_file_t *fp, const char *name)
712 {
713   return (ctf_dvdef_t *) ctf_dynhash_lookup (fp->ctf_dvhash, name);
714 }
715
716 /* Discard all of the dynamic type definitions and variable definitions that
717    have been added to the container since the last call to ctf_update().  We
718    locate such types by scanning the dtd list and deleting elements that have
719    type IDs greater than ctf_dtoldid, which is set by ctf_update(), above, and
720    by scanning the variable list and deleting elements that have update IDs
721    equal to the current value of the last-update snapshot count (indicating that
722    they were added after the most recent call to ctf_update()).  */
723 int
724 ctf_discard (ctf_file_t *fp)
725 {
726   ctf_snapshot_id_t last_update =
727     { fp->ctf_dtoldid,
728       fp->ctf_snapshot_lu + 1 };
729
730   /* Update required?  */
731   if (!(fp->ctf_flags & LCTF_DIRTY))
732     return 0;
733
734   return (ctf_rollback (fp, last_update));
735 }
736
737 ctf_snapshot_id_t
738 ctf_snapshot (ctf_file_t *fp)
739 {
740   ctf_snapshot_id_t snapid;
741   snapid.dtd_id = fp->ctf_typemax;
742   snapid.snapshot_id = fp->ctf_snapshots++;
743   return snapid;
744 }
745
746 /* Like ctf_discard(), only discards everything after a particular ID.  */
747 int
748 ctf_rollback (ctf_file_t *fp, ctf_snapshot_id_t id)
749 {
750   ctf_dtdef_t *dtd, *ntd;
751   ctf_dvdef_t *dvd, *nvd;
752
753   if (!(fp->ctf_flags & LCTF_RDWR))
754     return (ctf_set_errno (fp, ECTF_RDONLY));
755
756   if (fp->ctf_snapshot_lu >= id.snapshot_id)
757     return (ctf_set_errno (fp, ECTF_OVERROLLBACK));
758
759   for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
760     {
761       int kind;
762       const char *name;
763
764       ntd = ctf_list_next (dtd);
765
766       if (LCTF_TYPE_TO_INDEX (fp, dtd->dtd_type) <= id.dtd_id)
767         continue;
768
769       kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
770       if (kind == CTF_K_FORWARD)
771         kind = dtd->dtd_data.ctt_type;
772
773       if (dtd->dtd_data.ctt_name
774           && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
775           && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
776         {
777           ctf_dynhash_remove (ctf_name_table (fp, kind)->ctn_writable,
778                               name);
779           ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
780         }
781
782       ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type);
783       ctf_dtd_delete (fp, dtd);
784     }
785
786   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
787     {
788       nvd = ctf_list_next (dvd);
789
790       if (dvd->dvd_snapshots <= id.snapshot_id)
791         continue;
792
793       ctf_dvd_delete (fp, dvd);
794     }
795
796   fp->ctf_typemax = id.dtd_id;
797   fp->ctf_snapshots = id.snapshot_id;
798
799   if (fp->ctf_snapshots == fp->ctf_snapshot_lu)
800     fp->ctf_flags &= ~LCTF_DIRTY;
801
802   return 0;
803 }
804
805 static ctf_id_t
806 ctf_add_generic (ctf_file_t *fp, uint32_t flag, const char *name, int kind,
807                  ctf_dtdef_t **rp)
808 {
809   ctf_dtdef_t *dtd;
810   ctf_id_t type;
811
812   if (flag != CTF_ADD_NONROOT && flag != CTF_ADD_ROOT)
813     return (ctf_set_errno (fp, EINVAL));
814
815   if (!(fp->ctf_flags & LCTF_RDWR))
816     return (ctf_set_errno (fp, ECTF_RDONLY));
817
818   if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) >= CTF_MAX_TYPE)
819     return (ctf_set_errno (fp, ECTF_FULL));
820
821   if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) == (CTF_MAX_PTYPE - 1))
822     return (ctf_set_errno (fp, ECTF_FULL));
823
824   /* Make sure ptrtab always grows to be big enough for all types.  */
825   if (ctf_grow_ptrtab (fp) < 0)
826       return CTF_ERR;           /* errno is set for us. */
827
828   if ((dtd = malloc (sizeof (ctf_dtdef_t))) == NULL)
829     return (ctf_set_errno (fp, EAGAIN));
830
831   type = ++fp->ctf_typemax;
832   type = LCTF_INDEX_TO_TYPE (fp, type, (fp->ctf_flags & LCTF_CHILD));
833
834   memset (dtd, 0, sizeof (ctf_dtdef_t));
835   dtd->dtd_data.ctt_name = ctf_str_add_ref (fp, name, &dtd->dtd_data.ctt_name);
836   dtd->dtd_type = type;
837
838   if (dtd->dtd_data.ctt_name == 0 && name != NULL && name[0] != '\0')
839     {
840       free (dtd);
841       return (ctf_set_errno (fp, EAGAIN));
842     }
843
844   if (ctf_dtd_insert (fp, dtd, flag, kind) < 0)
845     {
846       free (dtd);
847       return CTF_ERR;                   /* errno is set for us.  */
848     }
849   fp->ctf_flags |= LCTF_DIRTY;
850
851   *rp = dtd;
852   return type;
853 }
854
855 /* When encoding integer sizes, we want to convert a byte count in the range
856    1-8 to the closest power of 2 (e.g. 3->4, 5->8, etc).  The clp2() function
857    is a clever implementation from "Hacker's Delight" by Henry Warren, Jr.  */
858 static size_t
859 clp2 (size_t x)
860 {
861   x--;
862
863   x |= (x >> 1);
864   x |= (x >> 2);
865   x |= (x >> 4);
866   x |= (x >> 8);
867   x |= (x >> 16);
868
869   return (x + 1);
870 }
871
872 static ctf_id_t
873 ctf_add_encoded (ctf_file_t *fp, uint32_t flag,
874                  const char *name, const ctf_encoding_t *ep, uint32_t kind)
875 {
876   ctf_dtdef_t *dtd;
877   ctf_id_t type;
878
879   if (ep == NULL)
880     return (ctf_set_errno (fp, EINVAL));
881
882   if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
883     return CTF_ERR;             /* errno is set for us.  */
884
885   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
886   dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
887                                  / CHAR_BIT);
888   dtd->dtd_u.dtu_enc = *ep;
889
890   return type;
891 }
892
893 static ctf_id_t
894 ctf_add_reftype (ctf_file_t *fp, uint32_t flag, ctf_id_t ref, uint32_t kind)
895 {
896   ctf_dtdef_t *dtd;
897   ctf_id_t type;
898   ctf_file_t *tmp = fp;
899   int child = fp->ctf_flags & LCTF_CHILD;
900
901   if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
902     return (ctf_set_errno (fp, EINVAL));
903
904   if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
905     return CTF_ERR;             /* errno is set for us.  */
906
907   if ((type = ctf_add_generic (fp, flag, NULL, kind, &dtd)) == CTF_ERR)
908     return CTF_ERR;             /* errno is set for us.  */
909
910   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
911   dtd->dtd_data.ctt_type = (uint32_t) ref;
912
913   if (kind != CTF_K_POINTER)
914     return type;
915
916   /* If we are adding a pointer, update the ptrtab, both the directly pointed-to
917      type and (if an anonymous typedef node is being pointed at) the type that
918      points at too.  Note that ctf_typemax is at this point one higher than we
919      want to check against, because it's just been incremented for the addition
920      of this type.  */
921
922   uint32_t type_idx = LCTF_TYPE_TO_INDEX (fp, type);
923   uint32_t ref_idx = LCTF_TYPE_TO_INDEX (fp, ref);
924
925   if (LCTF_TYPE_ISCHILD (fp, ref) == child
926       && ref_idx < fp->ctf_typemax)
927     {
928       fp->ctf_ptrtab[ref_idx] = type_idx;
929
930       ctf_id_t refref_idx = LCTF_TYPE_TO_INDEX (fp, dtd->dtd_data.ctt_type);
931
932       if (tmp == fp
933           && (LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) == CTF_K_TYPEDEF)
934           && strcmp (ctf_strptr (fp, dtd->dtd_data.ctt_name), "") == 0
935           && refref_idx < fp->ctf_typemax)
936         fp->ctf_ptrtab[refref_idx] = type_idx;
937     }
938
939   return type;
940 }
941
942 ctf_id_t
943 ctf_add_slice (ctf_file_t *fp, uint32_t flag, ctf_id_t ref,
944                const ctf_encoding_t *ep)
945 {
946   ctf_dtdef_t *dtd;
947   ctf_id_t type;
948   int kind;
949   const ctf_type_t *tp;
950   ctf_file_t *tmp = fp;
951
952   if (ep == NULL)
953     return (ctf_set_errno (fp, EINVAL));
954
955   if ((ep->cte_bits > 255) || (ep->cte_offset > 255))
956     return (ctf_set_errno (fp, ECTF_SLICEOVERFLOW));
957
958   if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
959     return (ctf_set_errno (fp, EINVAL));
960
961   if (ref != 0 && ((tp = ctf_lookup_by_id (&tmp, ref)) == NULL))
962     return CTF_ERR;             /* errno is set for us.  */
963
964   kind = ctf_type_kind_unsliced (tmp, ref);
965   if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) &&
966       (kind != CTF_K_ENUM)
967       && (ref != 0))
968     return (ctf_set_errno (fp, ECTF_NOTINTFP));
969
970   if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_SLICE, &dtd)) == CTF_ERR)
971     return CTF_ERR;             /* errno is set for us.  */
972
973   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_SLICE, flag, 0);
974   dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
975                                  / CHAR_BIT);
976   dtd->dtd_u.dtu_slice.cts_type = (uint32_t) ref;
977   dtd->dtd_u.dtu_slice.cts_bits = ep->cte_bits;
978   dtd->dtd_u.dtu_slice.cts_offset = ep->cte_offset;
979
980   return type;
981 }
982
983 ctf_id_t
984 ctf_add_integer (ctf_file_t *fp, uint32_t flag,
985                  const char *name, const ctf_encoding_t *ep)
986 {
987   return (ctf_add_encoded (fp, flag, name, ep, CTF_K_INTEGER));
988 }
989
990 ctf_id_t
991 ctf_add_float (ctf_file_t *fp, uint32_t flag,
992                const char *name, const ctf_encoding_t *ep)
993 {
994   return (ctf_add_encoded (fp, flag, name, ep, CTF_K_FLOAT));
995 }
996
997 ctf_id_t
998 ctf_add_pointer (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
999 {
1000   return (ctf_add_reftype (fp, flag, ref, CTF_K_POINTER));
1001 }
1002
1003 ctf_id_t
1004 ctf_add_array (ctf_file_t *fp, uint32_t flag, const ctf_arinfo_t *arp)
1005 {
1006   ctf_dtdef_t *dtd;
1007   ctf_id_t type;
1008   ctf_file_t *tmp = fp;
1009
1010   if (arp == NULL)
1011     return (ctf_set_errno (fp, EINVAL));
1012
1013   if (arp->ctr_contents != 0
1014       && ctf_lookup_by_id (&tmp, arp->ctr_contents) == NULL)
1015     return CTF_ERR;             /* errno is set for us.  */
1016
1017   tmp = fp;
1018   if (ctf_lookup_by_id (&tmp, arp->ctr_index) == NULL)
1019     return CTF_ERR;             /* errno is set for us.  */
1020
1021   if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_ARRAY, &dtd)) == CTF_ERR)
1022     return CTF_ERR;             /* errno is set for us.  */
1023
1024   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ARRAY, flag, 0);
1025   dtd->dtd_data.ctt_size = 0;
1026   dtd->dtd_u.dtu_arr = *arp;
1027
1028   return type;
1029 }
1030
1031 int
1032 ctf_set_array (ctf_file_t *fp, ctf_id_t type, const ctf_arinfo_t *arp)
1033 {
1034   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
1035
1036   if (!(fp->ctf_flags & LCTF_RDWR))
1037     return (ctf_set_errno (fp, ECTF_RDONLY));
1038
1039   if (dtd == NULL
1040       || LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) != CTF_K_ARRAY)
1041     return (ctf_set_errno (fp, ECTF_BADID));
1042
1043   fp->ctf_flags |= LCTF_DIRTY;
1044   dtd->dtd_u.dtu_arr = *arp;
1045
1046   return 0;
1047 }
1048
1049 ctf_id_t
1050 ctf_add_function (ctf_file_t *fp, uint32_t flag,
1051                   const ctf_funcinfo_t *ctc, const ctf_id_t *argv)
1052 {
1053   ctf_dtdef_t *dtd;
1054   ctf_id_t type;
1055   uint32_t vlen;
1056   uint32_t *vdat = NULL;
1057   ctf_file_t *tmp = fp;
1058   size_t i;
1059
1060   if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0
1061       || (ctc->ctc_argc != 0 && argv == NULL))
1062     return (ctf_set_errno (fp, EINVAL));
1063
1064   vlen = ctc->ctc_argc;
1065   if (ctc->ctc_flags & CTF_FUNC_VARARG)
1066     vlen++;            /* Add trailing zero to indicate varargs (see below).  */
1067
1068   if (ctc->ctc_return != 0
1069       && ctf_lookup_by_id (&tmp, ctc->ctc_return) == NULL)
1070     return CTF_ERR;             /* errno is set for us.  */
1071
1072   if (vlen > CTF_MAX_VLEN)
1073     return (ctf_set_errno (fp, EOVERFLOW));
1074
1075   if (vlen != 0 && (vdat = malloc (sizeof (ctf_id_t) * vlen)) == NULL)
1076     return (ctf_set_errno (fp, EAGAIN));
1077
1078   for (i = 0; i < ctc->ctc_argc; i++)
1079     {
1080       tmp = fp;
1081       if (argv[i] != 0 && ctf_lookup_by_id (&tmp, argv[i]) == NULL)
1082         {
1083           free (vdat);
1084           return CTF_ERR;          /* errno is set for us.  */
1085         }
1086       vdat[i] = (uint32_t) argv[i];
1087     }
1088
1089   if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_FUNCTION,
1090                                &dtd)) == CTF_ERR)
1091     {
1092       free (vdat);
1093       return CTF_ERR;              /* errno is set for us.  */
1094     }
1095
1096   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
1097   dtd->dtd_data.ctt_type = (uint32_t) ctc->ctc_return;
1098
1099   if (ctc->ctc_flags & CTF_FUNC_VARARG)
1100     vdat[vlen - 1] = 0;            /* Add trailing zero to indicate varargs.  */
1101   dtd->dtd_u.dtu_argv = vdat;
1102
1103   return type;
1104 }
1105
1106 ctf_id_t
1107 ctf_add_struct_sized (ctf_file_t *fp, uint32_t flag, const char *name,
1108                       size_t size)
1109 {
1110   ctf_dtdef_t *dtd;
1111   ctf_id_t type = 0;
1112
1113   /* Promote root-visible forwards to structs.  */
1114   if (name != NULL)
1115     type = ctf_lookup_by_rawname (fp, CTF_K_STRUCT, name);
1116
1117   if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1118     dtd = ctf_dtd_lookup (fp, type);
1119   else if ((type = ctf_add_generic (fp, flag, name, CTF_K_STRUCT,
1120                                     &dtd)) == CTF_ERR)
1121     return CTF_ERR;             /* errno is set for us.  */
1122
1123   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_STRUCT, flag, 0);
1124
1125   if (size > CTF_MAX_SIZE)
1126     {
1127       dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1128       dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1129       dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1130     }
1131   else
1132     dtd->dtd_data.ctt_size = (uint32_t) size;
1133
1134   return type;
1135 }
1136
1137 ctf_id_t
1138 ctf_add_struct (ctf_file_t *fp, uint32_t flag, const char *name)
1139 {
1140   return (ctf_add_struct_sized (fp, flag, name, 0));
1141 }
1142
1143 ctf_id_t
1144 ctf_add_union_sized (ctf_file_t *fp, uint32_t flag, const char *name,
1145                      size_t size)
1146 {
1147   ctf_dtdef_t *dtd;
1148   ctf_id_t type = 0;
1149
1150   /* Promote root-visible forwards to unions.  */
1151   if (name != NULL)
1152     type = ctf_lookup_by_rawname (fp, CTF_K_UNION, name);
1153
1154   if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1155     dtd = ctf_dtd_lookup (fp, type);
1156   else if ((type = ctf_add_generic (fp, flag, name, CTF_K_UNION,
1157                                     &dtd)) == CTF_ERR)
1158     return CTF_ERR;             /* errno is set for us */
1159
1160   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_UNION, flag, 0);
1161
1162   if (size > CTF_MAX_SIZE)
1163     {
1164       dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1165       dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1166       dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1167     }
1168   else
1169     dtd->dtd_data.ctt_size = (uint32_t) size;
1170
1171   return type;
1172 }
1173
1174 ctf_id_t
1175 ctf_add_union (ctf_file_t *fp, uint32_t flag, const char *name)
1176 {
1177   return (ctf_add_union_sized (fp, flag, name, 0));
1178 }
1179
1180 ctf_id_t
1181 ctf_add_enum (ctf_file_t *fp, uint32_t flag, const char *name)
1182 {
1183   ctf_dtdef_t *dtd;
1184   ctf_id_t type = 0;
1185
1186   /* Promote root-visible forwards to enums.  */
1187   if (name != NULL)
1188     type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1189
1190   if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1191     dtd = ctf_dtd_lookup (fp, type);
1192   else if ((type = ctf_add_generic (fp, flag, name, CTF_K_ENUM,
1193                                     &dtd)) == CTF_ERR)
1194     return CTF_ERR;             /* errno is set for us.  */
1195
1196   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ENUM, flag, 0);
1197   dtd->dtd_data.ctt_size = fp->ctf_dmodel->ctd_int;
1198
1199   return type;
1200 }
1201
1202 ctf_id_t
1203 ctf_add_enum_encoded (ctf_file_t *fp, uint32_t flag, const char *name,
1204                       const ctf_encoding_t *ep)
1205 {
1206   ctf_id_t type = 0;
1207
1208   /* First, create the enum if need be, using most of the same machinery as
1209      ctf_add_enum(), to ensure that we do not allow things past that are not
1210      enums or forwards to them.  (This includes other slices: you cannot slice a
1211      slice, which would be a useless thing to do anyway.)  */
1212
1213   if (name != NULL)
1214     type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1215
1216   if (type != 0)
1217     {
1218       if ((ctf_type_kind (fp, type) != CTF_K_FORWARD) &&
1219           (ctf_type_kind_unsliced (fp, type) != CTF_K_ENUM))
1220         return (ctf_set_errno (fp, ECTF_NOTINTFP));
1221     }
1222   else if ((type = ctf_add_enum (fp, flag, name)) == CTF_ERR)
1223     return CTF_ERR;             /* errno is set for us.  */
1224
1225   /* Now attach a suitable slice to it.  */
1226
1227   return ctf_add_slice (fp, flag, type, ep);
1228 }
1229
1230 ctf_id_t
1231 ctf_add_forward (ctf_file_t *fp, uint32_t flag, const char *name,
1232                  uint32_t kind)
1233 {
1234   ctf_dtdef_t *dtd;
1235   ctf_id_t type = 0;
1236
1237   if (kind != CTF_K_STRUCT && kind != CTF_K_UNION && kind != CTF_K_ENUM)
1238     return (ctf_set_errno (fp, ECTF_NOTSUE));
1239
1240   /* If the type is already defined or exists as a forward tag, just
1241      return the ctf_id_t of the existing definition.  */
1242
1243   if (name != NULL)
1244     type = ctf_lookup_by_rawname (fp, kind, name);
1245
1246   if (type)
1247     return type;
1248
1249   if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
1250     return CTF_ERR;             /* errno is set for us.  */
1251
1252   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FORWARD, flag, 0);
1253   dtd->dtd_data.ctt_type = kind;
1254
1255   return type;
1256 }
1257
1258 ctf_id_t
1259 ctf_add_typedef (ctf_file_t *fp, uint32_t flag, const char *name,
1260                  ctf_id_t ref)
1261 {
1262   ctf_dtdef_t *dtd;
1263   ctf_id_t type;
1264   ctf_file_t *tmp = fp;
1265
1266   if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1267     return (ctf_set_errno (fp, EINVAL));
1268
1269   if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
1270     return CTF_ERR;             /* errno is set for us.  */
1271
1272   if ((type = ctf_add_generic (fp, flag, name, CTF_K_TYPEDEF,
1273                                &dtd)) == CTF_ERR)
1274     return CTF_ERR;             /* errno is set for us.  */
1275
1276   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_TYPEDEF, flag, 0);
1277   dtd->dtd_data.ctt_type = (uint32_t) ref;
1278
1279   return type;
1280 }
1281
1282 ctf_id_t
1283 ctf_add_volatile (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
1284 {
1285   return (ctf_add_reftype (fp, flag, ref, CTF_K_VOLATILE));
1286 }
1287
1288 ctf_id_t
1289 ctf_add_const (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
1290 {
1291   return (ctf_add_reftype (fp, flag, ref, CTF_K_CONST));
1292 }
1293
1294 ctf_id_t
1295 ctf_add_restrict (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
1296 {
1297   return (ctf_add_reftype (fp, flag, ref, CTF_K_RESTRICT));
1298 }
1299
1300 int
1301 ctf_add_enumerator (ctf_file_t *fp, ctf_id_t enid, const char *name,
1302                     int value)
1303 {
1304   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, enid);
1305   ctf_dmdef_t *dmd;
1306
1307   uint32_t kind, vlen, root;
1308   char *s;
1309
1310   if (name == NULL)
1311     return (ctf_set_errno (fp, EINVAL));
1312
1313   if (!(fp->ctf_flags & LCTF_RDWR))
1314     return (ctf_set_errno (fp, ECTF_RDONLY));
1315
1316   if (dtd == NULL)
1317     return (ctf_set_errno (fp, ECTF_BADID));
1318
1319   kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1320   root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
1321   vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
1322
1323   if (kind != CTF_K_ENUM)
1324     return (ctf_set_errno (fp, ECTF_NOTENUM));
1325
1326   if (vlen == CTF_MAX_VLEN)
1327     return (ctf_set_errno (fp, ECTF_DTFULL));
1328
1329   for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
1330        dmd != NULL; dmd = ctf_list_next (dmd))
1331     {
1332       if (strcmp (dmd->dmd_name, name) == 0)
1333         return (ctf_set_errno (fp, ECTF_DUPLICATE));
1334     }
1335
1336   if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
1337     return (ctf_set_errno (fp, EAGAIN));
1338
1339   if ((s = strdup (name)) == NULL)
1340     {
1341       free (dmd);
1342       return (ctf_set_errno (fp, EAGAIN));
1343     }
1344
1345   dmd->dmd_name = s;
1346   dmd->dmd_type = CTF_ERR;
1347   dmd->dmd_offset = 0;
1348   dmd->dmd_value = value;
1349
1350   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
1351   ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
1352
1353   fp->ctf_flags |= LCTF_DIRTY;
1354
1355   return 0;
1356 }
1357
1358 int
1359 ctf_add_member_offset (ctf_file_t *fp, ctf_id_t souid, const char *name,
1360                        ctf_id_t type, unsigned long bit_offset)
1361 {
1362   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, souid);
1363   ctf_dmdef_t *dmd;
1364
1365   ssize_t msize, malign, ssize;
1366   uint32_t kind, vlen, root;
1367   char *s = NULL;
1368
1369   if (!(fp->ctf_flags & LCTF_RDWR))
1370     return (ctf_set_errno (fp, ECTF_RDONLY));
1371
1372   if (dtd == NULL)
1373     return (ctf_set_errno (fp, ECTF_BADID));
1374
1375   if (name != NULL && name[0] == '\0')
1376     name = NULL;
1377
1378   kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1379   root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
1380   vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
1381
1382   if (kind != CTF_K_STRUCT && kind != CTF_K_UNION)
1383     return (ctf_set_errno (fp, ECTF_NOTSOU));
1384
1385   if (vlen == CTF_MAX_VLEN)
1386     return (ctf_set_errno (fp, ECTF_DTFULL));
1387
1388   if (name != NULL)
1389     {
1390       for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
1391            dmd != NULL; dmd = ctf_list_next (dmd))
1392         {
1393           if (dmd->dmd_name != NULL && strcmp (dmd->dmd_name, name) == 0)
1394             return (ctf_set_errno (fp, ECTF_DUPLICATE));
1395         }
1396     }
1397
1398   if ((msize = ctf_type_size (fp, type)) < 0 ||
1399       (malign = ctf_type_align (fp, type)) < 0)
1400     {
1401       /* The unimplemented type, and any type that resolves to it, has no size
1402          and no alignment: it can correspond to any number of compiler-inserted
1403          types.  */
1404
1405       if (ctf_errno (fp) == ECTF_NONREPRESENTABLE)
1406         {
1407           msize = 0;
1408           malign = 0;
1409           ctf_set_errno (fp, 0);
1410         }
1411       else
1412         return -1;              /* errno is set for us.  */
1413     }
1414
1415   if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
1416     return (ctf_set_errno (fp, EAGAIN));
1417
1418   if (name != NULL && (s = strdup (name)) == NULL)
1419     {
1420       free (dmd);
1421       return (ctf_set_errno (fp, EAGAIN));
1422     }
1423
1424   dmd->dmd_name = s;
1425   dmd->dmd_type = type;
1426   dmd->dmd_value = -1;
1427
1428   if (kind == CTF_K_STRUCT && vlen != 0)
1429     {
1430       if (bit_offset == (unsigned long) - 1)
1431         {
1432           /* Natural alignment.  */
1433
1434           ctf_dmdef_t *lmd = ctf_list_prev (&dtd->dtd_u.dtu_members);
1435           ctf_id_t ltype = ctf_type_resolve (fp, lmd->dmd_type);
1436           size_t off = lmd->dmd_offset;
1437
1438           ctf_encoding_t linfo;
1439           ssize_t lsize;
1440
1441           /* Propagate any error from ctf_type_resolve.  If the last member was
1442              of unimplemented type, this may be -ECTF_NONREPRESENTABLE: we
1443              cannot insert right after such a member without explicit offset
1444              specification, because its alignment and size is not known.  */
1445           if (ltype == CTF_ERR)
1446             {
1447               free (dmd);
1448               return -1;        /* errno is set for us.  */
1449             }
1450
1451           if (ctf_type_encoding (fp, ltype, &linfo) == 0)
1452             off += linfo.cte_bits;
1453           else if ((lsize = ctf_type_size (fp, ltype)) > 0)
1454             off += lsize * CHAR_BIT;
1455
1456           /* Round up the offset of the end of the last member to
1457              the next byte boundary, convert 'off' to bytes, and
1458              then round it up again to the next multiple of the
1459              alignment required by the new member.  Finally,
1460              convert back to bits and store the result in
1461              dmd_offset.  Technically we could do more efficient
1462              packing if the new member is a bit-field, but we're
1463              the "compiler" and ANSI says we can do as we choose.  */
1464
1465           off = roundup (off, CHAR_BIT) / CHAR_BIT;
1466           off = roundup (off, MAX (malign, 1));
1467           dmd->dmd_offset = off * CHAR_BIT;
1468           ssize = off + msize;
1469         }
1470       else
1471         {
1472           /* Specified offset in bits.  */
1473
1474           dmd->dmd_offset = bit_offset;
1475           ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
1476           ssize = MAX (ssize, ((signed) bit_offset / CHAR_BIT) + msize);
1477         }
1478     }
1479   else
1480     {
1481       dmd->dmd_offset = 0;
1482       ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
1483       ssize = MAX (ssize, msize);
1484     }
1485
1486   if ((size_t) ssize > CTF_MAX_SIZE)
1487     {
1488       dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1489       dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (ssize);
1490       dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (ssize);
1491     }
1492   else
1493     dtd->dtd_data.ctt_size = (uint32_t) ssize;
1494
1495   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
1496   ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
1497
1498   fp->ctf_flags |= LCTF_DIRTY;
1499   return 0;
1500 }
1501
1502 int
1503 ctf_add_member_encoded (ctf_file_t *fp, ctf_id_t souid, const char *name,
1504                         ctf_id_t type, unsigned long bit_offset,
1505                         const ctf_encoding_t encoding)
1506 {
1507   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
1508   int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1509   int otype = type;
1510
1511   if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) && (kind != CTF_K_ENUM))
1512     return (ctf_set_errno (fp, ECTF_NOTINTFP));
1513
1514   if ((type = ctf_add_slice (fp, CTF_ADD_NONROOT, otype, &encoding)) == CTF_ERR)
1515     return -1;                  /* errno is set for us.  */
1516
1517   return ctf_add_member_offset (fp, souid, name, type, bit_offset);
1518 }
1519
1520 int
1521 ctf_add_member (ctf_file_t *fp, ctf_id_t souid, const char *name,
1522                 ctf_id_t type)
1523 {
1524   return ctf_add_member_offset (fp, souid, name, type, (unsigned long) - 1);
1525 }
1526
1527 int
1528 ctf_add_variable (ctf_file_t *fp, const char *name, ctf_id_t ref)
1529 {
1530   ctf_dvdef_t *dvd;
1531   ctf_file_t *tmp = fp;
1532
1533   if (!(fp->ctf_flags & LCTF_RDWR))
1534     return (ctf_set_errno (fp, ECTF_RDONLY));
1535
1536   if (ctf_dvd_lookup (fp, name) != NULL)
1537     return (ctf_set_errno (fp, ECTF_DUPLICATE));
1538
1539   if (ctf_lookup_by_id (&tmp, ref) == NULL)
1540     return -1;                  /* errno is set for us.  */
1541
1542   /* Make sure this type is representable.  */
1543   if ((ctf_type_resolve (fp, ref) == CTF_ERR)
1544       && (ctf_errno (fp) == ECTF_NONREPRESENTABLE))
1545     return -1;
1546
1547   if ((dvd = malloc (sizeof (ctf_dvdef_t))) == NULL)
1548     return (ctf_set_errno (fp, EAGAIN));
1549
1550   if (name != NULL && (dvd->dvd_name = strdup (name)) == NULL)
1551     {
1552       free (dvd);
1553       return (ctf_set_errno (fp, EAGAIN));
1554     }
1555   dvd->dvd_type = ref;
1556   dvd->dvd_snapshots = fp->ctf_snapshots;
1557
1558   if (ctf_dvd_insert (fp, dvd) < 0)
1559     {
1560       free (dvd->dvd_name);
1561       free (dvd);
1562       return -1;                        /* errno is set for us.  */
1563     }
1564
1565   fp->ctf_flags |= LCTF_DIRTY;
1566   return 0;
1567 }
1568
1569 static int
1570 enumcmp (const char *name, int value, void *arg)
1571 {
1572   ctf_bundle_t *ctb = arg;
1573   int bvalue;
1574
1575   if (ctf_enum_value (ctb->ctb_file, ctb->ctb_type, name, &bvalue) < 0)
1576     {
1577       ctf_dprintf ("Conflict due to member %s iteration error: %s.\n", name,
1578                    ctf_errmsg (ctf_errno (ctb->ctb_file)));
1579       return 1;
1580     }
1581   if (value != bvalue)
1582     {
1583       ctf_dprintf ("Conflict due to value change: %i versus %i\n",
1584                    value, bvalue);
1585       return 1;
1586     }
1587   return 0;
1588 }
1589
1590 static int
1591 enumadd (const char *name, int value, void *arg)
1592 {
1593   ctf_bundle_t *ctb = arg;
1594
1595   return (ctf_add_enumerator (ctb->ctb_file, ctb->ctb_type,
1596                               name, value) < 0);
1597 }
1598
1599 static int
1600 membcmp (const char *name, ctf_id_t type _libctf_unused_, unsigned long offset,
1601          void *arg)
1602 {
1603   ctf_bundle_t *ctb = arg;
1604   ctf_membinfo_t ctm;
1605
1606   /* Don't check nameless members (e.g. anonymous structs/unions) against each
1607      other.  */
1608   if (name[0] == 0)
1609     return 0;
1610
1611   if (ctf_member_info (ctb->ctb_file, ctb->ctb_type, name, &ctm) < 0)
1612     {
1613       ctf_dprintf ("Conflict due to member %s iteration error: %s.\n", name,
1614                    ctf_errmsg (ctf_errno (ctb->ctb_file)));
1615       return 1;
1616     }
1617   if (ctm.ctm_offset != offset)
1618     {
1619       ctf_dprintf ("Conflict due to member %s offset change: "
1620                    "%lx versus %lx\n", name, ctm.ctm_offset, offset);
1621       return 1;
1622     }
1623   return 0;
1624 }
1625
1626 static int
1627 membadd (const char *name, ctf_id_t type, unsigned long offset, void *arg)
1628 {
1629   ctf_bundle_t *ctb = arg;
1630   ctf_dmdef_t *dmd;
1631   char *s = NULL;
1632
1633   if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
1634     return (ctf_set_errno (ctb->ctb_file, EAGAIN));
1635
1636   if (name != NULL && (s = strdup (name)) == NULL)
1637     {
1638       free (dmd);
1639       return (ctf_set_errno (ctb->ctb_file, EAGAIN));
1640     }
1641
1642   /* For now, dmd_type is copied as the src_fp's type; it is reset to an
1643     equivalent dst_fp type by a final loop in ctf_add_type(), below.  */
1644   dmd->dmd_name = s;
1645   dmd->dmd_type = type;
1646   dmd->dmd_offset = offset;
1647   dmd->dmd_value = -1;
1648
1649   ctf_list_append (&ctb->ctb_dtd->dtd_u.dtu_members, dmd);
1650
1651   ctb->ctb_file->ctf_flags |= LCTF_DIRTY;
1652   return 0;
1653 }
1654
1655 /* The ctf_add_type routine is used to copy a type from a source CTF container
1656    to a dynamic destination container.  This routine operates recursively by
1657    following the source type's links and embedded member types.  If the
1658    destination container already contains a named type which has the same
1659    attributes, then we succeed and return this type but no changes occur.  */
1660 static ctf_id_t
1661 ctf_add_type_internal (ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type,
1662                        ctf_file_t *proc_tracking_fp)
1663 {
1664   ctf_id_t dst_type = CTF_ERR;
1665   uint32_t dst_kind = CTF_K_UNKNOWN;
1666   ctf_file_t *tmp_fp = dst_fp;
1667   ctf_id_t tmp;
1668
1669   const char *name;
1670   uint32_t kind, forward_kind, flag, vlen;
1671
1672   const ctf_type_t *src_tp, *dst_tp;
1673   ctf_bundle_t src, dst;
1674   ctf_encoding_t src_en, dst_en;
1675   ctf_arinfo_t src_ar, dst_ar;
1676
1677   ctf_funcinfo_t ctc;
1678
1679   ctf_id_t orig_src_type = src_type;
1680
1681   if (!(dst_fp->ctf_flags & LCTF_RDWR))
1682     return (ctf_set_errno (dst_fp, ECTF_RDONLY));
1683
1684   if ((src_tp = ctf_lookup_by_id (&src_fp, src_type)) == NULL)
1685     return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
1686
1687   if ((ctf_type_resolve (src_fp, src_type) == CTF_ERR)
1688       && (ctf_errno (src_fp) == ECTF_NONREPRESENTABLE))
1689     return (ctf_set_errno (dst_fp, ECTF_NONREPRESENTABLE));
1690
1691   name = ctf_strptr (src_fp, src_tp->ctt_name);
1692   kind = LCTF_INFO_KIND (src_fp, src_tp->ctt_info);
1693   flag = LCTF_INFO_ISROOT (src_fp, src_tp->ctt_info);
1694   vlen = LCTF_INFO_VLEN (src_fp, src_tp->ctt_info);
1695
1696   /* If this is a type we are currently in the middle of adding, hand it
1697      straight back.  (This lets us handle self-referential structures without
1698      considering forwards and empty structures the same as their completed
1699      forms.)  */
1700
1701   tmp = ctf_type_mapping (src_fp, src_type, &tmp_fp);
1702
1703   if (tmp != 0)
1704     {
1705       if (ctf_dynhash_lookup (proc_tracking_fp->ctf_add_processing,
1706                               (void *) (uintptr_t) src_type))
1707         return tmp;
1708
1709       /* If this type has already been added from this container, and is the same
1710          kind and (if a struct or union) has the same number of members, hand it
1711          straight back.  */
1712
1713       if (ctf_type_kind_unsliced (tmp_fp, tmp) == (int) kind)
1714         {
1715           if (kind == CTF_K_STRUCT || kind == CTF_K_UNION
1716               || kind == CTF_K_ENUM)
1717             {
1718               if ((dst_tp = ctf_lookup_by_id (&tmp_fp, dst_type)) != NULL)
1719                 if (vlen == LCTF_INFO_VLEN (tmp_fp, dst_tp->ctt_info))
1720                   return tmp;
1721             }
1722           else
1723             return tmp;
1724         }
1725     }
1726
1727   forward_kind = kind;
1728   if (kind == CTF_K_FORWARD)
1729     forward_kind = src_tp->ctt_type;
1730
1731   /* If the source type has a name and is a root type (visible at the
1732      top-level scope), lookup the name in the destination container and
1733      verify that it is of the same kind before we do anything else.  */
1734
1735   if ((flag & CTF_ADD_ROOT) && name[0] != '\0'
1736       && (tmp = ctf_lookup_by_rawname (dst_fp, forward_kind, name)) != 0)
1737     {
1738       dst_type = tmp;
1739       dst_kind = ctf_type_kind_unsliced (dst_fp, dst_type);
1740     }
1741
1742   /* If an identically named dst_type exists, fail with ECTF_CONFLICT
1743      unless dst_type is a forward declaration and src_type is a struct,
1744      union, or enum (i.e. the definition of the previous forward decl).
1745
1746      We also allow addition in the opposite order (addition of a forward when a
1747      struct, union, or enum already exists), which is a NOP and returns the
1748      already-present struct, union, or enum.  */
1749
1750   if (dst_type != CTF_ERR && dst_kind != kind)
1751     {
1752       if (kind == CTF_K_FORWARD
1753           && (dst_kind == CTF_K_ENUM || dst_kind == CTF_K_STRUCT
1754               || dst_kind == CTF_K_UNION))
1755         {
1756           ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
1757           return dst_type;
1758         }
1759
1760       if (dst_kind != CTF_K_FORWARD
1761           || (kind != CTF_K_ENUM && kind != CTF_K_STRUCT
1762               && kind != CTF_K_UNION))
1763         {
1764           ctf_dprintf ("Conflict for type %s: kinds differ, new: %i; "
1765                        "old (ID %lx): %i\n", name, kind, dst_type, dst_kind);
1766           return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1767         }
1768     }
1769
1770   /* We take special action for an integer, float, or slice since it is
1771      described not only by its name but also its encoding.  For integers,
1772      bit-fields exploit this degeneracy.  */
1773
1774   if (kind == CTF_K_INTEGER || kind == CTF_K_FLOAT || kind == CTF_K_SLICE)
1775     {
1776       if (ctf_type_encoding (src_fp, src_type, &src_en) != 0)
1777         return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
1778
1779       if (dst_type != CTF_ERR)
1780         {
1781           ctf_file_t *fp = dst_fp;
1782
1783           if ((dst_tp = ctf_lookup_by_id (&fp, dst_type)) == NULL)
1784             return CTF_ERR;
1785
1786           if (ctf_type_encoding (dst_fp, dst_type, &dst_en) != 0)
1787             return CTF_ERR;                     /* errno set for us.  */
1788
1789           if (LCTF_INFO_ISROOT (fp, dst_tp->ctt_info) & CTF_ADD_ROOT)
1790             {
1791               /* The type that we found in the hash is also root-visible.  If
1792                  the two types match then use the existing one; otherwise,
1793                  declare a conflict.  Note: slices are not certain to match
1794                  even if there is no conflict: we must check the contained type
1795                  too.  */
1796
1797               if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
1798                 {
1799                   if (kind != CTF_K_SLICE)
1800                     {
1801                       ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
1802                       return dst_type;
1803                     }
1804                 }
1805               else
1806                   {
1807                     return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1808                   }
1809             }
1810           else
1811             {
1812               /* We found a non-root-visible type in the hash.  If its encoding
1813                  is the same, we can reuse it, unless it is a slice.  */
1814
1815               if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
1816                 {
1817                   if (kind != CTF_K_SLICE)
1818                     {
1819                       ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
1820                       return dst_type;
1821                     }
1822                 }
1823             }
1824         }
1825     }
1826
1827   src.ctb_file = src_fp;
1828   src.ctb_type = src_type;
1829   src.ctb_dtd = NULL;
1830
1831   dst.ctb_file = dst_fp;
1832   dst.ctb_type = dst_type;
1833   dst.ctb_dtd = NULL;
1834
1835   /* Now perform kind-specific processing.  If dst_type is CTF_ERR, then we add
1836      a new type with the same properties as src_type to dst_fp.  If dst_type is
1837      not CTF_ERR, then we verify that dst_type has the same attributes as
1838      src_type.  We recurse for embedded references.  Before we start, we note
1839      that we are processing this type, to prevent infinite recursion: we do not
1840      re-process any type that appears in this list.  The list is emptied
1841      wholesale at the end of processing everything in this recursive stack.  */
1842
1843   if (ctf_dynhash_insert (proc_tracking_fp->ctf_add_processing,
1844                           (void *) (uintptr_t) src_type, (void *) 1) < 0)
1845     return ctf_set_errno (dst_fp, ENOMEM);
1846
1847   switch (kind)
1848     {
1849     case CTF_K_INTEGER:
1850       /*  If we found a match we will have either returned it or declared a
1851           conflict.  */
1852       dst_type = ctf_add_integer (dst_fp, flag, name, &src_en);
1853       break;
1854
1855     case CTF_K_FLOAT:
1856       /* If we found a match we will have either returned it or declared a
1857        conflict.  */
1858       dst_type = ctf_add_float (dst_fp, flag, name, &src_en);
1859       break;
1860
1861     case CTF_K_SLICE:
1862       /* We have checked for conflicting encodings: now try to add the
1863          contained type.  */
1864       src_type = ctf_type_reference (src_fp, src_type);
1865       src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
1866                                         proc_tracking_fp);
1867
1868       if (src_type == CTF_ERR)
1869         return CTF_ERR;                         /* errno is set for us.  */
1870
1871       dst_type = ctf_add_slice (dst_fp, flag, src_type, &src_en);
1872       break;
1873
1874     case CTF_K_POINTER:
1875     case CTF_K_VOLATILE:
1876     case CTF_K_CONST:
1877     case CTF_K_RESTRICT:
1878       src_type = ctf_type_reference (src_fp, src_type);
1879       src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
1880                                         proc_tracking_fp);
1881
1882       if (src_type == CTF_ERR)
1883         return CTF_ERR;                         /* errno is set for us.  */
1884
1885       dst_type = ctf_add_reftype (dst_fp, flag, src_type, kind);
1886       break;
1887
1888     case CTF_K_ARRAY:
1889       if (ctf_array_info (src_fp, src_type, &src_ar) != 0)
1890         return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
1891
1892       src_ar.ctr_contents =
1893         ctf_add_type_internal (dst_fp, src_fp, src_ar.ctr_contents,
1894                                proc_tracking_fp);
1895       src_ar.ctr_index = ctf_add_type_internal (dst_fp, src_fp,
1896                                                 src_ar.ctr_index,
1897                                                 proc_tracking_fp);
1898       src_ar.ctr_nelems = src_ar.ctr_nelems;
1899
1900       if (src_ar.ctr_contents == CTF_ERR || src_ar.ctr_index == CTF_ERR)
1901         return CTF_ERR;                         /* errno is set for us.  */
1902
1903       if (dst_type != CTF_ERR)
1904         {
1905           if (ctf_array_info (dst_fp, dst_type, &dst_ar) != 0)
1906             return CTF_ERR;                     /* errno is set for us.  */
1907
1908           if (memcmp (&src_ar, &dst_ar, sizeof (ctf_arinfo_t)))
1909             {
1910               ctf_dprintf ("Conflict for type %s against ID %lx: "
1911                            "array info differs, old %lx/%lx/%x; "
1912                            "new: %lx/%lx/%x\n", name, dst_type,
1913                            src_ar.ctr_contents, src_ar.ctr_index,
1914                            src_ar.ctr_nelems, dst_ar.ctr_contents,
1915                            dst_ar.ctr_index, dst_ar.ctr_nelems);
1916               return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1917             }
1918         }
1919       else
1920         dst_type = ctf_add_array (dst_fp, flag, &src_ar);
1921       break;
1922
1923     case CTF_K_FUNCTION:
1924       ctc.ctc_return = ctf_add_type_internal (dst_fp, src_fp,
1925                                               src_tp->ctt_type,
1926                                               proc_tracking_fp);
1927       ctc.ctc_argc = 0;
1928       ctc.ctc_flags = 0;
1929
1930       if (ctc.ctc_return == CTF_ERR)
1931         return CTF_ERR;                         /* errno is set for us.  */
1932
1933       dst_type = ctf_add_function (dst_fp, flag, &ctc, NULL);
1934       break;
1935
1936     case CTF_K_STRUCT:
1937     case CTF_K_UNION:
1938       {
1939         ctf_dmdef_t *dmd;
1940         int errs = 0;
1941         size_t size;
1942         ssize_t ssize;
1943         ctf_dtdef_t *dtd;
1944
1945         /* Technically to match a struct or union we need to check both
1946            ways (src members vs. dst, dst members vs. src) but we make
1947            this more optimal by only checking src vs. dst and comparing
1948            the total size of the structure (which we must do anyway)
1949            which covers the possibility of dst members not in src.
1950            This optimization can be defeated for unions, but is so
1951            pathological as to render it irrelevant for our purposes.  */
1952
1953         if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
1954             && dst_kind != CTF_K_FORWARD)
1955           {
1956             if (ctf_type_size (src_fp, src_type) !=
1957                 ctf_type_size (dst_fp, dst_type))
1958               {
1959                 ctf_dprintf ("Conflict for type %s against ID %lx: "
1960                              "union size differs, old %li, new %li\n",
1961                              name, dst_type,
1962                              (long) ctf_type_size (src_fp, src_type),
1963                              (long) ctf_type_size (dst_fp, dst_type));
1964                 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1965               }
1966
1967             if (ctf_member_iter (src_fp, src_type, membcmp, &dst))
1968               {
1969                 ctf_dprintf ("Conflict for type %s against ID %lx: "
1970                              "members differ, see above\n", name, dst_type);
1971                 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1972               }
1973
1974             break;
1975           }
1976
1977         /* Unlike the other cases, copying structs and unions is done
1978            manually so as to avoid repeated lookups in ctf_add_member
1979            and to ensure the exact same member offsets as in src_type.  */
1980
1981         dst_type = ctf_add_generic (dst_fp, flag, name, kind, &dtd);
1982         if (dst_type == CTF_ERR)
1983           return CTF_ERR;                       /* errno is set for us.  */
1984
1985         dst.ctb_type = dst_type;
1986         dst.ctb_dtd = dtd;
1987
1988         /* Pre-emptively add this struct to the type mapping so that
1989            structures that refer to themselves work.  */
1990         ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
1991
1992         if (ctf_member_iter (src_fp, src_type, membadd, &dst) != 0)
1993           errs++;              /* Increment errs and fail at bottom of case.  */
1994
1995         if ((ssize = ctf_type_size (src_fp, src_type)) < 0)
1996           return CTF_ERR;                       /* errno is set for us.  */
1997
1998         size = (size_t) ssize;
1999         if (size > CTF_MAX_SIZE)
2000           {
2001             dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
2002             dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
2003             dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
2004           }
2005         else
2006           dtd->dtd_data.ctt_size = (uint32_t) size;
2007
2008         dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, vlen);
2009
2010         /* Make a final pass through the members changing each dmd_type (a
2011            src_fp type) to an equivalent type in dst_fp.  We pass through all
2012            members, leaving any that fail set to CTF_ERR, unless they fail
2013            because they are marking a member of type not representable in this
2014            version of CTF, in which case we just want to silently omit them:
2015            no consumer can do anything with them anyway.  */
2016         for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
2017              dmd != NULL; dmd = ctf_list_next (dmd))
2018           {
2019             ctf_file_t *dst = dst_fp;
2020             ctf_id_t memb_type;
2021
2022             memb_type = ctf_type_mapping (src_fp, dmd->dmd_type, &dst);
2023             if (memb_type == 0)
2024               {
2025                 if ((dmd->dmd_type =
2026                      ctf_add_type_internal (dst_fp, src_fp, dmd->dmd_type,
2027                                             proc_tracking_fp)) == CTF_ERR)
2028                   {
2029                     if (ctf_errno (dst_fp) != ECTF_NONREPRESENTABLE)
2030                       errs++;
2031                   }
2032               }
2033             else
2034               dmd->dmd_type = memb_type;
2035           }
2036
2037         if (errs)
2038           return CTF_ERR;                       /* errno is set for us.  */
2039         break;
2040       }
2041
2042     case CTF_K_ENUM:
2043       if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
2044           && dst_kind != CTF_K_FORWARD)
2045         {
2046           if (ctf_enum_iter (src_fp, src_type, enumcmp, &dst)
2047               || ctf_enum_iter (dst_fp, dst_type, enumcmp, &src))
2048             {
2049               ctf_dprintf ("Conflict for enum %s against ID %lx: "
2050                            "members differ, see above\n", name, dst_type);
2051               return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2052             }
2053         }
2054       else
2055         {
2056           dst_type = ctf_add_enum (dst_fp, flag, name);
2057           if ((dst.ctb_type = dst_type) == CTF_ERR
2058               || ctf_enum_iter (src_fp, src_type, enumadd, &dst))
2059             return CTF_ERR;                     /* errno is set for us */
2060         }
2061       break;
2062
2063     case CTF_K_FORWARD:
2064       if (dst_type == CTF_ERR)
2065           dst_type = ctf_add_forward (dst_fp, flag, name, forward_kind);
2066       break;
2067
2068     case CTF_K_TYPEDEF:
2069       src_type = ctf_type_reference (src_fp, src_type);
2070       src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2071                                         proc_tracking_fp);
2072
2073       if (src_type == CTF_ERR)
2074         return CTF_ERR;                         /* errno is set for us.  */
2075
2076       /* If dst_type is not CTF_ERR at this point, we should check if
2077          ctf_type_reference(dst_fp, dst_type) != src_type and if so fail with
2078          ECTF_CONFLICT.  However, this causes problems with bitness typedefs
2079          that vary based on things like if 32-bit then pid_t is int otherwise
2080          long.  We therefore omit this check and assume that if the identically
2081          named typedef already exists in dst_fp, it is correct or
2082          equivalent.  */
2083
2084       if (dst_type == CTF_ERR)
2085           dst_type = ctf_add_typedef (dst_fp, flag, name, src_type);
2086
2087       break;
2088
2089     default:
2090       return (ctf_set_errno (dst_fp, ECTF_CORRUPT));
2091     }
2092
2093   if (dst_type != CTF_ERR)
2094     ctf_add_type_mapping (src_fp, orig_src_type, dst_fp, dst_type);
2095   return dst_type;
2096 }
2097
2098 ctf_id_t
2099 ctf_add_type (ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type)
2100 {
2101   ctf_id_t id;
2102
2103   if (!src_fp->ctf_add_processing)
2104     src_fp->ctf_add_processing = ctf_dynhash_create (ctf_hash_integer,
2105                                                      ctf_hash_eq_integer,
2106                                                      NULL, NULL);
2107
2108   /* We store the hash on the source, because it contains only source type IDs:
2109      but callers will invariably expect errors to appear on the dest.  */
2110   if (!src_fp->ctf_add_processing)
2111     return (ctf_set_errno (dst_fp, ENOMEM));
2112
2113   id = ctf_add_type_internal (dst_fp, src_fp, src_type, src_fp);
2114   ctf_dynhash_empty (src_fp->ctf_add_processing);
2115
2116   return id;
2117 }
2118
2119 /* Write the compressed CTF data stream to the specified gzFile descriptor.  */
2120 int
2121 ctf_gzwrite (ctf_file_t *fp, gzFile fd)
2122 {
2123   const unsigned char *buf;
2124   ssize_t resid;
2125   ssize_t len;
2126
2127   resid = sizeof (ctf_header_t);
2128   buf = (unsigned char *) fp->ctf_header;
2129   while (resid != 0)
2130     {
2131       if ((len = gzwrite (fd, buf, resid)) <= 0)
2132         return (ctf_set_errno (fp, errno));
2133       resid -= len;
2134       buf += len;
2135     }
2136
2137   resid = fp->ctf_size;
2138   buf = fp->ctf_buf;
2139   while (resid != 0)
2140     {
2141       if ((len = gzwrite (fd, buf, resid)) <= 0)
2142         return (ctf_set_errno (fp, errno));
2143       resid -= len;
2144       buf += len;
2145     }
2146
2147   return 0;
2148 }
2149
2150 /* Compress the specified CTF data stream and write it to the specified file
2151    descriptor.  */
2152 int
2153 ctf_compress_write (ctf_file_t *fp, int fd)
2154 {
2155   unsigned char *buf;
2156   unsigned char *bp;
2157   ctf_header_t h;
2158   ctf_header_t *hp = &h;
2159   ssize_t header_len = sizeof (ctf_header_t);
2160   ssize_t compress_len;
2161   ssize_t len;
2162   int rc;
2163   int err = 0;
2164
2165   if (ctf_serialize (fp) < 0)
2166     return -1;                                  /* errno is set for us.  */
2167
2168   memcpy (hp, fp->ctf_header, header_len);
2169   hp->cth_flags |= CTF_F_COMPRESS;
2170   compress_len = compressBound (fp->ctf_size);
2171
2172   if ((buf = malloc (compress_len)) == NULL)
2173     return (ctf_set_errno (fp, ECTF_ZALLOC));
2174
2175   if ((rc = compress (buf, (uLongf *) &compress_len,
2176                       fp->ctf_buf, fp->ctf_size)) != Z_OK)
2177     {
2178       ctf_dprintf ("zlib deflate err: %s\n", zError (rc));
2179       err = ctf_set_errno (fp, ECTF_COMPRESS);
2180       goto ret;
2181     }
2182
2183   while (header_len > 0)
2184     {
2185       if ((len = write (fd, hp, header_len)) < 0)
2186         {
2187           err = ctf_set_errno (fp, errno);
2188           goto ret;
2189         }
2190       header_len -= len;
2191       hp += len;
2192     }
2193
2194   bp = buf;
2195   while (compress_len > 0)
2196     {
2197       if ((len = write (fd, bp, compress_len)) < 0)
2198         {
2199           err = ctf_set_errno (fp, errno);
2200           goto ret;
2201         }
2202       compress_len -= len;
2203       bp += len;
2204     }
2205
2206 ret:
2207   free (buf);
2208   return err;
2209 }
2210
2211 /* Optionally compress the specified CTF data stream and return it as a new
2212    dynamically-allocated string.  */
2213 unsigned char *
2214 ctf_write_mem (ctf_file_t *fp, size_t *size, size_t threshold)
2215 {
2216   unsigned char *buf;
2217   unsigned char *bp;
2218   ctf_header_t *hp;
2219   ssize_t header_len = sizeof (ctf_header_t);
2220   ssize_t compress_len;
2221   int rc;
2222
2223   if (ctf_serialize (fp) < 0)
2224     return NULL;                                /* errno is set for us.  */
2225
2226   compress_len = compressBound (fp->ctf_size);
2227   if (fp->ctf_size < threshold)
2228     compress_len = fp->ctf_size;
2229   if ((buf = malloc (compress_len
2230                      + sizeof (struct ctf_header))) == NULL)
2231     {
2232       ctf_set_errno (fp, ENOMEM);
2233       return NULL;
2234     }
2235
2236   hp = (ctf_header_t *) buf;
2237   memcpy (hp, fp->ctf_header, header_len);
2238   bp = buf + sizeof (struct ctf_header);
2239   *size = sizeof (struct ctf_header);
2240
2241   if (fp->ctf_size < threshold)
2242     {
2243       hp->cth_flags &= ~CTF_F_COMPRESS;
2244       memcpy (bp, fp->ctf_buf, fp->ctf_size);
2245       *size += fp->ctf_size;
2246     }
2247   else
2248     {
2249       hp->cth_flags |= CTF_F_COMPRESS;
2250       if ((rc = compress (bp, (uLongf *) &compress_len,
2251                           fp->ctf_buf, fp->ctf_size)) != Z_OK)
2252         {
2253           ctf_dprintf ("zlib deflate err: %s\n", zError (rc));
2254           ctf_set_errno (fp, ECTF_COMPRESS);
2255           free (buf);
2256           return NULL;
2257         }
2258       *size += compress_len;
2259     }
2260   return buf;
2261 }
2262
2263 /* Write the uncompressed CTF data stream to the specified file descriptor.  */
2264 int
2265 ctf_write (ctf_file_t *fp, int fd)
2266 {
2267   const unsigned char *buf;
2268   ssize_t resid;
2269   ssize_t len;
2270
2271   if (ctf_serialize (fp) < 0)
2272     return -1;                                  /* errno is set for us.  */
2273
2274   resid = sizeof (ctf_header_t);
2275   buf = (unsigned char *) fp->ctf_header;
2276   while (resid != 0)
2277     {
2278       if ((len = write (fd, buf, resid)) <= 0)
2279         return (ctf_set_errno (fp, errno));
2280       resid -= len;
2281       buf += len;
2282     }
2283
2284   resid = fp->ctf_size;
2285   buf = fp->ctf_buf;
2286   while (resid != 0)
2287     {
2288       if ((len = write (fd, buf, resid)) <= 0)
2289         return (ctf_set_errno (fp, errno));
2290       resid -= len;
2291       buf += len;
2292     }
2293
2294   return 0;
2295 }
This page took 0.161433 seconds and 4 git commands to generate.