]> Git Repo - binutils.git/blob - libctf/ctf-create.c
libctf: symbol type linking support
[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 #include <elf.h>
28 #include "elf-bfd.h"
29
30 #ifndef EOVERFLOW
31 #define EOVERFLOW ERANGE
32 #endif
33
34 #ifndef roundup
35 #define roundup(x, y)  ((((x) + ((y) - 1)) / (y)) * (y))
36 #endif
37
38 /* Make sure the ptrtab has enough space for at least one more type.
39
40    We start with 4KiB of ptrtab, enough for a thousand types, then grow it 25%
41    at a time.  */
42
43 static int
44 ctf_grow_ptrtab (ctf_dict_t *fp)
45 {
46   size_t new_ptrtab_len = fp->ctf_ptrtab_len;
47
48   /* We allocate one more ptrtab entry than we need, for the initial zero,
49      plus one because the caller will probably allocate a new type.  */
50
51   if (fp->ctf_ptrtab == NULL)
52     new_ptrtab_len = 1024;
53   else if ((fp->ctf_typemax + 2) > fp->ctf_ptrtab_len)
54     new_ptrtab_len = fp->ctf_ptrtab_len * 1.25;
55
56   if (new_ptrtab_len != fp->ctf_ptrtab_len)
57     {
58       uint32_t *new_ptrtab;
59
60       if ((new_ptrtab = realloc (fp->ctf_ptrtab,
61                                  new_ptrtab_len * sizeof (uint32_t))) == NULL)
62         return (ctf_set_errno (fp, ENOMEM));
63
64       fp->ctf_ptrtab = new_ptrtab;
65       memset (fp->ctf_ptrtab + fp->ctf_ptrtab_len, 0,
66               (new_ptrtab_len - fp->ctf_ptrtab_len) * sizeof (uint32_t));
67       fp->ctf_ptrtab_len = new_ptrtab_len;
68     }
69   return 0;
70 }
71
72 /* To create an empty CTF dict, we just declare a zeroed header and call
73    ctf_bufopen() on it.  If ctf_bufopen succeeds, we mark the new dict r/w and
74    initialize the dynamic members.  We start assigning type IDs at 1 because
75    type ID 0 is used as a sentinel and a not-found indicator.  */
76
77 ctf_dict_t *
78 ctf_create (int *errp)
79 {
80   static const ctf_header_t hdr = { .cth_preamble = { CTF_MAGIC, CTF_VERSION, 0 } };
81
82   ctf_dynhash_t *dthash;
83   ctf_dynhash_t *dvhash;
84   ctf_dynhash_t *structs = NULL, *unions = NULL, *enums = NULL, *names = NULL;
85   ctf_dynhash_t *objthash = NULL, *funchash = NULL;
86   ctf_sect_t cts;
87   ctf_dict_t *fp;
88
89   libctf_init_debug();
90   dthash = ctf_dynhash_create (ctf_hash_integer, ctf_hash_eq_integer,
91                                NULL, NULL);
92   if (dthash == NULL)
93     {
94       ctf_set_open_errno (errp, EAGAIN);
95       goto err;
96     }
97
98   dvhash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
99                                NULL, NULL);
100   if (dvhash == NULL)
101     {
102       ctf_set_open_errno (errp, EAGAIN);
103       goto err_dt;
104     }
105
106   structs = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
107                                 NULL, NULL);
108   unions = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
109                                NULL, NULL);
110   enums = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
111                               NULL, NULL);
112   names = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
113                               NULL, NULL);
114   objthash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
115                                  free, NULL);
116   funchash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
117                                  free, NULL);
118   if (!structs || !unions || !enums || !names)
119     {
120       ctf_set_open_errno (errp, EAGAIN);
121       goto err_dv;
122     }
123
124   cts.cts_name = _CTF_SECTION;
125   cts.cts_data = &hdr;
126   cts.cts_size = sizeof (hdr);
127   cts.cts_entsize = 1;
128
129   if ((fp = ctf_bufopen_internal (&cts, NULL, NULL, NULL, 1, errp)) == NULL)
130     goto err_dv;
131
132   fp->ctf_structs.ctn_writable = structs;
133   fp->ctf_unions.ctn_writable = unions;
134   fp->ctf_enums.ctn_writable = enums;
135   fp->ctf_names.ctn_writable = names;
136   fp->ctf_objthash = objthash;
137   fp->ctf_funchash = funchash;
138   fp->ctf_dthash = dthash;
139   fp->ctf_dvhash = dvhash;
140   fp->ctf_dtoldid = 0;
141   fp->ctf_snapshots = 1;
142   fp->ctf_snapshot_lu = 0;
143   fp->ctf_flags |= LCTF_DIRTY;
144
145   ctf_set_ctl_hashes (fp);
146   ctf_setmodel (fp, CTF_MODEL_NATIVE);
147   if (ctf_grow_ptrtab (fp) < 0)
148     {
149       ctf_set_open_errno (errp, ctf_errno (fp));
150       ctf_dict_close (fp);
151       return NULL;
152     }
153
154   return fp;
155
156  err_dv:
157   ctf_dynhash_destroy (structs);
158   ctf_dynhash_destroy (unions);
159   ctf_dynhash_destroy (enums);
160   ctf_dynhash_destroy (names);
161   ctf_dynhash_destroy (objthash);
162   ctf_dynhash_destroy (funchash);
163   ctf_dynhash_destroy (dvhash);
164  err_dt:
165   ctf_dynhash_destroy (dthash);
166  err:
167   return NULL;
168 }
169
170 /* Delete data symbols that have been assigned names from the variable section.
171    Must be called from within ctf_serialize, because that is the only place
172    you can safely delete variables without messing up ctf_rollback.  */
173
174 static int
175 symtypetab_delete_nonstatic_vars (ctf_dict_t *fp)
176 {
177   ctf_dvdef_t *dvd, *nvd;
178   ctf_id_t type;
179
180   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
181     {
182       nvd = ctf_list_next (dvd);
183
184       if (((type = (ctf_id_t) (uintptr_t)
185             ctf_dynhash_lookup (fp->ctf_objthash, dvd->dvd_name)) > 0)
186           && type == dvd->dvd_type)
187         ctf_dvd_delete (fp, dvd);
188     }
189
190   return 0;
191 }
192
193 /* Determine if a symbol is "skippable" and should never appear in the
194    symtypetab sections.  */
195
196 int
197 ctf_symtab_skippable (ctf_link_sym_t *sym)
198 {
199   /* Never skip symbols whose name is not yet known.  */
200   if (sym->st_nameidx_set)
201     return 0;
202
203   return (sym->st_name == NULL || sym->st_name[0] == 0
204           || sym->st_shndx == SHN_UNDEF
205           || strcmp (sym->st_name, "_START_") == 0
206           || strcmp (sym->st_name, "_END_") == 0
207           || (sym->st_type == STT_OBJECT && sym->st_shndx == SHN_EXTABS
208               && sym->st_value == 0));
209 }
210
211 /* Symtypetab emission flags.  */
212
213 #define CTF_SYMTYPETAB_EMIT_FUNCTION 0x1
214 #define CTF_SYMTYPETAB_EMIT_PAD 0x2
215 #define CTF_SYMTYPETAB_FORCE_INDEXED 0x4
216
217 /* Get the number of symbols in a symbol hash, the count of symbols, the maximum
218    seen, the eventual size, without any padding elements, of the func/data and
219    (if generated) index sections, and the size of accumulated padding elements.
220    The linker-reported set of symbols is found in SYMFP.
221
222    Also figure out if any symbols need to be moved to the variable section, and
223    add them (if not already present).  */
224
225 _libctf_nonnull_
226 static int
227 symtypetab_density (ctf_dict_t *fp, ctf_dict_t *symfp, ctf_dynhash_t *symhash,
228                     size_t *count, size_t *max, size_t *unpadsize,
229                     size_t *padsize, size_t *idxsize, int flags)
230 {
231   ctf_next_t *i = NULL;
232   const void *name;
233   const void *ctf_sym;
234   ctf_dynhash_t *linker_known = NULL;
235   int err;
236   int beyond_max = 0;
237
238   *count = 0;
239   *max = 0;
240   *unpadsize = 0;
241   *idxsize = 0;
242   *padsize = 0;
243
244   if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
245     {
246       /* Make a dynhash citing only symbols reported by the linker of the
247          appropriate type, then traverse all potential-symbols we know the types
248          of, removing them from linker_known as we go.  Once this is done, the
249          only symbols remaining in linker_known are symbols we don't know the
250          types of: we must emit pads for those symbols that are below the
251          maximum symbol we will emit (any beyond that are simply skipped).  */
252
253       if ((linker_known = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
254                                               NULL, NULL)) == NULL)
255         return (ctf_set_errno (fp, ENOMEM));
256
257       while ((err = ctf_dynhash_cnext (symfp->ctf_dynsyms, &i,
258                                        &name, &ctf_sym)) == 0)
259         {
260           ctf_link_sym_t *sym = (ctf_link_sym_t *) ctf_sym;
261
262           if (((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
263                && sym->st_type != STT_FUNC)
264               || (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
265                   && sym->st_type != STT_OBJECT))
266             continue;
267
268           if (ctf_symtab_skippable (sym))
269             continue;
270
271           /* This should only be true briefly before all the names are
272              finalized, long before we get this far.  */
273           if (!ctf_assert (fp, !sym->st_nameidx_set))
274             return -1;                          /* errno is set for us.  */
275
276           if (ctf_dynhash_cinsert (linker_known, name, ctf_sym) < 0)
277             {
278               ctf_dynhash_destroy (linker_known);
279               return (ctf_set_errno (fp, ENOMEM));
280             }
281         }
282       if (err != ECTF_NEXT_END)
283         {
284           ctf_err_warn (fp, 0, err, _("iterating over linker-known symbols during "
285                                   "serialization"));
286           ctf_dynhash_destroy (linker_known);
287           return (ctf_set_errno (fp, err));
288         }
289     }
290
291   while ((err = ctf_dynhash_cnext (symhash, &i, &name, NULL)) == 0)
292     {
293       ctf_link_sym_t *sym;
294
295       if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
296         {
297           /* Linker did not report symbol in symtab.  Remove it from the
298              set of known data symbols and continue.  */
299           if ((sym = ctf_dynhash_lookup (symfp->ctf_dynsyms, name)) == NULL)
300             {
301               ctf_dynhash_remove (symhash, name);
302               continue;
303             }
304
305           /* We don't remove skippable symbols from the symhash because we don't
306              want them to be migrated into variables.  */
307           if (ctf_symtab_skippable (sym))
308             continue;
309
310           if ((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
311               && sym->st_type != STT_FUNC)
312             {
313               ctf_err_warn (fp, 1, 0, _("Symbol %x added to CTF as a function "
314                                         "but is of type %x\n"),
315                             sym->st_symidx, sym->st_type);
316               ctf_dynhash_remove (symhash, name);
317               continue;
318             }
319           else if (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
320                    && sym->st_type != STT_OBJECT)
321             {
322               ctf_err_warn (fp, 1, 0, _("Symbol %x added to CTF as a data "
323                                         "object but is of type %x\n"),
324                             sym->st_symidx, sym->st_type);
325               ctf_dynhash_remove (symhash, name);
326               continue;
327             }
328
329           ctf_dynhash_remove (linker_known, name);
330         }
331       *unpadsize += sizeof (uint32_t);
332       (*count)++;
333
334       if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
335         {
336           if (*max < sym->st_symidx)
337             *max = sym->st_symidx;
338         }
339       else
340         (*max)++;
341     }
342   if (err != ECTF_NEXT_END)
343     {
344       ctf_err_warn (fp, 0, err, _("iterating over CTF symtypetab during "
345                                   "serialization"));
346       ctf_dynhash_destroy (linker_known);
347       return (ctf_set_errno (fp, err));
348     }
349
350   if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
351     {
352       while ((err = ctf_dynhash_cnext (linker_known, &i, NULL, &ctf_sym)) == 0)
353         {
354           ctf_link_sym_t *sym = (ctf_link_sym_t *) ctf_sym;
355
356           if (sym->st_symidx > *max)
357             beyond_max++;
358         }
359       if (err != ECTF_NEXT_END)
360         {
361           ctf_err_warn (fp, 0, err, _("iterating over linker-known symbols "
362                                       "during CTF serialization"));
363           ctf_dynhash_destroy (linker_known);
364           return (ctf_set_errno (fp, err));
365         }
366     }
367
368   *idxsize = *count * sizeof (uint32_t);
369   if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
370     *padsize = (ctf_dynhash_elements (linker_known) - beyond_max) * sizeof (uint32_t);
371
372   ctf_dynhash_destroy (linker_known);
373   return 0;
374 }
375
376 /* Emit an objt or func symtypetab into DP in a particular order defined by an
377    array of ctf_link_sym_t or symbol names passed in.  The index has NIDX
378    elements in it: unindexed output would terminate at symbol OUTMAX and is in
379    any case no larger than SIZE bytes.  Some index elements are expected to be
380    skipped: see symtypetab_density.  The linker-reported set of symbols (if any)
381    is found in SYMFP. */
382 static int
383 emit_symtypetab (ctf_dict_t *fp, ctf_dict_t *symfp, uint32_t *dp,
384                  ctf_link_sym_t **idx, const char **nameidx, uint32_t nidx,
385                  uint32_t outmax, int size, int flags)
386 {
387   uint32_t i;
388   uint32_t *dpp = dp;
389   ctf_dynhash_t *symhash;
390
391   ctf_dprintf ("Emitting table of size %i, outmax %u, %u symtypetab entries, "
392                "flags %i\n", size, outmax, nidx, flags);
393
394   /* Empty table? Nothing to do.  */
395   if (size == 0)
396     return 0;
397
398   if (flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
399     symhash = fp->ctf_funchash;
400   else
401     symhash = fp->ctf_objthash;
402
403   for (i = 0; i < nidx; i++)
404     {
405       const char *sym_name;
406       void *type;
407
408       /* If we have a linker-reported set of symbols, we may be given that set
409          to work from, or a set of symbol names.  In both cases we want to look
410          at the corresponding linker-reported symbol (if any).  */
411       if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
412         {
413           ctf_link_sym_t *this_link_sym;
414
415           if (idx)
416             this_link_sym = idx[i];
417           else
418             this_link_sym = ctf_dynhash_lookup (symfp->ctf_dynsyms, nameidx[i]);
419
420           /* Unreported symbol number.  No pad, no nothing.  */
421           if (!this_link_sym)
422             continue;
423
424           /* Symbol of the wrong type, or skippable?  This symbol is not in this
425              table.  */
426           if (((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
427                && this_link_sym->st_type != STT_FUNC)
428               || (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
429                   && this_link_sym->st_type != STT_OBJECT))
430             continue;
431
432           if (ctf_symtab_skippable (this_link_sym))
433             continue;
434
435           sym_name = this_link_sym->st_name;
436
437           /* Linker reports symbol of a different type to the symbol we actually
438              added?  Skip the symbol.  No pad, since the symbol doesn't actually
439              belong in this table at all.  (Warned about in
440              symtypetab_density.)  */
441           if ((this_link_sym->st_type == STT_FUNC)
442               && (ctf_dynhash_lookup (fp->ctf_objthash, sym_name)))
443             continue;
444
445           if ((this_link_sym->st_type == STT_OBJECT)
446               && (ctf_dynhash_lookup (fp->ctf_funchash, sym_name)))
447             continue;
448         }
449       else
450         sym_name = nameidx[i];
451
452       /* Symbol in index but no type set? Silently skip and (optionally)
453          pad.  (In force-indexed mode, this is also where we track symbols of
454          the wrong type for this round of insertion.)  */
455       if ((type = ctf_dynhash_lookup (symhash, sym_name)) == NULL)
456         {
457           if (flags & CTF_SYMTYPETAB_EMIT_PAD)
458             *dpp++ = 0;
459           continue;
460         }
461
462       if (!ctf_assert (fp, (((char *) dpp) - (char *) dp) < size))
463         return -1;                              /* errno is set for us.  */
464
465       *dpp++ = (ctf_id_t) (uintptr_t) type;
466
467       /* When emitting unindexed output, all later symbols are pads: stop
468          early.  */
469       if ((flags & CTF_SYMTYPETAB_EMIT_PAD) && idx[i]->st_symidx == outmax)
470         break;
471     }
472
473   return 0;
474 }
475
476 /* Emit an objt or func symtypetab index into DP in a paticular order defined by
477    an array of symbol names passed in.  Stop at NIDX.  The linker-reported set
478    of symbols (if any) is found in SYMFP. */
479 static int
480 emit_symtypetab_index (ctf_dict_t *fp, ctf_dict_t *symfp, uint32_t *dp,
481                        const char **idx, uint32_t nidx, int size, int flags)
482 {
483   uint32_t i;
484   uint32_t *dpp = dp;
485   ctf_dynhash_t *symhash;
486
487   ctf_dprintf ("Emitting index of size %i, %u entries reported by linker, "
488                "flags %i\n", size, nidx, flags);
489
490   /* Empty table? Nothing to do.  */
491   if (size == 0)
492     return 0;
493
494   if (flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
495     symhash = fp->ctf_funchash;
496   else
497     symhash = fp->ctf_objthash;
498
499   /* Indexes should always be unpadded.  */
500   if (!ctf_assert (fp, !(flags & CTF_SYMTYPETAB_EMIT_PAD)))
501     return -1;                                  /* errno is set for us.  */
502
503   for (i = 0; i < nidx; i++)
504     {
505       const char *sym_name;
506       void *type;
507
508       if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
509         {
510           ctf_link_sym_t *this_link_sym;
511
512           this_link_sym = ctf_dynhash_lookup (symfp->ctf_dynsyms, idx[i]);
513
514           /* This is an index: unreported symbols should never appear in it.  */
515           if (!ctf_assert (fp, this_link_sym != NULL))
516             return -1;                          /* errno is set for us.  */
517
518           /* Symbol of the wrong type, or skippable?  This symbol is not in this
519              table.  */
520           if (((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
521                && this_link_sym->st_type != STT_FUNC)
522               || (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
523                   && this_link_sym->st_type != STT_OBJECT))
524             continue;
525
526           if (ctf_symtab_skippable (this_link_sym))
527             continue;
528
529           sym_name = this_link_sym->st_name;
530
531           /* Linker reports symbol of a different type to the symbol we actually
532              added?  Skip the symbol.  */
533           if ((this_link_sym->st_type == STT_FUNC)
534               && (ctf_dynhash_lookup (fp->ctf_objthash, sym_name)))
535             continue;
536
537           if ((this_link_sym->st_type == STT_OBJECT)
538               && (ctf_dynhash_lookup (fp->ctf_funchash, sym_name)))
539             continue;
540         }
541       else
542         sym_name = idx[i];
543
544       /* Symbol in index and reported by linker, but no type set? Silently skip
545          and (optionally) pad.  (In force-indexed mode, this is also where we
546          track symbols of the wrong type for this round of insertion.)  */
547       if ((type = ctf_dynhash_lookup (symhash, sym_name)) == NULL)
548         continue;
549
550       ctf_str_add_ref (fp, sym_name, dpp++);
551
552       if (!ctf_assert (fp, (((char *) dpp) - (char *) dp) <= size))
553         return -1;                              /* errno is set for us.  */
554     }
555
556   return 0;
557 }
558
559 static unsigned char *
560 ctf_copy_smembers (ctf_dict_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
561 {
562   ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
563   ctf_member_t ctm;
564
565   for (; dmd != NULL; dmd = ctf_list_next (dmd))
566     {
567       ctf_member_t *copied;
568
569       ctm.ctm_name = 0;
570       ctm.ctm_type = (uint32_t) dmd->dmd_type;
571       ctm.ctm_offset = (uint32_t) dmd->dmd_offset;
572
573       memcpy (t, &ctm, sizeof (ctm));
574       copied = (ctf_member_t *) t;
575       if (dmd->dmd_name)
576         ctf_str_add_ref (fp, dmd->dmd_name, &copied->ctm_name);
577
578       t += sizeof (ctm);
579     }
580
581   return t;
582 }
583
584 static unsigned char *
585 ctf_copy_lmembers (ctf_dict_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
586 {
587   ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
588   ctf_lmember_t ctlm;
589
590   for (; dmd != NULL; dmd = ctf_list_next (dmd))
591     {
592       ctf_lmember_t *copied;
593
594       ctlm.ctlm_name = 0;
595       ctlm.ctlm_type = (uint32_t) dmd->dmd_type;
596       ctlm.ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (dmd->dmd_offset);
597       ctlm.ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (dmd->dmd_offset);
598
599       memcpy (t, &ctlm, sizeof (ctlm));
600       copied = (ctf_lmember_t *) t;
601       if (dmd->dmd_name)
602         ctf_str_add_ref (fp, dmd->dmd_name, &copied->ctlm_name);
603
604       t += sizeof (ctlm);
605     }
606
607   return t;
608 }
609
610 static unsigned char *
611 ctf_copy_emembers (ctf_dict_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
612 {
613   ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
614   ctf_enum_t cte;
615
616   for (; dmd != NULL; dmd = ctf_list_next (dmd))
617     {
618       ctf_enum_t *copied;
619
620       cte.cte_value = dmd->dmd_value;
621       memcpy (t, &cte, sizeof (cte));
622       copied = (ctf_enum_t *) t;
623       ctf_str_add_ref (fp, dmd->dmd_name, &copied->cte_name);
624       t += sizeof (cte);
625     }
626
627   return t;
628 }
629
630 /* Sort a newly-constructed static variable array.  */
631
632 typedef struct ctf_sort_var_arg_cb
633 {
634   ctf_dict_t *fp;
635   ctf_strs_t *strtab;
636 } ctf_sort_var_arg_cb_t;
637
638 static int
639 ctf_sort_var (const void *one_, const void *two_, void *arg_)
640 {
641   const ctf_varent_t *one = one_;
642   const ctf_varent_t *two = two_;
643   ctf_sort_var_arg_cb_t *arg = arg_;
644
645   return (strcmp (ctf_strraw_explicit (arg->fp, one->ctv_name, arg->strtab),
646                   ctf_strraw_explicit (arg->fp, two->ctv_name, arg->strtab)));
647 }
648
649 /* Compatibility: just update the threshold for ctf_discard.  */
650 int
651 ctf_update (ctf_dict_t *fp)
652 {
653   if (!(fp->ctf_flags & LCTF_RDWR))
654     return (ctf_set_errno (fp, ECTF_RDONLY));
655
656   fp->ctf_dtoldid = fp->ctf_typemax;
657   return 0;
658 }
659
660 /* If the specified CTF dict is writable and has been modified, reload this dict
661    with the updated type definitions, ready for serialization.  In order to make
662    this code and the rest of libctf as simple as possible, we perform updates by
663    taking the dynamic type definitions and creating an in-memory CTF dict
664    containing the definitions, and then call ctf_simple_open_internal() on it.
665    We perform one extra trick here for the benefit of callers and to keep our
666    code simple: ctf_simple_open_internal() will return a new ctf_dict_t, but we
667    want to keep the fp constant for the caller, so after
668    ctf_simple_open_internal() returns, we use memcpy to swap the interior of the
669    old and new ctf_dict_t's, and then free the old.  */
670 int
671 ctf_serialize (ctf_dict_t *fp)
672 {
673   ctf_dict_t ofp, *nfp;
674   ctf_header_t hdr, *hdrp;
675   ctf_dtdef_t *dtd;
676   ctf_dvdef_t *dvd;
677   ctf_varent_t *dvarents;
678   ctf_strs_writable_t strtab;
679   ctf_dict_t *symfp = fp;
680
681   unsigned char *t;
682   unsigned long i;
683   int symflags = 0;
684   size_t buf_size, type_size, objt_size, func_size;
685   size_t objt_unpadsize, func_unpadsize, objt_padsize, func_padsize;
686   size_t funcidx_size, objtidx_size;
687   size_t nvars, nfuncs, nobjts, maxobjt, maxfunc;
688   size_t ndynsyms = 0;
689   const char **sym_name_order = NULL;
690   unsigned char *buf = NULL, *newbuf;
691   int err;
692
693   if (!(fp->ctf_flags & LCTF_RDWR))
694     return (ctf_set_errno (fp, ECTF_RDONLY));
695
696   /* Update required?  */
697   if (!(fp->ctf_flags & LCTF_DIRTY))
698     return 0;
699
700   /* Fill in an initial CTF header.  We will leave the label, object,
701      and function sections empty and only output a header, type section,
702      and string table.  The type section begins at a 4-byte aligned
703      boundary past the CTF header itself (at relative offset zero).  The flag
704      indicating a new-style function info section (an array of CTF_K_FUNCTION
705      type IDs in the types section) is flipped on.  */
706
707   memset (&hdr, 0, sizeof (hdr));
708   hdr.cth_magic = CTF_MAGIC;
709   hdr.cth_version = CTF_VERSION;
710
711   /* This is a new-format func info section, and the symtab and strtab come out
712      of the dynsym and dynstr these days.  */
713   hdr.cth_flags = (CTF_F_NEWFUNCINFO | CTF_F_DYNSTR);
714
715   /* Iterate through the dynamic type definition list and compute the
716      size of the CTF type section we will need to generate.  */
717
718   for (type_size = 0, dtd = ctf_list_next (&fp->ctf_dtdefs);
719        dtd != NULL; dtd = ctf_list_next (dtd))
720     {
721       uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
722       uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
723
724       if (dtd->dtd_data.ctt_size != CTF_LSIZE_SENT)
725         type_size += sizeof (ctf_stype_t);
726       else
727         type_size += sizeof (ctf_type_t);
728
729       switch (kind)
730         {
731         case CTF_K_INTEGER:
732         case CTF_K_FLOAT:
733           type_size += sizeof (uint32_t);
734           break;
735         case CTF_K_ARRAY:
736           type_size += sizeof (ctf_array_t);
737           break;
738         case CTF_K_SLICE:
739           type_size += sizeof (ctf_slice_t);
740           break;
741         case CTF_K_FUNCTION:
742           type_size += sizeof (uint32_t) * (vlen + (vlen & 1));
743           break;
744         case CTF_K_STRUCT:
745         case CTF_K_UNION:
746           if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH)
747             type_size += sizeof (ctf_member_t) * vlen;
748           else
749             type_size += sizeof (ctf_lmember_t) * vlen;
750           break;
751         case CTF_K_ENUM:
752           type_size += sizeof (ctf_enum_t) * vlen;
753           break;
754         }
755     }
756
757   /* Symbol table stuff is done only if the linker has told this dict about
758      potential symbols (usually the case for parent dicts only).  The linker
759      will report symbols to the parent dict in a parent/child link, as usual
760      with all linker-related matters.  */
761
762   if (!fp->ctf_dynsyms && fp->ctf_parent && fp->ctf_parent->ctf_dynsyms)
763     symfp = fp->ctf_parent;
764
765   /* No linker-reported symbols at all: ctf_link_shuffle_syms was never called.
766      This must be an unsorted, indexed dict.  Otherwise, this is a sorted
767      dict, and the header flags indicate as much.  */
768   if (!symfp->ctf_dynsyms)
769     symflags = CTF_SYMTYPETAB_FORCE_INDEXED;
770   else
771     hdr.cth_flags |= CTF_F_IDXSORTED;
772
773   /* Work out the sizes of the object and function sections, and work out the
774      number of pad (unassigned) symbols in each, and the overall size of the
775      sections.  */
776
777   if (symtypetab_density (fp, symfp, fp->ctf_objthash, &nobjts, &maxobjt,
778                           &objt_unpadsize, &objt_padsize, &objtidx_size,
779                           symflags) < 0)
780     return -1;                                  /* errno is set for us.  */
781
782   ctf_dprintf ("Object symtypetab: %i objects, max %i, unpadded size %i, "
783                "%i bytes of pads, index size %i\n", (int) nobjts, (int) maxobjt,
784                (int) objt_unpadsize, (int) objt_padsize, (int) objtidx_size);
785
786   if (symtypetab_density (fp, symfp, fp->ctf_funchash, &nfuncs, &maxfunc,
787                           &func_unpadsize, &func_padsize, &funcidx_size,
788                           symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
789     return -1;                                  /* errno is set for us.  */
790
791   ctf_dprintf ("Function symtypetab: %i functions, max %i, unpadded size %i, "
792                "%i bytes of pads, index size %i\n", (int) nfuncs, (int) maxfunc,
793                (int) func_unpadsize, (int) func_padsize, (int) funcidx_size);
794
795   /* If the linker has reported any symbols at all, those symbols that the
796      linker has not reported are now removed from the ctf_objthash and
797      ctf_funchash.  Delete entries from the variable section that duplicate
798      newly-added data symbols.  There's no need to migrate new ones in, because
799      linker invocations (even ld -r) can only introduce new symbols, not remove
800      symbols that already exist, and the compiler always emits both a variable
801      and a data symbol simultaneously.  */
802
803   if (symtypetab_delete_nonstatic_vars (fp) < 0)
804     return -1;
805
806   /* It is worth indexing each section if it would save space to do so, due to
807      reducing the number of pads sufficiently.  A pad is the same size as a
808      single index entry: but index sections compress relatively poorly compared
809      to constant pads, so it takes a lot of contiguous padding to equal one
810      index section entry.  It would be nice to be able to *verify* whether we
811      would save space after compression rather than guessing, but this seems
812      difficult, since it would require complete reserialization.  Regardless, if
813      the linker has not reported any symbols (e.g. if this is not a final link
814      but just an ld -r), we must emit things in indexed fashion just as the
815      compiler does.  */
816
817   objt_size = objt_unpadsize;
818   if (!(symflags & CTF_SYMTYPETAB_FORCE_INDEXED)
819       && ((objt_padsize + objt_unpadsize) * CTF_INDEX_PAD_THRESHOLD
820           > objt_padsize))
821     {
822       objt_size += objt_padsize;
823       objtidx_size = 0;
824     }
825
826   func_size = func_unpadsize;
827   if (!(symflags & CTF_SYMTYPETAB_FORCE_INDEXED)
828       && ((func_padsize + func_unpadsize) * CTF_INDEX_PAD_THRESHOLD
829           > func_padsize))
830     {
831       func_size += func_padsize;
832       funcidx_size = 0;
833     }
834
835   /* Computing the number of entries in the CTF variable section is much
836      simpler.  */
837
838   for (nvars = 0, dvd = ctf_list_next (&fp->ctf_dvdefs);
839        dvd != NULL; dvd = ctf_list_next (dvd), nvars++);
840
841   /* Compute the size of the CTF buffer we need, sans only the string table,
842      then allocate a new buffer and memcpy the finished header to the start of
843      the buffer.  (We will adjust this later with strtab length info.)  */
844
845   hdr.cth_lbloff = hdr.cth_objtoff = 0;
846   hdr.cth_funcoff = hdr.cth_objtoff + objt_size;
847   hdr.cth_objtidxoff = hdr.cth_funcoff + func_size;
848   hdr.cth_funcidxoff = hdr.cth_objtidxoff + objtidx_size;
849   hdr.cth_varoff = hdr.cth_funcidxoff + funcidx_size;
850   hdr.cth_typeoff = hdr.cth_varoff + (nvars * sizeof (ctf_varent_t));
851   hdr.cth_stroff = hdr.cth_typeoff + type_size;
852   hdr.cth_strlen = 0;
853
854   buf_size = sizeof (ctf_header_t) + hdr.cth_stroff + hdr.cth_strlen;
855
856   if ((buf = malloc (buf_size)) == NULL)
857     return (ctf_set_errno (fp, EAGAIN));
858
859   memcpy (buf, &hdr, sizeof (ctf_header_t));
860   t = (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_objtoff;
861
862   hdrp = (ctf_header_t *) buf;
863   if ((fp->ctf_flags & LCTF_CHILD) && (fp->ctf_parname != NULL))
864     ctf_str_add_ref (fp, fp->ctf_parname, &hdrp->cth_parname);
865   if (fp->ctf_cuname != NULL)
866     ctf_str_add_ref (fp, fp->ctf_cuname, &hdrp->cth_cuname);
867
868   /* Sort the linker's symbols into name order if need be: if
869      ctf_link_shuffle_syms has not been called at all, just use all the symbols
870      that were added to this dict, and don't bother sorting them since this is
871      probably an ld -r and will likely just be consumed by ld again, with no
872      ctf_lookup_by_symbol()s ever done on it.  */
873
874   if ((objtidx_size != 0) || (funcidx_size != 0))
875     {
876       ctf_next_t *i = NULL;
877       void *symname;
878       const char **walk;
879       int err;
880
881       if (symfp->ctf_dynsyms)
882         ndynsyms = ctf_dynhash_elements (symfp->ctf_dynsyms);
883       else
884         ndynsyms = ctf_dynhash_elements (symfp->ctf_objthash)
885           + ctf_dynhash_elements (symfp->ctf_funchash);
886
887       if ((sym_name_order = calloc (ndynsyms, sizeof (const char *))) == NULL)
888         goto oom;
889
890       walk = sym_name_order;
891
892       if (symfp->ctf_dynsyms)
893         {
894           while ((err = ctf_dynhash_next_sorted (symfp->ctf_dynsyms, &i, &symname,
895                                                  NULL, ctf_dynhash_sort_by_name,
896                                                  NULL)) == 0)
897             *walk++ = (const char *) symname;
898           if (err != ECTF_NEXT_END)
899             goto symerr;
900         }
901       else
902         {
903           while ((err = ctf_dynhash_next (symfp->ctf_objthash, &i, &symname,
904                                           NULL)) == 0)
905             *walk++ = (const char *) symname;
906           if (err != ECTF_NEXT_END)
907             goto symerr;
908
909           while ((err = ctf_dynhash_next (symfp->ctf_funchash, &i, &symname,
910                                           NULL)) == 0)
911             *walk++ = (const char *) symname;
912           if (err != ECTF_NEXT_END)
913             goto symerr;
914         }
915     }
916
917   /* Emit the object and function sections, and if necessary their indexes.
918      Emission is done in symtab order if there is no index, and in index
919      (name) order otherwise.  */
920
921   if ((objtidx_size == 0) && symfp->ctf_dynsymidx)
922     {
923       ctf_dprintf ("Emitting unindexed objt symtypetab\n");
924       if (emit_symtypetab (fp, symfp, (uint32_t *) t, symfp->ctf_dynsymidx,
925                            NULL, symfp->ctf_dynsymmax + 1, maxobjt, objt_size,
926                            symflags | CTF_SYMTYPETAB_EMIT_PAD) < 0)
927         goto err;                               /* errno is set for us.  */
928     }
929   else
930     {
931       ctf_dprintf ("Emitting indexed objt symtypetab\n");
932       if (emit_symtypetab (fp, symfp, (uint32_t *) t, NULL, sym_name_order,
933                            ndynsyms, maxobjt, objt_size, symflags) < 0)
934         goto err;                               /* errno is set for us.  */
935     }
936
937   t += objt_size;
938
939   if ((funcidx_size == 0) && symfp->ctf_dynsymidx)
940     {
941       ctf_dprintf ("Emitting unindexed func symtypetab\n");
942       if (emit_symtypetab (fp, symfp, (uint32_t *) t, symfp->ctf_dynsymidx,
943                            NULL, symfp->ctf_dynsymmax + 1, maxfunc,
944                            func_size, symflags | CTF_SYMTYPETAB_EMIT_FUNCTION
945                            | CTF_SYMTYPETAB_EMIT_PAD) < 0)
946         goto err;                               /* errno is set for us.  */
947     }
948   else
949     {
950       ctf_dprintf ("Emitting indexed func symtypetab\n");
951       if (emit_symtypetab (fp, symfp, (uint32_t *) t, NULL, sym_name_order,
952                            ndynsyms, maxfunc, func_size,
953                            symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
954         goto err;                               /* errno is set for us.  */
955     }
956
957   t += func_size;
958
959   if (objtidx_size > 0)
960     if (emit_symtypetab_index (fp, symfp, (uint32_t *) t, sym_name_order,
961                                ndynsyms, objtidx_size, symflags) < 0)
962       goto err;
963
964   t += objtidx_size;
965
966   if (funcidx_size > 0)
967     if (emit_symtypetab_index (fp, symfp, (uint32_t *) t, sym_name_order,
968                                ndynsyms, funcidx_size,
969                                symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
970       goto err;
971
972   t += funcidx_size;
973   free (sym_name_order);
974   sym_name_order = NULL;
975
976   /* Work over the variable list, translating everything into ctf_varent_t's and
977      prepping the string table.  */
978
979   dvarents = (ctf_varent_t *) t;
980   for (i = 0, dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL;
981        dvd = ctf_list_next (dvd), i++)
982     {
983       ctf_varent_t *var = &dvarents[i];
984
985       ctf_str_add_ref (fp, dvd->dvd_name, &var->ctv_name);
986       var->ctv_type = (uint32_t) dvd->dvd_type;
987     }
988   assert (i == nvars);
989
990   t += sizeof (ctf_varent_t) * nvars;
991
992   assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_typeoff);
993
994   /* We now take a final lap through the dynamic type definition list and copy
995      the appropriate type records to the output buffer, noting down the
996      strings as we go.  */
997
998   for (dtd = ctf_list_next (&fp->ctf_dtdefs);
999        dtd != NULL; dtd = ctf_list_next (dtd))
1000     {
1001       uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1002       uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
1003
1004       ctf_array_t cta;
1005       uint32_t encoding;
1006       size_t len;
1007       ctf_stype_t *copied;
1008       const char *name;
1009
1010       if (dtd->dtd_data.ctt_size != CTF_LSIZE_SENT)
1011         len = sizeof (ctf_stype_t);
1012       else
1013         len = sizeof (ctf_type_t);
1014
1015       memcpy (t, &dtd->dtd_data, len);
1016       copied = (ctf_stype_t *) t;  /* name is at the start: constant offset.  */
1017       if (copied->ctt_name
1018           && (name = ctf_strraw (fp, copied->ctt_name)) != NULL)
1019         ctf_str_add_ref (fp, name, &copied->ctt_name);
1020       t += len;
1021
1022       switch (kind)
1023         {
1024         case CTF_K_INTEGER:
1025         case CTF_K_FLOAT:
1026           if (kind == CTF_K_INTEGER)
1027             {
1028               encoding = CTF_INT_DATA (dtd->dtd_u.dtu_enc.cte_format,
1029                                        dtd->dtd_u.dtu_enc.cte_offset,
1030                                        dtd->dtd_u.dtu_enc.cte_bits);
1031             }
1032           else
1033             {
1034               encoding = CTF_FP_DATA (dtd->dtd_u.dtu_enc.cte_format,
1035                                       dtd->dtd_u.dtu_enc.cte_offset,
1036                                       dtd->dtd_u.dtu_enc.cte_bits);
1037             }
1038           memcpy (t, &encoding, sizeof (encoding));
1039           t += sizeof (encoding);
1040           break;
1041
1042         case CTF_K_SLICE:
1043           memcpy (t, &dtd->dtd_u.dtu_slice, sizeof (struct ctf_slice));
1044           t += sizeof (struct ctf_slice);
1045           break;
1046
1047         case CTF_K_ARRAY:
1048           cta.cta_contents = (uint32_t) dtd->dtd_u.dtu_arr.ctr_contents;
1049           cta.cta_index = (uint32_t) dtd->dtd_u.dtu_arr.ctr_index;
1050           cta.cta_nelems = dtd->dtd_u.dtu_arr.ctr_nelems;
1051           memcpy (t, &cta, sizeof (cta));
1052           t += sizeof (cta);
1053           break;
1054
1055         case CTF_K_FUNCTION:
1056           {
1057             uint32_t *argv = (uint32_t *) (uintptr_t) t;
1058             uint32_t argc;
1059
1060             for (argc = 0; argc < vlen; argc++)
1061               *argv++ = dtd->dtd_u.dtu_argv[argc];
1062
1063             if (vlen & 1)
1064               *argv++ = 0;      /* Pad to 4-byte boundary.  */
1065
1066             t = (unsigned char *) argv;
1067             break;
1068           }
1069
1070         case CTF_K_STRUCT:
1071         case CTF_K_UNION:
1072           if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH)
1073             t = ctf_copy_smembers (fp, dtd, t);
1074           else
1075             t = ctf_copy_lmembers (fp, dtd, t);
1076           break;
1077
1078         case CTF_K_ENUM:
1079           t = ctf_copy_emembers (fp, dtd, t);
1080           break;
1081         }
1082     }
1083   assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_stroff);
1084
1085   /* Construct the final string table and fill out all the string refs with the
1086      final offsets.  Then purge the refs list, because we're about to move this
1087      strtab onto the end of the buf, invalidating all the offsets.  */
1088   strtab = ctf_str_write_strtab (fp);
1089   ctf_str_purge_refs (fp);
1090
1091   if (strtab.cts_strs == NULL)
1092     goto oom;
1093
1094   /* Now the string table is constructed, we can sort the buffer of
1095      ctf_varent_t's.  */
1096   ctf_sort_var_arg_cb_t sort_var_arg = { fp, (ctf_strs_t *) &strtab };
1097   ctf_qsort_r (dvarents, nvars, sizeof (ctf_varent_t), ctf_sort_var,
1098                &sort_var_arg);
1099
1100   if ((newbuf = ctf_realloc (fp, buf, buf_size + strtab.cts_len)) == NULL)
1101     {
1102       free (strtab.cts_strs);
1103       goto oom;
1104     }
1105   buf = newbuf;
1106   memcpy (buf + buf_size, strtab.cts_strs, strtab.cts_len);
1107   hdrp = (ctf_header_t *) buf;
1108   hdrp->cth_strlen = strtab.cts_len;
1109   buf_size += hdrp->cth_strlen;
1110   free (strtab.cts_strs);
1111
1112   /* Finally, we are ready to ctf_simple_open() the new dict.  If this is
1113      successful, we then switch nfp and fp and free the old dict.  */
1114
1115   if ((nfp = ctf_simple_open_internal ((char *) buf, buf_size, NULL, 0,
1116                                        0, NULL, 0, fp->ctf_syn_ext_strtab,
1117                                        1, &err)) == NULL)
1118     {
1119       free (buf);
1120       return (ctf_set_errno (fp, err));
1121     }
1122
1123   (void) ctf_setmodel (nfp, ctf_getmodel (fp));
1124
1125   nfp->ctf_parent = fp->ctf_parent;
1126   nfp->ctf_parent_unreffed = fp->ctf_parent_unreffed;
1127   nfp->ctf_refcnt = fp->ctf_refcnt;
1128   nfp->ctf_flags |= fp->ctf_flags & ~LCTF_DIRTY;
1129   if (nfp->ctf_dynbase == NULL)
1130     nfp->ctf_dynbase = buf;             /* Make sure buf is freed on close.  */
1131   nfp->ctf_dthash = fp->ctf_dthash;
1132   nfp->ctf_dtdefs = fp->ctf_dtdefs;
1133   nfp->ctf_dvhash = fp->ctf_dvhash;
1134   nfp->ctf_dvdefs = fp->ctf_dvdefs;
1135   nfp->ctf_dtoldid = fp->ctf_dtoldid;
1136   nfp->ctf_add_processing = fp->ctf_add_processing;
1137   nfp->ctf_snapshots = fp->ctf_snapshots + 1;
1138   nfp->ctf_specific = fp->ctf_specific;
1139   nfp->ctf_nfuncidx = fp->ctf_nfuncidx;
1140   nfp->ctf_nobjtidx = fp->ctf_nobjtidx;
1141   nfp->ctf_objthash = fp->ctf_objthash;
1142   nfp->ctf_funchash = fp->ctf_funchash;
1143   nfp->ctf_dynsyms = fp->ctf_dynsyms;
1144   nfp->ctf_ptrtab = fp->ctf_ptrtab;
1145   nfp->ctf_dynsymidx = fp->ctf_dynsymidx;
1146   nfp->ctf_dynsymmax = fp->ctf_dynsymmax;
1147   nfp->ctf_ptrtab_len = fp->ctf_ptrtab_len;
1148   nfp->ctf_link_inputs = fp->ctf_link_inputs;
1149   nfp->ctf_link_outputs = fp->ctf_link_outputs;
1150   nfp->ctf_errs_warnings = fp->ctf_errs_warnings;
1151   nfp->ctf_funcidx_names = fp->ctf_funcidx_names;
1152   nfp->ctf_objtidx_names = fp->ctf_objtidx_names;
1153   nfp->ctf_funcidx_sxlate = fp->ctf_funcidx_sxlate;
1154   nfp->ctf_objtidx_sxlate = fp->ctf_objtidx_sxlate;
1155   nfp->ctf_str_prov_offset = fp->ctf_str_prov_offset;
1156   nfp->ctf_syn_ext_strtab = fp->ctf_syn_ext_strtab;
1157   nfp->ctf_in_flight_dynsyms = fp->ctf_in_flight_dynsyms;
1158   nfp->ctf_link_in_cu_mapping = fp->ctf_link_in_cu_mapping;
1159   nfp->ctf_link_out_cu_mapping = fp->ctf_link_out_cu_mapping;
1160   nfp->ctf_link_type_mapping = fp->ctf_link_type_mapping;
1161   nfp->ctf_link_memb_name_changer = fp->ctf_link_memb_name_changer;
1162   nfp->ctf_link_memb_name_changer_arg = fp->ctf_link_memb_name_changer_arg;
1163   nfp->ctf_link_variable_filter = fp->ctf_link_variable_filter;
1164   nfp->ctf_link_variable_filter_arg = fp->ctf_link_variable_filter_arg;
1165   nfp->ctf_link_flags = fp->ctf_link_flags;
1166   nfp->ctf_dedup_atoms = fp->ctf_dedup_atoms;
1167   nfp->ctf_dedup_atoms_alloc = fp->ctf_dedup_atoms_alloc;
1168   memcpy (&nfp->ctf_dedup, &fp->ctf_dedup, sizeof (fp->ctf_dedup));
1169
1170   nfp->ctf_snapshot_lu = fp->ctf_snapshots;
1171
1172   memcpy (&nfp->ctf_lookups, fp->ctf_lookups, sizeof (fp->ctf_lookups));
1173   nfp->ctf_structs = fp->ctf_structs;
1174   nfp->ctf_unions = fp->ctf_unions;
1175   nfp->ctf_enums = fp->ctf_enums;
1176   nfp->ctf_names = fp->ctf_names;
1177
1178   fp->ctf_dthash = NULL;
1179   ctf_str_free_atoms (nfp);
1180   nfp->ctf_str_atoms = fp->ctf_str_atoms;
1181   nfp->ctf_prov_strtab = fp->ctf_prov_strtab;
1182   fp->ctf_str_atoms = NULL;
1183   fp->ctf_prov_strtab = NULL;
1184   memset (&fp->ctf_dtdefs, 0, sizeof (ctf_list_t));
1185   memset (&fp->ctf_errs_warnings, 0, sizeof (ctf_list_t));
1186   fp->ctf_add_processing = NULL;
1187   fp->ctf_ptrtab = NULL;
1188   fp->ctf_funcidx_names = NULL;
1189   fp->ctf_objtidx_names = NULL;
1190   fp->ctf_funcidx_sxlate = NULL;
1191   fp->ctf_objtidx_sxlate = NULL;
1192   fp->ctf_objthash = NULL;
1193   fp->ctf_funchash = NULL;
1194   fp->ctf_dynsyms = NULL;
1195   fp->ctf_dynsymidx = NULL;
1196   fp->ctf_link_inputs = NULL;
1197   fp->ctf_link_outputs = NULL;
1198   fp->ctf_syn_ext_strtab = NULL;
1199   fp->ctf_link_in_cu_mapping = NULL;
1200   fp->ctf_link_out_cu_mapping = NULL;
1201   fp->ctf_link_type_mapping = NULL;
1202   fp->ctf_dedup_atoms = NULL;
1203   fp->ctf_dedup_atoms_alloc = NULL;
1204   fp->ctf_parent_unreffed = 1;
1205
1206   fp->ctf_dvhash = NULL;
1207   memset (&fp->ctf_dvdefs, 0, sizeof (ctf_list_t));
1208   memset (fp->ctf_lookups, 0, sizeof (fp->ctf_lookups));
1209   memset (&fp->ctf_in_flight_dynsyms, 0, sizeof (fp->ctf_in_flight_dynsyms));
1210   memset (&fp->ctf_dedup, 0, sizeof (fp->ctf_dedup));
1211   fp->ctf_structs.ctn_writable = NULL;
1212   fp->ctf_unions.ctn_writable = NULL;
1213   fp->ctf_enums.ctn_writable = NULL;
1214   fp->ctf_names.ctn_writable = NULL;
1215
1216   memcpy (&ofp, fp, sizeof (ctf_dict_t));
1217   memcpy (fp, nfp, sizeof (ctf_dict_t));
1218   memcpy (nfp, &ofp, sizeof (ctf_dict_t));
1219
1220   nfp->ctf_refcnt = 1;                          /* Force nfp to be freed.  */
1221   ctf_dict_close (nfp);
1222
1223   return 0;
1224
1225 symerr:
1226   ctf_err_warn (fp, 0, err, _("error serializing symtypetabs"));
1227   goto err;
1228 oom:
1229   free (buf);
1230   free (sym_name_order);
1231   return (ctf_set_errno (fp, EAGAIN));
1232 err:
1233   free (buf);
1234   free (sym_name_order);
1235   return -1;                                    /* errno is set for us.  */
1236 }
1237
1238 ctf_names_t *
1239 ctf_name_table (ctf_dict_t *fp, int kind)
1240 {
1241   switch (kind)
1242     {
1243     case CTF_K_STRUCT:
1244       return &fp->ctf_structs;
1245     case CTF_K_UNION:
1246       return &fp->ctf_unions;
1247     case CTF_K_ENUM:
1248       return &fp->ctf_enums;
1249     default:
1250       return &fp->ctf_names;
1251     }
1252 }
1253
1254 int
1255 ctf_dtd_insert (ctf_dict_t *fp, ctf_dtdef_t *dtd, int flag, int kind)
1256 {
1257   const char *name;
1258   if (ctf_dynhash_insert (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type,
1259                           dtd) < 0)
1260     return -1;
1261
1262   if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name
1263       && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL)
1264     {
1265       if (ctf_dynhash_insert (ctf_name_table (fp, kind)->ctn_writable,
1266                               (char *) name, (void *) (uintptr_t)
1267                               dtd->dtd_type) < 0)
1268         {
1269           ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t)
1270                               dtd->dtd_type);
1271           return -1;
1272         }
1273     }
1274   ctf_list_append (&fp->ctf_dtdefs, dtd);
1275   return 0;
1276 }
1277
1278 void
1279 ctf_dtd_delete (ctf_dict_t *fp, ctf_dtdef_t *dtd)
1280 {
1281   ctf_dmdef_t *dmd, *nmd;
1282   int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1283   int name_kind = kind;
1284   const char *name;
1285
1286   ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type);
1287
1288   switch (kind)
1289     {
1290     case CTF_K_STRUCT:
1291     case CTF_K_UNION:
1292     case CTF_K_ENUM:
1293       for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
1294            dmd != NULL; dmd = nmd)
1295         {
1296           if (dmd->dmd_name != NULL)
1297               free (dmd->dmd_name);
1298           nmd = ctf_list_next (dmd);
1299           free (dmd);
1300         }
1301       break;
1302     case CTF_K_FUNCTION:
1303       free (dtd->dtd_u.dtu_argv);
1304       break;
1305     case CTF_K_FORWARD:
1306       name_kind = dtd->dtd_data.ctt_type;
1307       break;
1308     }
1309
1310   if (dtd->dtd_data.ctt_name
1311       && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
1312       && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
1313     {
1314       ctf_dynhash_remove (ctf_name_table (fp, name_kind)->ctn_writable,
1315                           name);
1316       ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
1317     }
1318
1319   ctf_list_delete (&fp->ctf_dtdefs, dtd);
1320   free (dtd);
1321 }
1322
1323 ctf_dtdef_t *
1324 ctf_dtd_lookup (const ctf_dict_t *fp, ctf_id_t type)
1325 {
1326   return (ctf_dtdef_t *)
1327     ctf_dynhash_lookup (fp->ctf_dthash, (void *) (uintptr_t) type);
1328 }
1329
1330 ctf_dtdef_t *
1331 ctf_dynamic_type (const ctf_dict_t *fp, ctf_id_t id)
1332 {
1333   ctf_id_t idx;
1334
1335   if (!(fp->ctf_flags & LCTF_RDWR))
1336     return NULL;
1337
1338   if ((fp->ctf_flags & LCTF_CHILD) && LCTF_TYPE_ISPARENT (fp, id))
1339     fp = fp->ctf_parent;
1340
1341   idx = LCTF_TYPE_TO_INDEX(fp, id);
1342
1343   if ((unsigned long) idx <= fp->ctf_typemax)
1344     return ctf_dtd_lookup (fp, id);
1345   return NULL;
1346 }
1347
1348 int
1349 ctf_dvd_insert (ctf_dict_t *fp, ctf_dvdef_t *dvd)
1350 {
1351   if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0)
1352     return -1;
1353   ctf_list_append (&fp->ctf_dvdefs, dvd);
1354   return 0;
1355 }
1356
1357 void
1358 ctf_dvd_delete (ctf_dict_t *fp, ctf_dvdef_t *dvd)
1359 {
1360   ctf_dynhash_remove (fp->ctf_dvhash, dvd->dvd_name);
1361   free (dvd->dvd_name);
1362
1363   ctf_list_delete (&fp->ctf_dvdefs, dvd);
1364   free (dvd);
1365 }
1366
1367 ctf_dvdef_t *
1368 ctf_dvd_lookup (const ctf_dict_t *fp, const char *name)
1369 {
1370   return (ctf_dvdef_t *) ctf_dynhash_lookup (fp->ctf_dvhash, name);
1371 }
1372
1373 /* Discard all of the dynamic type definitions and variable definitions that
1374    have been added to the dict since the last call to ctf_update().  We locate
1375    such types by scanning the dtd list and deleting elements that have type IDs
1376    greater than ctf_dtoldid, which is set by ctf_update(), above, and by
1377    scanning the variable list and deleting elements that have update IDs equal
1378    to the current value of the last-update snapshot count (indicating that they
1379    were added after the most recent call to ctf_update()).  */
1380 int
1381 ctf_discard (ctf_dict_t *fp)
1382 {
1383   ctf_snapshot_id_t last_update =
1384     { fp->ctf_dtoldid,
1385       fp->ctf_snapshot_lu + 1 };
1386
1387   /* Update required?  */
1388   if (!(fp->ctf_flags & LCTF_DIRTY))
1389     return 0;
1390
1391   return (ctf_rollback (fp, last_update));
1392 }
1393
1394 ctf_snapshot_id_t
1395 ctf_snapshot (ctf_dict_t *fp)
1396 {
1397   ctf_snapshot_id_t snapid;
1398   snapid.dtd_id = fp->ctf_typemax;
1399   snapid.snapshot_id = fp->ctf_snapshots++;
1400   return snapid;
1401 }
1402
1403 /* Like ctf_discard(), only discards everything after a particular ID.  */
1404 int
1405 ctf_rollback (ctf_dict_t *fp, ctf_snapshot_id_t id)
1406 {
1407   ctf_dtdef_t *dtd, *ntd;
1408   ctf_dvdef_t *dvd, *nvd;
1409
1410   if (!(fp->ctf_flags & LCTF_RDWR))
1411     return (ctf_set_errno (fp, ECTF_RDONLY));
1412
1413   if (fp->ctf_snapshot_lu >= id.snapshot_id)
1414     return (ctf_set_errno (fp, ECTF_OVERROLLBACK));
1415
1416   for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1417     {
1418       int kind;
1419       const char *name;
1420
1421       ntd = ctf_list_next (dtd);
1422
1423       if (LCTF_TYPE_TO_INDEX (fp, dtd->dtd_type) <= id.dtd_id)
1424         continue;
1425
1426       kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1427       if (kind == CTF_K_FORWARD)
1428         kind = dtd->dtd_data.ctt_type;
1429
1430       if (dtd->dtd_data.ctt_name
1431           && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
1432           && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
1433         {
1434           ctf_dynhash_remove (ctf_name_table (fp, kind)->ctn_writable,
1435                               name);
1436           ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
1437         }
1438
1439       ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type);
1440       ctf_dtd_delete (fp, dtd);
1441     }
1442
1443   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1444     {
1445       nvd = ctf_list_next (dvd);
1446
1447       if (dvd->dvd_snapshots <= id.snapshot_id)
1448         continue;
1449
1450       ctf_dvd_delete (fp, dvd);
1451     }
1452
1453   fp->ctf_typemax = id.dtd_id;
1454   fp->ctf_snapshots = id.snapshot_id;
1455
1456   if (fp->ctf_snapshots == fp->ctf_snapshot_lu)
1457     fp->ctf_flags &= ~LCTF_DIRTY;
1458
1459   return 0;
1460 }
1461
1462 static ctf_id_t
1463 ctf_add_generic (ctf_dict_t *fp, uint32_t flag, const char *name, int kind,
1464                  ctf_dtdef_t **rp)
1465 {
1466   ctf_dtdef_t *dtd;
1467   ctf_id_t type;
1468
1469   if (flag != CTF_ADD_NONROOT && flag != CTF_ADD_ROOT)
1470     return (ctf_set_errno (fp, EINVAL));
1471
1472   if (!(fp->ctf_flags & LCTF_RDWR))
1473     return (ctf_set_errno (fp, ECTF_RDONLY));
1474
1475   if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) >= CTF_MAX_TYPE)
1476     return (ctf_set_errno (fp, ECTF_FULL));
1477
1478   if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) == (CTF_MAX_PTYPE - 1))
1479     return (ctf_set_errno (fp, ECTF_FULL));
1480
1481   /* Make sure ptrtab always grows to be big enough for all types.  */
1482   if (ctf_grow_ptrtab (fp) < 0)
1483       return CTF_ERR;           /* errno is set for us. */
1484
1485   if ((dtd = malloc (sizeof (ctf_dtdef_t))) == NULL)
1486     return (ctf_set_errno (fp, EAGAIN));
1487
1488   type = ++fp->ctf_typemax;
1489   type = LCTF_INDEX_TO_TYPE (fp, type, (fp->ctf_flags & LCTF_CHILD));
1490
1491   memset (dtd, 0, sizeof (ctf_dtdef_t));
1492   dtd->dtd_data.ctt_name = ctf_str_add_ref (fp, name, &dtd->dtd_data.ctt_name);
1493   dtd->dtd_type = type;
1494
1495   if (dtd->dtd_data.ctt_name == 0 && name != NULL && name[0] != '\0')
1496     {
1497       free (dtd);
1498       return (ctf_set_errno (fp, EAGAIN));
1499     }
1500
1501   if (ctf_dtd_insert (fp, dtd, flag, kind) < 0)
1502     {
1503       free (dtd);
1504       return CTF_ERR;                   /* errno is set for us.  */
1505     }
1506   fp->ctf_flags |= LCTF_DIRTY;
1507
1508   *rp = dtd;
1509   return type;
1510 }
1511
1512 /* When encoding integer sizes, we want to convert a byte count in the range
1513    1-8 to the closest power of 2 (e.g. 3->4, 5->8, etc).  The clp2() function
1514    is a clever implementation from "Hacker's Delight" by Henry Warren, Jr.  */
1515 static size_t
1516 clp2 (size_t x)
1517 {
1518   x--;
1519
1520   x |= (x >> 1);
1521   x |= (x >> 2);
1522   x |= (x >> 4);
1523   x |= (x >> 8);
1524   x |= (x >> 16);
1525
1526   return (x + 1);
1527 }
1528
1529 ctf_id_t
1530 ctf_add_encoded (ctf_dict_t *fp, uint32_t flag,
1531                  const char *name, const ctf_encoding_t *ep, uint32_t kind)
1532 {
1533   ctf_dtdef_t *dtd;
1534   ctf_id_t type;
1535
1536   if (ep == NULL)
1537     return (ctf_set_errno (fp, EINVAL));
1538
1539   if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
1540     return CTF_ERR;             /* errno is set for us.  */
1541
1542   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
1543   dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
1544                                  / CHAR_BIT);
1545   dtd->dtd_u.dtu_enc = *ep;
1546
1547   return type;
1548 }
1549
1550 ctf_id_t
1551 ctf_add_reftype (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref, uint32_t kind)
1552 {
1553   ctf_dtdef_t *dtd;
1554   ctf_id_t type;
1555   ctf_dict_t *tmp = fp;
1556   int child = fp->ctf_flags & LCTF_CHILD;
1557
1558   if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1559     return (ctf_set_errno (fp, EINVAL));
1560
1561   if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
1562     return CTF_ERR;             /* errno is set for us.  */
1563
1564   if ((type = ctf_add_generic (fp, flag, NULL, kind, &dtd)) == CTF_ERR)
1565     return CTF_ERR;             /* errno is set for us.  */
1566
1567   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
1568   dtd->dtd_data.ctt_type = (uint32_t) ref;
1569
1570   if (kind != CTF_K_POINTER)
1571     return type;
1572
1573   /* If we are adding a pointer, update the ptrtab, both the directly pointed-to
1574      type and (if an anonymous typedef node is being pointed at) the type that
1575      points at too.  Note that ctf_typemax is at this point one higher than we
1576      want to check against, because it's just been incremented for the addition
1577      of this type.  */
1578
1579   uint32_t type_idx = LCTF_TYPE_TO_INDEX (fp, type);
1580   uint32_t ref_idx = LCTF_TYPE_TO_INDEX (fp, ref);
1581
1582   if (LCTF_TYPE_ISCHILD (fp, ref) == child
1583       && ref_idx < fp->ctf_typemax)
1584     {
1585       fp->ctf_ptrtab[ref_idx] = type_idx;
1586
1587       ctf_id_t refref_idx = LCTF_TYPE_TO_INDEX (fp, dtd->dtd_data.ctt_type);
1588
1589       if (tmp == fp
1590           && (LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) == CTF_K_TYPEDEF)
1591           && strcmp (ctf_strptr (fp, dtd->dtd_data.ctt_name), "") == 0
1592           && refref_idx < fp->ctf_typemax)
1593         fp->ctf_ptrtab[refref_idx] = type_idx;
1594     }
1595
1596   return type;
1597 }
1598
1599 ctf_id_t
1600 ctf_add_slice (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref,
1601                const ctf_encoding_t *ep)
1602 {
1603   ctf_dtdef_t *dtd;
1604   ctf_id_t resolved_ref = ref;
1605   ctf_id_t type;
1606   int kind;
1607   const ctf_type_t *tp;
1608   ctf_dict_t *tmp = fp;
1609
1610   if (ep == NULL)
1611     return (ctf_set_errno (fp, EINVAL));
1612
1613   if ((ep->cte_bits > 255) || (ep->cte_offset > 255))
1614     return (ctf_set_errno (fp, ECTF_SLICEOVERFLOW));
1615
1616   if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1617     return (ctf_set_errno (fp, EINVAL));
1618
1619   if (ref != 0 && ((tp = ctf_lookup_by_id (&tmp, ref)) == NULL))
1620     return CTF_ERR;             /* errno is set for us.  */
1621
1622   /* Make sure we ultimately point to an integral type.  We also allow slices to
1623      point to the unimplemented type, for now, because the compiler can emit
1624      such slices, though they're not very much use.  */
1625
1626   resolved_ref = ctf_type_resolve_unsliced (tmp, ref);
1627   kind = ctf_type_kind_unsliced (tmp, resolved_ref);
1628
1629   if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) &&
1630       (kind != CTF_K_ENUM)
1631       && (ref != 0))
1632     return (ctf_set_errno (fp, ECTF_NOTINTFP));
1633
1634   if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_SLICE, &dtd)) == CTF_ERR)
1635     return CTF_ERR;             /* errno is set for us.  */
1636
1637   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_SLICE, flag, 0);
1638   dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
1639                                  / CHAR_BIT);
1640   dtd->dtd_u.dtu_slice.cts_type = (uint32_t) ref;
1641   dtd->dtd_u.dtu_slice.cts_bits = ep->cte_bits;
1642   dtd->dtd_u.dtu_slice.cts_offset = ep->cte_offset;
1643
1644   return type;
1645 }
1646
1647 ctf_id_t
1648 ctf_add_integer (ctf_dict_t *fp, uint32_t flag,
1649                  const char *name, const ctf_encoding_t *ep)
1650 {
1651   return (ctf_add_encoded (fp, flag, name, ep, CTF_K_INTEGER));
1652 }
1653
1654 ctf_id_t
1655 ctf_add_float (ctf_dict_t *fp, uint32_t flag,
1656                const char *name, const ctf_encoding_t *ep)
1657 {
1658   return (ctf_add_encoded (fp, flag, name, ep, CTF_K_FLOAT));
1659 }
1660
1661 ctf_id_t
1662 ctf_add_pointer (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
1663 {
1664   return (ctf_add_reftype (fp, flag, ref, CTF_K_POINTER));
1665 }
1666
1667 ctf_id_t
1668 ctf_add_array (ctf_dict_t *fp, uint32_t flag, const ctf_arinfo_t *arp)
1669 {
1670   ctf_dtdef_t *dtd;
1671   ctf_id_t type;
1672   ctf_dict_t *tmp = fp;
1673
1674   if (arp == NULL)
1675     return (ctf_set_errno (fp, EINVAL));
1676
1677   if (arp->ctr_contents != 0
1678       && ctf_lookup_by_id (&tmp, arp->ctr_contents) == NULL)
1679     return CTF_ERR;             /* errno is set for us.  */
1680
1681   tmp = fp;
1682   if (ctf_lookup_by_id (&tmp, arp->ctr_index) == NULL)
1683     return CTF_ERR;             /* errno is set for us.  */
1684
1685   if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_ARRAY, &dtd)) == CTF_ERR)
1686     return CTF_ERR;             /* errno is set for us.  */
1687
1688   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ARRAY, flag, 0);
1689   dtd->dtd_data.ctt_size = 0;
1690   dtd->dtd_u.dtu_arr = *arp;
1691
1692   return type;
1693 }
1694
1695 int
1696 ctf_set_array (ctf_dict_t *fp, ctf_id_t type, const ctf_arinfo_t *arp)
1697 {
1698   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
1699
1700   if (!(fp->ctf_flags & LCTF_RDWR))
1701     return (ctf_set_errno (fp, ECTF_RDONLY));
1702
1703   if (dtd == NULL
1704       || LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) != CTF_K_ARRAY)
1705     return (ctf_set_errno (fp, ECTF_BADID));
1706
1707   fp->ctf_flags |= LCTF_DIRTY;
1708   dtd->dtd_u.dtu_arr = *arp;
1709
1710   return 0;
1711 }
1712
1713 ctf_id_t
1714 ctf_add_function (ctf_dict_t *fp, uint32_t flag,
1715                   const ctf_funcinfo_t *ctc, const ctf_id_t *argv)
1716 {
1717   ctf_dtdef_t *dtd;
1718   ctf_id_t type;
1719   uint32_t vlen;
1720   uint32_t *vdat = NULL;
1721   ctf_dict_t *tmp = fp;
1722   size_t i;
1723
1724   if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0
1725       || (ctc->ctc_argc != 0 && argv == NULL))
1726     return (ctf_set_errno (fp, EINVAL));
1727
1728   vlen = ctc->ctc_argc;
1729   if (ctc->ctc_flags & CTF_FUNC_VARARG)
1730     vlen++;            /* Add trailing zero to indicate varargs (see below).  */
1731
1732   if (ctc->ctc_return != 0
1733       && ctf_lookup_by_id (&tmp, ctc->ctc_return) == NULL)
1734     return CTF_ERR;             /* errno is set for us.  */
1735
1736   if (vlen > CTF_MAX_VLEN)
1737     return (ctf_set_errno (fp, EOVERFLOW));
1738
1739   if (vlen != 0 && (vdat = malloc (sizeof (ctf_id_t) * vlen)) == NULL)
1740     return (ctf_set_errno (fp, EAGAIN));
1741
1742   for (i = 0; i < ctc->ctc_argc; i++)
1743     {
1744       tmp = fp;
1745       if (argv[i] != 0 && ctf_lookup_by_id (&tmp, argv[i]) == NULL)
1746         {
1747           free (vdat);
1748           return CTF_ERR;          /* errno is set for us.  */
1749         }
1750       vdat[i] = (uint32_t) argv[i];
1751     }
1752
1753   if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_FUNCTION,
1754                                &dtd)) == CTF_ERR)
1755     {
1756       free (vdat);
1757       return CTF_ERR;              /* errno is set for us.  */
1758     }
1759
1760   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
1761   dtd->dtd_data.ctt_type = (uint32_t) ctc->ctc_return;
1762
1763   if (ctc->ctc_flags & CTF_FUNC_VARARG)
1764     vdat[vlen - 1] = 0;            /* Add trailing zero to indicate varargs.  */
1765   dtd->dtd_u.dtu_argv = vdat;
1766
1767   return type;
1768 }
1769
1770 ctf_id_t
1771 ctf_add_struct_sized (ctf_dict_t *fp, uint32_t flag, const char *name,
1772                       size_t size)
1773 {
1774   ctf_dtdef_t *dtd;
1775   ctf_id_t type = 0;
1776
1777   /* Promote root-visible forwards to structs.  */
1778   if (name != NULL)
1779     type = ctf_lookup_by_rawname (fp, CTF_K_STRUCT, name);
1780
1781   if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1782     dtd = ctf_dtd_lookup (fp, type);
1783   else if ((type = ctf_add_generic (fp, flag, name, CTF_K_STRUCT,
1784                                     &dtd)) == CTF_ERR)
1785     return CTF_ERR;             /* errno is set for us.  */
1786
1787   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_STRUCT, flag, 0);
1788
1789   if (size > CTF_MAX_SIZE)
1790     {
1791       dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1792       dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1793       dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1794     }
1795   else
1796     dtd->dtd_data.ctt_size = (uint32_t) size;
1797
1798   return type;
1799 }
1800
1801 ctf_id_t
1802 ctf_add_struct (ctf_dict_t *fp, uint32_t flag, const char *name)
1803 {
1804   return (ctf_add_struct_sized (fp, flag, name, 0));
1805 }
1806
1807 ctf_id_t
1808 ctf_add_union_sized (ctf_dict_t *fp, uint32_t flag, const char *name,
1809                      size_t size)
1810 {
1811   ctf_dtdef_t *dtd;
1812   ctf_id_t type = 0;
1813
1814   /* Promote root-visible forwards to unions.  */
1815   if (name != NULL)
1816     type = ctf_lookup_by_rawname (fp, CTF_K_UNION, name);
1817
1818   if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1819     dtd = ctf_dtd_lookup (fp, type);
1820   else if ((type = ctf_add_generic (fp, flag, name, CTF_K_UNION,
1821                                     &dtd)) == CTF_ERR)
1822     return CTF_ERR;             /* errno is set for us */
1823
1824   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_UNION, flag, 0);
1825
1826   if (size > CTF_MAX_SIZE)
1827     {
1828       dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1829       dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1830       dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1831     }
1832   else
1833     dtd->dtd_data.ctt_size = (uint32_t) size;
1834
1835   return type;
1836 }
1837
1838 ctf_id_t
1839 ctf_add_union (ctf_dict_t *fp, uint32_t flag, const char *name)
1840 {
1841   return (ctf_add_union_sized (fp, flag, name, 0));
1842 }
1843
1844 ctf_id_t
1845 ctf_add_enum (ctf_dict_t *fp, uint32_t flag, const char *name)
1846 {
1847   ctf_dtdef_t *dtd;
1848   ctf_id_t type = 0;
1849
1850   /* Promote root-visible forwards to enums.  */
1851   if (name != NULL)
1852     type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1853
1854   if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1855     dtd = ctf_dtd_lookup (fp, type);
1856   else if ((type = ctf_add_generic (fp, flag, name, CTF_K_ENUM,
1857                                     &dtd)) == CTF_ERR)
1858     return CTF_ERR;             /* errno is set for us.  */
1859
1860   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ENUM, flag, 0);
1861   dtd->dtd_data.ctt_size = fp->ctf_dmodel->ctd_int;
1862
1863   return type;
1864 }
1865
1866 ctf_id_t
1867 ctf_add_enum_encoded (ctf_dict_t *fp, uint32_t flag, const char *name,
1868                       const ctf_encoding_t *ep)
1869 {
1870   ctf_id_t type = 0;
1871
1872   /* First, create the enum if need be, using most of the same machinery as
1873      ctf_add_enum(), to ensure that we do not allow things past that are not
1874      enums or forwards to them.  (This includes other slices: you cannot slice a
1875      slice, which would be a useless thing to do anyway.)  */
1876
1877   if (name != NULL)
1878     type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1879
1880   if (type != 0)
1881     {
1882       if ((ctf_type_kind (fp, type) != CTF_K_FORWARD) &&
1883           (ctf_type_kind_unsliced (fp, type) != CTF_K_ENUM))
1884         return (ctf_set_errno (fp, ECTF_NOTINTFP));
1885     }
1886   else if ((type = ctf_add_enum (fp, flag, name)) == CTF_ERR)
1887     return CTF_ERR;             /* errno is set for us.  */
1888
1889   /* Now attach a suitable slice to it.  */
1890
1891   return ctf_add_slice (fp, flag, type, ep);
1892 }
1893
1894 ctf_id_t
1895 ctf_add_forward (ctf_dict_t *fp, uint32_t flag, const char *name,
1896                  uint32_t kind)
1897 {
1898   ctf_dtdef_t *dtd;
1899   ctf_id_t type = 0;
1900
1901   if (!ctf_forwardable_kind (kind))
1902     return (ctf_set_errno (fp, ECTF_NOTSUE));
1903
1904   /* If the type is already defined or exists as a forward tag, just
1905      return the ctf_id_t of the existing definition.  */
1906
1907   if (name != NULL)
1908     type = ctf_lookup_by_rawname (fp, kind, name);
1909
1910   if (type)
1911     return type;
1912
1913   if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
1914     return CTF_ERR;             /* errno is set for us.  */
1915
1916   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FORWARD, flag, 0);
1917   dtd->dtd_data.ctt_type = kind;
1918
1919   return type;
1920 }
1921
1922 ctf_id_t
1923 ctf_add_typedef (ctf_dict_t *fp, uint32_t flag, const char *name,
1924                  ctf_id_t ref)
1925 {
1926   ctf_dtdef_t *dtd;
1927   ctf_id_t type;
1928   ctf_dict_t *tmp = fp;
1929
1930   if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1931     return (ctf_set_errno (fp, EINVAL));
1932
1933   if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
1934     return CTF_ERR;             /* errno is set for us.  */
1935
1936   if ((type = ctf_add_generic (fp, flag, name, CTF_K_TYPEDEF,
1937                                &dtd)) == CTF_ERR)
1938     return CTF_ERR;             /* errno is set for us.  */
1939
1940   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_TYPEDEF, flag, 0);
1941   dtd->dtd_data.ctt_type = (uint32_t) ref;
1942
1943   return type;
1944 }
1945
1946 ctf_id_t
1947 ctf_add_volatile (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
1948 {
1949   return (ctf_add_reftype (fp, flag, ref, CTF_K_VOLATILE));
1950 }
1951
1952 ctf_id_t
1953 ctf_add_const (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
1954 {
1955   return (ctf_add_reftype (fp, flag, ref, CTF_K_CONST));
1956 }
1957
1958 ctf_id_t
1959 ctf_add_restrict (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
1960 {
1961   return (ctf_add_reftype (fp, flag, ref, CTF_K_RESTRICT));
1962 }
1963
1964 int
1965 ctf_add_enumerator (ctf_dict_t *fp, ctf_id_t enid, const char *name,
1966                     int value)
1967 {
1968   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, enid);
1969   ctf_dmdef_t *dmd;
1970
1971   uint32_t kind, vlen, root;
1972   char *s;
1973
1974   if (name == NULL)
1975     return (ctf_set_errno (fp, EINVAL));
1976
1977   if (!(fp->ctf_flags & LCTF_RDWR))
1978     return (ctf_set_errno (fp, ECTF_RDONLY));
1979
1980   if (dtd == NULL)
1981     return (ctf_set_errno (fp, ECTF_BADID));
1982
1983   kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1984   root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
1985   vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
1986
1987   if (kind != CTF_K_ENUM)
1988     return (ctf_set_errno (fp, ECTF_NOTENUM));
1989
1990   if (vlen == CTF_MAX_VLEN)
1991     return (ctf_set_errno (fp, ECTF_DTFULL));
1992
1993   for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
1994        dmd != NULL; dmd = ctf_list_next (dmd))
1995     {
1996       if (strcmp (dmd->dmd_name, name) == 0)
1997         return (ctf_set_errno (fp, ECTF_DUPLICATE));
1998     }
1999
2000   if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
2001     return (ctf_set_errno (fp, EAGAIN));
2002
2003   if ((s = strdup (name)) == NULL)
2004     {
2005       free (dmd);
2006       return (ctf_set_errno (fp, EAGAIN));
2007     }
2008
2009   dmd->dmd_name = s;
2010   dmd->dmd_type = CTF_ERR;
2011   dmd->dmd_offset = 0;
2012   dmd->dmd_value = value;
2013
2014   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
2015   ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
2016
2017   fp->ctf_flags |= LCTF_DIRTY;
2018
2019   return 0;
2020 }
2021
2022 int
2023 ctf_add_member_offset (ctf_dict_t *fp, ctf_id_t souid, const char *name,
2024                        ctf_id_t type, unsigned long bit_offset)
2025 {
2026   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, souid);
2027   ctf_dmdef_t *dmd;
2028
2029   ssize_t msize, malign, ssize;
2030   uint32_t kind, vlen, root;
2031   char *s = NULL;
2032
2033   if (!(fp->ctf_flags & LCTF_RDWR))
2034     return (ctf_set_errno (fp, ECTF_RDONLY));
2035
2036   if (dtd == NULL)
2037     return (ctf_set_errno (fp, ECTF_BADID));
2038
2039   if (name != NULL && name[0] == '\0')
2040     name = NULL;
2041
2042   kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
2043   root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
2044   vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
2045
2046   if (kind != CTF_K_STRUCT && kind != CTF_K_UNION)
2047     return (ctf_set_errno (fp, ECTF_NOTSOU));
2048
2049   if (vlen == CTF_MAX_VLEN)
2050     return (ctf_set_errno (fp, ECTF_DTFULL));
2051
2052   if (name != NULL)
2053     {
2054       for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
2055            dmd != NULL; dmd = ctf_list_next (dmd))
2056         {
2057           if (dmd->dmd_name != NULL && strcmp (dmd->dmd_name, name) == 0)
2058             return (ctf_set_errno (fp, ECTF_DUPLICATE));
2059         }
2060     }
2061
2062   if ((msize = ctf_type_size (fp, type)) < 0 ||
2063       (malign = ctf_type_align (fp, type)) < 0)
2064     {
2065       /* The unimplemented type, and any type that resolves to it, has no size
2066          and no alignment: it can correspond to any number of compiler-inserted
2067          types.  */
2068
2069       if (ctf_errno (fp) == ECTF_NONREPRESENTABLE)
2070         {
2071           msize = 0;
2072           malign = 0;
2073           ctf_set_errno (fp, 0);
2074         }
2075       else
2076         return -1;              /* errno is set for us.  */
2077     }
2078
2079   if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
2080     return (ctf_set_errno (fp, EAGAIN));
2081
2082   if (name != NULL && (s = strdup (name)) == NULL)
2083     {
2084       free (dmd);
2085       return (ctf_set_errno (fp, EAGAIN));
2086     }
2087
2088   dmd->dmd_name = s;
2089   dmd->dmd_type = type;
2090   dmd->dmd_value = -1;
2091
2092   if (kind == CTF_K_STRUCT && vlen != 0)
2093     {
2094       if (bit_offset == (unsigned long) - 1)
2095         {
2096           /* Natural alignment.  */
2097
2098           ctf_dmdef_t *lmd = ctf_list_prev (&dtd->dtd_u.dtu_members);
2099           ctf_id_t ltype = ctf_type_resolve (fp, lmd->dmd_type);
2100           size_t off = lmd->dmd_offset;
2101
2102           ctf_encoding_t linfo;
2103           ssize_t lsize;
2104
2105           /* Propagate any error from ctf_type_resolve.  If the last member was
2106              of unimplemented type, this may be -ECTF_NONREPRESENTABLE: we
2107              cannot insert right after such a member without explicit offset
2108              specification, because its alignment and size is not known.  */
2109           if (ltype == CTF_ERR)
2110             {
2111               free (dmd);
2112               return -1;        /* errno is set for us.  */
2113             }
2114
2115           if (ctf_type_encoding (fp, ltype, &linfo) == 0)
2116             off += linfo.cte_bits;
2117           else if ((lsize = ctf_type_size (fp, ltype)) > 0)
2118             off += lsize * CHAR_BIT;
2119
2120           /* Round up the offset of the end of the last member to
2121              the next byte boundary, convert 'off' to bytes, and
2122              then round it up again to the next multiple of the
2123              alignment required by the new member.  Finally,
2124              convert back to bits and store the result in
2125              dmd_offset.  Technically we could do more efficient
2126              packing if the new member is a bit-field, but we're
2127              the "compiler" and ANSI says we can do as we choose.  */
2128
2129           off = roundup (off, CHAR_BIT) / CHAR_BIT;
2130           off = roundup (off, MAX (malign, 1));
2131           dmd->dmd_offset = off * CHAR_BIT;
2132           ssize = off + msize;
2133         }
2134       else
2135         {
2136           /* Specified offset in bits.  */
2137
2138           dmd->dmd_offset = bit_offset;
2139           ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
2140           ssize = MAX (ssize, ((signed) bit_offset / CHAR_BIT) + msize);
2141         }
2142     }
2143   else
2144     {
2145       dmd->dmd_offset = 0;
2146       ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
2147       ssize = MAX (ssize, msize);
2148     }
2149
2150   if ((size_t) ssize > CTF_MAX_SIZE)
2151     {
2152       dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
2153       dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (ssize);
2154       dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (ssize);
2155     }
2156   else
2157     dtd->dtd_data.ctt_size = (uint32_t) ssize;
2158
2159   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
2160   ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
2161
2162   fp->ctf_flags |= LCTF_DIRTY;
2163   return 0;
2164 }
2165
2166 int
2167 ctf_add_member_encoded (ctf_dict_t *fp, ctf_id_t souid, const char *name,
2168                         ctf_id_t type, unsigned long bit_offset,
2169                         const ctf_encoding_t encoding)
2170 {
2171   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
2172   int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
2173   int otype = type;
2174
2175   if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) && (kind != CTF_K_ENUM))
2176     return (ctf_set_errno (fp, ECTF_NOTINTFP));
2177
2178   if ((type = ctf_add_slice (fp, CTF_ADD_NONROOT, otype, &encoding)) == CTF_ERR)
2179     return -1;                  /* errno is set for us.  */
2180
2181   return ctf_add_member_offset (fp, souid, name, type, bit_offset);
2182 }
2183
2184 int
2185 ctf_add_member (ctf_dict_t *fp, ctf_id_t souid, const char *name,
2186                 ctf_id_t type)
2187 {
2188   return ctf_add_member_offset (fp, souid, name, type, (unsigned long) - 1);
2189 }
2190
2191 int
2192 ctf_add_variable (ctf_dict_t *fp, const char *name, ctf_id_t ref)
2193 {
2194   ctf_dvdef_t *dvd;
2195   ctf_dict_t *tmp = fp;
2196
2197   if (!(fp->ctf_flags & LCTF_RDWR))
2198     return (ctf_set_errno (fp, ECTF_RDONLY));
2199
2200   if (ctf_dvd_lookup (fp, name) != NULL)
2201     return (ctf_set_errno (fp, ECTF_DUPLICATE));
2202
2203   if (ctf_lookup_by_id (&tmp, ref) == NULL)
2204     return -1;                  /* errno is set for us.  */
2205
2206   /* Make sure this type is representable.  */
2207   if ((ctf_type_resolve (fp, ref) == CTF_ERR)
2208       && (ctf_errno (fp) == ECTF_NONREPRESENTABLE))
2209     return -1;
2210
2211   if ((dvd = malloc (sizeof (ctf_dvdef_t))) == NULL)
2212     return (ctf_set_errno (fp, EAGAIN));
2213
2214   if (name != NULL && (dvd->dvd_name = strdup (name)) == NULL)
2215     {
2216       free (dvd);
2217       return (ctf_set_errno (fp, EAGAIN));
2218     }
2219   dvd->dvd_type = ref;
2220   dvd->dvd_snapshots = fp->ctf_snapshots;
2221
2222   if (ctf_dvd_insert (fp, dvd) < 0)
2223     {
2224       free (dvd->dvd_name);
2225       free (dvd);
2226       return -1;                        /* errno is set for us.  */
2227     }
2228
2229   fp->ctf_flags |= LCTF_DIRTY;
2230   return 0;
2231 }
2232
2233 int
2234 ctf_add_funcobjt_sym (ctf_dict_t *fp, int is_function, const char *name, ctf_id_t id)
2235 {
2236   ctf_dict_t *tmp = fp;
2237   char *dupname;
2238   ctf_dynhash_t *h = is_function ? fp->ctf_funchash : fp->ctf_objthash;
2239
2240   if (!(fp->ctf_flags & LCTF_RDWR))
2241     return (ctf_set_errno (fp, ECTF_RDONLY));
2242
2243   if (ctf_dynhash_lookup (fp->ctf_objthash, name) != NULL ||
2244       ctf_dynhash_lookup (fp->ctf_funchash, name) != NULL)
2245     return (ctf_set_errno (fp, ECTF_DUPLICATE));
2246
2247   if (ctf_lookup_by_id (&tmp, id) == NULL)
2248     return -1;                                  /* errno is set for us.  */
2249
2250   if (is_function && ctf_type_kind (fp, id) != CTF_K_FUNCTION)
2251     return (ctf_set_errno (fp, ECTF_NOTFUNC));
2252
2253   if ((dupname = strdup (name)) == NULL)
2254     return (ctf_set_errno (fp, ENOMEM));
2255
2256   if (ctf_dynhash_insert (h, dupname, (void *) (uintptr_t) id) < 0)
2257     {
2258       free (dupname);
2259       return (ctf_set_errno (fp, ENOMEM));
2260     }
2261   return 0;
2262 }
2263
2264 int
2265 ctf_add_objt_sym (ctf_dict_t *fp, const char *name, ctf_id_t id)
2266 {
2267   return (ctf_add_funcobjt_sym (fp, 0, name, id));
2268 }
2269
2270 int
2271 ctf_add_func_sym (ctf_dict_t *fp, const char *name, ctf_id_t id)
2272 {
2273   return (ctf_add_funcobjt_sym (fp, 1, name, id));
2274 }
2275
2276 typedef struct ctf_bundle
2277 {
2278   ctf_dict_t *ctb_dict;         /* CTF dict handle.  */
2279   ctf_id_t ctb_type;            /* CTF type identifier.  */
2280   ctf_dtdef_t *ctb_dtd;         /* CTF dynamic type definition (if any).  */
2281 } ctf_bundle_t;
2282
2283 static int
2284 enumcmp (const char *name, int value, void *arg)
2285 {
2286   ctf_bundle_t *ctb = arg;
2287   int bvalue;
2288
2289   if (ctf_enum_value (ctb->ctb_dict, ctb->ctb_type, name, &bvalue) < 0)
2290     {
2291       ctf_err_warn (ctb->ctb_dict, 0, 0,
2292                     _("conflict due to enum %s iteration error"), name);
2293       return 1;
2294     }
2295   if (value != bvalue)
2296     {
2297       ctf_err_warn (ctb->ctb_dict, 1, ECTF_CONFLICT,
2298                     _("conflict due to enum value change: %i versus %i"),
2299                     value, bvalue);
2300       return 1;
2301     }
2302   return 0;
2303 }
2304
2305 static int
2306 enumadd (const char *name, int value, void *arg)
2307 {
2308   ctf_bundle_t *ctb = arg;
2309
2310   return (ctf_add_enumerator (ctb->ctb_dict, ctb->ctb_type,
2311                               name, value) < 0);
2312 }
2313
2314 static int
2315 membcmp (const char *name, ctf_id_t type _libctf_unused_, unsigned long offset,
2316          void *arg)
2317 {
2318   ctf_bundle_t *ctb = arg;
2319   ctf_membinfo_t ctm;
2320
2321   /* Don't check nameless members (e.g. anonymous structs/unions) against each
2322      other.  */
2323   if (name[0] == 0)
2324     return 0;
2325
2326   if (ctf_member_info (ctb->ctb_dict, ctb->ctb_type, name, &ctm) < 0)
2327     {
2328       ctf_err_warn (ctb->ctb_dict, 0, 0,
2329                     _("conflict due to struct member %s iteration error"),
2330                     name);
2331       return 1;
2332     }
2333   if (ctm.ctm_offset != offset)
2334     {
2335       ctf_err_warn (ctb->ctb_dict, 1, ECTF_CONFLICT,
2336                     _("conflict due to struct member %s offset change: "
2337                       "%lx versus %lx"),
2338                     name, ctm.ctm_offset, offset);
2339       return 1;
2340     }
2341   return 0;
2342 }
2343
2344 static int
2345 membadd (const char *name, ctf_id_t type, unsigned long offset, void *arg)
2346 {
2347   ctf_bundle_t *ctb = arg;
2348   ctf_dmdef_t *dmd;
2349   char *s = NULL;
2350
2351   if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
2352     return (ctf_set_errno (ctb->ctb_dict, EAGAIN));
2353
2354   if (name != NULL && (s = strdup (name)) == NULL)
2355     {
2356       free (dmd);
2357       return (ctf_set_errno (ctb->ctb_dict, EAGAIN));
2358     }
2359
2360   /* For now, dmd_type is copied as the src_fp's type; it is reset to an
2361     equivalent dst_fp type by a final loop in ctf_add_type(), below.  */
2362   dmd->dmd_name = s;
2363   dmd->dmd_type = type;
2364   dmd->dmd_offset = offset;
2365   dmd->dmd_value = -1;
2366
2367   ctf_list_append (&ctb->ctb_dtd->dtd_u.dtu_members, dmd);
2368
2369   ctb->ctb_dict->ctf_flags |= LCTF_DIRTY;
2370   return 0;
2371 }
2372
2373 /* The ctf_add_type routine is used to copy a type from a source CTF dictionary
2374    to a dynamic destination dictionary.  This routine operates recursively by
2375    following the source type's links and embedded member types.  If the
2376    destination dict already contains a named type which has the same attributes,
2377    then we succeed and return this type but no changes occur.  */
2378 static ctf_id_t
2379 ctf_add_type_internal (ctf_dict_t *dst_fp, ctf_dict_t *src_fp, ctf_id_t src_type,
2380                        ctf_dict_t *proc_tracking_fp)
2381 {
2382   ctf_id_t dst_type = CTF_ERR;
2383   uint32_t dst_kind = CTF_K_UNKNOWN;
2384   ctf_dict_t *tmp_fp = dst_fp;
2385   ctf_id_t tmp;
2386
2387   const char *name;
2388   uint32_t kind, forward_kind, flag, vlen;
2389
2390   const ctf_type_t *src_tp, *dst_tp;
2391   ctf_bundle_t src, dst;
2392   ctf_encoding_t src_en, dst_en;
2393   ctf_arinfo_t src_ar, dst_ar;
2394
2395   ctf_funcinfo_t ctc;
2396
2397   ctf_id_t orig_src_type = src_type;
2398
2399   if (!(dst_fp->ctf_flags & LCTF_RDWR))
2400     return (ctf_set_errno (dst_fp, ECTF_RDONLY));
2401
2402   if ((src_tp = ctf_lookup_by_id (&src_fp, src_type)) == NULL)
2403     return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
2404
2405   if ((ctf_type_resolve (src_fp, src_type) == CTF_ERR)
2406       && (ctf_errno (src_fp) == ECTF_NONREPRESENTABLE))
2407     return (ctf_set_errno (dst_fp, ECTF_NONREPRESENTABLE));
2408
2409   name = ctf_strptr (src_fp, src_tp->ctt_name);
2410   kind = LCTF_INFO_KIND (src_fp, src_tp->ctt_info);
2411   flag = LCTF_INFO_ISROOT (src_fp, src_tp->ctt_info);
2412   vlen = LCTF_INFO_VLEN (src_fp, src_tp->ctt_info);
2413
2414   /* If this is a type we are currently in the middle of adding, hand it
2415      straight back.  (This lets us handle self-referential structures without
2416      considering forwards and empty structures the same as their completed
2417      forms.)  */
2418
2419   tmp = ctf_type_mapping (src_fp, src_type, &tmp_fp);
2420
2421   if (tmp != 0)
2422     {
2423       if (ctf_dynhash_lookup (proc_tracking_fp->ctf_add_processing,
2424                               (void *) (uintptr_t) src_type))
2425         return tmp;
2426
2427       /* If this type has already been added from this dictionary, and is the
2428          same kind and (if a struct or union) has the same number of members,
2429          hand it straight back.  */
2430
2431       if (ctf_type_kind_unsliced (tmp_fp, tmp) == (int) kind)
2432         {
2433           if (kind == CTF_K_STRUCT || kind == CTF_K_UNION
2434               || kind == CTF_K_ENUM)
2435             {
2436               if ((dst_tp = ctf_lookup_by_id (&tmp_fp, dst_type)) != NULL)
2437                 if (vlen == LCTF_INFO_VLEN (tmp_fp, dst_tp->ctt_info))
2438                   return tmp;
2439             }
2440           else
2441             return tmp;
2442         }
2443     }
2444
2445   forward_kind = kind;
2446   if (kind == CTF_K_FORWARD)
2447     forward_kind = src_tp->ctt_type;
2448
2449   /* If the source type has a name and is a root type (visible at the top-level
2450      scope), lookup the name in the destination dictionary and verify that it is
2451      of the same kind before we do anything else.  */
2452
2453   if ((flag & CTF_ADD_ROOT) && name[0] != '\0'
2454       && (tmp = ctf_lookup_by_rawname (dst_fp, forward_kind, name)) != 0)
2455     {
2456       dst_type = tmp;
2457       dst_kind = ctf_type_kind_unsliced (dst_fp, dst_type);
2458     }
2459
2460   /* If an identically named dst_type exists, fail with ECTF_CONFLICT
2461      unless dst_type is a forward declaration and src_type is a struct,
2462      union, or enum (i.e. the definition of the previous forward decl).
2463
2464      We also allow addition in the opposite order (addition of a forward when a
2465      struct, union, or enum already exists), which is a NOP and returns the
2466      already-present struct, union, or enum.  */
2467
2468   if (dst_type != CTF_ERR && dst_kind != kind)
2469     {
2470       if (kind == CTF_K_FORWARD
2471           && (dst_kind == CTF_K_ENUM || dst_kind == CTF_K_STRUCT
2472               || dst_kind == CTF_K_UNION))
2473         {
2474           ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2475           return dst_type;
2476         }
2477
2478       if (dst_kind != CTF_K_FORWARD
2479           || (kind != CTF_K_ENUM && kind != CTF_K_STRUCT
2480               && kind != CTF_K_UNION))
2481         {
2482           ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2483                         _("ctf_add_type: conflict for type %s: "
2484                           "kinds differ, new: %i; old (ID %lx): %i"),
2485                         name, kind, dst_type, dst_kind);
2486           return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2487         }
2488     }
2489
2490   /* We take special action for an integer, float, or slice since it is
2491      described not only by its name but also its encoding.  For integers,
2492      bit-fields exploit this degeneracy.  */
2493
2494   if (kind == CTF_K_INTEGER || kind == CTF_K_FLOAT || kind == CTF_K_SLICE)
2495     {
2496       if (ctf_type_encoding (src_fp, src_type, &src_en) != 0)
2497         return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
2498
2499       if (dst_type != CTF_ERR)
2500         {
2501           ctf_dict_t *fp = dst_fp;
2502
2503           if ((dst_tp = ctf_lookup_by_id (&fp, dst_type)) == NULL)
2504             return CTF_ERR;
2505
2506           if (ctf_type_encoding (dst_fp, dst_type, &dst_en) != 0)
2507             return CTF_ERR;                     /* errno set for us.  */
2508
2509           if (LCTF_INFO_ISROOT (fp, dst_tp->ctt_info) & CTF_ADD_ROOT)
2510             {
2511               /* The type that we found in the hash is also root-visible.  If
2512                  the two types match then use the existing one; otherwise,
2513                  declare a conflict.  Note: slices are not certain to match
2514                  even if there is no conflict: we must check the contained type
2515                  too.  */
2516
2517               if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
2518                 {
2519                   if (kind != CTF_K_SLICE)
2520                     {
2521                       ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2522                       return dst_type;
2523                     }
2524                 }
2525               else
2526                   {
2527                     return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2528                   }
2529             }
2530           else
2531             {
2532               /* We found a non-root-visible type in the hash.  If its encoding
2533                  is the same, we can reuse it, unless it is a slice.  */
2534
2535               if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
2536                 {
2537                   if (kind != CTF_K_SLICE)
2538                     {
2539                       ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2540                       return dst_type;
2541                     }
2542                 }
2543             }
2544         }
2545     }
2546
2547   src.ctb_dict = src_fp;
2548   src.ctb_type = src_type;
2549   src.ctb_dtd = NULL;
2550
2551   dst.ctb_dict = dst_fp;
2552   dst.ctb_type = dst_type;
2553   dst.ctb_dtd = NULL;
2554
2555   /* Now perform kind-specific processing.  If dst_type is CTF_ERR, then we add
2556      a new type with the same properties as src_type to dst_fp.  If dst_type is
2557      not CTF_ERR, then we verify that dst_type has the same attributes as
2558      src_type.  We recurse for embedded references.  Before we start, we note
2559      that we are processing this type, to prevent infinite recursion: we do not
2560      re-process any type that appears in this list.  The list is emptied
2561      wholesale at the end of processing everything in this recursive stack.  */
2562
2563   if (ctf_dynhash_insert (proc_tracking_fp->ctf_add_processing,
2564                           (void *) (uintptr_t) src_type, (void *) 1) < 0)
2565     return ctf_set_errno (dst_fp, ENOMEM);
2566
2567   switch (kind)
2568     {
2569     case CTF_K_INTEGER:
2570       /*  If we found a match we will have either returned it or declared a
2571           conflict.  */
2572       dst_type = ctf_add_integer (dst_fp, flag, name, &src_en);
2573       break;
2574
2575     case CTF_K_FLOAT:
2576       /* If we found a match we will have either returned it or declared a
2577        conflict.  */
2578       dst_type = ctf_add_float (dst_fp, flag, name, &src_en);
2579       break;
2580
2581     case CTF_K_SLICE:
2582       /* We have checked for conflicting encodings: now try to add the
2583          contained type.  */
2584       src_type = ctf_type_reference (src_fp, src_type);
2585       src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2586                                         proc_tracking_fp);
2587
2588       if (src_type == CTF_ERR)
2589         return CTF_ERR;                         /* errno is set for us.  */
2590
2591       dst_type = ctf_add_slice (dst_fp, flag, src_type, &src_en);
2592       break;
2593
2594     case CTF_K_POINTER:
2595     case CTF_K_VOLATILE:
2596     case CTF_K_CONST:
2597     case CTF_K_RESTRICT:
2598       src_type = ctf_type_reference (src_fp, src_type);
2599       src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2600                                         proc_tracking_fp);
2601
2602       if (src_type == CTF_ERR)
2603         return CTF_ERR;                         /* errno is set for us.  */
2604
2605       dst_type = ctf_add_reftype (dst_fp, flag, src_type, kind);
2606       break;
2607
2608     case CTF_K_ARRAY:
2609       if (ctf_array_info (src_fp, src_type, &src_ar) != 0)
2610         return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
2611
2612       src_ar.ctr_contents =
2613         ctf_add_type_internal (dst_fp, src_fp, src_ar.ctr_contents,
2614                                proc_tracking_fp);
2615       src_ar.ctr_index = ctf_add_type_internal (dst_fp, src_fp,
2616                                                 src_ar.ctr_index,
2617                                                 proc_tracking_fp);
2618       src_ar.ctr_nelems = src_ar.ctr_nelems;
2619
2620       if (src_ar.ctr_contents == CTF_ERR || src_ar.ctr_index == CTF_ERR)
2621         return CTF_ERR;                         /* errno is set for us.  */
2622
2623       if (dst_type != CTF_ERR)
2624         {
2625           if (ctf_array_info (dst_fp, dst_type, &dst_ar) != 0)
2626             return CTF_ERR;                     /* errno is set for us.  */
2627
2628           if (memcmp (&src_ar, &dst_ar, sizeof (ctf_arinfo_t)))
2629             {
2630               ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2631                             _("conflict for type %s against ID %lx: array info "
2632                               "differs, old %lx/%lx/%x; new: %lx/%lx/%x"),
2633                             name, dst_type, src_ar.ctr_contents,
2634                             src_ar.ctr_index, src_ar.ctr_nelems,
2635                             dst_ar.ctr_contents, dst_ar.ctr_index,
2636                             dst_ar.ctr_nelems);
2637               return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2638             }
2639         }
2640       else
2641         dst_type = ctf_add_array (dst_fp, flag, &src_ar);
2642       break;
2643
2644     case CTF_K_FUNCTION:
2645       ctc.ctc_return = ctf_add_type_internal (dst_fp, src_fp,
2646                                               src_tp->ctt_type,
2647                                               proc_tracking_fp);
2648       ctc.ctc_argc = 0;
2649       ctc.ctc_flags = 0;
2650
2651       if (ctc.ctc_return == CTF_ERR)
2652         return CTF_ERR;                         /* errno is set for us.  */
2653
2654       dst_type = ctf_add_function (dst_fp, flag, &ctc, NULL);
2655       break;
2656
2657     case CTF_K_STRUCT:
2658     case CTF_K_UNION:
2659       {
2660         ctf_dmdef_t *dmd;
2661         int errs = 0;
2662         size_t size;
2663         ssize_t ssize;
2664         ctf_dtdef_t *dtd;
2665
2666         /* Technically to match a struct or union we need to check both
2667            ways (src members vs. dst, dst members vs. src) but we make
2668            this more optimal by only checking src vs. dst and comparing
2669            the total size of the structure (which we must do anyway)
2670            which covers the possibility of dst members not in src.
2671            This optimization can be defeated for unions, but is so
2672            pathological as to render it irrelevant for our purposes.  */
2673
2674         if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
2675             && dst_kind != CTF_K_FORWARD)
2676           {
2677             if (ctf_type_size (src_fp, src_type) !=
2678                 ctf_type_size (dst_fp, dst_type))
2679               {
2680                 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2681                               _("conflict for type %s against ID %lx: union "
2682                                 "size differs, old %li, new %li"), name,
2683                               dst_type, (long) ctf_type_size (src_fp, src_type),
2684                               (long) ctf_type_size (dst_fp, dst_type));
2685                 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2686               }
2687
2688             if (ctf_member_iter (src_fp, src_type, membcmp, &dst))
2689               {
2690                 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2691                               _("conflict for type %s against ID %lx: members "
2692                                 "differ, see above"), name, dst_type);
2693                 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2694               }
2695
2696             break;
2697           }
2698
2699         /* Unlike the other cases, copying structs and unions is done
2700            manually so as to avoid repeated lookups in ctf_add_member
2701            and to ensure the exact same member offsets as in src_type.  */
2702
2703         dst_type = ctf_add_generic (dst_fp, flag, name, kind, &dtd);
2704         if (dst_type == CTF_ERR)
2705           return CTF_ERR;                       /* errno is set for us.  */
2706
2707         dst.ctb_type = dst_type;
2708         dst.ctb_dtd = dtd;
2709
2710         /* Pre-emptively add this struct to the type mapping so that
2711            structures that refer to themselves work.  */
2712         ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2713
2714         if (ctf_member_iter (src_fp, src_type, membadd, &dst) != 0)
2715           errs++;              /* Increment errs and fail at bottom of case.  */
2716
2717         if ((ssize = ctf_type_size (src_fp, src_type)) < 0)
2718           return CTF_ERR;                       /* errno is set for us.  */
2719
2720         size = (size_t) ssize;
2721         if (size > CTF_MAX_SIZE)
2722           {
2723             dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
2724             dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
2725             dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
2726           }
2727         else
2728           dtd->dtd_data.ctt_size = (uint32_t) size;
2729
2730         dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, vlen);
2731
2732         /* Make a final pass through the members changing each dmd_type (a
2733            src_fp type) to an equivalent type in dst_fp.  We pass through all
2734            members, leaving any that fail set to CTF_ERR, unless they fail
2735            because they are marking a member of type not representable in this
2736            version of CTF, in which case we just want to silently omit them:
2737            no consumer can do anything with them anyway.  */
2738         for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
2739              dmd != NULL; dmd = ctf_list_next (dmd))
2740           {
2741             ctf_dict_t *dst = dst_fp;
2742             ctf_id_t memb_type;
2743
2744             memb_type = ctf_type_mapping (src_fp, dmd->dmd_type, &dst);
2745             if (memb_type == 0)
2746               {
2747                 if ((dmd->dmd_type =
2748                      ctf_add_type_internal (dst_fp, src_fp, dmd->dmd_type,
2749                                             proc_tracking_fp)) == CTF_ERR)
2750                   {
2751                     if (ctf_errno (dst_fp) != ECTF_NONREPRESENTABLE)
2752                       errs++;
2753                   }
2754               }
2755             else
2756               dmd->dmd_type = memb_type;
2757           }
2758
2759         if (errs)
2760           return CTF_ERR;                       /* errno is set for us.  */
2761         break;
2762       }
2763
2764     case CTF_K_ENUM:
2765       if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
2766           && dst_kind != CTF_K_FORWARD)
2767         {
2768           if (ctf_enum_iter (src_fp, src_type, enumcmp, &dst)
2769               || ctf_enum_iter (dst_fp, dst_type, enumcmp, &src))
2770             {
2771               ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2772                             _("conflict for enum %s against ID %lx: members "
2773                               "differ, see above"), name, dst_type);
2774               return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2775             }
2776         }
2777       else
2778         {
2779           dst_type = ctf_add_enum (dst_fp, flag, name);
2780           if ((dst.ctb_type = dst_type) == CTF_ERR
2781               || ctf_enum_iter (src_fp, src_type, enumadd, &dst))
2782             return CTF_ERR;                     /* errno is set for us */
2783         }
2784       break;
2785
2786     case CTF_K_FORWARD:
2787       if (dst_type == CTF_ERR)
2788           dst_type = ctf_add_forward (dst_fp, flag, name, forward_kind);
2789       break;
2790
2791     case CTF_K_TYPEDEF:
2792       src_type = ctf_type_reference (src_fp, src_type);
2793       src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2794                                         proc_tracking_fp);
2795
2796       if (src_type == CTF_ERR)
2797         return CTF_ERR;                         /* errno is set for us.  */
2798
2799       /* If dst_type is not CTF_ERR at this point, we should check if
2800          ctf_type_reference(dst_fp, dst_type) != src_type and if so fail with
2801          ECTF_CONFLICT.  However, this causes problems with bitness typedefs
2802          that vary based on things like if 32-bit then pid_t is int otherwise
2803          long.  We therefore omit this check and assume that if the identically
2804          named typedef already exists in dst_fp, it is correct or
2805          equivalent.  */
2806
2807       if (dst_type == CTF_ERR)
2808           dst_type = ctf_add_typedef (dst_fp, flag, name, src_type);
2809
2810       break;
2811
2812     default:
2813       return (ctf_set_errno (dst_fp, ECTF_CORRUPT));
2814     }
2815
2816   if (dst_type != CTF_ERR)
2817     ctf_add_type_mapping (src_fp, orig_src_type, dst_fp, dst_type);
2818   return dst_type;
2819 }
2820
2821 ctf_id_t
2822 ctf_add_type (ctf_dict_t *dst_fp, ctf_dict_t *src_fp, ctf_id_t src_type)
2823 {
2824   ctf_id_t id;
2825
2826   if (!src_fp->ctf_add_processing)
2827     src_fp->ctf_add_processing = ctf_dynhash_create (ctf_hash_integer,
2828                                                      ctf_hash_eq_integer,
2829                                                      NULL, NULL);
2830
2831   /* We store the hash on the source, because it contains only source type IDs:
2832      but callers will invariably expect errors to appear on the dest.  */
2833   if (!src_fp->ctf_add_processing)
2834     return (ctf_set_errno (dst_fp, ENOMEM));
2835
2836   id = ctf_add_type_internal (dst_fp, src_fp, src_type, src_fp);
2837   ctf_dynhash_empty (src_fp->ctf_add_processing);
2838
2839   return id;
2840 }
2841
2842 /* Write the compressed CTF data stream to the specified gzFile descriptor.  */
2843 int
2844 ctf_gzwrite (ctf_dict_t *fp, gzFile fd)
2845 {
2846   const unsigned char *buf;
2847   ssize_t resid;
2848   ssize_t len;
2849
2850   resid = sizeof (ctf_header_t);
2851   buf = (unsigned char *) fp->ctf_header;
2852   while (resid != 0)
2853     {
2854       if ((len = gzwrite (fd, buf, resid)) <= 0)
2855         return (ctf_set_errno (fp, errno));
2856       resid -= len;
2857       buf += len;
2858     }
2859
2860   resid = fp->ctf_size;
2861   buf = fp->ctf_buf;
2862   while (resid != 0)
2863     {
2864       if ((len = gzwrite (fd, buf, resid)) <= 0)
2865         return (ctf_set_errno (fp, errno));
2866       resid -= len;
2867       buf += len;
2868     }
2869
2870   return 0;
2871 }
2872
2873 /* Compress the specified CTF data stream and write it to the specified file
2874    descriptor.  */
2875 int
2876 ctf_compress_write (ctf_dict_t *fp, int fd)
2877 {
2878   unsigned char *buf;
2879   unsigned char *bp;
2880   ctf_header_t h;
2881   ctf_header_t *hp = &h;
2882   ssize_t header_len = sizeof (ctf_header_t);
2883   ssize_t compress_len;
2884   ssize_t len;
2885   int rc;
2886   int err = 0;
2887
2888   if (ctf_serialize (fp) < 0)
2889     return -1;                                  /* errno is set for us.  */
2890
2891   memcpy (hp, fp->ctf_header, header_len);
2892   hp->cth_flags |= CTF_F_COMPRESS;
2893   compress_len = compressBound (fp->ctf_size);
2894
2895   if ((buf = malloc (compress_len)) == NULL)
2896     {
2897       ctf_err_warn (fp, 0, 0, _("ctf_compress_write: cannot allocate %li bytes"),
2898                     (unsigned long) compress_len);
2899       return (ctf_set_errno (fp, ECTF_ZALLOC));
2900     }
2901
2902   if ((rc = compress (buf, (uLongf *) &compress_len,
2903                       fp->ctf_buf, fp->ctf_size)) != Z_OK)
2904     {
2905       err = ctf_set_errno (fp, ECTF_COMPRESS);
2906       ctf_err_warn (fp, 0, 0, _("zlib deflate err: %s"), zError (rc));
2907       goto ret;
2908     }
2909
2910   while (header_len > 0)
2911     {
2912       if ((len = write (fd, hp, header_len)) < 0)
2913         {
2914           err = ctf_set_errno (fp, errno);
2915           ctf_err_warn (fp, 0, 0, _("ctf_compress_write: error writing header"));
2916           goto ret;
2917         }
2918       header_len -= len;
2919       hp += len;
2920     }
2921
2922   bp = buf;
2923   while (compress_len > 0)
2924     {
2925       if ((len = write (fd, bp, compress_len)) < 0)
2926         {
2927           err = ctf_set_errno (fp, errno);
2928           ctf_err_warn (fp, 0, 0, _("ctf_compress_write: error writing"));
2929           goto ret;
2930         }
2931       compress_len -= len;
2932       bp += len;
2933     }
2934
2935 ret:
2936   free (buf);
2937   return err;
2938 }
2939
2940 /* Optionally compress the specified CTF data stream and return it as a new
2941    dynamically-allocated string.  */
2942 unsigned char *
2943 ctf_write_mem (ctf_dict_t *fp, size_t *size, size_t threshold)
2944 {
2945   unsigned char *buf;
2946   unsigned char *bp;
2947   ctf_header_t *hp;
2948   ssize_t header_len = sizeof (ctf_header_t);
2949   ssize_t compress_len;
2950   int rc;
2951
2952   if (ctf_serialize (fp) < 0)
2953     return NULL;                                /* errno is set for us.  */
2954
2955   compress_len = compressBound (fp->ctf_size);
2956   if (fp->ctf_size < threshold)
2957     compress_len = fp->ctf_size;
2958   if ((buf = malloc (compress_len
2959                      + sizeof (struct ctf_header))) == NULL)
2960     {
2961       ctf_set_errno (fp, ENOMEM);
2962       ctf_err_warn (fp, 0, 0, _("ctf_write_mem: cannot allocate %li bytes"),
2963                     (unsigned long) (compress_len + sizeof (struct ctf_header)));
2964       return NULL;
2965     }
2966
2967   hp = (ctf_header_t *) buf;
2968   memcpy (hp, fp->ctf_header, header_len);
2969   bp = buf + sizeof (struct ctf_header);
2970   *size = sizeof (struct ctf_header);
2971
2972   if (fp->ctf_size < threshold)
2973     {
2974       hp->cth_flags &= ~CTF_F_COMPRESS;
2975       memcpy (bp, fp->ctf_buf, fp->ctf_size);
2976       *size += fp->ctf_size;
2977     }
2978   else
2979     {
2980       hp->cth_flags |= CTF_F_COMPRESS;
2981       if ((rc = compress (bp, (uLongf *) &compress_len,
2982                           fp->ctf_buf, fp->ctf_size)) != Z_OK)
2983         {
2984           ctf_set_errno (fp, ECTF_COMPRESS);
2985           ctf_err_warn (fp, 0, 0, _("zlib deflate err: %s"), zError (rc));
2986           free (buf);
2987           return NULL;
2988         }
2989       *size += compress_len;
2990     }
2991   return buf;
2992 }
2993
2994 /* Write the uncompressed CTF data stream to the specified file descriptor.  */
2995 int
2996 ctf_write (ctf_dict_t *fp, int fd)
2997 {
2998   const unsigned char *buf;
2999   ssize_t resid;
3000   ssize_t len;
3001
3002   if (ctf_serialize (fp) < 0)
3003     return -1;                                  /* errno is set for us.  */
3004
3005   resid = sizeof (ctf_header_t);
3006   buf = (unsigned char *) fp->ctf_header;
3007   while (resid != 0)
3008     {
3009       if ((len = write (fd, buf, resid)) <= 0)
3010         {
3011           ctf_err_warn (fp, 0, errno, _("ctf_write: error writing header"));
3012           return (ctf_set_errno (fp, errno));
3013         }
3014       resid -= len;
3015       buf += len;
3016     }
3017
3018   resid = fp->ctf_size;
3019   buf = fp->ctf_buf;
3020   while (resid != 0)
3021     {
3022       if ((len = write (fd, buf, resid)) <= 0)
3023         {
3024           ctf_err_warn (fp, 0, errno, _("ctf_write: error writing"));
3025           return (ctf_set_errno (fp, errno));
3026         }
3027       resid -= len;
3028       buf += len;
3029     }
3030
3031   return 0;
3032 }
This page took 0.194254 seconds and 4 git commands to generate.