]> Git Repo - binutils.git/blob - libctf/ctf-open.c
libctf: rip out dead code handling typedefs with no name
[binutils.git] / libctf / ctf-open.c
1 /* Opening CTF files.
2    Copyright (C) 2019-2021 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;
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   return 0;
957 }
958
959 /* Endianness-flipping routines.
960
961    We flip everything, mindlessly, even 1-byte entities, so that future
962    expansions do not require changes to this code.  */
963
964 /* Flip the endianness of the CTF header.  */
965
966 static void
967 flip_header (ctf_header_t *cth)
968 {
969   swap_thing (cth->cth_preamble.ctp_magic);
970   swap_thing (cth->cth_preamble.ctp_version);
971   swap_thing (cth->cth_preamble.ctp_flags);
972   swap_thing (cth->cth_parlabel);
973   swap_thing (cth->cth_parname);
974   swap_thing (cth->cth_cuname);
975   swap_thing (cth->cth_objtoff);
976   swap_thing (cth->cth_funcoff);
977   swap_thing (cth->cth_objtidxoff);
978   swap_thing (cth->cth_funcidxoff);
979   swap_thing (cth->cth_varoff);
980   swap_thing (cth->cth_typeoff);
981   swap_thing (cth->cth_stroff);
982   swap_thing (cth->cth_strlen);
983 }
984
985 /* Flip the endianness of the label section, an array of ctf_lblent_t.  */
986
987 static void
988 flip_lbls (void *start, size_t len)
989 {
990   ctf_lblent_t *lbl = start;
991   ssize_t i;
992
993   for (i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
994     {
995       swap_thing (lbl->ctl_label);
996       swap_thing (lbl->ctl_type);
997     }
998 }
999
1000 /* Flip the endianness of the data-object or function sections or their indexes,
1001    all arrays of uint32_t.  */
1002
1003 static void
1004 flip_objts (void *start, size_t len)
1005 {
1006   uint32_t *obj = start;
1007   ssize_t i;
1008
1009   for (i = len / sizeof (uint32_t); i > 0; obj++, i--)
1010       swap_thing (*obj);
1011 }
1012
1013 /* Flip the endianness of the variable section, an array of ctf_varent_t.  */
1014
1015 static void
1016 flip_vars (void *start, size_t len)
1017 {
1018   ctf_varent_t *var = start;
1019   ssize_t i;
1020
1021   for (i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
1022     {
1023       swap_thing (var->ctv_name);
1024       swap_thing (var->ctv_type);
1025     }
1026 }
1027
1028 /* Flip the endianness of the type section, a tagged array of ctf_type or
1029    ctf_stype followed by variable data.  */
1030
1031 static int
1032 flip_types (ctf_dict_t *fp, void *start, size_t len)
1033 {
1034   ctf_type_t *t = start;
1035
1036   while ((uintptr_t) t < ((uintptr_t) start) + len)
1037     {
1038       swap_thing (t->ctt_name);
1039       swap_thing (t->ctt_info);
1040       swap_thing (t->ctt_size);
1041
1042       uint32_t kind = CTF_V2_INFO_KIND (t->ctt_info);
1043       size_t size = t->ctt_size;
1044       uint32_t vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1045       size_t vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1046
1047       if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1048         {
1049           swap_thing (t->ctt_lsizehi);
1050           swap_thing (t->ctt_lsizelo);
1051           size = CTF_TYPE_LSIZE (t);
1052           t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1053         }
1054       else
1055         t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1056
1057       switch (kind)
1058         {
1059         case CTF_K_FORWARD:
1060         case CTF_K_UNKNOWN:
1061         case CTF_K_POINTER:
1062         case CTF_K_TYPEDEF:
1063         case CTF_K_VOLATILE:
1064         case CTF_K_CONST:
1065         case CTF_K_RESTRICT:
1066           /* These types have no vlen data to swap.  */
1067           assert (vbytes == 0);
1068           break;
1069
1070         case CTF_K_INTEGER:
1071         case CTF_K_FLOAT:
1072           {
1073             /* These types have a single uint32_t.  */
1074
1075             uint32_t *item = (uint32_t *) t;
1076
1077             swap_thing (*item);
1078             break;
1079           }
1080
1081         case CTF_K_FUNCTION:
1082           {
1083             /* This type has a bunch of uint32_ts.  */
1084
1085             uint32_t *item = (uint32_t *) t;
1086             ssize_t i;
1087
1088             for (i = vlen; i > 0; item++, i--)
1089               swap_thing (*item);
1090             break;
1091           }
1092
1093         case CTF_K_ARRAY:
1094           {
1095             /* This has a single ctf_array_t.  */
1096
1097             ctf_array_t *a = (ctf_array_t *) t;
1098
1099             assert (vbytes == sizeof (ctf_array_t));
1100             swap_thing (a->cta_contents);
1101             swap_thing (a->cta_index);
1102             swap_thing (a->cta_nelems);
1103
1104             break;
1105           }
1106
1107         case CTF_K_SLICE:
1108           {
1109             /* This has a single ctf_slice_t.  */
1110
1111             ctf_slice_t *s = (ctf_slice_t *) t;
1112
1113             assert (vbytes == sizeof (ctf_slice_t));
1114             swap_thing (s->cts_type);
1115             swap_thing (s->cts_offset);
1116             swap_thing (s->cts_bits);
1117
1118             break;
1119           }
1120
1121         case CTF_K_STRUCT:
1122         case CTF_K_UNION:
1123           {
1124             /* This has an array of ctf_member or ctf_lmember, depending on
1125                size.  We could consider it to be a simple array of uint32_t,
1126                but for safety's sake in case these structures ever acquire
1127                non-uint32_t members, do it member by member.  */
1128
1129             if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1130               {
1131                 ctf_lmember_t *lm = (ctf_lmember_t *) t;
1132                 ssize_t i;
1133                 for (i = vlen; i > 0; i--, lm++)
1134                   {
1135                     swap_thing (lm->ctlm_name);
1136                     swap_thing (lm->ctlm_offsethi);
1137                     swap_thing (lm->ctlm_type);
1138                     swap_thing (lm->ctlm_offsetlo);
1139                   }
1140               }
1141             else
1142               {
1143                 ctf_member_t *m = (ctf_member_t *) t;
1144                 ssize_t i;
1145                 for (i = vlen; i > 0; i--, m++)
1146                   {
1147                     swap_thing (m->ctm_name);
1148                     swap_thing (m->ctm_offset);
1149                     swap_thing (m->ctm_type);
1150                   }
1151               }
1152             break;
1153           }
1154
1155         case CTF_K_ENUM:
1156           {
1157             /* This has an array of ctf_enum_t.  */
1158
1159             ctf_enum_t *item = (ctf_enum_t *) t;
1160             ssize_t i;
1161
1162             for (i = vlen; i > 0; item++, i--)
1163               {
1164                 swap_thing (item->cte_name);
1165                 swap_thing (item->cte_value);
1166               }
1167             break;
1168           }
1169         default:
1170           ctf_err_warn (fp, 0, ECTF_CORRUPT,
1171                         _("unhandled CTF kind in endianness conversion: %x"),
1172                         kind);
1173           return ECTF_CORRUPT;
1174         }
1175
1176       t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1177     }
1178
1179   return 0;
1180 }
1181
1182 /* Flip the endianness of BUF, given the offsets in the (already endian-
1183    converted) CTH.
1184
1185    All of this stuff happens before the header is fully initialized, so the
1186    LCTF_*() macros cannot be used yet.  Since we do not try to endian-convert v1
1187    data, this is no real loss.  */
1188
1189 static int
1190 flip_ctf (ctf_dict_t *fp, ctf_header_t *cth, unsigned char *buf)
1191 {
1192   flip_lbls (buf + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1193   flip_objts (buf + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1194   flip_objts (buf + cth->cth_funcoff, cth->cth_objtidxoff - cth->cth_funcoff);
1195   flip_objts (buf + cth->cth_objtidxoff, cth->cth_funcidxoff - cth->cth_objtidxoff);
1196   flip_objts (buf + cth->cth_funcidxoff, cth->cth_varoff - cth->cth_funcidxoff);
1197   flip_vars (buf + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1198   return flip_types (fp, buf + cth->cth_typeoff, cth->cth_stroff - cth->cth_typeoff);
1199 }
1200
1201 /* Set up the ctl hashes in a ctf_dict_t.  Called by both writable and
1202    non-writable dictionary initialization.  */
1203 void ctf_set_ctl_hashes (ctf_dict_t *fp)
1204 {
1205   /* Initialize the ctf_lookup_by_name top-level dictionary.  We keep an
1206      array of type name prefixes and the corresponding ctf_hash to use.  */
1207   fp->ctf_lookups[0].ctl_prefix = "struct";
1208   fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1209   fp->ctf_lookups[0].ctl_hash = &fp->ctf_structs;
1210   fp->ctf_lookups[1].ctl_prefix = "union";
1211   fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1212   fp->ctf_lookups[1].ctl_hash = &fp->ctf_unions;
1213   fp->ctf_lookups[2].ctl_prefix = "enum";
1214   fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1215   fp->ctf_lookups[2].ctl_hash = &fp->ctf_enums;
1216   fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1217   fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1218   fp->ctf_lookups[3].ctl_hash = &fp->ctf_names;
1219   fp->ctf_lookups[4].ctl_prefix = NULL;
1220   fp->ctf_lookups[4].ctl_len = 0;
1221   fp->ctf_lookups[4].ctl_hash = NULL;
1222 }
1223
1224 /* Open a CTF file, mocking up a suitable ctf_sect.  */
1225
1226 ctf_dict_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1227                              const char *symsect, size_t symsect_size,
1228                              size_t symsect_entsize,
1229                              const char *strsect, size_t strsect_size,
1230                              int *errp)
1231 {
1232   return ctf_simple_open_internal (ctfsect, ctfsect_size, symsect, symsect_size,
1233                                    symsect_entsize, strsect, strsect_size, NULL,
1234                                    0, errp);
1235 }
1236
1237 /* Open a CTF file, mocking up a suitable ctf_sect and overriding the external
1238    strtab with a synthetic one.  */
1239
1240 ctf_dict_t *ctf_simple_open_internal (const char *ctfsect, size_t ctfsect_size,
1241                                       const char *symsect, size_t symsect_size,
1242                                       size_t symsect_entsize,
1243                                       const char *strsect, size_t strsect_size,
1244                                       ctf_dynhash_t *syn_strtab, int writable,
1245                                       int *errp)
1246 {
1247   ctf_sect_t skeleton;
1248
1249   ctf_sect_t ctf_sect, sym_sect, str_sect;
1250   ctf_sect_t *ctfsectp = NULL;
1251   ctf_sect_t *symsectp = NULL;
1252   ctf_sect_t *strsectp = NULL;
1253
1254   skeleton.cts_name = _CTF_SECTION;
1255   skeleton.cts_entsize = 1;
1256
1257   if (ctfsect)
1258     {
1259       memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1260       ctf_sect.cts_data = ctfsect;
1261       ctf_sect.cts_size = ctfsect_size;
1262       ctfsectp = &ctf_sect;
1263     }
1264
1265   if (symsect)
1266     {
1267       memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1268       sym_sect.cts_data = symsect;
1269       sym_sect.cts_size = symsect_size;
1270       sym_sect.cts_entsize = symsect_entsize;
1271       symsectp = &sym_sect;
1272     }
1273
1274   if (strsect)
1275     {
1276       memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1277       str_sect.cts_data = strsect;
1278       str_sect.cts_size = strsect_size;
1279       strsectp = &str_sect;
1280     }
1281
1282   return ctf_bufopen_internal (ctfsectp, symsectp, strsectp, syn_strtab,
1283                                writable, errp);
1284 }
1285
1286 /* Decode the specified CTF buffer and optional symbol table, and create a new
1287    CTF dict representing the symbolic debugging information.  This code can
1288    be used directly by the debugger, or it can be used as the engine for
1289    ctf_fdopen() or ctf_open(), below.  */
1290
1291 ctf_dict_t *
1292 ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1293              const ctf_sect_t *strsect, int *errp)
1294 {
1295   return ctf_bufopen_internal (ctfsect, symsect, strsect, NULL, 0, errp);
1296 }
1297
1298 /* Like ctf_bufopen, but overriding the external strtab with a synthetic one.  */
1299
1300 ctf_dict_t *
1301 ctf_bufopen_internal (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1302                       const ctf_sect_t *strsect, ctf_dynhash_t *syn_strtab,
1303                       int writable, int *errp)
1304 {
1305   const ctf_preamble_t *pp;
1306   size_t hdrsz = sizeof (ctf_header_t);
1307   ctf_header_t *hp;
1308   ctf_dict_t *fp;
1309   int foreign_endian = 0;
1310   int err;
1311
1312   libctf_init_debug();
1313
1314   if ((ctfsect == NULL) || ((symsect != NULL) &&
1315                             ((strsect == NULL) && syn_strtab == NULL)))
1316     return (ctf_set_open_errno (errp, EINVAL));
1317
1318   if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1319       symsect->cts_entsize != sizeof (Elf64_Sym))
1320     return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1321
1322   if (symsect != NULL && symsect->cts_data == NULL)
1323     return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1324
1325   if (strsect != NULL && strsect->cts_data == NULL)
1326     return (ctf_set_open_errno (errp, ECTF_STRBAD));
1327
1328   if (ctfsect->cts_size < sizeof (ctf_preamble_t))
1329     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1330
1331   pp = (const ctf_preamble_t *) ctfsect->cts_data;
1332
1333   ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1334                pp->ctp_magic, pp->ctp_version);
1335
1336   /* Validate each part of the CTF header.
1337
1338      First, we validate the preamble (common to all versions).  At that point,
1339      we know the endianness and specific header version, and can validate the
1340      version-specific parts including section offsets and alignments.
1341
1342      We specifically do not support foreign-endian old versions.  */
1343
1344   if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1345     {
1346       if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1347         {
1348           if (pp->ctp_version != CTF_VERSION_3)
1349             return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1350           foreign_endian = 1;
1351         }
1352       else
1353         return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1354     }
1355
1356   if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1357                          || (pp->ctp_version > CTF_VERSION_3)))
1358     return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1359
1360   if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1361     {
1362       /* The symtab can contain function entries which contain embedded ctf
1363          info.  We do not support dynamically upgrading such entries (none
1364          should exist in any case, since dwarf2ctf does not create them).  */
1365
1366       ctf_err_warn (NULL, 0, ECTF_NOTSUP, _("ctf_bufopen: CTF version %d "
1367                                             "symsect not supported"),
1368                     pp->ctp_version);
1369       return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1370     }
1371
1372   if (pp->ctp_version < CTF_VERSION_3)
1373     hdrsz = sizeof (ctf_header_v2_t);
1374
1375   if (_libctf_unlikely_ (pp->ctp_flags > CTF_F_MAX))
1376     {
1377       ctf_err_warn (NULL, 0, ECTF_FLAGS, _("ctf_bufopen: invalid header "
1378                                            "flags: %x"),
1379                     (unsigned int) pp->ctp_flags);
1380       return (ctf_set_open_errno (errp, ECTF_FLAGS));
1381     }
1382
1383   if (ctfsect->cts_size < hdrsz)
1384     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1385
1386   if ((fp = malloc (sizeof (ctf_dict_t))) == NULL)
1387     return (ctf_set_open_errno (errp, ENOMEM));
1388
1389   memset (fp, 0, sizeof (ctf_dict_t));
1390
1391   if (writable)
1392     fp->ctf_flags |= LCTF_RDWR;
1393
1394   if ((fp->ctf_header = malloc (sizeof (struct ctf_header))) == NULL)
1395     {
1396       free (fp);
1397       return (ctf_set_open_errno (errp, ENOMEM));
1398     }
1399   hp = fp->ctf_header;
1400   memcpy (hp, ctfsect->cts_data, hdrsz);
1401   if (pp->ctp_version < CTF_VERSION_3)
1402     upgrade_header (hp);
1403
1404   if (foreign_endian)
1405     flip_header (hp);
1406   fp->ctf_openflags = hp->cth_flags;
1407   fp->ctf_size = hp->cth_stroff + hp->cth_strlen;
1408
1409   ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
1410                (unsigned long) fp->ctf_size);
1411
1412   if (hp->cth_lbloff > fp->ctf_size || hp->cth_objtoff > fp->ctf_size
1413       || hp->cth_funcoff > fp->ctf_size || hp->cth_objtidxoff > fp->ctf_size
1414       || hp->cth_funcidxoff > fp->ctf_size || hp->cth_typeoff > fp->ctf_size
1415       || hp->cth_stroff > fp->ctf_size)
1416     {
1417       ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("header offset exceeds CTF size"));
1418       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1419     }
1420
1421   if (hp->cth_lbloff > hp->cth_objtoff
1422       || hp->cth_objtoff > hp->cth_funcoff
1423       || hp->cth_funcoff > hp->cth_typeoff
1424       || hp->cth_funcoff > hp->cth_objtidxoff
1425       || hp->cth_objtidxoff > hp->cth_funcidxoff
1426       || hp->cth_funcidxoff > hp->cth_varoff
1427       || hp->cth_varoff > hp->cth_typeoff || hp->cth_typeoff > hp->cth_stroff)
1428     {
1429       ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("overlapping CTF sections"));
1430       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1431     }
1432
1433   if ((hp->cth_lbloff & 3) || (hp->cth_objtoff & 2)
1434       || (hp->cth_funcoff & 2) || (hp->cth_objtidxoff & 2)
1435       || (hp->cth_funcidxoff & 2) || (hp->cth_varoff & 3)
1436       || (hp->cth_typeoff & 3))
1437     {
1438       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1439                     _("CTF sections not properly aligned"));
1440       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1441     }
1442
1443   /* This invariant will be lifted in v4, but for now it is true.  */
1444
1445   if ((hp->cth_funcidxoff - hp->cth_objtidxoff != 0) &&
1446       (hp->cth_funcidxoff - hp->cth_objtidxoff
1447        != hp->cth_funcoff - hp->cth_objtoff))
1448     {
1449       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1450                     _("Object index section exists is neither empty nor the "
1451                       "same length as the object section: %u versus %u "
1452                       "bytes"), hp->cth_funcoff - hp->cth_objtoff,
1453                     hp->cth_funcidxoff - hp->cth_objtidxoff);
1454       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1455     }
1456
1457   if ((hp->cth_varoff - hp->cth_funcidxoff != 0) &&
1458       (hp->cth_varoff - hp->cth_funcidxoff
1459        != hp->cth_objtidxoff - hp->cth_funcoff))
1460     {
1461       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1462                     _("Function index section exists is neither empty nor the "
1463                       "same length as the function section: %u versus %u "
1464                       "bytes"), hp->cth_objtidxoff - hp->cth_funcoff,
1465                     hp->cth_varoff - hp->cth_funcidxoff);
1466       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1467     }
1468
1469   /* Once everything is determined to be valid, attempt to decompress the CTF
1470      data buffer if it is compressed, or copy it into new storage if it is not
1471      compressed but needs endian-flipping.  Otherwise we just put the data
1472      section's buffer pointer into ctf_buf, below.  */
1473
1474   /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1475      init_types().  */
1476
1477   if (hp->cth_flags & CTF_F_COMPRESS)
1478     {
1479       size_t srclen;
1480       uLongf dstlen;
1481       const void *src;
1482       int rc = Z_OK;
1483
1484       /* We are allocating this ourselves, so we can drop the ctf header
1485          copy in favour of ctf->ctf_header.  */
1486
1487       if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1488         {
1489           err = ECTF_ZALLOC;
1490           goto bad;
1491         }
1492       fp->ctf_dynbase = fp->ctf_base;
1493       hp->cth_flags &= ~CTF_F_COMPRESS;
1494
1495       src = (unsigned char *) ctfsect->cts_data + hdrsz;
1496       srclen = ctfsect->cts_size - hdrsz;
1497       dstlen = fp->ctf_size;
1498       fp->ctf_buf = fp->ctf_base;
1499
1500       if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
1501         {
1502           ctf_err_warn (NULL, 0, ECTF_DECOMPRESS, _("zlib inflate err: %s"),
1503                         zError (rc));
1504           err = ECTF_DECOMPRESS;
1505           goto bad;
1506         }
1507
1508       if ((size_t) dstlen != fp->ctf_size)
1509         {
1510           ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1511                         _("zlib inflate short: got %lu of %lu bytes"),
1512                         (unsigned long) dstlen, (unsigned long) fp->ctf_size);
1513           err = ECTF_CORRUPT;
1514           goto bad;
1515         }
1516     }
1517   else if (foreign_endian)
1518     {
1519       if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1520         {
1521           err = ECTF_ZALLOC;
1522           goto bad;
1523         }
1524       fp->ctf_dynbase = fp->ctf_base;
1525       memcpy (fp->ctf_base, ((unsigned char *) ctfsect->cts_data) + hdrsz,
1526               fp->ctf_size);
1527       fp->ctf_buf = fp->ctf_base;
1528     }
1529   else
1530     {
1531       /* We are just using the section passed in -- but its header may be an old
1532          version.  Point ctf_buf past the old header, and never touch it
1533          again.  */
1534       fp->ctf_base = (unsigned char *) ctfsect->cts_data;
1535       fp->ctf_dynbase = NULL;
1536       fp->ctf_buf = fp->ctf_base + hdrsz;
1537     }
1538
1539   /* Once we have uncompressed and validated the CTF data buffer, we can
1540      proceed with initializing the ctf_dict_t we allocated above.
1541
1542      Nothing that depends on buf or base should be set directly in this function
1543      before the init_types() call, because it may be reallocated during
1544      transparent upgrade if this recension of libctf is so configured: see
1545      ctf_set_base().  */
1546
1547   ctf_set_version (fp, hp, hp->cth_version);
1548   ctf_str_create_atoms (fp);
1549   fp->ctf_parmax = CTF_MAX_PTYPE;
1550   memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1551
1552   if (symsect != NULL)
1553     {
1554       memcpy (&fp->ctf_symtab, symsect, sizeof (ctf_sect_t));
1555       memcpy (&fp->ctf_strtab, strsect, sizeof (ctf_sect_t));
1556     }
1557
1558   if (fp->ctf_data.cts_name != NULL)
1559     if ((fp->ctf_data.cts_name = strdup (fp->ctf_data.cts_name)) == NULL)
1560       {
1561         err = ENOMEM;
1562         goto bad;
1563       }
1564   if (fp->ctf_symtab.cts_name != NULL)
1565     if ((fp->ctf_symtab.cts_name = strdup (fp->ctf_symtab.cts_name)) == NULL)
1566       {
1567         err = ENOMEM;
1568         goto bad;
1569       }
1570   if (fp->ctf_strtab.cts_name != NULL)
1571     if ((fp->ctf_strtab.cts_name = strdup (fp->ctf_strtab.cts_name)) == NULL)
1572       {
1573         err = ENOMEM;
1574         goto bad;
1575       }
1576
1577   if (fp->ctf_data.cts_name == NULL)
1578     fp->ctf_data.cts_name = _CTF_NULLSTR;
1579   if (fp->ctf_symtab.cts_name == NULL)
1580     fp->ctf_symtab.cts_name = _CTF_NULLSTR;
1581   if (fp->ctf_strtab.cts_name == NULL)
1582     fp->ctf_strtab.cts_name = _CTF_NULLSTR;
1583
1584   if (strsect != NULL)
1585     {
1586       fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1587       fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1588     }
1589   fp->ctf_syn_ext_strtab = syn_strtab;
1590
1591   if (foreign_endian &&
1592       (err = flip_ctf (fp, hp, fp->ctf_buf)) != 0)
1593     {
1594       /* We can be certain that flip_ctf() will have endian-flipped everything
1595          other than the types table when we return.  In particular the header
1596          is fine, so set it, to allow freeing to use the usual code path.  */
1597
1598       ctf_set_base (fp, hp, fp->ctf_base);
1599       goto bad;
1600     }
1601
1602   ctf_set_base (fp, hp, fp->ctf_base);
1603
1604   /* No need to do anything else for dynamic dicts: they do not support symbol
1605      lookups, and the type table is maintained in the dthashes.  */
1606   if (fp->ctf_flags & LCTF_RDWR)
1607     {
1608       fp->ctf_refcnt = 1;
1609       return fp;
1610     }
1611
1612   if ((err = init_types (fp, hp)) != 0)
1613     goto bad;
1614
1615   /* Allocate and initialize the symtab translation table, pointed to by
1616      ctf_sxlate, and the corresponding index sections.  This table may be too
1617      large for the actual size of the object and function info sections: if so,
1618      ctf_nsyms will be adjusted and the excess will never be used.  It's
1619      possible to do indexed symbol lookups even without a symbol table, so check
1620      even in that case.  Initially, we assume the symtab is native-endian: if it
1621      isn't, the caller will inform us later by calling ctf_symsect_endianness.  */
1622 #ifdef WORDS_BIGENDIAN
1623   fp->ctf_symsect_little_endian = 0;
1624 #else
1625   fp->ctf_symsect_little_endian = 1;
1626 #endif
1627
1628   if (symsect != NULL)
1629     {
1630       fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1631       fp->ctf_sxlate = malloc (fp->ctf_nsyms * sizeof (uint32_t));
1632
1633       if (fp->ctf_sxlate == NULL)
1634         {
1635           err = ENOMEM;
1636           goto bad;
1637         }
1638     }
1639
1640   if ((err = init_symtab (fp, hp, symsect)) != 0)
1641     goto bad;
1642
1643   ctf_set_ctl_hashes (fp);
1644
1645   if (symsect != NULL)
1646     {
1647       if (symsect->cts_entsize == sizeof (Elf64_Sym))
1648         (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1649       else
1650         (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1651     }
1652   else
1653     (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1654
1655   fp->ctf_refcnt = 1;
1656   return fp;
1657
1658 bad:
1659   ctf_set_open_errno (errp, err);
1660   ctf_err_warn_to_open (fp);
1661   ctf_dict_close (fp);
1662   return NULL;
1663 }
1664
1665 /* Bump the refcount on the specified CTF dict, to allow export of ctf_dict_t's
1666    from iterators that open and close the ctf_dict_t around the loop.  (This
1667    does not extend their lifetime beyond that of the ctf_archive_t in which they
1668    are contained.)  */
1669
1670 void
1671 ctf_ref (ctf_dict_t *fp)
1672 {
1673   fp->ctf_refcnt++;
1674 }
1675
1676 /* Close the specified CTF dict and free associated data structures.  Note that
1677    ctf_dict_close() is a reference counted operation: if the specified file is
1678    the parent of other active dict, its reference count will be greater than one
1679    and it will be freed later when no active children exist.  */
1680
1681 void
1682 ctf_dict_close (ctf_dict_t *fp)
1683 {
1684   ctf_dtdef_t *dtd, *ntd;
1685   ctf_dvdef_t *dvd, *nvd;
1686   ctf_in_flight_dynsym_t *did, *nid;
1687   ctf_err_warning_t *err, *nerr;
1688
1689   if (fp == NULL)
1690     return;                /* Allow ctf_dict_close(NULL) to simplify caller code.  */
1691
1692   ctf_dprintf ("ctf_dict_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1693
1694   if (fp->ctf_refcnt > 1)
1695     {
1696       fp->ctf_refcnt--;
1697       return;
1698     }
1699
1700   /* It is possible to recurse back in here, notably if dicts in the
1701      ctf_link_inputs or ctf_link_outputs cite this dict as a parent without
1702      using ctf_import_unref.  Do nothing in that case.  */
1703   if (fp->ctf_refcnt == 0)
1704     return;
1705
1706   fp->ctf_refcnt--;
1707   free (fp->ctf_dyncuname);
1708   free (fp->ctf_dynparname);
1709   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1710     ctf_dict_close (fp->ctf_parent);
1711
1712   for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1713     {
1714       ntd = ctf_list_next (dtd);
1715       ctf_dtd_delete (fp, dtd);
1716     }
1717   ctf_dynhash_destroy (fp->ctf_dthash);
1718   if (fp->ctf_flags & LCTF_RDWR)
1719     {
1720       ctf_dynhash_destroy (fp->ctf_structs.ctn_writable);
1721       ctf_dynhash_destroy (fp->ctf_unions.ctn_writable);
1722       ctf_dynhash_destroy (fp->ctf_enums.ctn_writable);
1723       ctf_dynhash_destroy (fp->ctf_names.ctn_writable);
1724     }
1725   else
1726     {
1727       ctf_hash_destroy (fp->ctf_structs.ctn_readonly);
1728       ctf_hash_destroy (fp->ctf_unions.ctn_readonly);
1729       ctf_hash_destroy (fp->ctf_enums.ctn_readonly);
1730       ctf_hash_destroy (fp->ctf_names.ctn_readonly);
1731     }
1732
1733   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1734     {
1735       nvd = ctf_list_next (dvd);
1736       ctf_dvd_delete (fp, dvd);
1737     }
1738   ctf_dynhash_destroy (fp->ctf_dvhash);
1739
1740   free (fp->ctf_funcidx_sxlate);
1741   free (fp->ctf_objtidx_sxlate);
1742   ctf_dynhash_destroy (fp->ctf_objthash);
1743   ctf_dynhash_destroy (fp->ctf_funchash);
1744   free (fp->ctf_dynsymidx);
1745   ctf_dynhash_destroy (fp->ctf_dynsyms);
1746   for (did = ctf_list_next (&fp->ctf_in_flight_dynsyms); did != NULL; did = nid)
1747     {
1748       nid = ctf_list_next (did);
1749       ctf_list_delete (&fp->ctf_in_flight_dynsyms, did);
1750       free (did);
1751     }
1752
1753   ctf_str_free_atoms (fp);
1754   free (fp->ctf_tmp_typeslice);
1755
1756   if (fp->ctf_data.cts_name != _CTF_NULLSTR)
1757     free ((char *) fp->ctf_data.cts_name);
1758
1759   if (fp->ctf_symtab.cts_name != _CTF_NULLSTR)
1760     free ((char *) fp->ctf_symtab.cts_name);
1761
1762   if (fp->ctf_strtab.cts_name != _CTF_NULLSTR)
1763     free ((char *) fp->ctf_strtab.cts_name);
1764   else if (fp->ctf_data_mmapped)
1765     ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1766
1767   free (fp->ctf_dynbase);
1768
1769   ctf_dynhash_destroy (fp->ctf_syn_ext_strtab);
1770   ctf_dynhash_destroy (fp->ctf_link_inputs);
1771   ctf_dynhash_destroy (fp->ctf_link_outputs);
1772   ctf_dynhash_destroy (fp->ctf_link_type_mapping);
1773   ctf_dynhash_destroy (fp->ctf_link_in_cu_mapping);
1774   ctf_dynhash_destroy (fp->ctf_link_out_cu_mapping);
1775   ctf_dynhash_destroy (fp->ctf_add_processing);
1776   ctf_dedup_fini (fp, NULL, 0);
1777   ctf_dynset_destroy (fp->ctf_dedup_atoms_alloc);
1778
1779   for (err = ctf_list_next (&fp->ctf_errs_warnings); err != NULL; err = nerr)
1780     {
1781       nerr = ctf_list_next (err);
1782       ctf_list_delete (&fp->ctf_errs_warnings, err);
1783       free (err->cew_text);
1784       free (err);
1785     }
1786
1787   free (fp->ctf_sxlate);
1788   free (fp->ctf_txlate);
1789   free (fp->ctf_ptrtab);
1790   free (fp->ctf_pptrtab);
1791
1792   free (fp->ctf_header);
1793   free (fp);
1794 }
1795
1796 /* Backward compatibility.  */
1797 void
1798 ctf_file_close (ctf_file_t *fp)
1799 {
1800   ctf_dict_close (fp);
1801 }
1802
1803 /* The converse of ctf_open().  ctf_open() disguises whatever it opens as an
1804    archive, so closing one is just like closing an archive.  */
1805 void
1806 ctf_close (ctf_archive_t *arc)
1807 {
1808   ctf_arc_close (arc);
1809 }
1810
1811 /* Get the CTF archive from which this ctf_dict_t is derived.  */
1812 ctf_archive_t *
1813 ctf_get_arc (const ctf_dict_t *fp)
1814 {
1815   return fp->ctf_archive;
1816 }
1817
1818 /* Return the ctfsect out of the core ctf_impl.  Useful for freeing the
1819    ctfsect's data * after ctf_dict_close(), which is why we return the actual
1820    structure, not a pointer to it, since that is likely to become a pointer to
1821    freed data before the return value is used under the expected use case of
1822    ctf_getsect()/ ctf_dict_close()/free().  */
1823 ctf_sect_t
1824 ctf_getdatasect (const ctf_dict_t *fp)
1825 {
1826   return fp->ctf_data;
1827 }
1828
1829 ctf_sect_t
1830 ctf_getsymsect (const ctf_dict_t *fp)
1831 {
1832   return fp->ctf_symtab;
1833 }
1834
1835 ctf_sect_t
1836 ctf_getstrsect (const ctf_dict_t *fp)
1837 {
1838   return fp->ctf_strtab;
1839 }
1840
1841 /* Set the endianness of the symbol table attached to FP.  */
1842 void
1843 ctf_symsect_endianness (ctf_dict_t *fp, int little_endian)
1844 {
1845   int old_endianness = fp->ctf_symsect_little_endian;
1846
1847   fp->ctf_symsect_little_endian = !!little_endian;
1848
1849   /* If we already have a symtab translation table, we need to repopulate it if
1850      our idea of the endianness has changed.  */
1851
1852   if (old_endianness != fp->ctf_symsect_little_endian
1853       && fp->ctf_sxlate != NULL && fp->ctf_symtab.cts_data != NULL)
1854     assert (init_symtab (fp, fp->ctf_header, &fp->ctf_symtab) == 0);
1855 }
1856
1857 /* Return the CTF handle for the parent CTF dict, if one exists.  Otherwise
1858    return NULL to indicate this dict has no imported parent.  */
1859 ctf_dict_t *
1860 ctf_parent_dict (ctf_dict_t *fp)
1861 {
1862   return fp->ctf_parent;
1863 }
1864
1865 /* Backward compatibility.  */
1866 ctf_dict_t *
1867 ctf_parent_file (ctf_dict_t *fp)
1868 {
1869   return ctf_parent_dict (fp);
1870 }
1871
1872 /* Return the name of the parent CTF dict, if one exists, or NULL otherwise.  */
1873 const char *
1874 ctf_parent_name (ctf_dict_t *fp)
1875 {
1876   return fp->ctf_parname;
1877 }
1878
1879 /* Set the parent name.  It is an error to call this routine without calling
1880    ctf_import() at some point.  */
1881 int
1882 ctf_parent_name_set (ctf_dict_t *fp, const char *name)
1883 {
1884   if (fp->ctf_dynparname != NULL)
1885     free (fp->ctf_dynparname);
1886
1887   if ((fp->ctf_dynparname = strdup (name)) == NULL)
1888     return (ctf_set_errno (fp, ENOMEM));
1889   fp->ctf_parname = fp->ctf_dynparname;
1890   return 0;
1891 }
1892
1893 /* Return the name of the compilation unit this CTF file applies to.  Usually
1894    non-NULL only for non-parent dicts.  */
1895 const char *
1896 ctf_cuname (ctf_dict_t *fp)
1897 {
1898   return fp->ctf_cuname;
1899 }
1900
1901 /* Set the compilation unit name.  */
1902 int
1903 ctf_cuname_set (ctf_dict_t *fp, const char *name)
1904 {
1905   if (fp->ctf_dyncuname != NULL)
1906     free (fp->ctf_dyncuname);
1907
1908   if ((fp->ctf_dyncuname = strdup (name)) == NULL)
1909     return (ctf_set_errno (fp, ENOMEM));
1910   fp->ctf_cuname = fp->ctf_dyncuname;
1911   return 0;
1912 }
1913
1914 /* Import the types from the specified parent dict by storing a pointer to it in
1915    ctf_parent and incrementing its reference count.  Only one parent is allowed:
1916    if a parent already exists, it is replaced by the new parent.  The pptrtab
1917    is wiped, and will be refreshed by the next ctf_lookup_by_name call.  */
1918 int
1919 ctf_import (ctf_dict_t *fp, ctf_dict_t *pfp)
1920 {
1921   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1922     return (ctf_set_errno (fp, EINVAL));
1923
1924   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1925     return (ctf_set_errno (fp, ECTF_DMODEL));
1926
1927   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1928     ctf_dict_close (fp->ctf_parent);
1929   fp->ctf_parent = NULL;
1930
1931   free (fp->ctf_pptrtab);
1932   fp->ctf_pptrtab = NULL;
1933   fp->ctf_pptrtab_len = 0;
1934   fp->ctf_pptrtab_typemax = 0;
1935
1936   if (pfp != NULL)
1937     {
1938       int err;
1939
1940       if (fp->ctf_parname == NULL)
1941         if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
1942           return err;
1943
1944       fp->ctf_flags |= LCTF_CHILD;
1945       pfp->ctf_refcnt++;
1946       fp->ctf_parent_unreffed = 0;
1947     }
1948
1949   fp->ctf_parent = pfp;
1950   return 0;
1951 }
1952
1953 /* Like ctf_import, but does not increment the refcount on the imported parent
1954    or close it at any point: as a result it can go away at any time and the
1955    caller must do all freeing itself.  Used internally to avoid refcount
1956    loops.  */
1957 int
1958 ctf_import_unref (ctf_dict_t *fp, ctf_dict_t *pfp)
1959 {
1960   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1961     return (ctf_set_errno (fp, EINVAL));
1962
1963   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1964     return (ctf_set_errno (fp, ECTF_DMODEL));
1965
1966   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1967     ctf_dict_close (fp->ctf_parent);
1968   fp->ctf_parent = NULL;
1969
1970   free (fp->ctf_pptrtab);
1971   fp->ctf_pptrtab = NULL;
1972   fp->ctf_pptrtab_len = 0;
1973   fp->ctf_pptrtab_typemax = 0;
1974   if (pfp != NULL)
1975     {
1976       int err;
1977
1978       if (fp->ctf_parname == NULL)
1979         if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
1980           return err;
1981
1982       fp->ctf_flags |= LCTF_CHILD;
1983       fp->ctf_parent_unreffed = 1;
1984     }
1985
1986   fp->ctf_parent = pfp;
1987   return 0;
1988 }
1989
1990 /* Set the data model constant for the CTF dict.  */
1991 int
1992 ctf_setmodel (ctf_dict_t *fp, int model)
1993 {
1994   const ctf_dmodel_t *dp;
1995
1996   for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
1997     {
1998       if (dp->ctd_code == model)
1999         {
2000           fp->ctf_dmodel = dp;
2001           return 0;
2002         }
2003     }
2004
2005   return (ctf_set_errno (fp, EINVAL));
2006 }
2007
2008 /* Return the data model constant for the CTF dict.  */
2009 int
2010 ctf_getmodel (ctf_dict_t *fp)
2011 {
2012   return fp->ctf_dmodel->ctd_code;
2013 }
2014
2015 /* The caller can hang an arbitrary pointer off each ctf_dict_t using this
2016    function.  */
2017 void
2018 ctf_setspecific (ctf_dict_t *fp, void *data)
2019 {
2020   fp->ctf_specific = data;
2021 }
2022
2023 /* Retrieve the arbitrary pointer again.  */
2024 void *
2025 ctf_getspecific (ctf_dict_t *fp)
2026 {
2027   return fp->ctf_specific;
2028 }
This page took 0.136563 seconds and 4 git commands to generate.