]> Git Repo - binutils.git/blob - libctf/ctf-open.c
7816fd0af102ccbfa1963fd9b0ce225bc08f1f06
[binutils.git] / libctf / ctf-open.c
1 /* Opening CTF files.
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 <stddef.h>
22 #include <string.h>
23 #include <sys/types.h>
24 #include <elf.h>
25 #include "swap.h"
26 #include <bfd.h>
27 #include <zlib.h>
28
29 static const ctf_dmodel_t _libctf_models[] = {
30   {"ILP32", CTF_MODEL_ILP32, 4, 1, 2, 4, 4},
31   {"LP64", CTF_MODEL_LP64, 8, 1, 2, 4, 8},
32   {NULL, 0, 0, 0, 0, 0, 0}
33 };
34
35 const char _CTF_SECTION[] = ".ctf";
36 const char _CTF_NULLSTR[] = "";
37
38 /* Version-sensitive accessors.  */
39
40 static uint32_t
41 get_kind_v1 (uint32_t info)
42 {
43   return (CTF_V1_INFO_KIND (info));
44 }
45
46 static uint32_t
47 get_root_v1 (uint32_t info)
48 {
49   return (CTF_V1_INFO_ISROOT (info));
50 }
51
52 static uint32_t
53 get_vlen_v1 (uint32_t info)
54 {
55   return (CTF_V1_INFO_VLEN (info));
56 }
57
58 static uint32_t
59 get_kind_v2 (uint32_t info)
60 {
61   return (CTF_V2_INFO_KIND (info));
62 }
63
64 static uint32_t
65 get_root_v2 (uint32_t info)
66 {
67   return (CTF_V2_INFO_ISROOT (info));
68 }
69
70 static uint32_t
71 get_vlen_v2 (uint32_t info)
72 {
73   return (CTF_V2_INFO_VLEN (info));
74 }
75
76 static inline ssize_t
77 get_ctt_size_common (const ctf_dict_t *fp _libctf_unused_,
78                      const ctf_type_t *tp _libctf_unused_,
79                      ssize_t *sizep, ssize_t *incrementp, size_t lsize,
80                      size_t csize, size_t ctf_type_size,
81                      size_t ctf_stype_size, size_t ctf_lsize_sent)
82 {
83   ssize_t size, increment;
84
85   if (csize == ctf_lsize_sent)
86     {
87       size = lsize;
88       increment = ctf_type_size;
89     }
90   else
91     {
92       size = csize;
93       increment = ctf_stype_size;
94     }
95
96   if (sizep)
97     *sizep = size;
98   if (incrementp)
99     *incrementp = increment;
100
101   return size;
102 }
103
104 static ssize_t
105 get_ctt_size_v1 (const ctf_dict_t *fp, const ctf_type_t *tp,
106                  ssize_t *sizep, ssize_t *incrementp)
107 {
108   ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
109
110   return (get_ctt_size_common (fp, tp, sizep, incrementp,
111                                CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
112                                sizeof (ctf_type_v1_t), sizeof (ctf_stype_v1_t),
113                                CTF_LSIZE_SENT_V1));
114 }
115
116 /* Return the size that a v1 will be once it is converted to v2.  */
117
118 static ssize_t
119 get_ctt_size_v2_unconverted (const ctf_dict_t *fp, const ctf_type_t *tp,
120                              ssize_t *sizep, ssize_t *incrementp)
121 {
122   ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
123
124   return (get_ctt_size_common (fp, tp, sizep, incrementp,
125                                CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
126                                sizeof (ctf_type_t), sizeof (ctf_stype_t),
127                                CTF_LSIZE_SENT));
128 }
129
130 static ssize_t
131 get_ctt_size_v2 (const ctf_dict_t *fp, const ctf_type_t *tp,
132                  ssize_t *sizep, ssize_t *incrementp)
133 {
134   return (get_ctt_size_common (fp, tp, sizep, incrementp,
135                                CTF_TYPE_LSIZE (tp), tp->ctt_size,
136                                sizeof (ctf_type_t), sizeof (ctf_stype_t),
137                                CTF_LSIZE_SENT));
138 }
139
140 static ssize_t
141 get_vbytes_common (ctf_dict_t *fp, unsigned short kind,
142                    ssize_t size _libctf_unused_, size_t vlen)
143 {
144   switch (kind)
145     {
146     case CTF_K_INTEGER:
147     case CTF_K_FLOAT:
148       return (sizeof (uint32_t));
149     case CTF_K_SLICE:
150       return (sizeof (ctf_slice_t));
151     case CTF_K_ENUM:
152       return (sizeof (ctf_enum_t) * vlen);
153     case CTF_K_FORWARD:
154     case CTF_K_UNKNOWN:
155     case CTF_K_POINTER:
156     case CTF_K_TYPEDEF:
157     case CTF_K_VOLATILE:
158     case CTF_K_CONST:
159     case CTF_K_RESTRICT:
160       return 0;
161     default:
162       ctf_set_errno (fp, ECTF_CORRUPT);
163       ctf_err_warn (fp, 0, 0, _("detected invalid CTF kind: %x"), kind);
164       return -1;
165     }
166 }
167
168 static ssize_t
169 get_vbytes_v1 (ctf_dict_t *fp, unsigned short kind, ssize_t size, size_t vlen)
170 {
171   switch (kind)
172     {
173     case CTF_K_ARRAY:
174       return (sizeof (ctf_array_v1_t));
175     case CTF_K_FUNCTION:
176       return (sizeof (unsigned short) * (vlen + (vlen & 1)));
177     case CTF_K_STRUCT:
178     case CTF_K_UNION:
179       if (size < CTF_LSTRUCT_THRESH_V1)
180         return (sizeof (ctf_member_v1_t) * vlen);
181       else
182         return (sizeof (ctf_lmember_v1_t) * vlen);
183     }
184
185   return (get_vbytes_common (fp, kind, size, vlen));
186 }
187
188 static ssize_t
189 get_vbytes_v2 (ctf_dict_t *fp, unsigned short kind, ssize_t size, size_t vlen)
190 {
191   switch (kind)
192     {
193     case CTF_K_ARRAY:
194       return (sizeof (ctf_array_t));
195     case CTF_K_FUNCTION:
196       return (sizeof (uint32_t) * (vlen + (vlen & 1)));
197     case CTF_K_STRUCT:
198     case CTF_K_UNION:
199       if (size < CTF_LSTRUCT_THRESH)
200         return (sizeof (ctf_member_t) * vlen);
201       else
202         return (sizeof (ctf_lmember_t) * vlen);
203     }
204
205   return (get_vbytes_common (fp, kind, size, vlen));
206 }
207
208 static const ctf_dictops_t ctf_dictops[] = {
209   {NULL, NULL, NULL, NULL, NULL},
210   /* CTF_VERSION_1 */
211   {get_kind_v1, get_root_v1, get_vlen_v1, get_ctt_size_v1, get_vbytes_v1},
212   /* CTF_VERSION_1_UPGRADED_3 */
213   {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
214   /* CTF_VERSION_2 */
215   {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
216   /* CTF_VERSION_3, identical to 2: only new type kinds */
217   {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
218 };
219
220 /* Initialize the symtab translation table as appropriate for its indexing
221    state.  For unindexed symtypetabs, fill each entry with the offset of the CTF
222    type or function data corresponding to each STT_FUNC or STT_OBJECT entry in
223    the symbol table.  For indexed symtypetabs, do nothing: the needed
224    initialization for indexed lookups may be quite expensive, so it is done only
225    as needed, when lookups happen.  (In particular, the majority of indexed
226    symtypetabs come from the compiler, and all the linker does is iteration over
227    all entries, which doesn't need this initialization.)
228
229    The SP symbol table section may be NULL if there is no symtab.
230
231    If init_symtab works on one call, it cannot fail on future calls to the same
232    fp: ctf_symsect_endianness relies on this.  */
233
234 static int
235 init_symtab (ctf_dict_t *fp, const ctf_header_t *hp, const ctf_sect_t *sp)
236 {
237   const unsigned char *symp;
238   int skip_func_info = 0;
239   int i;
240   uint32_t *xp = fp->ctf_sxlate;
241   uint32_t *xend = xp + fp->ctf_nsyms;
242
243   uint32_t objtoff = hp->cth_objtoff;
244   uint32_t funcoff = hp->cth_funcoff;
245
246   /* If the CTF_F_NEWFUNCINFO flag is not set, pretend the func info section
247      is empty: this compiler is too old to emit a function info section we
248      understand.  */
249
250   if (!(hp->cth_flags & CTF_F_NEWFUNCINFO))
251     skip_func_info = 1;
252
253   if (hp->cth_objtidxoff < hp->cth_funcidxoff)
254     fp->ctf_objtidx_names = (uint32_t *) (fp->ctf_buf + hp->cth_objtidxoff);
255   if (hp->cth_funcidxoff < hp->cth_varoff && !skip_func_info)
256     fp->ctf_funcidx_names = (uint32_t *) (fp->ctf_buf + hp->cth_funcidxoff);
257
258   /* Don't bother doing the rest if everything is indexed, or if we don't have a
259      symbol table: we will never use it.  */
260   if ((fp->ctf_objtidx_names && fp->ctf_funcidx_names) || !sp || !sp->cts_data)
261     return 0;
262
263   /* The CTF data object and function type sections are ordered to match the
264      relative order of the respective symbol types in the symtab, unless there
265      is an index section, in which case the order is arbitrary and the index
266      gives the mapping.  If no type information is available for a symbol table
267      entry, a pad is inserted in the CTF section.  As a further optimization,
268      anonymous or undefined symbols are omitted from the CTF data.  If an
269      index is available for function symbols but not object symbols, or vice
270      versa, we populate the xslate table for the unindexed symbols only.  */
271
272   for (i = 0, symp = sp->cts_data; xp < xend; xp++, symp += sp->cts_entsize,
273          i++)
274     {
275       ctf_link_sym_t sym;
276
277       switch (sp->cts_entsize)
278         {
279         case sizeof (Elf64_Sym):
280           {
281             const Elf64_Sym *symp64 = (Elf64_Sym *) (uintptr_t) symp;
282             ctf_elf64_to_link_sym (fp, &sym, symp64, i);
283           }
284           break;
285         case sizeof (Elf32_Sym):
286           {
287             const Elf32_Sym *symp32 = (Elf32_Sym *) (uintptr_t) symp;
288             ctf_elf32_to_link_sym (fp, &sym, symp32, i);
289           }
290           break;
291         default:
292           return ECTF_SYMTAB;
293         }
294
295       /* This call may be led astray if our idea of the symtab's endianness is
296          wrong, but when this is fixed by a call to ctf_symsect_endianness,
297          init_symtab will be called again with the right endianness in
298          force.  */
299       if (ctf_symtab_skippable (&sym))
300         {
301           *xp = -1u;
302           continue;
303         }
304
305       switch (sym.st_type)
306         {
307         case STT_OBJECT:
308           if (fp->ctf_objtidx_names || objtoff >= hp->cth_funcoff)
309             {
310               *xp = -1u;
311               break;
312             }
313
314           *xp = objtoff;
315           objtoff += sizeof (uint32_t);
316           break;
317
318         case STT_FUNC:
319           if (fp->ctf_funcidx_names || funcoff >= hp->cth_objtidxoff
320               || skip_func_info)
321             {
322               *xp = -1u;
323               break;
324             }
325
326           *xp = funcoff;
327           funcoff += sizeof (uint32_t);
328           break;
329
330         default:
331           *xp = -1u;
332           break;
333         }
334     }
335
336   ctf_dprintf ("loaded %lu symtab entries\n", fp->ctf_nsyms);
337   return 0;
338 }
339
340 /* Reset the CTF base pointer and derive the buf pointer from it, initializing
341    everything in the ctf_dict that depends on the base or buf pointers.
342
343    The original gap between the buf and base pointers, if any -- the original,
344    unconverted CTF header -- is kept, but its contents are not specified and are
345    never used.  */
346
347 static void
348 ctf_set_base (ctf_dict_t *fp, const ctf_header_t *hp, unsigned char *base)
349 {
350   fp->ctf_buf = base + (fp->ctf_buf - fp->ctf_base);
351   fp->ctf_base = base;
352   fp->ctf_vars = (ctf_varent_t *) ((const char *) fp->ctf_buf +
353                                    hp->cth_varoff);
354   fp->ctf_nvars = (hp->cth_typeoff - hp->cth_varoff) / sizeof (ctf_varent_t);
355
356   fp->ctf_str[CTF_STRTAB_0].cts_strs = (const char *) fp->ctf_buf
357     + hp->cth_stroff;
358   fp->ctf_str[CTF_STRTAB_0].cts_len = hp->cth_strlen;
359
360   /* If we have a parent dict name and label, store the relocated string
361      pointers in the CTF dict for easy access later. */
362
363   /* Note: before conversion, these will be set to values that will be
364      immediately invalidated by the conversion process, but the conversion
365      process will call ctf_set_base() again to fix things up.  */
366
367   if (hp->cth_parlabel != 0)
368     fp->ctf_parlabel = ctf_strptr (fp, hp->cth_parlabel);
369   if (hp->cth_parname != 0)
370     fp->ctf_parname = ctf_strptr (fp, hp->cth_parname);
371   if (hp->cth_cuname != 0)
372     fp->ctf_cuname = ctf_strptr (fp, hp->cth_cuname);
373
374   if (fp->ctf_cuname)
375     ctf_dprintf ("ctf_set_base: CU name %s\n", fp->ctf_cuname);
376   if (fp->ctf_parname)
377     ctf_dprintf ("ctf_set_base: parent name %s (label %s)\n",
378                fp->ctf_parname,
379                fp->ctf_parlabel ? fp->ctf_parlabel : "<NULL>");
380 }
381
382 /* Set the version of the CTF file. */
383
384 /* When this is reset, LCTF_* changes behaviour, but there is no guarantee that
385    the variable data list associated with each type has been upgraded: the
386    caller must ensure this has been done in advance.  */
387
388 static void
389 ctf_set_version (ctf_dict_t *fp, ctf_header_t *cth, int ctf_version)
390 {
391   fp->ctf_version = ctf_version;
392   cth->cth_version = ctf_version;
393   fp->ctf_dictops = &ctf_dictops[ctf_version];
394 }
395
396
397 /* Upgrade the header to CTF_VERSION_3.  The upgrade is done in-place.  */
398 static void
399 upgrade_header (ctf_header_t *hp)
400 {
401   ctf_header_v2_t *oldhp = (ctf_header_v2_t *) hp;
402
403   hp->cth_strlen = oldhp->cth_strlen;
404   hp->cth_stroff = oldhp->cth_stroff;
405   hp->cth_typeoff = oldhp->cth_typeoff;
406   hp->cth_varoff = oldhp->cth_varoff;
407   hp->cth_funcidxoff = hp->cth_varoff;          /* No index sections.  */
408   hp->cth_objtidxoff = hp->cth_funcidxoff;
409   hp->cth_funcoff = oldhp->cth_funcoff;
410   hp->cth_objtoff = oldhp->cth_objtoff;
411   hp->cth_lbloff = oldhp->cth_lbloff;
412   hp->cth_cuname = 0;                           /* No CU name.  */
413 }
414
415 /* Upgrade the type table to CTF_VERSION_3 (really CTF_VERSION_1_UPGRADED_3)
416    from CTF_VERSION_1.
417
418    The upgrade is not done in-place: the ctf_base is moved.  ctf_strptr() must
419    not be called before reallocation is complete.
420
421    Sections not checked here due to nonexistence or nonpopulated state in older
422    formats: objtidx, funcidx.
423
424    Type kinds not checked here due to nonexistence in older formats:
425       CTF_K_SLICE.  */
426 static int
427 upgrade_types_v1 (ctf_dict_t *fp, ctf_header_t *cth)
428 {
429   const ctf_type_v1_t *tbuf;
430   const ctf_type_v1_t *tend;
431   unsigned char *ctf_base, *old_ctf_base = (unsigned char *) fp->ctf_dynbase;
432   ctf_type_t *t2buf;
433
434   ssize_t increase = 0, size, increment, v2increment, vbytes, v2bytes;
435   const ctf_type_v1_t *tp;
436   ctf_type_t *t2p;
437
438   tbuf = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_typeoff);
439   tend = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_stroff);
440
441   /* Much like init_types(), this is a two-pass process.
442
443      First, figure out the new type-section size needed.  (It is possible,
444      in theory, for it to be less than the old size, but this is very
445      unlikely.  It cannot be so small that cth_typeoff ends up of negative
446      size.  We validate this with an assertion below.)
447
448      We must cater not only for changes in vlen and types sizes but also
449      for changes in 'increment', which happen because v2 places some types
450      into ctf_stype_t where v1 would be forced to use the larger non-stype.  */
451
452   for (tp = tbuf; tp < tend;
453        tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes))
454     {
455       unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
456       unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
457
458       size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
459       vbytes = get_vbytes_v1 (fp, kind, size, vlen);
460
461       get_ctt_size_v2_unconverted (fp, (const ctf_type_t *) tp, NULL,
462                                    &v2increment);
463       v2bytes = get_vbytes_v2 (fp, kind, size, vlen);
464
465       if ((vbytes < 0) || (size < 0))
466         return ECTF_CORRUPT;
467
468       increase += v2increment - increment;      /* May be negative.  */
469       increase += v2bytes - vbytes;
470     }
471
472   /* Allocate enough room for the new buffer, then copy everything but the type
473      section into place, and reset the base accordingly.  Leave the version
474      number unchanged, so that LCTF_INFO_* still works on the
475      as-yet-untranslated type info.  */
476
477   if ((ctf_base = malloc (fp->ctf_size + increase)) == NULL)
478     return ECTF_ZALLOC;
479
480   /* Start at ctf_buf, not ctf_base, to squeeze out the original header: we
481      never use it and it is unconverted.  */
482
483   memcpy (ctf_base, fp->ctf_buf, cth->cth_typeoff);
484   memcpy (ctf_base + cth->cth_stroff + increase,
485           fp->ctf_buf + cth->cth_stroff, cth->cth_strlen);
486
487   memset (ctf_base + cth->cth_typeoff, 0, cth->cth_stroff - cth->cth_typeoff
488           + increase);
489
490   cth->cth_stroff += increase;
491   fp->ctf_size += increase;
492   assert (cth->cth_stroff >= cth->cth_typeoff);
493   fp->ctf_base = ctf_base;
494   fp->ctf_buf = ctf_base;
495   fp->ctf_dynbase = ctf_base;
496   ctf_set_base (fp, cth, ctf_base);
497
498   t2buf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
499
500   /* Iterate through all the types again, upgrading them.
501
502      Everything that hasn't changed can just be outright memcpy()ed.
503      Things that have changed need field-by-field consideration.  */
504
505   for (tp = tbuf, t2p = t2buf; tp < tend;
506        tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes),
507        t2p = (ctf_type_t *) ((uintptr_t) t2p + v2increment + v2bytes))
508     {
509       unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
510       int isroot = CTF_V1_INFO_ISROOT (tp->ctt_info);
511       unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
512       ssize_t v2size;
513       void *vdata, *v2data;
514
515       size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
516       vbytes = get_vbytes_v1 (fp, kind, size, vlen);
517
518       t2p->ctt_name = tp->ctt_name;
519       t2p->ctt_info = CTF_TYPE_INFO (kind, isroot, vlen);
520
521       switch (kind)
522         {
523         case CTF_K_FUNCTION:
524         case CTF_K_FORWARD:
525         case CTF_K_TYPEDEF:
526         case CTF_K_POINTER:
527         case CTF_K_VOLATILE:
528         case CTF_K_CONST:
529         case CTF_K_RESTRICT:
530           t2p->ctt_type = tp->ctt_type;
531           break;
532         case CTF_K_INTEGER:
533         case CTF_K_FLOAT:
534         case CTF_K_ARRAY:
535         case CTF_K_STRUCT:
536         case CTF_K_UNION:
537         case CTF_K_ENUM:
538         case CTF_K_UNKNOWN:
539           if ((size_t) size <= CTF_MAX_SIZE)
540             t2p->ctt_size = size;
541           else
542             {
543               t2p->ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
544               t2p->ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
545             }
546           break;
547         }
548
549       v2size = get_ctt_size_v2 (fp, t2p, NULL, &v2increment);
550       v2bytes = get_vbytes_v2 (fp, kind, v2size, vlen);
551
552       /* Catch out-of-sync get_ctt_size_*().  The count goes wrong if
553          these are not identical (and having them different makes no
554          sense semantically).  */
555
556       assert (size == v2size);
557
558       /* Now the varlen info.  */
559
560       vdata = (void *) ((uintptr_t) tp + increment);
561       v2data = (void *) ((uintptr_t) t2p + v2increment);
562
563       switch (kind)
564         {
565         case CTF_K_ARRAY:
566           {
567             const ctf_array_v1_t *ap = (const ctf_array_v1_t *) vdata;
568             ctf_array_t *a2p = (ctf_array_t *) v2data;
569
570             a2p->cta_contents = ap->cta_contents;
571             a2p->cta_index = ap->cta_index;
572             a2p->cta_nelems = ap->cta_nelems;
573             break;
574           }
575         case CTF_K_STRUCT:
576         case CTF_K_UNION:
577           {
578             ctf_member_t tmp;
579             const ctf_member_v1_t *m1 = (const ctf_member_v1_t *) vdata;
580             const ctf_lmember_v1_t *lm1 = (const ctf_lmember_v1_t *) m1;
581             ctf_member_t *m2 = (ctf_member_t *) v2data;
582             ctf_lmember_t *lm2 = (ctf_lmember_t *) m2;
583             unsigned long i;
584
585             /* We walk all four pointers forward, but only reference the two
586                that are valid for the given size, to avoid quadruplicating all
587                the code.  */
588
589             for (i = vlen; i != 0; i--, m1++, lm1++, m2++, lm2++)
590               {
591                 size_t offset;
592                 if (size < CTF_LSTRUCT_THRESH_V1)
593                   {
594                     offset = m1->ctm_offset;
595                     tmp.ctm_name = m1->ctm_name;
596                     tmp.ctm_type = m1->ctm_type;
597                   }
598                 else
599                   {
600                     offset = CTF_LMEM_OFFSET (lm1);
601                     tmp.ctm_name = lm1->ctlm_name;
602                     tmp.ctm_type = lm1->ctlm_type;
603                   }
604                 if (size < CTF_LSTRUCT_THRESH)
605                   {
606                     m2->ctm_name = tmp.ctm_name;
607                     m2->ctm_type = tmp.ctm_type;
608                     m2->ctm_offset = offset;
609                   }
610                 else
611                   {
612                     lm2->ctlm_name = tmp.ctm_name;
613                     lm2->ctlm_type = tmp.ctm_type;
614                     lm2->ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (offset);
615                     lm2->ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (offset);
616                   }
617               }
618             break;
619           }
620         case CTF_K_FUNCTION:
621           {
622             unsigned long i;
623             unsigned short *a1 = (unsigned short *) vdata;
624             uint32_t *a2 = (uint32_t *) v2data;
625
626             for (i = vlen; i != 0; i--, a1++, a2++)
627               *a2 = *a1;
628           }
629         /* FALLTHRU */
630         default:
631           /* Catch out-of-sync get_vbytes_*().  */
632           assert (vbytes == v2bytes);
633           memcpy (v2data, vdata, vbytes);
634         }
635     }
636
637   /* Verify that the entire region was converted.  If not, we are either
638      converting too much, or too little (leading to a buffer overrun either here
639      or at read time, in init_types().) */
640
641   assert ((size_t) t2p - (size_t) fp->ctf_buf == cth->cth_stroff);
642
643   ctf_set_version (fp, cth, CTF_VERSION_1_UPGRADED_3);
644   free (old_ctf_base);
645
646   return 0;
647 }
648
649 /* Upgrade from any earlier version.  */
650 static int
651 upgrade_types (ctf_dict_t *fp, ctf_header_t *cth)
652 {
653   switch (cth->cth_version)
654     {
655       /* v1 requires a full pass and reformatting.  */
656     case CTF_VERSION_1:
657       upgrade_types_v1 (fp, cth);
658       /* FALLTHRU */
659       /* Already-converted v1 is just like later versions except that its
660          parent/child boundary is unchanged (and much lower).  */
661
662     case CTF_VERSION_1_UPGRADED_3:
663       fp->ctf_parmax = CTF_MAX_PTYPE_V1;
664
665       /* v2 is just the same as v3 except for new types and sections:
666          no upgrading required. */
667     case CTF_VERSION_2: ;
668       /* FALLTHRU */
669     }
670   return 0;
671 }
672
673 /* Initialize the type ID translation table with the byte offset of each type,
674    and initialize the hash tables of each named type.  Upgrade the type table to
675    the latest supported representation in the process, if needed, and if this
676    recension of libctf supports upgrading.  */
677
678 static int
679 init_types (ctf_dict_t *fp, ctf_header_t *cth)
680 {
681   const ctf_type_t *tbuf;
682   const ctf_type_t *tend;
683
684   unsigned long pop[CTF_K_MAX + 1] = { 0 };
685   const ctf_type_t *tp;
686   uint32_t id, dst;
687   uint32_t *xp;
688
689   /* We determine whether the dict is a child or a parent based on the value of
690      cth_parname.  */
691
692   int child = cth->cth_parname != 0;
693   int nlstructs = 0, nlunions = 0;
694   int err;
695
696   assert (!(fp->ctf_flags & LCTF_RDWR));
697
698   if (_libctf_unlikely_ (fp->ctf_version == CTF_VERSION_1))
699     {
700       int err;
701       if ((err = upgrade_types (fp, cth)) != 0)
702         return err;                             /* Upgrade failed.  */
703     }
704
705   tbuf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
706   tend = (ctf_type_t *) (fp->ctf_buf + cth->cth_stroff);
707
708   /* We make two passes through the entire type section.  In this first
709      pass, we count the number of each type and the total number of types.  */
710
711   for (tp = tbuf; tp < tend; fp->ctf_typemax++)
712     {
713       unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
714       unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
715       ssize_t size, increment, vbytes;
716
717       (void) ctf_get_ctt_size (fp, tp, &size, &increment);
718       vbytes = LCTF_VBYTES (fp, kind, size, vlen);
719
720       if (vbytes < 0)
721         return ECTF_CORRUPT;
722
723       /* For forward declarations, ctt_type is the CTF_K_* kind for the tag,
724          so bump that population count too.  */
725       if (kind == CTF_K_FORWARD)
726         pop[tp->ctt_type]++;
727
728       tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
729       pop[kind]++;
730     }
731
732   if (child)
733     {
734       ctf_dprintf ("CTF dict %p is a child\n", (void *) fp);
735       fp->ctf_flags |= LCTF_CHILD;
736     }
737   else
738     ctf_dprintf ("CTF dict %p is a parent\n", (void *) fp);
739
740   /* Now that we've counted up the number of each type, we can allocate
741      the hash tables, type translation table, and pointer table.  */
742
743   if ((fp->ctf_structs.ctn_readonly
744        = ctf_hash_create (pop[CTF_K_STRUCT], ctf_hash_string,
745                           ctf_hash_eq_string)) == NULL)
746     return ENOMEM;
747
748   if ((fp->ctf_unions.ctn_readonly
749        = ctf_hash_create (pop[CTF_K_UNION], ctf_hash_string,
750                           ctf_hash_eq_string)) == NULL)
751     return ENOMEM;
752
753   if ((fp->ctf_enums.ctn_readonly
754        = ctf_hash_create (pop[CTF_K_ENUM], ctf_hash_string,
755                           ctf_hash_eq_string)) == NULL)
756     return ENOMEM;
757
758   if ((fp->ctf_names.ctn_readonly
759        = ctf_hash_create (pop[CTF_K_INTEGER] +
760                           pop[CTF_K_FLOAT] +
761                           pop[CTF_K_FUNCTION] +
762                           pop[CTF_K_TYPEDEF] +
763                           pop[CTF_K_POINTER] +
764                           pop[CTF_K_VOLATILE] +
765                           pop[CTF_K_CONST] +
766                           pop[CTF_K_RESTRICT],
767                           ctf_hash_string,
768                           ctf_hash_eq_string)) == NULL)
769     return ENOMEM;
770
771   fp->ctf_txlate = malloc (sizeof (uint32_t) * (fp->ctf_typemax + 1));
772   fp->ctf_ptrtab_len = fp->ctf_typemax + 1;
773   fp->ctf_ptrtab = malloc (sizeof (uint32_t) * fp->ctf_ptrtab_len);
774
775   if (fp->ctf_txlate == NULL || fp->ctf_ptrtab == NULL)
776     return ENOMEM;              /* Memory allocation failed.  */
777
778   xp = fp->ctf_txlate;
779   *xp++ = 0;                    /* Type id 0 is used as a sentinel value.  */
780
781   memset (fp->ctf_txlate, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
782   memset (fp->ctf_ptrtab, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
783
784   /* In the second pass through the types, we fill in each entry of the
785      type and pointer tables and add names to the appropriate hashes.  */
786
787   for (id = 1, tp = tbuf; tp < tend; xp++, id++)
788     {
789       unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
790       unsigned short isroot = LCTF_INFO_ISROOT (fp, tp->ctt_info);
791       unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
792       ssize_t size, increment, vbytes;
793
794       const char *name;
795
796       (void) ctf_get_ctt_size (fp, tp, &size, &increment);
797       name = ctf_strptr (fp, tp->ctt_name);
798       /* Cannot fail: shielded by call in loop above.  */
799       vbytes = LCTF_VBYTES (fp, kind, size, vlen);
800
801       switch (kind)
802         {
803         case CTF_K_INTEGER:
804         case CTF_K_FLOAT:
805           /* Names are reused by bit-fields, which are differentiated by their
806              encodings, and so typically we'd record only the first instance of
807              a given intrinsic.  However, we replace an existing type with a
808              root-visible version so that we can be sure to find it when
809              checking for conflicting definitions in ctf_add_type().  */
810
811           if (((ctf_hash_lookup_type (fp->ctf_names.ctn_readonly,
812                                       fp, name)) == 0)
813               || isroot)
814             {
815               err = ctf_hash_define_type (fp->ctf_names.ctn_readonly, fp,
816                                           LCTF_INDEX_TO_TYPE (fp, id, child),
817                                           tp->ctt_name);
818               if (err != 0)
819                 return err;
820             }
821           break;
822
823           /* These kinds have no name, so do not need interning into any
824              hashtables.  */
825         case CTF_K_ARRAY:
826         case CTF_K_SLICE:
827           break;
828
829         case CTF_K_FUNCTION:
830           if (!isroot)
831             break;
832
833           err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
834                                       LCTF_INDEX_TO_TYPE (fp, id, child),
835                                       tp->ctt_name);
836           if (err != 0)
837             return err;
838           break;
839
840         case CTF_K_STRUCT:
841           if (size >= CTF_LSTRUCT_THRESH)
842             nlstructs++;
843
844           if (!isroot)
845             break;
846
847           err = ctf_hash_define_type (fp->ctf_structs.ctn_readonly, fp,
848                                       LCTF_INDEX_TO_TYPE (fp, id, child),
849                                       tp->ctt_name);
850
851           if (err != 0)
852             return err;
853
854           break;
855
856         case CTF_K_UNION:
857           if (size >= CTF_LSTRUCT_THRESH)
858             nlunions++;
859
860           if (!isroot)
861             break;
862
863           err = ctf_hash_define_type (fp->ctf_unions.ctn_readonly, fp,
864                                       LCTF_INDEX_TO_TYPE (fp, id, child),
865                                       tp->ctt_name);
866
867           if (err != 0)
868             return err;
869           break;
870
871         case CTF_K_ENUM:
872           if (!isroot)
873             break;
874
875           err = ctf_hash_define_type (fp->ctf_enums.ctn_readonly, fp,
876                                       LCTF_INDEX_TO_TYPE (fp, id, child),
877                                       tp->ctt_name);
878
879           if (err != 0)
880             return err;
881           break;
882
883         case CTF_K_TYPEDEF:
884           if (!isroot)
885             break;
886
887           err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
888                                       LCTF_INDEX_TO_TYPE (fp, id, child),
889                                       tp->ctt_name);
890           if (err != 0)
891             return err;
892           break;
893
894         case CTF_K_FORWARD:
895           {
896             ctf_names_t *np = ctf_name_table (fp, tp->ctt_type);
897
898             if (!isroot)
899               break;
900
901             /* Only insert forward tags into the given hash if the type or tag
902                name is not already present.  */
903             if (ctf_hash_lookup_type (np->ctn_readonly, fp, name) == 0)
904               {
905                 err = ctf_hash_insert_type (np->ctn_readonly, fp,
906                                             LCTF_INDEX_TO_TYPE (fp, id, child),
907                                             tp->ctt_name);
908                 if (err != 0)
909                   return err;
910               }
911             break;
912           }
913
914         case CTF_K_POINTER:
915           /* If the type referenced by the pointer is in this CTF dict, then
916              store the index of the pointer type in fp->ctf_ptrtab[ index of
917              referenced type ].  */
918
919           if (LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
920               && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
921             fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = id;
922          /*FALLTHRU*/
923
924         case CTF_K_VOLATILE:
925         case CTF_K_CONST:
926         case CTF_K_RESTRICT:
927           if (!isroot)
928             break;
929
930           err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
931                                       LCTF_INDEX_TO_TYPE (fp, id, child),
932                                       tp->ctt_name);
933           if (err != 0)
934             return err;
935           break;
936         default:
937           ctf_err_warn (fp, 0, ECTF_CORRUPT,
938                         _("init_types(): unhandled CTF kind: %x"), kind);
939           return ECTF_CORRUPT;
940         }
941
942       *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
943       tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
944     }
945
946   ctf_dprintf ("%lu total types processed\n", fp->ctf_typemax);
947   ctf_dprintf ("%u enum names hashed\n",
948                ctf_hash_size (fp->ctf_enums.ctn_readonly));
949   ctf_dprintf ("%u struct names hashed (%d long)\n",
950                ctf_hash_size (fp->ctf_structs.ctn_readonly), nlstructs);
951   ctf_dprintf ("%u union names hashed (%d long)\n",
952                ctf_hash_size (fp->ctf_unions.ctn_readonly), nlunions);
953   ctf_dprintf ("%u base type names hashed\n",
954                ctf_hash_size (fp->ctf_names.ctn_readonly));
955
956   /* Make an additional pass through the pointer table to find pointers that
957      point to anonymous typedef nodes.  If we find one, modify the pointer table
958      so that the pointer is also known to point to the node that is referenced
959      by the anonymous typedef node.  */
960
961   for (id = 1; id <= fp->ctf_typemax; id++)
962     {
963       if ((dst = fp->ctf_ptrtab[id]) != 0)
964         {
965           tp = LCTF_INDEX_TO_TYPEPTR (fp, id);
966
967           if (LCTF_INFO_KIND (fp, tp->ctt_info) == CTF_K_TYPEDEF
968               && strcmp (ctf_strptr (fp, tp->ctt_name), "") == 0
969               && LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
970               && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
971               fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = dst;
972         }
973     }
974
975   return 0;
976 }
977
978 /* Endianness-flipping routines.
979
980    We flip everything, mindlessly, even 1-byte entities, so that future
981    expansions do not require changes to this code.  */
982
983 /* Flip the endianness of the CTF header.  */
984
985 static void
986 flip_header (ctf_header_t *cth)
987 {
988   swap_thing (cth->cth_preamble.ctp_magic);
989   swap_thing (cth->cth_preamble.ctp_version);
990   swap_thing (cth->cth_preamble.ctp_flags);
991   swap_thing (cth->cth_parlabel);
992   swap_thing (cth->cth_parname);
993   swap_thing (cth->cth_cuname);
994   swap_thing (cth->cth_objtoff);
995   swap_thing (cth->cth_funcoff);
996   swap_thing (cth->cth_objtidxoff);
997   swap_thing (cth->cth_funcidxoff);
998   swap_thing (cth->cth_varoff);
999   swap_thing (cth->cth_typeoff);
1000   swap_thing (cth->cth_stroff);
1001   swap_thing (cth->cth_strlen);
1002 }
1003
1004 /* Flip the endianness of the label section, an array of ctf_lblent_t.  */
1005
1006 static void
1007 flip_lbls (void *start, size_t len)
1008 {
1009   ctf_lblent_t *lbl = start;
1010   ssize_t i;
1011
1012   for (i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
1013     {
1014       swap_thing (lbl->ctl_label);
1015       swap_thing (lbl->ctl_type);
1016     }
1017 }
1018
1019 /* Flip the endianness of the data-object or function sections or their indexes,
1020    all arrays of uint32_t.  */
1021
1022 static void
1023 flip_objts (void *start, size_t len)
1024 {
1025   uint32_t *obj = start;
1026   ssize_t i;
1027
1028   for (i = len / sizeof (uint32_t); i > 0; obj++, i--)
1029       swap_thing (*obj);
1030 }
1031
1032 /* Flip the endianness of the variable section, an array of ctf_varent_t.  */
1033
1034 static void
1035 flip_vars (void *start, size_t len)
1036 {
1037   ctf_varent_t *var = start;
1038   ssize_t i;
1039
1040   for (i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
1041     {
1042       swap_thing (var->ctv_name);
1043       swap_thing (var->ctv_type);
1044     }
1045 }
1046
1047 /* Flip the endianness of the type section, a tagged array of ctf_type or
1048    ctf_stype followed by variable data.  */
1049
1050 static int
1051 flip_types (ctf_dict_t *fp, void *start, size_t len)
1052 {
1053   ctf_type_t *t = start;
1054
1055   while ((uintptr_t) t < ((uintptr_t) start) + len)
1056     {
1057       swap_thing (t->ctt_name);
1058       swap_thing (t->ctt_info);
1059       swap_thing (t->ctt_size);
1060
1061       uint32_t kind = CTF_V2_INFO_KIND (t->ctt_info);
1062       size_t size = t->ctt_size;
1063       uint32_t vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1064       size_t vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1065
1066       if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1067         {
1068           swap_thing (t->ctt_lsizehi);
1069           swap_thing (t->ctt_lsizelo);
1070           size = CTF_TYPE_LSIZE (t);
1071           t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1072         }
1073       else
1074         t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1075
1076       switch (kind)
1077         {
1078         case CTF_K_FORWARD:
1079         case CTF_K_UNKNOWN:
1080         case CTF_K_POINTER:
1081         case CTF_K_TYPEDEF:
1082         case CTF_K_VOLATILE:
1083         case CTF_K_CONST:
1084         case CTF_K_RESTRICT:
1085           /* These types have no vlen data to swap.  */
1086           assert (vbytes == 0);
1087           break;
1088
1089         case CTF_K_INTEGER:
1090         case CTF_K_FLOAT:
1091           {
1092             /* These types have a single uint32_t.  */
1093
1094             uint32_t *item = (uint32_t *) t;
1095
1096             swap_thing (*item);
1097             break;
1098           }
1099
1100         case CTF_K_FUNCTION:
1101           {
1102             /* This type has a bunch of uint32_ts.  */
1103
1104             uint32_t *item = (uint32_t *) t;
1105             ssize_t i;
1106
1107             for (i = vlen; i > 0; item++, i--)
1108               swap_thing (*item);
1109             break;
1110           }
1111
1112         case CTF_K_ARRAY:
1113           {
1114             /* This has a single ctf_array_t.  */
1115
1116             ctf_array_t *a = (ctf_array_t *) t;
1117
1118             assert (vbytes == sizeof (ctf_array_t));
1119             swap_thing (a->cta_contents);
1120             swap_thing (a->cta_index);
1121             swap_thing (a->cta_nelems);
1122
1123             break;
1124           }
1125
1126         case CTF_K_SLICE:
1127           {
1128             /* This has a single ctf_slice_t.  */
1129
1130             ctf_slice_t *s = (ctf_slice_t *) t;
1131
1132             assert (vbytes == sizeof (ctf_slice_t));
1133             swap_thing (s->cts_type);
1134             swap_thing (s->cts_offset);
1135             swap_thing (s->cts_bits);
1136
1137             break;
1138           }
1139
1140         case CTF_K_STRUCT:
1141         case CTF_K_UNION:
1142           {
1143             /* This has an array of ctf_member or ctf_lmember, depending on
1144                size.  We could consider it to be a simple array of uint32_t,
1145                but for safety's sake in case these structures ever acquire
1146                non-uint32_t members, do it member by member.  */
1147
1148             if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1149               {
1150                 ctf_lmember_t *lm = (ctf_lmember_t *) t;
1151                 ssize_t i;
1152                 for (i = vlen; i > 0; i--, lm++)
1153                   {
1154                     swap_thing (lm->ctlm_name);
1155                     swap_thing (lm->ctlm_offsethi);
1156                     swap_thing (lm->ctlm_type);
1157                     swap_thing (lm->ctlm_offsetlo);
1158                   }
1159               }
1160             else
1161               {
1162                 ctf_member_t *m = (ctf_member_t *) t;
1163                 ssize_t i;
1164                 for (i = vlen; i > 0; i--, m++)
1165                   {
1166                     swap_thing (m->ctm_name);
1167                     swap_thing (m->ctm_offset);
1168                     swap_thing (m->ctm_type);
1169                   }
1170               }
1171             break;
1172           }
1173
1174         case CTF_K_ENUM:
1175           {
1176             /* This has an array of ctf_enum_t.  */
1177
1178             ctf_enum_t *item = (ctf_enum_t *) t;
1179             ssize_t i;
1180
1181             for (i = vlen; i > 0; item++, i--)
1182               {
1183                 swap_thing (item->cte_name);
1184                 swap_thing (item->cte_value);
1185               }
1186             break;
1187           }
1188         default:
1189           ctf_err_warn (fp, 0, ECTF_CORRUPT,
1190                         _("unhandled CTF kind in endianness conversion: %x"),
1191                         kind);
1192           return ECTF_CORRUPT;
1193         }
1194
1195       t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1196     }
1197
1198   return 0;
1199 }
1200
1201 /* Flip the endianness of BUF, given the offsets in the (already endian-
1202    converted) CTH.
1203
1204    All of this stuff happens before the header is fully initialized, so the
1205    LCTF_*() macros cannot be used yet.  Since we do not try to endian-convert v1
1206    data, this is no real loss.  */
1207
1208 static int
1209 flip_ctf (ctf_dict_t *fp, ctf_header_t *cth, unsigned char *buf)
1210 {
1211   flip_lbls (buf + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1212   flip_objts (buf + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1213   flip_objts (buf + cth->cth_funcoff, cth->cth_objtidxoff - cth->cth_funcoff);
1214   flip_objts (buf + cth->cth_objtidxoff, cth->cth_funcidxoff - cth->cth_objtidxoff);
1215   flip_objts (buf + cth->cth_funcidxoff, cth->cth_varoff - cth->cth_funcidxoff);
1216   flip_vars (buf + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1217   return flip_types (fp, buf + cth->cth_typeoff, cth->cth_stroff - cth->cth_typeoff);
1218 }
1219
1220 /* Set up the ctl hashes in a ctf_dict_t.  Called by both writable and
1221    non-writable dictionary initialization.  */
1222 void ctf_set_ctl_hashes (ctf_dict_t *fp)
1223 {
1224   /* Initialize the ctf_lookup_by_name top-level dictionary.  We keep an
1225      array of type name prefixes and the corresponding ctf_hash to use.  */
1226   fp->ctf_lookups[0].ctl_prefix = "struct";
1227   fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1228   fp->ctf_lookups[0].ctl_hash = &fp->ctf_structs;
1229   fp->ctf_lookups[1].ctl_prefix = "union";
1230   fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1231   fp->ctf_lookups[1].ctl_hash = &fp->ctf_unions;
1232   fp->ctf_lookups[2].ctl_prefix = "enum";
1233   fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1234   fp->ctf_lookups[2].ctl_hash = &fp->ctf_enums;
1235   fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1236   fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1237   fp->ctf_lookups[3].ctl_hash = &fp->ctf_names;
1238   fp->ctf_lookups[4].ctl_prefix = NULL;
1239   fp->ctf_lookups[4].ctl_len = 0;
1240   fp->ctf_lookups[4].ctl_hash = NULL;
1241 }
1242
1243 /* Open a CTF file, mocking up a suitable ctf_sect.  */
1244
1245 ctf_dict_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1246                              const char *symsect, size_t symsect_size,
1247                              size_t symsect_entsize,
1248                              const char *strsect, size_t strsect_size,
1249                              int *errp)
1250 {
1251   return ctf_simple_open_internal (ctfsect, ctfsect_size, symsect, symsect_size,
1252                                    symsect_entsize, strsect, strsect_size, NULL,
1253                                    0, errp);
1254 }
1255
1256 /* Open a CTF file, mocking up a suitable ctf_sect and overriding the external
1257    strtab with a synthetic one.  */
1258
1259 ctf_dict_t *ctf_simple_open_internal (const char *ctfsect, size_t ctfsect_size,
1260                                       const char *symsect, size_t symsect_size,
1261                                       size_t symsect_entsize,
1262                                       const char *strsect, size_t strsect_size,
1263                                       ctf_dynhash_t *syn_strtab, int writable,
1264                                       int *errp)
1265 {
1266   ctf_sect_t skeleton;
1267
1268   ctf_sect_t ctf_sect, sym_sect, str_sect;
1269   ctf_sect_t *ctfsectp = NULL;
1270   ctf_sect_t *symsectp = NULL;
1271   ctf_sect_t *strsectp = NULL;
1272
1273   skeleton.cts_name = _CTF_SECTION;
1274   skeleton.cts_entsize = 1;
1275
1276   if (ctfsect)
1277     {
1278       memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1279       ctf_sect.cts_data = ctfsect;
1280       ctf_sect.cts_size = ctfsect_size;
1281       ctfsectp = &ctf_sect;
1282     }
1283
1284   if (symsect)
1285     {
1286       memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1287       sym_sect.cts_data = symsect;
1288       sym_sect.cts_size = symsect_size;
1289       sym_sect.cts_entsize = symsect_entsize;
1290       symsectp = &sym_sect;
1291     }
1292
1293   if (strsect)
1294     {
1295       memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1296       str_sect.cts_data = strsect;
1297       str_sect.cts_size = strsect_size;
1298       strsectp = &str_sect;
1299     }
1300
1301   return ctf_bufopen_internal (ctfsectp, symsectp, strsectp, syn_strtab,
1302                                writable, errp);
1303 }
1304
1305 /* Decode the specified CTF buffer and optional symbol table, and create a new
1306    CTF dict representing the symbolic debugging information.  This code can
1307    be used directly by the debugger, or it can be used as the engine for
1308    ctf_fdopen() or ctf_open(), below.  */
1309
1310 ctf_dict_t *
1311 ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1312              const ctf_sect_t *strsect, int *errp)
1313 {
1314   return ctf_bufopen_internal (ctfsect, symsect, strsect, NULL, 0, errp);
1315 }
1316
1317 /* Like ctf_bufopen, but overriding the external strtab with a synthetic one.  */
1318
1319 ctf_dict_t *
1320 ctf_bufopen_internal (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1321                       const ctf_sect_t *strsect, ctf_dynhash_t *syn_strtab,
1322                       int writable, int *errp)
1323 {
1324   const ctf_preamble_t *pp;
1325   size_t hdrsz = sizeof (ctf_header_t);
1326   ctf_header_t *hp;
1327   ctf_dict_t *fp;
1328   int foreign_endian = 0;
1329   int err;
1330
1331   libctf_init_debug();
1332
1333   if ((ctfsect == NULL) || ((symsect != NULL) &&
1334                             ((strsect == NULL) && syn_strtab == NULL)))
1335     return (ctf_set_open_errno (errp, EINVAL));
1336
1337   if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1338       symsect->cts_entsize != sizeof (Elf64_Sym))
1339     return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1340
1341   if (symsect != NULL && symsect->cts_data == NULL)
1342     return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1343
1344   if (strsect != NULL && strsect->cts_data == NULL)
1345     return (ctf_set_open_errno (errp, ECTF_STRBAD));
1346
1347   if (ctfsect->cts_size < sizeof (ctf_preamble_t))
1348     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1349
1350   pp = (const ctf_preamble_t *) ctfsect->cts_data;
1351
1352   ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1353                pp->ctp_magic, pp->ctp_version);
1354
1355   /* Validate each part of the CTF header.
1356
1357      First, we validate the preamble (common to all versions).  At that point,
1358      we know the endianness and specific header version, and can validate the
1359      version-specific parts including section offsets and alignments.
1360
1361      We specifically do not support foreign-endian old versions.  */
1362
1363   if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1364     {
1365       if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1366         {
1367           if (pp->ctp_version != CTF_VERSION_3)
1368             return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1369           foreign_endian = 1;
1370         }
1371       else
1372         return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1373     }
1374
1375   if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1376                          || (pp->ctp_version > CTF_VERSION_3)))
1377     return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1378
1379   if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1380     {
1381       /* The symtab can contain function entries which contain embedded ctf
1382          info.  We do not support dynamically upgrading such entries (none
1383          should exist in any case, since dwarf2ctf does not create them).  */
1384
1385       ctf_err_warn (NULL, 0, ECTF_NOTSUP, _("ctf_bufopen: CTF version %d "
1386                                             "symsect not supported"),
1387                     pp->ctp_version);
1388       return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1389     }
1390
1391   if (pp->ctp_version < CTF_VERSION_3)
1392     hdrsz = sizeof (ctf_header_v2_t);
1393
1394   if (_libctf_unlikely_ (pp->ctp_flags > CTF_F_MAX))
1395     {
1396       ctf_err_warn (NULL, 0, ECTF_FLAGS, _("ctf_bufopen: invalid header "
1397                                            "flags: %x"),
1398                     (unsigned int) pp->ctp_flags);
1399       return (ctf_set_open_errno (errp, ECTF_FLAGS));
1400     }
1401
1402   if (ctfsect->cts_size < hdrsz)
1403     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1404
1405   if ((fp = malloc (sizeof (ctf_dict_t))) == NULL)
1406     return (ctf_set_open_errno (errp, ENOMEM));
1407
1408   memset (fp, 0, sizeof (ctf_dict_t));
1409
1410   if (writable)
1411     fp->ctf_flags |= LCTF_RDWR;
1412
1413   if ((fp->ctf_header = malloc (sizeof (struct ctf_header))) == NULL)
1414     {
1415       free (fp);
1416       return (ctf_set_open_errno (errp, ENOMEM));
1417     }
1418   hp = fp->ctf_header;
1419   memcpy (hp, ctfsect->cts_data, hdrsz);
1420   if (pp->ctp_version < CTF_VERSION_3)
1421     upgrade_header (hp);
1422
1423   if (foreign_endian)
1424     flip_header (hp);
1425   fp->ctf_openflags = hp->cth_flags;
1426   fp->ctf_size = hp->cth_stroff + hp->cth_strlen;
1427
1428   ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
1429                (unsigned long) fp->ctf_size);
1430
1431   if (hp->cth_lbloff > fp->ctf_size || hp->cth_objtoff > fp->ctf_size
1432       || hp->cth_funcoff > fp->ctf_size || hp->cth_objtidxoff > fp->ctf_size
1433       || hp->cth_funcidxoff > fp->ctf_size || hp->cth_typeoff > fp->ctf_size
1434       || hp->cth_stroff > fp->ctf_size)
1435     {
1436       ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("header offset exceeds CTF size"));
1437       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1438     }
1439
1440   if (hp->cth_lbloff > hp->cth_objtoff
1441       || hp->cth_objtoff > hp->cth_funcoff
1442       || hp->cth_funcoff > hp->cth_typeoff
1443       || hp->cth_funcoff > hp->cth_objtidxoff
1444       || hp->cth_objtidxoff > hp->cth_funcidxoff
1445       || hp->cth_funcidxoff > hp->cth_varoff
1446       || hp->cth_varoff > hp->cth_typeoff || hp->cth_typeoff > hp->cth_stroff)
1447     {
1448       ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("overlapping CTF sections"));
1449       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1450     }
1451
1452   if ((hp->cth_lbloff & 3) || (hp->cth_objtoff & 2)
1453       || (hp->cth_funcoff & 2) || (hp->cth_objtidxoff & 2)
1454       || (hp->cth_funcidxoff & 2) || (hp->cth_varoff & 3)
1455       || (hp->cth_typeoff & 3))
1456     {
1457       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1458                     _("CTF sections not properly aligned"));
1459       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1460     }
1461
1462   /* This invariant will be lifted in v4, but for now it is true.  */
1463
1464   if ((hp->cth_funcidxoff - hp->cth_objtidxoff != 0) &&
1465       (hp->cth_funcidxoff - hp->cth_objtidxoff
1466        != hp->cth_funcoff - hp->cth_objtoff))
1467     {
1468       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1469                     _("Object index section exists is neither empty nor the "
1470                       "same length as the object section: %u versus %u "
1471                       "bytes"), hp->cth_funcoff - hp->cth_objtoff,
1472                     hp->cth_funcidxoff - hp->cth_objtidxoff);
1473       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1474     }
1475
1476   if ((hp->cth_varoff - hp->cth_funcidxoff != 0) &&
1477       (hp->cth_varoff - hp->cth_funcidxoff
1478        != hp->cth_objtidxoff - hp->cth_funcoff))
1479     {
1480       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1481                     _("Function index section exists is neither empty nor the "
1482                       "same length as the function section: %u versus %u "
1483                       "bytes"), hp->cth_objtidxoff - hp->cth_funcoff,
1484                     hp->cth_varoff - hp->cth_funcidxoff);
1485       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1486     }
1487
1488   /* Once everything is determined to be valid, attempt to decompress the CTF
1489      data buffer if it is compressed, or copy it into new storage if it is not
1490      compressed but needs endian-flipping.  Otherwise we just put the data
1491      section's buffer pointer into ctf_buf, below.  */
1492
1493   /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1494      init_types().  */
1495
1496   if (hp->cth_flags & CTF_F_COMPRESS)
1497     {
1498       size_t srclen;
1499       uLongf dstlen;
1500       const void *src;
1501       int rc = Z_OK;
1502
1503       /* We are allocating this ourselves, so we can drop the ctf header
1504          copy in favour of ctf->ctf_header.  */
1505
1506       if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1507         {
1508           err = ECTF_ZALLOC;
1509           goto bad;
1510         }
1511       fp->ctf_dynbase = fp->ctf_base;
1512       hp->cth_flags &= ~CTF_F_COMPRESS;
1513
1514       src = (unsigned char *) ctfsect->cts_data + hdrsz;
1515       srclen = ctfsect->cts_size - hdrsz;
1516       dstlen = fp->ctf_size;
1517       fp->ctf_buf = fp->ctf_base;
1518
1519       if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
1520         {
1521           ctf_err_warn (NULL, 0, ECTF_DECOMPRESS, _("zlib inflate err: %s"),
1522                         zError (rc));
1523           err = ECTF_DECOMPRESS;
1524           goto bad;
1525         }
1526
1527       if ((size_t) dstlen != fp->ctf_size)
1528         {
1529           ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1530                         _("zlib inflate short: got %lu of %lu bytes"),
1531                         (unsigned long) dstlen, (unsigned long) fp->ctf_size);
1532           err = ECTF_CORRUPT;
1533           goto bad;
1534         }
1535     }
1536   else if (foreign_endian)
1537     {
1538       if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1539         {
1540           err = ECTF_ZALLOC;
1541           goto bad;
1542         }
1543       fp->ctf_dynbase = fp->ctf_base;
1544       memcpy (fp->ctf_base, ((unsigned char *) ctfsect->cts_data) + hdrsz,
1545               fp->ctf_size);
1546       fp->ctf_buf = fp->ctf_base;
1547     }
1548   else
1549     {
1550       /* We are just using the section passed in -- but its header may be an old
1551          version.  Point ctf_buf past the old header, and never touch it
1552          again.  */
1553       fp->ctf_base = (unsigned char *) ctfsect->cts_data;
1554       fp->ctf_dynbase = NULL;
1555       fp->ctf_buf = fp->ctf_base + hdrsz;
1556     }
1557
1558   /* Once we have uncompressed and validated the CTF data buffer, we can
1559      proceed with initializing the ctf_dict_t we allocated above.
1560
1561      Nothing that depends on buf or base should be set directly in this function
1562      before the init_types() call, because it may be reallocated during
1563      transparent upgrade if this recension of libctf is so configured: see
1564      ctf_set_base().  */
1565
1566   ctf_set_version (fp, hp, hp->cth_version);
1567   ctf_str_create_atoms (fp);
1568   fp->ctf_parmax = CTF_MAX_PTYPE;
1569   memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1570
1571   if (symsect != NULL)
1572     {
1573       memcpy (&fp->ctf_symtab, symsect, sizeof (ctf_sect_t));
1574       memcpy (&fp->ctf_strtab, strsect, sizeof (ctf_sect_t));
1575     }
1576
1577   if (fp->ctf_data.cts_name != NULL)
1578     if ((fp->ctf_data.cts_name = strdup (fp->ctf_data.cts_name)) == NULL)
1579       {
1580         err = ENOMEM;
1581         goto bad;
1582       }
1583   if (fp->ctf_symtab.cts_name != NULL)
1584     if ((fp->ctf_symtab.cts_name = strdup (fp->ctf_symtab.cts_name)) == NULL)
1585       {
1586         err = ENOMEM;
1587         goto bad;
1588       }
1589   if (fp->ctf_strtab.cts_name != NULL)
1590     if ((fp->ctf_strtab.cts_name = strdup (fp->ctf_strtab.cts_name)) == NULL)
1591       {
1592         err = ENOMEM;
1593         goto bad;
1594       }
1595
1596   if (fp->ctf_data.cts_name == NULL)
1597     fp->ctf_data.cts_name = _CTF_NULLSTR;
1598   if (fp->ctf_symtab.cts_name == NULL)
1599     fp->ctf_symtab.cts_name = _CTF_NULLSTR;
1600   if (fp->ctf_strtab.cts_name == NULL)
1601     fp->ctf_strtab.cts_name = _CTF_NULLSTR;
1602
1603   if (strsect != NULL)
1604     {
1605       fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1606       fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1607     }
1608   fp->ctf_syn_ext_strtab = syn_strtab;
1609
1610   if (foreign_endian &&
1611       (err = flip_ctf (fp, hp, fp->ctf_buf)) != 0)
1612     {
1613       /* We can be certain that flip_ctf() will have endian-flipped everything
1614          other than the types table when we return.  In particular the header
1615          is fine, so set it, to allow freeing to use the usual code path.  */
1616
1617       ctf_set_base (fp, hp, fp->ctf_base);
1618       goto bad;
1619     }
1620
1621   ctf_set_base (fp, hp, fp->ctf_base);
1622
1623   /* No need to do anything else for dynamic dicts: they do not support symbol
1624      lookups, and the type table is maintained in the dthashes.  */
1625   if (fp->ctf_flags & LCTF_RDWR)
1626     {
1627       fp->ctf_refcnt = 1;
1628       return fp;
1629     }
1630
1631   if ((err = init_types (fp, hp)) != 0)
1632     goto bad;
1633
1634   /* Allocate and initialize the symtab translation table, pointed to by
1635      ctf_sxlate, and the corresponding index sections.  This table may be too
1636      large for the actual size of the object and function info sections: if so,
1637      ctf_nsyms will be adjusted and the excess will never be used.  It's
1638      possible to do indexed symbol lookups even without a symbol table, so check
1639      even in that case.  Initially, we assume the symtab is native-endian: if it
1640      isn't, the caller will inform us later by calling ctf_symsect_endianness.  */
1641 #ifdef WORDS_BIGENDIAN
1642   fp->ctf_symsect_little_endian = 0;
1643 #else
1644   fp->ctf_symsect_little_endian = 1;
1645 #endif
1646
1647   if (symsect != NULL)
1648     {
1649       fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1650       fp->ctf_sxlate = malloc (fp->ctf_nsyms * sizeof (uint32_t));
1651
1652       if (fp->ctf_sxlate == NULL)
1653         {
1654           err = ENOMEM;
1655           goto bad;
1656         }
1657     }
1658
1659   if ((err = init_symtab (fp, hp, symsect)) != 0)
1660     goto bad;
1661
1662   ctf_set_ctl_hashes (fp);
1663
1664   if (symsect != NULL)
1665     {
1666       if (symsect->cts_entsize == sizeof (Elf64_Sym))
1667         (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1668       else
1669         (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1670     }
1671   else
1672     (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1673
1674   fp->ctf_refcnt = 1;
1675   return fp;
1676
1677 bad:
1678   ctf_set_open_errno (errp, err);
1679   ctf_err_warn_to_open (fp);
1680   ctf_dict_close (fp);
1681   return NULL;
1682 }
1683
1684 /* Bump the refcount on the specified CTF dict, to allow export of ctf_dict_t's
1685    from iterators that open and close the ctf_dict_t around the loop.  (This
1686    does not extend their lifetime beyond that of the ctf_archive_t in which they
1687    are contained.)  */
1688
1689 void
1690 ctf_ref (ctf_dict_t *fp)
1691 {
1692   fp->ctf_refcnt++;
1693 }
1694
1695 /* Close the specified CTF dict and free associated data structures.  Note that
1696    ctf_dict_close() is a reference counted operation: if the specified file is
1697    the parent of other active dict, its reference count will be greater than one
1698    and it will be freed later when no active children exist.  */
1699
1700 void
1701 ctf_dict_close (ctf_dict_t *fp)
1702 {
1703   ctf_dtdef_t *dtd, *ntd;
1704   ctf_dvdef_t *dvd, *nvd;
1705   ctf_in_flight_dynsym_t *did, *nid;
1706   ctf_err_warning_t *err, *nerr;
1707
1708   if (fp == NULL)
1709     return;                /* Allow ctf_dict_close(NULL) to simplify caller code.  */
1710
1711   ctf_dprintf ("ctf_dict_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1712
1713   if (fp->ctf_refcnt > 1)
1714     {
1715       fp->ctf_refcnt--;
1716       return;
1717     }
1718
1719   /* It is possible to recurse back in here, notably if dicts in the
1720      ctf_link_inputs or ctf_link_outputs cite this dict as a parent without
1721      using ctf_import_unref.  Do nothing in that case.  */
1722   if (fp->ctf_refcnt == 0)
1723     return;
1724
1725   fp->ctf_refcnt--;
1726   free (fp->ctf_dyncuname);
1727   free (fp->ctf_dynparname);
1728   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1729     ctf_dict_close (fp->ctf_parent);
1730
1731   for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1732     {
1733       ntd = ctf_list_next (dtd);
1734       ctf_dtd_delete (fp, dtd);
1735     }
1736   ctf_dynhash_destroy (fp->ctf_dthash);
1737   if (fp->ctf_flags & LCTF_RDWR)
1738     {
1739       ctf_dynhash_destroy (fp->ctf_structs.ctn_writable);
1740       ctf_dynhash_destroy (fp->ctf_unions.ctn_writable);
1741       ctf_dynhash_destroy (fp->ctf_enums.ctn_writable);
1742       ctf_dynhash_destroy (fp->ctf_names.ctn_writable);
1743     }
1744   else
1745     {
1746       ctf_hash_destroy (fp->ctf_structs.ctn_readonly);
1747       ctf_hash_destroy (fp->ctf_unions.ctn_readonly);
1748       ctf_hash_destroy (fp->ctf_enums.ctn_readonly);
1749       ctf_hash_destroy (fp->ctf_names.ctn_readonly);
1750     }
1751
1752   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1753     {
1754       nvd = ctf_list_next (dvd);
1755       ctf_dvd_delete (fp, dvd);
1756     }
1757   ctf_dynhash_destroy (fp->ctf_dvhash);
1758
1759   free (fp->ctf_funcidx_sxlate);
1760   free (fp->ctf_objtidx_sxlate);
1761   ctf_dynhash_destroy (fp->ctf_objthash);
1762   ctf_dynhash_destroy (fp->ctf_funchash);
1763   free (fp->ctf_dynsymidx);
1764   ctf_dynhash_destroy (fp->ctf_dynsyms);
1765   for (did = ctf_list_next (&fp->ctf_in_flight_dynsyms); did != NULL; did = nid)
1766     {
1767       nid = ctf_list_next (did);
1768       ctf_list_delete (&fp->ctf_in_flight_dynsyms, did);
1769       free (did);
1770     }
1771
1772   ctf_str_free_atoms (fp);
1773   free (fp->ctf_tmp_typeslice);
1774
1775   if (fp->ctf_data.cts_name != _CTF_NULLSTR)
1776     free ((char *) fp->ctf_data.cts_name);
1777
1778   if (fp->ctf_symtab.cts_name != _CTF_NULLSTR)
1779     free ((char *) fp->ctf_symtab.cts_name);
1780
1781   if (fp->ctf_strtab.cts_name != _CTF_NULLSTR)
1782     free ((char *) fp->ctf_strtab.cts_name);
1783   else if (fp->ctf_data_mmapped)
1784     ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1785
1786   free (fp->ctf_dynbase);
1787
1788   ctf_dynhash_destroy (fp->ctf_syn_ext_strtab);
1789   ctf_dynhash_destroy (fp->ctf_link_inputs);
1790   ctf_dynhash_destroy (fp->ctf_link_outputs);
1791   ctf_dynhash_destroy (fp->ctf_link_type_mapping);
1792   ctf_dynhash_destroy (fp->ctf_link_in_cu_mapping);
1793   ctf_dynhash_destroy (fp->ctf_link_out_cu_mapping);
1794   ctf_dynhash_destroy (fp->ctf_add_processing);
1795   ctf_dedup_fini (fp, NULL, 0);
1796   ctf_dynset_destroy (fp->ctf_dedup_atoms_alloc);
1797
1798   for (err = ctf_list_next (&fp->ctf_errs_warnings); err != NULL; err = nerr)
1799     {
1800       nerr = ctf_list_next (err);
1801       ctf_list_delete (&fp->ctf_errs_warnings, err);
1802       free (err->cew_text);
1803       free (err);
1804     }
1805
1806   free (fp->ctf_sxlate);
1807   free (fp->ctf_txlate);
1808   free (fp->ctf_ptrtab);
1809
1810   free (fp->ctf_header);
1811   free (fp);
1812 }
1813
1814 /* Backward compatibility.  */
1815 void
1816 ctf_file_close (ctf_file_t *fp)
1817 {
1818   ctf_dict_close (fp);
1819 }
1820
1821 /* The converse of ctf_open().  ctf_open() disguises whatever it opens as an
1822    archive, so closing one is just like closing an archive.  */
1823 void
1824 ctf_close (ctf_archive_t *arc)
1825 {
1826   ctf_arc_close (arc);
1827 }
1828
1829 /* Get the CTF archive from which this ctf_dict_t is derived.  */
1830 ctf_archive_t *
1831 ctf_get_arc (const ctf_dict_t *fp)
1832 {
1833   return fp->ctf_archive;
1834 }
1835
1836 /* Return the ctfsect out of the core ctf_impl.  Useful for freeing the
1837    ctfsect's data * after ctf_dict_close(), which is why we return the actual
1838    structure, not a pointer to it, since that is likely to become a pointer to
1839    freed data before the return value is used under the expected use case of
1840    ctf_getsect()/ ctf_dict_close()/free().  */
1841 ctf_sect_t
1842 ctf_getdatasect (const ctf_dict_t *fp)
1843 {
1844   return fp->ctf_data;
1845 }
1846
1847 ctf_sect_t
1848 ctf_getsymsect (const ctf_dict_t *fp)
1849 {
1850   return fp->ctf_symtab;
1851 }
1852
1853 ctf_sect_t
1854 ctf_getstrsect (const ctf_dict_t *fp)
1855 {
1856   return fp->ctf_strtab;
1857 }
1858
1859 /* Set the endianness of the symbol table attached to FP.  */
1860 void
1861 ctf_symsect_endianness (ctf_dict_t *fp, int little_endian)
1862 {
1863   int old_endianness = fp->ctf_symsect_little_endian;
1864
1865   fp->ctf_symsect_little_endian = !!little_endian;
1866
1867   /* If we already have a symtab translation table, we need to repopulate it if
1868      our idea of the endianness has changed.  */
1869
1870   if (old_endianness != fp->ctf_symsect_little_endian
1871       && fp->ctf_sxlate != NULL && fp->ctf_symtab.cts_data != NULL)
1872     assert (init_symtab (fp, fp->ctf_header, &fp->ctf_symtab) == 0);
1873 }
1874
1875 /* Return the CTF handle for the parent CTF dict, if one exists.  Otherwise
1876    return NULL to indicate this dict has no imported parent.  */
1877 ctf_dict_t *
1878 ctf_parent_dict (ctf_dict_t *fp)
1879 {
1880   return fp->ctf_parent;
1881 }
1882
1883 /* Backward compatibility.  */
1884 ctf_dict_t *
1885 ctf_parent_file (ctf_dict_t *fp)
1886 {
1887   return ctf_parent_dict (fp);
1888 }
1889
1890 /* Return the name of the parent CTF dict, if one exists, or NULL otherwise.  */
1891 const char *
1892 ctf_parent_name (ctf_dict_t *fp)
1893 {
1894   return fp->ctf_parname;
1895 }
1896
1897 /* Set the parent name.  It is an error to call this routine without calling
1898    ctf_import() at some point.  */
1899 int
1900 ctf_parent_name_set (ctf_dict_t *fp, const char *name)
1901 {
1902   if (fp->ctf_dynparname != NULL)
1903     free (fp->ctf_dynparname);
1904
1905   if ((fp->ctf_dynparname = strdup (name)) == NULL)
1906     return (ctf_set_errno (fp, ENOMEM));
1907   fp->ctf_parname = fp->ctf_dynparname;
1908   return 0;
1909 }
1910
1911 /* Return the name of the compilation unit this CTF file applies to.  Usually
1912    non-NULL only for non-parent dicts.  */
1913 const char *
1914 ctf_cuname (ctf_dict_t *fp)
1915 {
1916   return fp->ctf_cuname;
1917 }
1918
1919 /* Set the compilation unit name.  */
1920 int
1921 ctf_cuname_set (ctf_dict_t *fp, const char *name)
1922 {
1923   if (fp->ctf_dyncuname != NULL)
1924     free (fp->ctf_dyncuname);
1925
1926   if ((fp->ctf_dyncuname = strdup (name)) == NULL)
1927     return (ctf_set_errno (fp, ENOMEM));
1928   fp->ctf_cuname = fp->ctf_dyncuname;
1929   return 0;
1930 }
1931
1932 /* Import the types from the specified parent dict by storing a pointer to it in
1933    ctf_parent and incrementing its reference count.  Only one parent is allowed:
1934    if a parent already exists, it is replaced by the new parent.  */
1935 int
1936 ctf_import (ctf_dict_t *fp, ctf_dict_t *pfp)
1937 {
1938   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1939     return (ctf_set_errno (fp, EINVAL));
1940
1941   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1942     return (ctf_set_errno (fp, ECTF_DMODEL));
1943
1944   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1945     ctf_dict_close (fp->ctf_parent);
1946   fp->ctf_parent = NULL;
1947
1948   if (pfp != NULL)
1949     {
1950       int err;
1951
1952       if (fp->ctf_parname == NULL)
1953         if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
1954           return err;
1955
1956       fp->ctf_flags |= LCTF_CHILD;
1957       pfp->ctf_refcnt++;
1958       fp->ctf_parent_unreffed = 0;
1959     }
1960
1961   fp->ctf_parent = pfp;
1962   return 0;
1963 }
1964
1965 /* Like ctf_import, but does not increment the refcount on the imported parent
1966    or close it at any point: as a result it can go away at any time and the
1967    caller must do all freeing itself.  Used internally to avoid refcount
1968    loops.  */
1969 int
1970 ctf_import_unref (ctf_dict_t *fp, ctf_dict_t *pfp)
1971 {
1972   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1973     return (ctf_set_errno (fp, EINVAL));
1974
1975   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1976     return (ctf_set_errno (fp, ECTF_DMODEL));
1977
1978   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1979     ctf_dict_close (fp->ctf_parent);
1980   fp->ctf_parent = NULL;
1981
1982   if (pfp != NULL)
1983     {
1984       int err;
1985
1986       if (fp->ctf_parname == NULL)
1987         if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
1988           return err;
1989
1990       fp->ctf_flags |= LCTF_CHILD;
1991       fp->ctf_parent_unreffed = 1;
1992     }
1993
1994   fp->ctf_parent = pfp;
1995   return 0;
1996 }
1997
1998 /* Set the data model constant for the CTF dict.  */
1999 int
2000 ctf_setmodel (ctf_dict_t *fp, int model)
2001 {
2002   const ctf_dmodel_t *dp;
2003
2004   for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
2005     {
2006       if (dp->ctd_code == model)
2007         {
2008           fp->ctf_dmodel = dp;
2009           return 0;
2010         }
2011     }
2012
2013   return (ctf_set_errno (fp, EINVAL));
2014 }
2015
2016 /* Return the data model constant for the CTF dict.  */
2017 int
2018 ctf_getmodel (ctf_dict_t *fp)
2019 {
2020   return fp->ctf_dmodel->ctd_code;
2021 }
2022
2023 /* The caller can hang an arbitrary pointer off each ctf_dict_t using this
2024    function.  */
2025 void
2026 ctf_setspecific (ctf_dict_t *fp, void *data)
2027 {
2028   fp->ctf_specific = data;
2029 }
2030
2031 /* Retrieve the arbitrary pointer again.  */
2032 void *
2033 ctf_getspecific (ctf_dict_t *fp)
2034 {
2035   return fp->ctf_specific;
2036 }
This page took 0.130559 seconds and 2 git commands to generate.