xref: /netbsd-src/external/gpl3/gdb/dist/libctf/ctf-open.c (revision f31867506b3d03104824848de4007d9c967e81b2)
1 /* Opening CTF files.
2    Copyright (C) 2019-2024 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 = PTR_ADD (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_static_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_static_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 /* Populate statically-defined types (those loaded from a saved buffer).
674 
675    Initialize the type ID translation table with the byte offset of each type,
676    and initialize the hash tables of each named type.  Upgrade the type table to
677    the latest supported representation in the process, if needed, and if this
678    recension of libctf supports upgrading.  */
679 
680 static int
681 init_static_types (ctf_dict_t *fp, ctf_header_t *cth)
682 {
683   const ctf_type_t *tbuf;
684   const ctf_type_t *tend;
685 
686   unsigned long pop[CTF_K_MAX + 1] = { 0 };
687   const ctf_type_t *tp;
688   uint32_t id;
689   uint32_t *xp;
690   unsigned long typemax = 0;
691 
692   /* We determine whether the dict is a child or a parent based on the value of
693      cth_parname.  */
694 
695   int child = cth->cth_parname != 0;
696   int nlstructs = 0, nlunions = 0;
697   int err;
698 
699   if (_libctf_unlikely_ (fp->ctf_version == CTF_VERSION_1))
700     {
701       int err;
702       if ((err = upgrade_types (fp, cth)) != 0)
703 	return err;				/* Upgrade failed.  */
704     }
705 
706   tbuf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
707   tend = (ctf_type_t *) (fp->ctf_buf + cth->cth_stroff);
708 
709   /* We make two passes through the entire type section.  In this first
710      pass, we count the number of each type and the total number of types.  */
711 
712   for (tp = tbuf; tp < tend; typemax++)
713     {
714       unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
715       unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
716       ssize_t size, increment, vbytes;
717 
718       (void) ctf_get_ctt_size (fp, tp, &size, &increment);
719       vbytes = LCTF_VBYTES (fp, kind, size, vlen);
720 
721       if (vbytes < 0)
722 	return ECTF_CORRUPT;
723 
724       /* For forward declarations, ctt_type is the CTF_K_* kind for the tag,
725 	 so bump that population count too.  */
726       if (kind == CTF_K_FORWARD)
727 	pop[tp->ctt_type]++;
728 
729       tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
730       pop[kind]++;
731     }
732 
733   if (child)
734     {
735       ctf_dprintf ("CTF dict %p is a child\n", (void *) fp);
736       fp->ctf_flags |= LCTF_CHILD;
737     }
738   else
739     ctf_dprintf ("CTF dict %p is a parent\n", (void *) fp);
740 
741   /* Now that we've counted up the number of each type, we can allocate
742      the hash tables, type translation table, and pointer table.  */
743 
744   if ((fp->ctf_structs
745        = ctf_dynhash_create_sized (pop[CTF_K_STRUCT], ctf_hash_string,
746 				   ctf_hash_eq_string, NULL, NULL)) == NULL)
747     return ENOMEM;
748 
749   if ((fp->ctf_unions
750        = ctf_dynhash_create_sized (pop[CTF_K_UNION], ctf_hash_string,
751 				   ctf_hash_eq_string, NULL, NULL)) == NULL)
752     return ENOMEM;
753 
754   if ((fp->ctf_enums
755        = ctf_dynhash_create_sized (pop[CTF_K_ENUM], ctf_hash_string,
756 				   ctf_hash_eq_string, NULL, NULL)) == NULL)
757     return ENOMEM;
758 
759   if ((fp->ctf_names
760        = ctf_dynhash_create_sized (pop[CTF_K_UNKNOWN] +
761 				   pop[CTF_K_INTEGER] +
762 				   pop[CTF_K_FLOAT] +
763 				   pop[CTF_K_FUNCTION] +
764 				   pop[CTF_K_TYPEDEF] +
765 				   pop[CTF_K_POINTER] +
766 				   pop[CTF_K_VOLATILE] +
767 				   pop[CTF_K_CONST] +
768 				   pop[CTF_K_RESTRICT],
769 				   ctf_hash_string,
770 				   ctf_hash_eq_string, NULL, NULL)) == NULL)
771     return ENOMEM;
772 
773   /* The ptrtab and txlate can be appropriately sized for precisely this set
774      of types: the txlate because it is only used to look up static types,
775      so dynamic types added later will never go through it, and the ptrtab
776      because later-added types will call grow_ptrtab() automatically, as
777      needed.  */
778 
779   fp->ctf_txlate = malloc (sizeof (uint32_t) * (typemax + 1));
780   fp->ctf_ptrtab_len = typemax + 1;
781   fp->ctf_ptrtab = malloc (sizeof (uint32_t) * fp->ctf_ptrtab_len);
782   fp->ctf_stypes = typemax;
783 
784   if (fp->ctf_txlate == NULL || fp->ctf_ptrtab == NULL)
785     return ENOMEM;		/* Memory allocation failed.  */
786 
787   xp = fp->ctf_txlate;
788   *xp++ = 0;			/* Type id 0 is used as a sentinel value.  */
789 
790   memset (fp->ctf_txlate, 0, sizeof (uint32_t) * (typemax + 1));
791   memset (fp->ctf_ptrtab, 0, sizeof (uint32_t) * (typemax + 1));
792 
793   /* In the second pass through the types, we fill in each entry of the
794      type and pointer tables and add names to the appropriate hashes.
795 
796      Bump ctf_typemax as we go, but keep it one higher than normal, so that
797      the type being read in is considered a valid type and it is at least
798      barely possible to run simple lookups on it.  */
799 
800   for (id = 1, fp->ctf_typemax = 1, tp = tbuf; tp < tend; xp++, id++, fp->ctf_typemax++)
801     {
802       unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
803       unsigned short isroot = LCTF_INFO_ISROOT (fp, tp->ctt_info);
804       unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
805       ssize_t size, increment, vbytes;
806 
807       const char *name;
808 
809       (void) ctf_get_ctt_size (fp, tp, &size, &increment);
810       name = ctf_strptr (fp, tp->ctt_name);
811       /* Cannot fail: shielded by call in loop above.  */
812       vbytes = LCTF_VBYTES (fp, kind, size, vlen);
813 
814       *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
815 
816       switch (kind)
817 	{
818 	case CTF_K_UNKNOWN:
819 	case CTF_K_INTEGER:
820 	case CTF_K_FLOAT:
821 	  {
822 	    ctf_id_t existing;
823 	    ctf_encoding_t existing_en;
824 	    ctf_encoding_t this_en;
825 
826 	    if (!isroot)
827 	      break;
828 
829 	    /* Names are reused by bitfields, which are differentiated by
830 	       their encodings.  So check for the type already existing, and
831 	       iff the new type is a root-visible non-bitfield, replace the
832 	       old one.  It's a little hard to figure out whether a type is
833 	       a non-bitfield without already knowing that type's native
834 	       width, but we can converge on it by replacing an existing
835 	       type as long as the new type is zero-offset and has a
836 	       bit-width wider than the existing one, since the native type
837 	       must necessarily have a bit-width at least as wide as any
838 	       bitfield based on it. */
839 
840 	    if (((existing = ctf_dynhash_lookup_type (fp->ctf_names, name)) == 0)
841 		|| ctf_type_encoding (fp, existing, &existing_en) != 0
842 		|| (ctf_type_encoding (fp, LCTF_INDEX_TO_TYPE (fp, id, child), &this_en) == 0
843 		    && this_en.cte_offset == 0
844 		    && (existing_en.cte_offset != 0
845 			|| existing_en.cte_bits < this_en.cte_bits)))
846 	      {
847 		err = ctf_dynhash_insert_type (fp, fp->ctf_names,
848 					       LCTF_INDEX_TO_TYPE (fp, id, child),
849 					       tp->ctt_name);
850 		if (err != 0)
851 		  return err;
852 	      }
853 	    break;
854 	  }
855 
856 	  /* These kinds have no name, so do not need interning into any
857 	     hashtables.  */
858 	case CTF_K_ARRAY:
859 	case CTF_K_SLICE:
860 	  break;
861 
862 	case CTF_K_FUNCTION:
863 	  if (!isroot)
864 	    break;
865 
866 	  err = ctf_dynhash_insert_type (fp, fp->ctf_names,
867 					 LCTF_INDEX_TO_TYPE (fp, id, child),
868 					 tp->ctt_name);
869 	  if (err != 0)
870 	    return err;
871 	  break;
872 
873 	case CTF_K_STRUCT:
874 	  if (size >= CTF_LSTRUCT_THRESH)
875 	    nlstructs++;
876 
877 	  if (!isroot)
878 	    break;
879 
880 	  err = ctf_dynhash_insert_type (fp, fp->ctf_structs,
881 					 LCTF_INDEX_TO_TYPE (fp, id, child),
882 					 tp->ctt_name);
883 
884 	  if (err != 0)
885 	    return err;
886 
887 	  break;
888 
889 	case CTF_K_UNION:
890 	  if (size >= CTF_LSTRUCT_THRESH)
891 	    nlunions++;
892 
893 	  if (!isroot)
894 	    break;
895 
896 	  err = ctf_dynhash_insert_type (fp, fp->ctf_unions,
897 					 LCTF_INDEX_TO_TYPE (fp, id, child),
898 					 tp->ctt_name);
899 
900 	  if (err != 0)
901 	    return err;
902 	  break;
903 
904 	case CTF_K_ENUM:
905 	  if (!isroot)
906 	    break;
907 
908 	  err = ctf_dynhash_insert_type (fp, fp->ctf_enums,
909 					 LCTF_INDEX_TO_TYPE (fp, id, child),
910 					 tp->ctt_name);
911 
912 	  if (err != 0)
913 	    return err;
914 	  break;
915 
916 	case CTF_K_TYPEDEF:
917 	  if (!isroot)
918 	    break;
919 
920 	  err = ctf_dynhash_insert_type (fp, fp->ctf_names,
921 					 LCTF_INDEX_TO_TYPE (fp, id, child),
922 					 tp->ctt_name);
923 	  if (err != 0)
924 	    return err;
925 	  break;
926 
927 	case CTF_K_FORWARD:
928 	  {
929 	    ctf_dynhash_t *h = ctf_name_table (fp, tp->ctt_type);
930 
931 	    if (!isroot)
932 	      break;
933 
934 	    /* Only insert forward tags into the given hash if the type or tag
935 	       name is not already present.  */
936 	    if (ctf_dynhash_lookup_type (h, name) == 0)
937 	      {
938 		err = ctf_dynhash_insert_type (fp, h, LCTF_INDEX_TO_TYPE (fp, id, child),
939 					       tp->ctt_name);
940 		if (err != 0)
941 		  return err;
942 	      }
943 	    break;
944 	  }
945 
946 	case CTF_K_POINTER:
947 	  /* If the type referenced by the pointer is in this CTF dict, then
948 	     store the index of the pointer type in fp->ctf_ptrtab[ index of
949 	     referenced type ].  */
950 
951 	  if (LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
952 	      && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
953 	    fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = id;
954 	 /*FALLTHRU*/
955 
956 	case CTF_K_VOLATILE:
957 	case CTF_K_CONST:
958 	case CTF_K_RESTRICT:
959 	  if (!isroot)
960 	    break;
961 
962 	  err = ctf_dynhash_insert_type (fp, fp->ctf_names,
963 					 LCTF_INDEX_TO_TYPE (fp, id, child),
964 					 tp->ctt_name);
965 	  if (err != 0)
966 	    return err;
967 	  break;
968 	default:
969 	  ctf_err_warn (fp, 0, ECTF_CORRUPT,
970 			_("init_static_types(): unhandled CTF kind: %x"), kind);
971 	  return ECTF_CORRUPT;
972 	}
973       tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
974     }
975   fp->ctf_typemax--;
976   assert (fp->ctf_typemax == typemax);
977 
978   ctf_dprintf ("%lu total types processed\n", fp->ctf_typemax);
979   ctf_dprintf ("%zu enum names hashed\n",
980 	       ctf_dynhash_elements (fp->ctf_enums));
981   ctf_dprintf ("%zu struct names hashed (%d long)\n",
982 	       ctf_dynhash_elements (fp->ctf_structs), nlstructs);
983   ctf_dprintf ("%zu union names hashed (%d long)\n",
984 	       ctf_dynhash_elements (fp->ctf_unions), nlunions);
985   ctf_dprintf ("%zu base type names hashed\n",
986 	       ctf_dynhash_elements (fp->ctf_names));
987 
988   return 0;
989 }
990 
991 /* Endianness-flipping routines.
992 
993    We flip everything, mindlessly, even 1-byte entities, so that future
994    expansions do not require changes to this code.  */
995 
996 /* Flip the endianness of the CTF header.  */
997 
998 void
999 ctf_flip_header (ctf_header_t *cth)
1000 {
1001   swap_thing (cth->cth_preamble.ctp_magic);
1002   swap_thing (cth->cth_preamble.ctp_version);
1003   swap_thing (cth->cth_preamble.ctp_flags);
1004   swap_thing (cth->cth_parlabel);
1005   swap_thing (cth->cth_parname);
1006   swap_thing (cth->cth_cuname);
1007   swap_thing (cth->cth_objtoff);
1008   swap_thing (cth->cth_funcoff);
1009   swap_thing (cth->cth_objtidxoff);
1010   swap_thing (cth->cth_funcidxoff);
1011   swap_thing (cth->cth_varoff);
1012   swap_thing (cth->cth_typeoff);
1013   swap_thing (cth->cth_stroff);
1014   swap_thing (cth->cth_strlen);
1015 }
1016 
1017 /* Flip the endianness of the label section, an array of ctf_lblent_t.  */
1018 
1019 static void
1020 flip_lbls (void *start, size_t len)
1021 {
1022   ctf_lblent_t *lbl = start;
1023   ssize_t i;
1024 
1025   for (i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
1026     {
1027       swap_thing (lbl->ctl_label);
1028       swap_thing (lbl->ctl_type);
1029     }
1030 }
1031 
1032 /* Flip the endianness of the data-object or function sections or their indexes,
1033    all arrays of uint32_t.  */
1034 
1035 static void
1036 flip_objts (void *start, size_t len)
1037 {
1038   uint32_t *obj = start;
1039   ssize_t i;
1040 
1041   for (i = len / sizeof (uint32_t); i > 0; obj++, i--)
1042       swap_thing (*obj);
1043 }
1044 
1045 /* Flip the endianness of the variable section, an array of ctf_varent_t.  */
1046 
1047 static void
1048 flip_vars (void *start, size_t len)
1049 {
1050   ctf_varent_t *var = start;
1051   ssize_t i;
1052 
1053   for (i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
1054     {
1055       swap_thing (var->ctv_name);
1056       swap_thing (var->ctv_type);
1057     }
1058 }
1059 
1060 /* Flip the endianness of the type section, a tagged array of ctf_type or
1061    ctf_stype followed by variable data.  */
1062 
1063 static int
1064 flip_types (ctf_dict_t *fp, void *start, size_t len, int to_foreign)
1065 {
1066   ctf_type_t *t = start;
1067 
1068   while ((uintptr_t) t < ((uintptr_t) start) + len)
1069     {
1070       uint32_t kind;
1071       size_t size;
1072       uint32_t vlen;
1073       size_t vbytes;
1074 
1075       if (to_foreign)
1076 	{
1077 	  kind = CTF_V2_INFO_KIND (t->ctt_info);
1078 	  size = t->ctt_size;
1079 	  vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1080 	  vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1081 	}
1082 
1083       swap_thing (t->ctt_name);
1084       swap_thing (t->ctt_info);
1085       swap_thing (t->ctt_size);
1086 
1087       if (!to_foreign)
1088 	{
1089 	  kind = CTF_V2_INFO_KIND (t->ctt_info);
1090 	  size = t->ctt_size;
1091 	  vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1092 	  vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1093 	}
1094 
1095       if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1096 	{
1097 	  if (to_foreign)
1098 	    size = CTF_TYPE_LSIZE (t);
1099 
1100 	  swap_thing (t->ctt_lsizehi);
1101 	  swap_thing (t->ctt_lsizelo);
1102 
1103 	  if (!to_foreign)
1104 	    size = CTF_TYPE_LSIZE (t);
1105 
1106 	  t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1107 	}
1108       else
1109 	t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1110 
1111       switch (kind)
1112 	{
1113 	case CTF_K_FORWARD:
1114 	case CTF_K_UNKNOWN:
1115 	case CTF_K_POINTER:
1116 	case CTF_K_TYPEDEF:
1117 	case CTF_K_VOLATILE:
1118 	case CTF_K_CONST:
1119 	case CTF_K_RESTRICT:
1120 	  /* These types have no vlen data to swap.  */
1121 	  assert (vbytes == 0);
1122 	  break;
1123 
1124 	case CTF_K_INTEGER:
1125 	case CTF_K_FLOAT:
1126 	  {
1127 	    /* These types have a single uint32_t.  */
1128 
1129 	    uint32_t *item = (uint32_t *) t;
1130 
1131 	    swap_thing (*item);
1132 	    break;
1133 	  }
1134 
1135 	case CTF_K_FUNCTION:
1136 	  {
1137 	    /* This type has a bunch of uint32_ts.  */
1138 
1139 	    uint32_t *item = (uint32_t *) t;
1140 	    ssize_t i;
1141 
1142 	    for (i = vlen; i > 0; item++, i--)
1143 	      swap_thing (*item);
1144 	    break;
1145 	  }
1146 
1147 	case CTF_K_ARRAY:
1148 	  {
1149 	    /* This has a single ctf_array_t.  */
1150 
1151 	    ctf_array_t *a = (ctf_array_t *) t;
1152 
1153 	    assert (vbytes == sizeof (ctf_array_t));
1154 	    swap_thing (a->cta_contents);
1155 	    swap_thing (a->cta_index);
1156 	    swap_thing (a->cta_nelems);
1157 
1158 	    break;
1159 	  }
1160 
1161 	case CTF_K_SLICE:
1162 	  {
1163 	    /* This has a single ctf_slice_t.  */
1164 
1165 	    ctf_slice_t *s = (ctf_slice_t *) t;
1166 
1167 	    assert (vbytes == sizeof (ctf_slice_t));
1168 	    swap_thing (s->cts_type);
1169 	    swap_thing (s->cts_offset);
1170 	    swap_thing (s->cts_bits);
1171 
1172 	    break;
1173 	  }
1174 
1175 	case CTF_K_STRUCT:
1176 	case CTF_K_UNION:
1177 	  {
1178 	    /* This has an array of ctf_member or ctf_lmember, depending on
1179 	       size.  We could consider it to be a simple array of uint32_t,
1180 	       but for safety's sake in case these structures ever acquire
1181 	       non-uint32_t members, do it member by member.  */
1182 
1183 	    if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1184 	      {
1185 		ctf_lmember_t *lm = (ctf_lmember_t *) t;
1186 		ssize_t i;
1187 		for (i = vlen; i > 0; i--, lm++)
1188 		  {
1189 		    swap_thing (lm->ctlm_name);
1190 		    swap_thing (lm->ctlm_offsethi);
1191 		    swap_thing (lm->ctlm_type);
1192 		    swap_thing (lm->ctlm_offsetlo);
1193 		  }
1194 	      }
1195 	    else
1196 	      {
1197 		ctf_member_t *m = (ctf_member_t *) t;
1198 		ssize_t i;
1199 		for (i = vlen; i > 0; i--, m++)
1200 		  {
1201 		    swap_thing (m->ctm_name);
1202 		    swap_thing (m->ctm_offset);
1203 		    swap_thing (m->ctm_type);
1204 		  }
1205 	      }
1206 	    break;
1207 	  }
1208 
1209 	case CTF_K_ENUM:
1210 	  {
1211 	    /* This has an array of ctf_enum_t.  */
1212 
1213 	    ctf_enum_t *item = (ctf_enum_t *) t;
1214 	    ssize_t i;
1215 
1216 	    for (i = vlen; i > 0; item++, i--)
1217 	      {
1218 		swap_thing (item->cte_name);
1219 		swap_thing (item->cte_value);
1220 	      }
1221 	    break;
1222 	  }
1223 	default:
1224 	  ctf_err_warn (fp, 0, ECTF_CORRUPT,
1225 			_("unhandled CTF kind in endianness conversion: %x"),
1226 			kind);
1227 	  return ECTF_CORRUPT;
1228 	}
1229 
1230       t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1231     }
1232 
1233   return 0;
1234 }
1235 
1236 /* Flip the endianness of BUF, given the offsets in the (native-endianness) CTH.
1237    If TO_FOREIGN is set, flip to foreign-endianness; if not, flip away.
1238 
1239    All of this stuff happens before the header is fully initialized, so the
1240    LCTF_*() macros cannot be used yet.  Since we do not try to endian-convert v1
1241    data, this is no real loss.  */
1242 
1243 int
1244 ctf_flip (ctf_dict_t *fp, ctf_header_t *cth, unsigned char *buf,
1245 	  int to_foreign)
1246 {
1247   ctf_dprintf("flipping endianness\n");
1248 
1249   flip_lbls (buf + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1250   flip_objts (buf + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1251   flip_objts (buf + cth->cth_funcoff, cth->cth_objtidxoff - cth->cth_funcoff);
1252   flip_objts (buf + cth->cth_objtidxoff, cth->cth_funcidxoff - cth->cth_objtidxoff);
1253   flip_objts (buf + cth->cth_funcidxoff, cth->cth_varoff - cth->cth_funcidxoff);
1254   flip_vars (buf + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1255   return flip_types (fp, buf + cth->cth_typeoff,
1256 		     cth->cth_stroff - cth->cth_typeoff, to_foreign);
1257 }
1258 
1259 /* Set up the ctl hashes in a ctf_dict_t.  Called by both writable and
1260    non-writable dictionary initialization.  */
1261 void ctf_set_ctl_hashes (ctf_dict_t *fp)
1262 {
1263   /* Initialize the ctf_lookup_by_name top-level dictionary.  We keep an
1264      array of type name prefixes and the corresponding ctf_hash to use.  */
1265   fp->ctf_lookups[0].ctl_prefix = "struct";
1266   fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1267   fp->ctf_lookups[0].ctl_hash = fp->ctf_structs;
1268   fp->ctf_lookups[1].ctl_prefix = "union";
1269   fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1270   fp->ctf_lookups[1].ctl_hash = fp->ctf_unions;
1271   fp->ctf_lookups[2].ctl_prefix = "enum";
1272   fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1273   fp->ctf_lookups[2].ctl_hash = fp->ctf_enums;
1274   fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1275   fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1276   fp->ctf_lookups[3].ctl_hash = fp->ctf_names;
1277   fp->ctf_lookups[4].ctl_prefix = NULL;
1278   fp->ctf_lookups[4].ctl_len = 0;
1279   fp->ctf_lookups[4].ctl_hash = NULL;
1280 }
1281 
1282 /* Open a CTF file, mocking up a suitable ctf_sect.  */
1283 
1284 ctf_dict_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1285 			     const char *symsect, size_t symsect_size,
1286 			     size_t symsect_entsize,
1287 			     const char *strsect, size_t strsect_size,
1288 			     int *errp)
1289 {
1290   ctf_sect_t skeleton;
1291 
1292   ctf_sect_t ctf_sect, sym_sect, str_sect;
1293   ctf_sect_t *ctfsectp = NULL;
1294   ctf_sect_t *symsectp = NULL;
1295   ctf_sect_t *strsectp = NULL;
1296 
1297   skeleton.cts_name = _CTF_SECTION;
1298   skeleton.cts_entsize = 1;
1299 
1300   if (ctfsect)
1301     {
1302       memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1303       ctf_sect.cts_data = ctfsect;
1304       ctf_sect.cts_size = ctfsect_size;
1305       ctfsectp = &ctf_sect;
1306     }
1307 
1308   if (symsect)
1309     {
1310       memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1311       sym_sect.cts_data = symsect;
1312       sym_sect.cts_size = symsect_size;
1313       sym_sect.cts_entsize = symsect_entsize;
1314       symsectp = &sym_sect;
1315     }
1316 
1317   if (strsect)
1318     {
1319       memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1320       str_sect.cts_data = strsect;
1321       str_sect.cts_size = strsect_size;
1322       strsectp = &str_sect;
1323     }
1324 
1325   return ctf_bufopen (ctfsectp, symsectp, strsectp, errp);
1326 }
1327 
1328 /* Decode the specified CTF buffer and optional symbol table, and create a new
1329    CTF dict representing the symbolic debugging information.  This code can
1330    be used directly by the debugger, or it can be used as the engine for
1331    ctf_fdopen() or ctf_open(), below.  */
1332 
1333 ctf_dict_t *
1334 ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1335 	     const ctf_sect_t *strsect, int *errp)
1336 {
1337   const ctf_preamble_t *pp;
1338   size_t hdrsz = sizeof (ctf_header_t);
1339   ctf_header_t *hp;
1340   ctf_dict_t *fp;
1341   int foreign_endian = 0;
1342   int err;
1343 
1344   libctf_init_debug();
1345 
1346   if ((ctfsect == NULL) || ((symsect != NULL) && (strsect == NULL)))
1347     return (ctf_set_open_errno (errp, EINVAL));
1348 
1349   if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1350       symsect->cts_entsize != sizeof (Elf64_Sym))
1351     return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1352 
1353   if (symsect != NULL && symsect->cts_data == NULL)
1354     return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1355 
1356   if (strsect != NULL && strsect->cts_data == NULL)
1357     return (ctf_set_open_errno (errp, ECTF_STRBAD));
1358 
1359   if (ctfsect->cts_data == NULL
1360       || ctfsect->cts_size < sizeof (ctf_preamble_t))
1361     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1362 
1363   pp = (const ctf_preamble_t *) ctfsect->cts_data;
1364 
1365   ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1366 	       pp->ctp_magic, pp->ctp_version);
1367 
1368   /* Validate each part of the CTF header.
1369 
1370      First, we validate the preamble (common to all versions).  At that point,
1371      we know the endianness and specific header version, and can validate the
1372      version-specific parts including section offsets and alignments.
1373 
1374      We specifically do not support foreign-endian old versions.  */
1375 
1376   if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1377     {
1378       if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1379 	{
1380 	  if (pp->ctp_version != CTF_VERSION_3)
1381 	    return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1382 	  foreign_endian = 1;
1383 	}
1384       else
1385 	return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1386     }
1387 
1388   if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1389 			 || (pp->ctp_version > CTF_VERSION_3)))
1390     return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1391 
1392   if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1393     {
1394       /* The symtab can contain function entries which contain embedded ctf
1395 	 info.  We do not support dynamically upgrading such entries (none
1396 	 should exist in any case, since dwarf2ctf does not create them).  */
1397 
1398       ctf_err_warn (NULL, 0, ECTF_NOTSUP, _("ctf_bufopen: CTF version %d "
1399 					    "symsect not supported"),
1400 		    pp->ctp_version);
1401       return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1402     }
1403 
1404   if (pp->ctp_version < CTF_VERSION_3)
1405     hdrsz = sizeof (ctf_header_v2_t);
1406 
1407   if (_libctf_unlikely_ (pp->ctp_flags > CTF_F_MAX))
1408     {
1409       ctf_err_warn (NULL, 0, ECTF_FLAGS, _("ctf_bufopen: invalid header "
1410 					   "flags: %x"),
1411 		    (unsigned int) pp->ctp_flags);
1412       return (ctf_set_open_errno (errp, ECTF_FLAGS));
1413     }
1414 
1415   if (ctfsect->cts_size < hdrsz)
1416     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1417 
1418   if ((fp = malloc (sizeof (ctf_dict_t))) == NULL)
1419     return (ctf_set_open_errno (errp, ENOMEM));
1420 
1421   memset (fp, 0, sizeof (ctf_dict_t));
1422 
1423   if ((fp->ctf_header = malloc (sizeof (struct ctf_header))) == NULL)
1424     {
1425       free (fp);
1426       return (ctf_set_open_errno (errp, ENOMEM));
1427     }
1428   hp = fp->ctf_header;
1429   memcpy (hp, ctfsect->cts_data, hdrsz);
1430   if (pp->ctp_version < CTF_VERSION_3)
1431     upgrade_header (hp);
1432 
1433   if (foreign_endian)
1434     ctf_flip_header (hp);
1435   fp->ctf_openflags = hp->cth_flags;
1436   fp->ctf_size = hp->cth_stroff + hp->cth_strlen;
1437 
1438   ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
1439 	       (unsigned long) fp->ctf_size);
1440 
1441   if (hp->cth_lbloff > fp->ctf_size || hp->cth_objtoff > fp->ctf_size
1442       || hp->cth_funcoff > fp->ctf_size || hp->cth_objtidxoff > fp->ctf_size
1443       || hp->cth_funcidxoff > fp->ctf_size || hp->cth_typeoff > fp->ctf_size
1444       || hp->cth_stroff > fp->ctf_size)
1445     {
1446       ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("header offset exceeds CTF size"));
1447       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1448     }
1449 
1450   if (hp->cth_lbloff > hp->cth_objtoff
1451       || hp->cth_objtoff > hp->cth_funcoff
1452       || hp->cth_funcoff > hp->cth_typeoff
1453       || hp->cth_funcoff > hp->cth_objtidxoff
1454       || hp->cth_objtidxoff > hp->cth_funcidxoff
1455       || hp->cth_funcidxoff > hp->cth_varoff
1456       || hp->cth_varoff > hp->cth_typeoff || hp->cth_typeoff > hp->cth_stroff)
1457     {
1458       ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("overlapping CTF sections"));
1459       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1460     }
1461 
1462   if ((hp->cth_lbloff & 3) || (hp->cth_objtoff & 2)
1463       || (hp->cth_funcoff & 2) || (hp->cth_objtidxoff & 2)
1464       || (hp->cth_funcidxoff & 2) || (hp->cth_varoff & 3)
1465       || (hp->cth_typeoff & 3))
1466     {
1467       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1468 		    _("CTF sections not properly aligned"));
1469       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1470     }
1471 
1472   /* This invariant will be lifted in v4, but for now it is true.  */
1473 
1474   if ((hp->cth_funcidxoff - hp->cth_objtidxoff != 0) &&
1475       (hp->cth_funcidxoff - hp->cth_objtidxoff
1476        != hp->cth_funcoff - hp->cth_objtoff))
1477     {
1478       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1479 		    _("Object index section is neither empty nor the "
1480 		      "same length as the object section: %u versus %u "
1481 		      "bytes"), hp->cth_funcoff - hp->cth_objtoff,
1482 		    hp->cth_funcidxoff - hp->cth_objtidxoff);
1483       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1484     }
1485 
1486   if ((hp->cth_varoff - hp->cth_funcidxoff != 0) &&
1487       (hp->cth_varoff - hp->cth_funcidxoff
1488        != hp->cth_objtidxoff - hp->cth_funcoff) &&
1489       (hp->cth_flags & CTF_F_NEWFUNCINFO))
1490     {
1491       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1492 		    _("Function index section is neither empty nor the "
1493 		      "same length as the function section: %u versus %u "
1494 		      "bytes"), hp->cth_objtidxoff - hp->cth_funcoff,
1495 		    hp->cth_varoff - hp->cth_funcidxoff);
1496       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1497     }
1498 
1499   /* Once everything is determined to be valid, attempt to decompress the CTF
1500      data buffer if it is compressed, or copy it into new storage if it is not
1501      compressed but needs endian-flipping.  Otherwise we just put the data
1502      section's buffer pointer into ctf_buf, below.  */
1503 
1504   /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1505      init_static_types().  */
1506 
1507   if (hp->cth_flags & CTF_F_COMPRESS)
1508     {
1509       size_t srclen;
1510       uLongf dstlen;
1511       const void *src;
1512       int rc = Z_OK;
1513 
1514       /* We are allocating this ourselves, so we can drop the ctf header
1515 	 copy in favour of ctf->ctf_header.  */
1516 
1517       if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1518 	{
1519 	  err = ECTF_ZALLOC;
1520 	  goto bad;
1521 	}
1522       fp->ctf_dynbase = fp->ctf_base;
1523       hp->cth_flags &= ~CTF_F_COMPRESS;
1524 
1525       src = (unsigned char *) ctfsect->cts_data + hdrsz;
1526       srclen = ctfsect->cts_size - hdrsz;
1527       dstlen = fp->ctf_size;
1528       fp->ctf_buf = fp->ctf_base;
1529 
1530       if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
1531 	{
1532 	  ctf_err_warn (NULL, 0, ECTF_DECOMPRESS, _("zlib inflate err: %s"),
1533 			zError (rc));
1534 	  err = ECTF_DECOMPRESS;
1535 	  goto bad;
1536 	}
1537 
1538       if ((size_t) dstlen != fp->ctf_size)
1539 	{
1540 	  ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1541 			_("zlib inflate short: got %lu of %lu bytes"),
1542 			(unsigned long) dstlen, (unsigned long) fp->ctf_size);
1543 	  err = ECTF_CORRUPT;
1544 	  goto bad;
1545 	}
1546     }
1547   else
1548     {
1549       if (_libctf_unlikely_ (ctfsect->cts_size < hdrsz + fp->ctf_size))
1550 	{
1551 	  ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1552 			_("%lu byte long CTF dictionary overruns %lu byte long CTF section"),
1553 			(unsigned long) ctfsect->cts_size,
1554 			(unsigned long) (hdrsz + fp->ctf_size));
1555 	  err = ECTF_CORRUPT;
1556 	  goto bad;
1557 	}
1558 
1559       if (foreign_endian)
1560 	{
1561 	  if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1562 	    {
1563 	      err = ECTF_ZALLOC;
1564 	      goto bad;
1565 	    }
1566 	  fp->ctf_dynbase = fp->ctf_base;
1567 	  memcpy (fp->ctf_base, ((unsigned char *) ctfsect->cts_data) + hdrsz,
1568 		  fp->ctf_size);
1569 	  fp->ctf_buf = fp->ctf_base;
1570 	}
1571       else
1572 	{
1573 	  /* We are just using the section passed in -- but its header may
1574 	     be an old version.  Point ctf_buf past the old header, and
1575 	     never touch it again.  */
1576 	  fp->ctf_base = (unsigned char *) ctfsect->cts_data;
1577 	  fp->ctf_dynbase = NULL;
1578 	  fp->ctf_buf = fp->ctf_base + hdrsz;
1579 	}
1580     }
1581 
1582   /* Once we have uncompressed and validated the CTF data buffer, we can
1583      proceed with initializing the ctf_dict_t we allocated above.
1584 
1585      Nothing that depends on buf or base should be set directly in this function
1586      before the init_static_types() call, because it may be reallocated during
1587      transparent upgrade if this recension of libctf is so configured: see
1588      ctf_set_base().  */
1589 
1590   ctf_set_version (fp, hp, hp->cth_version);
1591 
1592   /* Temporary assignment, just enough to be able to initialize
1593      the atoms table.  */
1594 
1595   fp->ctf_str[CTF_STRTAB_0].cts_strs = (const char *) fp->ctf_buf
1596     + hp->cth_stroff;
1597   fp->ctf_str[CTF_STRTAB_0].cts_len = hp->cth_strlen;
1598   if (ctf_str_create_atoms (fp) < 0)
1599     {
1600       err = ENOMEM;
1601       goto bad;
1602     }
1603 
1604   fp->ctf_parmax = CTF_MAX_PTYPE;
1605   memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1606 
1607   if (symsect != NULL)
1608     {
1609       memcpy (&fp->ctf_ext_symtab, symsect, sizeof (ctf_sect_t));
1610       memcpy (&fp->ctf_ext_strtab, strsect, sizeof (ctf_sect_t));
1611     }
1612 
1613   if (fp->ctf_data.cts_name != NULL)
1614     if ((fp->ctf_data.cts_name = strdup (fp->ctf_data.cts_name)) == NULL)
1615       {
1616 	err = ENOMEM;
1617 	goto bad;
1618       }
1619   if (fp->ctf_ext_symtab.cts_name != NULL)
1620     if ((fp->ctf_ext_symtab.cts_name = strdup (fp->ctf_ext_symtab.cts_name)) == NULL)
1621       {
1622 	err = ENOMEM;
1623 	goto bad;
1624       }
1625   if (fp->ctf_ext_strtab.cts_name != NULL)
1626     if ((fp->ctf_ext_strtab.cts_name = strdup (fp->ctf_ext_strtab.cts_name)) == NULL)
1627       {
1628 	err = ENOMEM;
1629 	goto bad;
1630       }
1631 
1632   if (fp->ctf_data.cts_name == NULL)
1633     fp->ctf_data.cts_name = _CTF_NULLSTR;
1634   if (fp->ctf_ext_symtab.cts_name == NULL)
1635     fp->ctf_ext_symtab.cts_name = _CTF_NULLSTR;
1636   if (fp->ctf_ext_strtab.cts_name == NULL)
1637     fp->ctf_ext_strtab.cts_name = _CTF_NULLSTR;
1638 
1639   if (strsect != NULL)
1640     {
1641       fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1642       fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1643     }
1644 
1645   /* Dynamic state, for dynamic addition to this dict after loading.  */
1646 
1647   fp->ctf_dthash = ctf_dynhash_create (ctf_hash_integer, ctf_hash_eq_integer,
1648 				       NULL, NULL);
1649   fp->ctf_dvhash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1650 				       NULL, NULL);
1651   fp->ctf_snapshots = 1;
1652 
1653   fp->ctf_objthash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1654 					   free, NULL);
1655   fp->ctf_funchash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
1656 					 free, NULL);
1657 
1658   if (!fp->ctf_dthash || !fp->ctf_dvhash || !fp->ctf_snapshots ||
1659       !fp->ctf_objthash || !fp->ctf_funchash)
1660     {
1661       err = ENOMEM;
1662       goto bad;
1663     }
1664 
1665   if (foreign_endian &&
1666       (err = ctf_flip (fp, hp, fp->ctf_buf, 0)) != 0)
1667     {
1668       /* We can be certain that ctf_flip() will have endian-flipped everything
1669 	 other than the types table when we return.  In particular the header
1670 	 is fine, so set it, to allow freeing to use the usual code path.  */
1671 
1672       ctf_set_base (fp, hp, fp->ctf_base);
1673       goto bad;
1674     }
1675 
1676   ctf_set_base (fp, hp, fp->ctf_base);
1677 
1678   if ((err = init_static_types (fp, hp)) != 0)
1679     goto bad;
1680 
1681   /* Allocate and initialize the symtab translation table, pointed to by
1682      ctf_sxlate, and the corresponding index sections.  This table may be too
1683      large for the actual size of the object and function info sections: if so,
1684      ctf_nsyms will be adjusted and the excess will never be used.  It's
1685      possible to do indexed symbol lookups even without a symbol table, so check
1686      even in that case.  Initially, we assume the symtab is native-endian: if it
1687      isn't, the caller will inform us later by calling ctf_symsect_endianness.  */
1688 #ifdef WORDS_BIGENDIAN
1689   fp->ctf_symsect_little_endian = 0;
1690 #else
1691   fp->ctf_symsect_little_endian = 1;
1692 #endif
1693 
1694   if (symsect != NULL)
1695     {
1696       fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1697       fp->ctf_sxlate = malloc (fp->ctf_nsyms * sizeof (uint32_t));
1698 
1699       if (fp->ctf_sxlate == NULL)
1700 	{
1701 	  err = ENOMEM;
1702 	  goto bad;
1703 	}
1704     }
1705 
1706   if ((err = init_symtab (fp, hp, symsect)) != 0)
1707     goto bad;
1708 
1709   ctf_set_ctl_hashes (fp);
1710 
1711   if (symsect != NULL)
1712     {
1713       if (symsect->cts_entsize == sizeof (Elf64_Sym))
1714 	(void) ctf_setmodel (fp, CTF_MODEL_LP64);
1715       else
1716 	(void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1717     }
1718   else
1719     (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1720 
1721   fp->ctf_refcnt = 1;
1722   return fp;
1723 
1724 bad:
1725   ctf_set_open_errno (errp, err);
1726   ctf_err_warn_to_open (fp);
1727   /* Without this, the refcnt is zero on entry and ctf_dict_close() won't
1728      actually do anything on the grounds that this is a recursive call via
1729      another dict being closed.  */
1730   fp->ctf_refcnt = 1;
1731   ctf_dict_close (fp);
1732   return NULL;
1733 }
1734 
1735 /* Bump the refcount on the specified CTF dict, to allow export of ctf_dict_t's
1736    from iterators that open and close the ctf_dict_t around the loop.  (This
1737    does not extend their lifetime beyond that of the ctf_archive_t in which they
1738    are contained.)  */
1739 
1740 void
1741 ctf_ref (ctf_dict_t *fp)
1742 {
1743   fp->ctf_refcnt++;
1744 }
1745 
1746 /* Close the specified CTF dict and free associated data structures.  Note that
1747    ctf_dict_close() is a reference counted operation: if the specified file is
1748    the parent of other active dict, its reference count will be greater than one
1749    and it will be freed later when no active children exist.  */
1750 
1751 void
1752 ctf_dict_close (ctf_dict_t *fp)
1753 {
1754   ctf_dtdef_t *dtd, *ntd;
1755   ctf_dvdef_t *dvd, *nvd;
1756   ctf_in_flight_dynsym_t *did, *nid;
1757   ctf_err_warning_t *err, *nerr;
1758 
1759   if (fp == NULL)
1760     return;		   /* Allow ctf_dict_close(NULL) to simplify caller code.  */
1761 
1762   ctf_dprintf ("ctf_dict_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1763 
1764   if (fp->ctf_refcnt > 1)
1765     {
1766       fp->ctf_refcnt--;
1767       return;
1768     }
1769 
1770   /* It is possible to recurse back in here, notably if dicts in the
1771      ctf_link_inputs or ctf_link_outputs cite this dict as a parent without
1772      using ctf_import_unref.  Do nothing in that case.  */
1773   if (fp->ctf_refcnt == 0)
1774     return;
1775 
1776   fp->ctf_refcnt--;
1777   free (fp->ctf_dyncuname);
1778   free (fp->ctf_dynparname);
1779   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1780     ctf_dict_close (fp->ctf_parent);
1781 
1782   for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1783     {
1784       ntd = ctf_list_next (dtd);
1785       ctf_dtd_delete (fp, dtd);
1786     }
1787   ctf_dynhash_destroy (fp->ctf_dthash);
1788 
1789   ctf_dynhash_destroy (fp->ctf_structs);
1790   ctf_dynhash_destroy (fp->ctf_unions);
1791   ctf_dynhash_destroy (fp->ctf_enums);
1792   ctf_dynhash_destroy (fp->ctf_names);
1793 
1794   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1795     {
1796       nvd = ctf_list_next (dvd);
1797       ctf_dvd_delete (fp, dvd);
1798     }
1799   ctf_dynhash_destroy (fp->ctf_dvhash);
1800 
1801   ctf_dynhash_destroy (fp->ctf_symhash_func);
1802   ctf_dynhash_destroy (fp->ctf_symhash_objt);
1803   free (fp->ctf_funcidx_sxlate);
1804   free (fp->ctf_objtidx_sxlate);
1805   ctf_dynhash_destroy (fp->ctf_objthash);
1806   ctf_dynhash_destroy (fp->ctf_funchash);
1807   free (fp->ctf_dynsymidx);
1808   ctf_dynhash_destroy (fp->ctf_dynsyms);
1809   for (did = ctf_list_next (&fp->ctf_in_flight_dynsyms); did != NULL; did = nid)
1810     {
1811       nid = ctf_list_next (did);
1812       ctf_list_delete (&fp->ctf_in_flight_dynsyms, did);
1813       free (did);
1814     }
1815 
1816   ctf_str_free_atoms (fp);
1817   free (fp->ctf_tmp_typeslice);
1818 
1819   if (fp->ctf_data.cts_name != _CTF_NULLSTR)
1820     free ((char *) fp->ctf_data.cts_name);
1821 
1822   if (fp->ctf_ext_symtab.cts_name != _CTF_NULLSTR)
1823     free ((char *) fp->ctf_ext_symtab.cts_name);
1824 
1825   if (fp->ctf_ext_strtab.cts_name != _CTF_NULLSTR)
1826     free ((char *) fp->ctf_ext_strtab.cts_name);
1827   else if (fp->ctf_data_mmapped)
1828     ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1829 
1830   free (fp->ctf_dynbase);
1831 
1832   ctf_dynhash_destroy (fp->ctf_syn_ext_strtab);
1833   ctf_dynhash_destroy (fp->ctf_link_inputs);
1834   ctf_dynhash_destroy (fp->ctf_link_outputs);
1835   ctf_dynhash_destroy (fp->ctf_link_type_mapping);
1836   ctf_dynhash_destroy (fp->ctf_link_in_cu_mapping);
1837   ctf_dynhash_destroy (fp->ctf_link_out_cu_mapping);
1838   ctf_dynhash_destroy (fp->ctf_add_processing);
1839   ctf_dedup_fini (fp, NULL, 0);
1840   ctf_dynset_destroy (fp->ctf_dedup_atoms_alloc);
1841 
1842   for (err = ctf_list_next (&fp->ctf_errs_warnings); err != NULL; err = nerr)
1843     {
1844       nerr = ctf_list_next (err);
1845       ctf_list_delete (&fp->ctf_errs_warnings, err);
1846       free (err->cew_text);
1847       free (err);
1848     }
1849 
1850   free (fp->ctf_sxlate);
1851   free (fp->ctf_txlate);
1852   free (fp->ctf_ptrtab);
1853   free (fp->ctf_pptrtab);
1854 
1855   free (fp->ctf_header);
1856   free (fp);
1857 }
1858 
1859 /* Backward compatibility.  */
1860 void
1861 ctf_file_close (ctf_file_t *fp)
1862 {
1863   ctf_dict_close (fp);
1864 }
1865 
1866 /* The converse of ctf_open().  ctf_open() disguises whatever it opens as an
1867    archive, so closing one is just like closing an archive.  */
1868 void
1869 ctf_close (ctf_archive_t *arc)
1870 {
1871   ctf_arc_close (arc);
1872 }
1873 
1874 /* Get the CTF archive from which this ctf_dict_t is derived.  */
1875 ctf_archive_t *
1876 ctf_get_arc (const ctf_dict_t *fp)
1877 {
1878   return fp->ctf_archive;
1879 }
1880 
1881 /* Return the ctfsect out of the core ctf_impl.  Useful for freeing the
1882    ctfsect's data * after ctf_dict_close(), which is why we return the actual
1883    structure, not a pointer to it, since that is likely to become a pointer to
1884    freed data before the return value is used under the expected use case of
1885    ctf_getsect()/ ctf_dict_close()/free().  */
1886 ctf_sect_t
1887 ctf_getdatasect (const ctf_dict_t *fp)
1888 {
1889   return fp->ctf_data;
1890 }
1891 
1892 ctf_sect_t
1893 ctf_getsymsect (const ctf_dict_t *fp)
1894 {
1895   return fp->ctf_ext_symtab;
1896 }
1897 
1898 ctf_sect_t
1899 ctf_getstrsect (const ctf_dict_t *fp)
1900 {
1901   return fp->ctf_ext_strtab;
1902 }
1903 
1904 /* Set the endianness of the symbol table attached to FP.  */
1905 void
1906 ctf_symsect_endianness (ctf_dict_t *fp, int little_endian)
1907 {
1908   int old_endianness = fp->ctf_symsect_little_endian;
1909 
1910   fp->ctf_symsect_little_endian = !!little_endian;
1911 
1912   /* If we already have a symtab translation table, we need to repopulate it if
1913      our idea of the endianness has changed.  */
1914 
1915   if (old_endianness != fp->ctf_symsect_little_endian
1916       && fp->ctf_sxlate != NULL && fp->ctf_ext_symtab.cts_data != NULL)
1917     assert (init_symtab (fp, fp->ctf_header, &fp->ctf_ext_symtab) == 0);
1918 }
1919 
1920 /* Return the CTF handle for the parent CTF dict, if one exists.  Otherwise
1921    return NULL to indicate this dict has no imported parent.  */
1922 ctf_dict_t *
1923 ctf_parent_dict (ctf_dict_t *fp)
1924 {
1925   return fp->ctf_parent;
1926 }
1927 
1928 /* Backward compatibility.  */
1929 ctf_dict_t *
1930 ctf_parent_file (ctf_dict_t *fp)
1931 {
1932   return ctf_parent_dict (fp);
1933 }
1934 
1935 /* Return the name of the parent CTF dict, if one exists, or NULL otherwise.  */
1936 const char *
1937 ctf_parent_name (ctf_dict_t *fp)
1938 {
1939   return fp->ctf_parname;
1940 }
1941 
1942 /* Set the parent name.  It is an error to call this routine without calling
1943    ctf_import() at some point.  */
1944 int
1945 ctf_parent_name_set (ctf_dict_t *fp, const char *name)
1946 {
1947   if (fp->ctf_dynparname != NULL)
1948     free (fp->ctf_dynparname);
1949 
1950   if ((fp->ctf_dynparname = strdup (name)) == NULL)
1951     return (ctf_set_errno (fp, ENOMEM));
1952   fp->ctf_parname = fp->ctf_dynparname;
1953   return 0;
1954 }
1955 
1956 /* Return the name of the compilation unit this CTF file applies to.  Usually
1957    non-NULL only for non-parent dicts.  */
1958 const char *
1959 ctf_cuname (ctf_dict_t *fp)
1960 {
1961   return fp->ctf_cuname;
1962 }
1963 
1964 /* Set the compilation unit name.  */
1965 int
1966 ctf_cuname_set (ctf_dict_t *fp, const char *name)
1967 {
1968   if (fp->ctf_dyncuname != NULL)
1969     free (fp->ctf_dyncuname);
1970 
1971   if ((fp->ctf_dyncuname = strdup (name)) == NULL)
1972     return (ctf_set_errno (fp, ENOMEM));
1973   fp->ctf_cuname = fp->ctf_dyncuname;
1974   return 0;
1975 }
1976 
1977 /* Import the types from the specified parent dict by storing a pointer to it in
1978    ctf_parent and incrementing its reference count.  Only one parent is allowed:
1979    if a parent already exists, it is replaced by the new parent.  The pptrtab
1980    is wiped, and will be refreshed by the next ctf_lookup_by_name call.  */
1981 int
1982 ctf_import (ctf_dict_t *fp, ctf_dict_t *pfp)
1983 {
1984   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1985     return (ctf_set_errno (fp, EINVAL));
1986 
1987   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1988     return (ctf_set_errno (fp, ECTF_DMODEL));
1989 
1990   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1991     ctf_dict_close (fp->ctf_parent);
1992   fp->ctf_parent = NULL;
1993 
1994   free (fp->ctf_pptrtab);
1995   fp->ctf_pptrtab = NULL;
1996   fp->ctf_pptrtab_len = 0;
1997   fp->ctf_pptrtab_typemax = 0;
1998 
1999   if (pfp != NULL)
2000     {
2001       int err;
2002 
2003       if (fp->ctf_parname == NULL)
2004 	if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
2005 	  return err;
2006 
2007       fp->ctf_flags |= LCTF_CHILD;
2008       pfp->ctf_refcnt++;
2009       fp->ctf_parent_unreffed = 0;
2010     }
2011 
2012   fp->ctf_parent = pfp;
2013   return 0;
2014 }
2015 
2016 /* Like ctf_import, but does not increment the refcount on the imported parent
2017    or close it at any point: as a result it can go away at any time and the
2018    caller must do all freeing itself.  Used internally to avoid refcount
2019    loops.  */
2020 int
2021 ctf_import_unref (ctf_dict_t *fp, ctf_dict_t *pfp)
2022 {
2023   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
2024     return (ctf_set_errno (fp, EINVAL));
2025 
2026   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
2027     return (ctf_set_errno (fp, ECTF_DMODEL));
2028 
2029   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
2030     ctf_dict_close (fp->ctf_parent);
2031   fp->ctf_parent = NULL;
2032 
2033   free (fp->ctf_pptrtab);
2034   fp->ctf_pptrtab = NULL;
2035   fp->ctf_pptrtab_len = 0;
2036   fp->ctf_pptrtab_typemax = 0;
2037   if (pfp != NULL)
2038     {
2039       int err;
2040 
2041       if (fp->ctf_parname == NULL)
2042 	if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
2043 	  return err;
2044 
2045       fp->ctf_flags |= LCTF_CHILD;
2046       fp->ctf_parent_unreffed = 1;
2047     }
2048 
2049   fp->ctf_parent = pfp;
2050   return 0;
2051 }
2052 
2053 /* Set the data model constant for the CTF dict.  */
2054 int
2055 ctf_setmodel (ctf_dict_t *fp, int model)
2056 {
2057   const ctf_dmodel_t *dp;
2058 
2059   for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
2060     {
2061       if (dp->ctd_code == model)
2062 	{
2063 	  fp->ctf_dmodel = dp;
2064 	  return 0;
2065 	}
2066     }
2067 
2068   return (ctf_set_errno (fp, EINVAL));
2069 }
2070 
2071 /* Return the data model constant for the CTF dict.  */
2072 int
2073 ctf_getmodel (ctf_dict_t *fp)
2074 {
2075   return fp->ctf_dmodel->ctd_code;
2076 }
2077 
2078 /* The caller can hang an arbitrary pointer off each ctf_dict_t using this
2079    function.  */
2080 void
2081 ctf_setspecific (ctf_dict_t *fp, void *data)
2082 {
2083   fp->ctf_specific = data;
2084 }
2085 
2086 /* Retrieve the arbitrary pointer again.  */
2087 void *
2088 ctf_getspecific (ctf_dict_t *fp)
2089 {
2090   return fp->ctf_specific;
2091 }
2092