libctf: work on platforms without O_CLOEXEC.
[external/binutils.git] / libctf / ctf-open.c
1 /* Opening CTF files.
2    Copyright (C) 2019 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 <assert.h>
26 #include "swap.h"
27 #include <bfd.h>
28 #include <zlib.h>
29
30 #include "elf-bfd.h"
31
32 static const ctf_dmodel_t _libctf_models[] = {
33   {"ILP32", CTF_MODEL_ILP32, 4, 1, 2, 4, 4},
34   {"LP64", CTF_MODEL_LP64, 8, 1, 2, 4, 8},
35   {NULL, 0, 0, 0, 0, 0, 0}
36 };
37
38 const char _CTF_SECTION[] = ".ctf";
39 const char _CTF_NULLSTR[] = "";
40
41 /* Version-sensitive accessors.  */
42
43 static uint32_t
44 get_kind_v1 (uint32_t info)
45 {
46   return (CTF_V1_INFO_KIND (info));
47 }
48
49 static uint32_t
50 get_root_v1 (uint32_t info)
51 {
52   return (CTF_V1_INFO_ISROOT (info));
53 }
54
55 static uint32_t
56 get_vlen_v1 (uint32_t info)
57 {
58   return (CTF_V1_INFO_VLEN (info));
59 }
60
61 static uint32_t
62 get_kind_v2 (uint32_t info)
63 {
64   return (CTF_V2_INFO_KIND (info));
65 }
66
67 static uint32_t
68 get_root_v2 (uint32_t info)
69 {
70   return (CTF_V2_INFO_ISROOT (info));
71 }
72
73 static uint32_t
74 get_vlen_v2 (uint32_t info)
75 {
76   return (CTF_V2_INFO_VLEN (info));
77 }
78
79 static inline ssize_t
80 get_ctt_size_common (const ctf_file_t *fp _libctf_unused_,
81                      const ctf_type_t *tp _libctf_unused_,
82                      ssize_t *sizep, ssize_t *incrementp, size_t lsize,
83                      size_t csize, size_t ctf_type_size,
84                      size_t ctf_stype_size, size_t ctf_lsize_sent)
85 {
86   ssize_t size, increment;
87
88   if (csize == ctf_lsize_sent)
89     {
90       size = lsize;
91       increment = ctf_type_size;
92     }
93   else
94     {
95       size = csize;
96       increment = ctf_stype_size;
97     }
98
99   if (sizep)
100     *sizep = size;
101   if (incrementp)
102     *incrementp = increment;
103
104   return size;
105 }
106
107 static ssize_t
108 get_ctt_size_v1 (const ctf_file_t *fp, const ctf_type_t *tp,
109                  ssize_t *sizep, ssize_t *incrementp)
110 {
111   ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
112
113   return (get_ctt_size_common (fp, tp, sizep, incrementp,
114                                CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
115                                sizeof (ctf_type_v1_t), sizeof (ctf_stype_v1_t),
116                                CTF_LSIZE_SENT_V1));
117 }
118
119 /* Return the size that a v1 will be once it is converted to v2.  */
120
121 static ssize_t
122 get_ctt_size_v2_unconverted (const ctf_file_t *fp, const ctf_type_t *tp,
123                              ssize_t *sizep, ssize_t *incrementp)
124 {
125   ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
126
127   return (get_ctt_size_common (fp, tp, sizep, incrementp,
128                                CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
129                                sizeof (ctf_type_t), sizeof (ctf_stype_t),
130                                CTF_LSIZE_SENT));
131 }
132
133 static ssize_t
134 get_ctt_size_v2 (const ctf_file_t *fp, const ctf_type_t *tp,
135                  ssize_t *sizep, ssize_t *incrementp)
136 {
137   return (get_ctt_size_common (fp, tp, sizep, incrementp,
138                                CTF_TYPE_LSIZE (tp), tp->ctt_size,
139                                sizeof (ctf_type_t), sizeof (ctf_stype_t),
140                                CTF_LSIZE_SENT));
141 }
142
143 static ssize_t
144 get_vbytes_common (unsigned short kind, ssize_t size _libctf_unused_,
145                    size_t vlen)
146 {
147   switch (kind)
148     {
149     case CTF_K_INTEGER:
150     case CTF_K_FLOAT:
151       return (sizeof (uint32_t));
152     case CTF_K_SLICE:
153       return (offsetof (ctf_slice_t, cts_bits) +
154               sizeof (((ctf_slice_t *)0)->cts_bits));
155     case CTF_K_ENUM:
156       return (sizeof (ctf_enum_t) * vlen);
157     case CTF_K_FORWARD:
158     case CTF_K_UNKNOWN:
159     case CTF_K_POINTER:
160     case CTF_K_TYPEDEF:
161     case CTF_K_VOLATILE:
162     case CTF_K_CONST:
163     case CTF_K_RESTRICT:
164       return 0;
165     default:
166       ctf_dprintf ("detected invalid CTF kind -- %x\n", kind);
167       return ECTF_CORRUPT;
168     }
169 }
170
171 static ssize_t
172 get_vbytes_v1 (unsigned short kind, ssize_t size, size_t vlen)
173 {
174   switch (kind)
175     {
176     case CTF_K_ARRAY:
177       return (sizeof (ctf_array_v1_t));
178     case CTF_K_FUNCTION:
179       return (sizeof (unsigned short) * (vlen + (vlen & 1)));
180     case CTF_K_STRUCT:
181     case CTF_K_UNION:
182       if (size < CTF_LSTRUCT_THRESH_V1)
183         return (sizeof (ctf_member_v1_t) * vlen);
184       else
185         return (sizeof (ctf_lmember_v1_t) * vlen);
186     }
187
188   return (get_vbytes_common (kind, size, vlen));
189 }
190
191 static ssize_t
192 get_vbytes_v2 (unsigned short kind, ssize_t size, size_t vlen)
193 {
194   switch (kind)
195     {
196     case CTF_K_ARRAY:
197       return (sizeof (ctf_array_t));
198     case CTF_K_FUNCTION:
199       return (sizeof (uint32_t) * (vlen + (vlen & 1)));
200     case CTF_K_STRUCT:
201     case CTF_K_UNION:
202       if (size < CTF_LSTRUCT_THRESH)
203         return (sizeof (ctf_member_t) * vlen);
204       else
205         return (sizeof (ctf_lmember_t) * vlen);
206     }
207
208   return (get_vbytes_common (kind, size, vlen));
209 }
210
211 static const ctf_fileops_t ctf_fileops[] = {
212   {NULL, NULL, NULL, NULL, NULL},
213   /* CTF_VERSION_1 */
214   {get_kind_v1, get_root_v1, get_vlen_v1, get_ctt_size_v1, get_vbytes_v1},
215   /* CTF_VERSION_1_UPGRADED_3 */
216   {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
217   /* CTF_VERSION_2 */
218   {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
219   /* CTF_VERSION_3, identical to 2: only new type kinds */
220   {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
221 };
222
223 /* Initialize the symtab translation table by filling each entry with the
224   offset of the CTF type or function data corresponding to each STT_FUNC or
225   STT_OBJECT entry in the symbol table.  */
226
227 static int
228 init_symtab (ctf_file_t *fp, const ctf_header_t *hp,
229              const ctf_sect_t *sp, const ctf_sect_t *strp)
230 {
231   const unsigned char *symp = sp->cts_data;
232   uint32_t *xp = fp->ctf_sxlate;
233   uint32_t *xend = xp + fp->ctf_nsyms;
234
235   uint32_t objtoff = hp->cth_objtoff;
236   uint32_t funcoff = hp->cth_funcoff;
237
238   uint32_t info, vlen;
239   Elf64_Sym sym, *gsp;
240   const char *name;
241
242   /* The CTF data object and function type sections are ordered to match
243      the relative order of the respective symbol types in the symtab.
244      If no type information is available for a symbol table entry, a
245      pad is inserted in the CTF section.  As a further optimization,
246      anonymous or undefined symbols are omitted from the CTF data.  */
247
248   for (; xp < xend; xp++, symp += sp->cts_entsize)
249     {
250       if (sp->cts_entsize == sizeof (Elf32_Sym))
251         gsp = ctf_sym_to_elf64 ((Elf32_Sym *) (uintptr_t) symp, &sym);
252       else
253         gsp = (Elf64_Sym *) (uintptr_t) symp;
254
255       if (gsp->st_name < strp->cts_size)
256         name = (const char *) strp->cts_data + gsp->st_name;
257       else
258         name = _CTF_NULLSTR;
259
260       if (gsp->st_name == 0 || gsp->st_shndx == SHN_UNDEF
261           || strcmp (name, "_START_") == 0 || strcmp (name, "_END_") == 0)
262         {
263           *xp = -1u;
264           continue;
265         }
266
267       switch (ELF64_ST_TYPE (gsp->st_info))
268         {
269         case STT_OBJECT:
270           if (objtoff >= hp->cth_funcoff
271               || (gsp->st_shndx == SHN_EXTABS && gsp->st_value == 0))
272             {
273               *xp = -1u;
274               break;
275             }
276
277           *xp = objtoff;
278           objtoff += sizeof (uint32_t);
279           break;
280
281         case STT_FUNC:
282           if (funcoff >= hp->cth_typeoff)
283             {
284               *xp = -1u;
285               break;
286             }
287
288           *xp = funcoff;
289
290           info = *(uint32_t *) ((uintptr_t) fp->ctf_buf + funcoff);
291           vlen = LCTF_INFO_VLEN (fp, info);
292
293           /* If we encounter a zero pad at the end, just skip it.  Otherwise
294              skip over the function and its return type (+2) and the argument
295              list (vlen).
296            */
297           if (LCTF_INFO_KIND (fp, info) == CTF_K_UNKNOWN && vlen == 0)
298             funcoff += sizeof (uint32_t);       /* Skip pad.  */
299           else
300             funcoff += sizeof (uint32_t) * (vlen + 2);
301           break;
302
303         default:
304           *xp = -1u;
305           break;
306         }
307     }
308
309   ctf_dprintf ("loaded %lu symtab entries\n", fp->ctf_nsyms);
310   return 0;
311 }
312
313 /* Set the CTF base pointer and derive the buf pointer from it, initializing
314    everything in the ctf_file that depends on the base or buf pointers.  */
315
316 static void
317 ctf_set_base (ctf_file_t *fp, const ctf_header_t *hp, void *base)
318 {
319   fp->ctf_base = base;
320   fp->ctf_buf = fp->ctf_base + sizeof (ctf_header_t);
321   fp->ctf_vars = (ctf_varent_t *) ((const char *) fp->ctf_buf +
322                                    hp->cth_varoff);
323   fp->ctf_nvars = (hp->cth_typeoff - hp->cth_varoff) / sizeof (ctf_varent_t);
324
325   fp->ctf_str[CTF_STRTAB_0].cts_strs = (const char *) fp->ctf_buf
326     + hp->cth_stroff;
327   fp->ctf_str[CTF_STRTAB_0].cts_len = hp->cth_strlen;
328
329   /* If we have a parent container name and label, store the relocated
330      string pointers in the CTF container for easy access later. */
331
332   /* Note: before conversion, these will be set to values that will be
333      immediately invalidated by the conversion process, but the conversion
334      process will call ctf_set_base() again to fix things up.  */
335
336   if (hp->cth_parlabel != 0)
337     fp->ctf_parlabel = ctf_strptr (fp, hp->cth_parlabel);
338   if (hp->cth_parname != 0)
339     fp->ctf_parname = ctf_strptr (fp, hp->cth_parname);
340
341   ctf_dprintf ("ctf_set_base: parent name %s (label %s)\n",
342                fp->ctf_parname ? fp->ctf_parname : "<NULL>",
343                fp->ctf_parlabel ? fp->ctf_parlabel : "<NULL>");
344 }
345
346 /* Free a ctf_base pointer: the pointer passed, or (if NULL) fp->ctf_base.  */
347 static void
348 ctf_free_base (ctf_file_t *fp, unsigned char *ctf_base, size_t ctf_size)
349 {
350   unsigned char *base;
351   size_t size;
352
353   if (ctf_base)
354     {
355       base = ctf_base;
356       size = ctf_size;
357     }
358   else
359     {
360       base = (unsigned char *) fp->ctf_base;
361       size = fp->ctf_size;
362     }
363
364   if (base != fp->ctf_data.cts_data && base != NULL)
365     ctf_data_free (base, size);
366 }
367
368 /* Set the version of the CTF file. */
369
370 /* When this is reset, LCTF_* changes behaviour, but there is no guarantee that
371    the variable data list associated with each type has been upgraded: the
372    caller must ensure this has been done in advance.  */
373
374 static void
375 ctf_set_version (ctf_file_t * fp, ctf_header_t * cth, int ctf_version)
376 {
377   fp->ctf_version = ctf_version;
378   cth->cth_version = ctf_version;
379   fp->ctf_fileops = &ctf_fileops[ctf_version];
380 }
381
382 /* Upgrade the type table to CTF_VERSION_3 (really CTF_VERSION_1_UPGRADED_3).
383
384    The upgrade is not done in-place: the ctf_base is moved.  ctf_strptr() must
385    not be called before reallocation is complete.
386
387    Type kinds not checked here due to nonexistence in older formats:
388       CTF_K_SLICE.  */
389 static int
390 upgrade_types (ctf_file_t *fp, ctf_header_t *cth)
391 {
392   const ctf_type_v1_t *tbuf;
393   const ctf_type_v1_t *tend;
394   unsigned char *ctf_base, *old_ctf_base = (unsigned char *) fp->ctf_base;
395   size_t old_ctf_size = fp->ctf_size;
396   ctf_type_t *t2buf;
397
398   ssize_t increase = 0, size, increment, v2increment, vbytes, v2bytes;
399   const ctf_type_v1_t *tp;
400   ctf_type_t *t2p;
401   ctf_header_t *new_cth;
402
403   tbuf = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_typeoff);
404   tend = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_stroff);
405
406   /* Much like init_types(), this is a two-pass process.
407
408      First, figure out the new type-section size needed.  (It is possible,
409      in theory, for it to be less than the old size, but this is very
410      unlikely.  It cannot be so small that cth_typeoff ends up of negative
411      size.  We validate this with an assertion below.)
412
413      We must cater not only for changes in vlen and types sizes but also
414      for changes in 'increment', which happen because v2 places some types
415      into ctf_stype_t where v1 would be forced to use the larger non-stype.  */
416
417   for (tp = tbuf; tp < tend;
418        tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes))
419     {
420       unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
421       unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
422
423       size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
424       vbytes = get_vbytes_v1 (kind, size, vlen);
425
426       get_ctt_size_v2_unconverted (fp, (const ctf_type_t *) tp, NULL,
427                                    &v2increment);
428       v2bytes = get_vbytes_v2 (kind, size, vlen);
429
430       if ((vbytes < 0) || (size < 0))
431         return ECTF_CORRUPT;
432
433       increase += v2increment - increment;      /* May be negative.  */
434       increase += v2bytes - vbytes;
435     }
436
437   /* Allocate enough room for the new buffer, then copy everything but the
438      type section into place, and reset the base accordingly.  Leave the
439      version number unchanged, so that LCTF_INFO_* still works on the
440      as-yet-untranslated type info.  */
441
442   if ((ctf_base = ctf_data_alloc (fp->ctf_size + increase)) == NULL)
443     return ECTF_ZALLOC;
444
445   memcpy (ctf_base, fp->ctf_base, sizeof (ctf_header_t) + cth->cth_typeoff);
446   memcpy (ctf_base + sizeof (ctf_header_t) + cth->cth_stroff + increase,
447           fp->ctf_base + sizeof (ctf_header_t) + cth->cth_stroff,
448           cth->cth_strlen);
449
450   memset (ctf_base + sizeof (ctf_header_t) + cth->cth_typeoff, 0,
451          cth->cth_stroff - cth->cth_typeoff + increase);
452
453   /* The cth here is an automatic variable in ctf_bufopen(), and transient
454      (a copy maintained because at that stage the header read out of the
455      ctf file may be read-only). We make all modifications in the
456      canonical copy at ctf_base (by now, writable), then copy it back into
457      cth at the end.  */
458
459   new_cth = (ctf_header_t *) ctf_base;
460   new_cth->cth_stroff += increase;
461   fp->ctf_size += increase;
462   assert (new_cth->cth_stroff >= new_cth->cth_typeoff);
463   ctf_set_base (fp, new_cth, ctf_base);
464
465   t2buf = (ctf_type_t *) (fp->ctf_buf + new_cth->cth_typeoff);
466
467   /* Iterate through all the types again, upgrading them.
468
469      Everything that hasn't changed can just be outright memcpy()ed.
470      Things that have changed need field-by-field consideration.  */
471
472   for (tp = tbuf, t2p = t2buf; tp < tend;
473        tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes),
474        t2p = (ctf_type_t *) ((uintptr_t) t2p + v2increment + v2bytes))
475     {
476       unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
477       int isroot = CTF_V1_INFO_ISROOT (tp->ctt_info);
478       unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
479       ssize_t v2size;
480       void *vdata, *v2data;
481
482       size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
483       vbytes = get_vbytes_v1 (kind, size, vlen);
484
485       t2p->ctt_name = tp->ctt_name;
486       t2p->ctt_info = CTF_TYPE_INFO (kind, isroot, vlen);
487
488       switch (kind)
489         {
490         case CTF_K_FUNCTION:
491         case CTF_K_FORWARD:
492         case CTF_K_TYPEDEF:
493         case CTF_K_POINTER:
494         case CTF_K_VOLATILE:
495         case CTF_K_CONST:
496         case CTF_K_RESTRICT:
497           t2p->ctt_type = tp->ctt_type;
498           break;
499         case CTF_K_INTEGER:
500         case CTF_K_FLOAT:
501         case CTF_K_ARRAY:
502         case CTF_K_STRUCT:
503         case CTF_K_UNION:
504         case CTF_K_ENUM:
505         case CTF_K_UNKNOWN:
506           if ((size_t) size <= CTF_MAX_SIZE)
507             t2p->ctt_size = size;
508           else
509             {
510               t2p->ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
511               t2p->ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
512             }
513           break;
514         }
515
516       v2size = get_ctt_size_v2 (fp, t2p, NULL, &v2increment);
517       v2bytes = get_vbytes_v2 (kind, v2size, vlen);
518
519       /* Catch out-of-sync get_ctt_size_*().  The count goes wrong if
520          these are not identical (and having them different makes no
521          sense semantically).  */
522
523       assert (size == v2size);
524
525       /* Now the varlen info.  */
526
527       vdata = (void *) ((uintptr_t) tp + increment);
528       v2data = (void *) ((uintptr_t) t2p + v2increment);
529
530       switch (kind)
531         {
532         case CTF_K_ARRAY:
533           {
534             const ctf_array_v1_t *ap = (const ctf_array_v1_t *) vdata;
535             ctf_array_t *a2p = (ctf_array_t *) v2data;
536
537             a2p->cta_contents = ap->cta_contents;
538             a2p->cta_index = ap->cta_index;
539             a2p->cta_nelems = ap->cta_nelems;
540             break;
541           }
542         case CTF_K_STRUCT:
543         case CTF_K_UNION:
544           {
545             ctf_member_t tmp;
546             const ctf_member_v1_t *m1 = (const ctf_member_v1_t *) vdata;
547             const ctf_lmember_v1_t *lm1 = (const ctf_lmember_v1_t *) m1;
548             ctf_member_t *m2 = (ctf_member_t *) v2data;
549             ctf_lmember_t *lm2 = (ctf_lmember_t *) m2;
550             unsigned long i;
551
552             /* We walk all four pointers forward, but only reference the two
553                that are valid for the given size, to avoid quadruplicating all
554                the code.  */
555
556             for (i = vlen; i != 0; i--, m1++, lm1++, m2++, lm2++)
557               {
558                 size_t offset;
559                 if (size < CTF_LSTRUCT_THRESH_V1)
560                   {
561                     offset = m1->ctm_offset;
562                     tmp.ctm_name = m1->ctm_name;
563                     tmp.ctm_type = m1->ctm_type;
564                   }
565                 else
566                   {
567                     offset = CTF_LMEM_OFFSET (lm1);
568                     tmp.ctm_name = lm1->ctlm_name;
569                     tmp.ctm_type = lm1->ctlm_type;
570                   }
571                 if (size < CTF_LSTRUCT_THRESH)
572                   {
573                     m2->ctm_name = tmp.ctm_name;
574                     m2->ctm_type = tmp.ctm_type;
575                     m2->ctm_offset = offset;
576                   }
577                 else
578                   {
579                     lm2->ctlm_name = tmp.ctm_name;
580                     lm2->ctlm_type = tmp.ctm_type;
581                     lm2->ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (offset);
582                     lm2->ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (offset);
583                   }
584               }
585             break;
586           }
587         case CTF_K_FUNCTION:
588           {
589             unsigned long i;
590             unsigned short *a1 = (unsigned short *) vdata;
591             uint32_t *a2 = (uint32_t *) v2data;
592
593             for (i = vlen; i != 0; i--, a1++, a2++)
594               *a2 = *a1;
595           }
596         /* FALLTHRU */
597         default:
598           /* Catch out-of-sync get_vbytes_*().  */
599           assert (vbytes == v2bytes);
600           memcpy (v2data, vdata, vbytes);
601         }
602     }
603
604   /* Verify that the entire region was converted.  If not, we are either
605      converting too much, or too little (leading to a buffer overrun either here
606      or at read time, in init_types().) */
607
608   assert ((size_t) t2p - (size_t) fp->ctf_buf == new_cth->cth_stroff);
609
610   ctf_set_version (fp, (ctf_header_t *) ctf_base, CTF_VERSION_1_UPGRADED_3);
611   ctf_free_base (fp, old_ctf_base, old_ctf_size);
612   memcpy (cth, new_cth, sizeof (ctf_header_t));
613
614   return 0;
615 }
616
617 /* Initialize the type ID translation table with the byte offset of each type,
618    and initialize the hash tables of each named type.  Upgrade the type table to
619    the latest supported representation in the process, if needed, and if this
620    recension of libctf supports upgrading.  */
621
622 static int
623 init_types (ctf_file_t *fp, ctf_header_t *cth)
624 {
625   const ctf_type_t *tbuf;
626   const ctf_type_t *tend;
627
628   unsigned long pop[CTF_K_MAX + 1] = { 0 };
629   const ctf_type_t *tp;
630   ctf_hash_t *hp;
631   uint32_t id, dst;
632   uint32_t *xp;
633
634   /* We determine whether the container is a child or a parent based on
635      the value of cth_parname.  */
636
637   int child = cth->cth_parname != 0;
638   int nlstructs = 0, nlunions = 0;
639   int err;
640
641   if (_libctf_unlikely_ (fp->ctf_version == CTF_VERSION_1))
642     {
643       int err;
644       if ((err = upgrade_types (fp, cth)) != 0)
645         return err;                             /* Upgrade failed.  */
646     }
647
648   tbuf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
649   tend = (ctf_type_t *) (fp->ctf_buf + cth->cth_stroff);
650
651   /* We make two passes through the entire type section.  In this first
652      pass, we count the number of each type and the total number of types.  */
653
654   for (tp = tbuf; tp < tend; fp->ctf_typemax++)
655     {
656       unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
657       unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
658       ssize_t size, increment, vbytes;
659
660       (void) ctf_get_ctt_size (fp, tp, &size, &increment);
661       vbytes = LCTF_VBYTES (fp, kind, size, vlen);
662
663       if (vbytes < 0)
664         return ECTF_CORRUPT;
665
666       if (kind == CTF_K_FORWARD)
667         {
668           /* For forward declarations, ctt_type is the CTF_K_* kind for the tag,
669              so bump that population count too.  If ctt_type is unknown, treat
670              the tag as a struct.  */
671
672           if (tp->ctt_type == CTF_K_UNKNOWN || tp->ctt_type >= CTF_K_MAX)
673             pop[CTF_K_STRUCT]++;
674           else
675             pop[tp->ctt_type]++;
676         }
677       tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
678       pop[kind]++;
679     }
680
681   if (child)
682     {
683       ctf_dprintf ("CTF container %p is a child\n", (void *) fp);
684       fp->ctf_flags |= LCTF_CHILD;
685     }
686   else
687     ctf_dprintf ("CTF container %p is a parent\n", (void *) fp);
688
689   /* Now that we've counted up the number of each type, we can allocate
690      the hash tables, type translation table, and pointer table.  */
691
692   if ((fp->ctf_structs = ctf_hash_create (pop[CTF_K_STRUCT], ctf_hash_string,
693                                           ctf_hash_eq_string)) == NULL)
694     return ENOMEM;
695
696   if ((fp->ctf_unions = ctf_hash_create (pop[CTF_K_UNION], ctf_hash_string,
697                                          ctf_hash_eq_string)) == NULL)
698     return ENOMEM;
699
700   if ((fp->ctf_enums = ctf_hash_create (pop[CTF_K_ENUM], ctf_hash_string,
701                                         ctf_hash_eq_string)) == NULL)
702     return ENOMEM;
703
704   if ((fp->ctf_names = ctf_hash_create (pop[CTF_K_INTEGER] +
705                                         pop[CTF_K_FLOAT] +
706                                         pop[CTF_K_FUNCTION] +
707                                         pop[CTF_K_TYPEDEF] +
708                                         pop[CTF_K_POINTER] +
709                                         pop[CTF_K_VOLATILE] +
710                                         pop[CTF_K_CONST] +
711                                         pop[CTF_K_RESTRICT],
712                                         ctf_hash_string,
713                                         ctf_hash_eq_string)) == NULL)
714     return ENOMEM;
715
716   fp->ctf_txlate = ctf_alloc (sizeof (uint32_t) * (fp->ctf_typemax + 1));
717   fp->ctf_ptrtab = ctf_alloc (sizeof (uint32_t) * (fp->ctf_typemax + 1));
718
719   if (fp->ctf_txlate == NULL || fp->ctf_ptrtab == NULL)
720     return ENOMEM;              /* Memory allocation failed.  */
721
722   xp = fp->ctf_txlate;
723   *xp++ = 0;                    /* Type id 0 is used as a sentinel value.  */
724
725   memset (fp->ctf_txlate, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
726   memset (fp->ctf_ptrtab, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
727
728   /* In the second pass through the types, we fill in each entry of the
729      type and pointer tables and add names to the appropriate hashes.  */
730
731   for (id = 1, tp = tbuf; tp < tend; xp++, id++)
732     {
733       unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
734       unsigned short flag = LCTF_INFO_ISROOT (fp, tp->ctt_info);
735       unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
736       ssize_t size, increment, vbytes;
737
738       const char *name;
739
740       (void) ctf_get_ctt_size (fp, tp, &size, &increment);
741       name = ctf_strptr (fp, tp->ctt_name);
742       vbytes = LCTF_VBYTES (fp, kind, size, vlen);
743
744       switch (kind)
745         {
746         case CTF_K_INTEGER:
747         case CTF_K_FLOAT:
748           /* Names are reused by bit-fields, which are differentiated by their
749              encodings, and so typically we'd record only the first instance of
750              a given intrinsic.  However, we replace an existing type with a
751              root-visible version so that we can be sure to find it when
752              checking for conflicting definitions in ctf_add_type().  */
753
754           if (((ctf_hash_lookup_type (fp->ctf_names, fp, name)) == 0)
755               || (flag & CTF_ADD_ROOT))
756             {
757               err = ctf_hash_define_type (fp->ctf_names, fp,
758                                           LCTF_INDEX_TO_TYPE (fp, id, child),
759                                           tp->ctt_name);
760               if (err != 0 && err != ECTF_STRTAB)
761                 return err;
762             }
763           break;
764
765           /* These kinds have no name, so do not need interning into any
766              hashtables.  */
767         case CTF_K_ARRAY:
768         case CTF_K_SLICE:
769           break;
770
771         case CTF_K_FUNCTION:
772           err = ctf_hash_insert_type (fp->ctf_names, fp,
773                                       LCTF_INDEX_TO_TYPE (fp, id, child),
774                                       tp->ctt_name);
775           if (err != 0 && err != ECTF_STRTAB)
776             return err;
777           break;
778
779         case CTF_K_STRUCT:
780           err = ctf_hash_define_type (fp->ctf_structs, fp,
781                                       LCTF_INDEX_TO_TYPE (fp, id, child),
782                                       tp->ctt_name);
783
784           if (err != 0 && err != ECTF_STRTAB)
785             return err;
786
787           if (size >= CTF_LSTRUCT_THRESH)
788             nlstructs++;
789           break;
790
791         case CTF_K_UNION:
792           err = ctf_hash_define_type (fp->ctf_unions, fp,
793                                       LCTF_INDEX_TO_TYPE (fp, id, child),
794                                       tp->ctt_name);
795
796           if (err != 0 && err != ECTF_STRTAB)
797             return err;
798
799           if (size >= CTF_LSTRUCT_THRESH)
800             nlunions++;
801           break;
802
803         case CTF_K_ENUM:
804           err = ctf_hash_define_type (fp->ctf_enums, fp,
805                                       LCTF_INDEX_TO_TYPE (fp, id, child),
806                                       tp->ctt_name);
807
808           if (err != 0 && err != ECTF_STRTAB)
809             return err;
810           break;
811
812         case CTF_K_TYPEDEF:
813           err = ctf_hash_insert_type (fp->ctf_names, fp,
814                                       LCTF_INDEX_TO_TYPE (fp, id, child),
815                                       tp->ctt_name);
816           if (err != 0 && err != ECTF_STRTAB)
817             return err;
818           break;
819
820         case CTF_K_FORWARD:
821           /* Only insert forward tags into the given hash if the type or tag
822              name is not already present.  */
823           switch (tp->ctt_type)
824             {
825             case CTF_K_STRUCT:
826               hp = fp->ctf_structs;
827               break;
828             case CTF_K_UNION:
829               hp = fp->ctf_unions;
830               break;
831             case CTF_K_ENUM:
832               hp = fp->ctf_enums;
833               break;
834             default:
835               hp = fp->ctf_structs;
836             }
837
838           if (ctf_hash_lookup_type (hp, fp, name) == 0)
839             {
840               err = ctf_hash_insert_type (hp, fp,
841                                           LCTF_INDEX_TO_TYPE (fp, id, child),
842                                           tp->ctt_name);
843               if (err != 0 && err != ECTF_STRTAB)
844                 return err;
845             }
846           break;
847
848         case CTF_K_POINTER:
849           /* If the type referenced by the pointer is in this CTF container,
850              then store the index of the pointer type in
851              fp->ctf_ptrtab[ index of referenced type ].  */
852
853           if (LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
854               && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
855             fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = id;
856          /*FALLTHRU*/
857
858         case CTF_K_VOLATILE:
859         case CTF_K_CONST:
860         case CTF_K_RESTRICT:
861           err = ctf_hash_insert_type (fp->ctf_names, fp,
862                                       LCTF_INDEX_TO_TYPE (fp, id, child),
863                                       tp->ctt_name);
864           if (err != 0 && err != ECTF_STRTAB)
865             return err;
866           break;
867         }
868
869       *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
870       tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
871     }
872
873   ctf_dprintf ("%lu total types processed\n", fp->ctf_typemax);
874   ctf_dprintf ("%u enum names hashed\n", ctf_hash_size (fp->ctf_enums));
875   ctf_dprintf ("%u struct names hashed (%d long)\n",
876                ctf_hash_size (fp->ctf_structs), nlstructs);
877   ctf_dprintf ("%u union names hashed (%d long)\n",
878                ctf_hash_size (fp->ctf_unions), nlunions);
879   ctf_dprintf ("%u base type names hashed\n", ctf_hash_size (fp->ctf_names));
880
881   /* Make an additional pass through the pointer table to find pointers that
882      point to anonymous typedef nodes.  If we find one, modify the pointer table
883      so that the pointer is also known to point to the node that is referenced
884      by the anonymous typedef node.  */
885
886   for (id = 1; id <= fp->ctf_typemax; id++)
887     {
888       if ((dst = fp->ctf_ptrtab[id]) != 0)
889         {
890           tp = LCTF_INDEX_TO_TYPEPTR (fp, id);
891
892           if (LCTF_INFO_KIND (fp, tp->ctt_info) == CTF_K_TYPEDEF &&
893               strcmp (ctf_strptr (fp, tp->ctt_name), "") == 0 &&
894               LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child &&
895               LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
896             fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = dst;
897         }
898     }
899
900   return 0;
901 }
902
903 /* Endianness-flipping routines.
904
905    We flip everything, mindlessly, even 1-byte entities, so that future
906    expansions do not require changes to this code.  */
907
908 /* < C11? define away static assertions.  */
909
910 #if !defined (__STDC_VERSION__) || __STDC_VERSION__ < 201112L
911 #define _Static_assert(cond, err)
912 #endif
913
914 /* Swap the endianness of something.  */
915
916 #define swap_thing(x)                                                   \
917   do {                                                                  \
918     _Static_assert (sizeof (x) == 1 || (sizeof (x) % 2 == 0             \
919                                         && sizeof (x) <= 8),            \
920                     "Invalid size, update endianness code");            \
921     switch (sizeof (x)) {                                               \
922     case 2: x = bswap_16 (x); break;                                    \
923     case 4: x = bswap_32 (x); break;                                    \
924     case 8: x = bswap_64 (x); break;                                    \
925     case 1: /* Nothing needs doing */                                   \
926       break;                                                            \
927     }                                                                   \
928   } while (0);
929
930 /* Flip the endianness of the CTF header.  */
931
932 static void
933 flip_header (ctf_header_t *cth)
934 {
935   swap_thing (cth->cth_preamble.ctp_magic);
936   swap_thing (cth->cth_preamble.ctp_version);
937   swap_thing (cth->cth_preamble.ctp_flags);
938   swap_thing (cth->cth_parlabel);
939   swap_thing (cth->cth_parname);
940   swap_thing (cth->cth_objtoff);
941   swap_thing (cth->cth_funcoff);
942   swap_thing (cth->cth_varoff);
943   swap_thing (cth->cth_typeoff);
944   swap_thing (cth->cth_stroff);
945   swap_thing (cth->cth_strlen);
946 }
947
948 /* Flip the endianness of the label section, an array of ctf_lblent_t.  */
949
950 static void
951 flip_lbls (void *start, size_t len)
952 {
953   ctf_lblent_t *lbl = start;
954
955   for (ssize_t i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
956     {
957       swap_thing (lbl->ctl_label);
958       swap_thing (lbl->ctl_type);
959     }
960 }
961
962 /* Flip the endianness of the data-object or function sections, an array of
963    uint32_t.  (The function section has more internal structure, but that
964    structure is an array of uint32_t, so can be treated as one big array for
965    byte-swapping.)  */
966
967 static void
968 flip_objts (void *start, size_t len)
969 {
970   uint32_t *obj = start;
971
972   for (ssize_t i = len / sizeof (uint32_t); i > 0; obj++, i--)
973       swap_thing (*obj);
974 }
975
976 /* Flip the endianness of the variable section, an array of ctf_varent_t.  */
977
978 static void
979 flip_vars (void *start, size_t len)
980 {
981   ctf_varent_t *var = start;
982
983   for (ssize_t i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
984     {
985       swap_thing (var->ctv_name);
986       swap_thing (var->ctv_type);
987     }
988 }
989
990 /* Flip the endianness of the type section, a tagged array of ctf_type or
991    ctf_stype followed by variable data.  */
992
993 static int
994 flip_types (void *start, size_t len)
995 {
996   ctf_type_t *t = start;
997
998   while ((uintptr_t) t < ((uintptr_t) start) + len)
999     {
1000       swap_thing (t->ctt_name);
1001       swap_thing (t->ctt_info);
1002       swap_thing (t->ctt_size);
1003
1004       uint32_t kind = CTF_V2_INFO_KIND (t->ctt_info);
1005       size_t size = t->ctt_size;
1006       uint32_t vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1007       size_t vbytes = get_vbytes_v2 (kind, size, vlen);
1008
1009       if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1010         {
1011           swap_thing (t->ctt_lsizehi);
1012           swap_thing (t->ctt_lsizelo);
1013           size = CTF_TYPE_LSIZE (t);
1014           t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1015         }
1016       else
1017         t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1018
1019       switch (kind)
1020         {
1021         case CTF_K_FORWARD:
1022         case CTF_K_UNKNOWN:
1023         case CTF_K_POINTER:
1024         case CTF_K_TYPEDEF:
1025         case CTF_K_VOLATILE:
1026         case CTF_K_CONST:
1027         case CTF_K_RESTRICT:
1028           /* These types have no vlen data to swap.  */
1029           assert (vbytes == 0);
1030           break;
1031
1032         case CTF_K_INTEGER:
1033         case CTF_K_FLOAT:
1034           {
1035             /* These types have a single uint32_t.  */
1036
1037             uint32_t *item = (uint32_t *) t;
1038
1039             swap_thing (*item);
1040             break;
1041           }
1042
1043         case CTF_K_FUNCTION:
1044           {
1045             /* This type has a bunch of uint32_ts.  */
1046
1047             uint32_t *item = (uint32_t *) t;
1048
1049             for (ssize_t i = vlen; i > 0; item++, i--)
1050               swap_thing (*item);
1051             break;
1052           }
1053
1054         case CTF_K_ARRAY:
1055           {
1056             /* This has a single ctf_array_t.  */
1057
1058             ctf_array_t *a = (ctf_array_t *) t;
1059
1060             assert (vbytes == sizeof (ctf_array_t));
1061             swap_thing (a->cta_contents);
1062             swap_thing (a->cta_index);
1063             swap_thing (a->cta_nelems);
1064
1065             break;
1066           }
1067
1068         case CTF_K_SLICE:
1069           {
1070             /* This has a single ctf_slice_t.  */
1071
1072             ctf_slice_t *s = (ctf_slice_t *) t;
1073
1074             assert (vbytes == sizeof (ctf_slice_t));
1075             swap_thing (s->cts_type);
1076             swap_thing (s->cts_offset);
1077             swap_thing (s->cts_bits);
1078
1079             break;
1080           }
1081
1082         case CTF_K_STRUCT:
1083         case CTF_K_UNION:
1084           {
1085             /* This has an array of ctf_member or ctf_lmember, depending on
1086                size.  We could consider it to be a simple array of uint32_t,
1087                but for safety's sake in case these structures ever acquire
1088                non-uint32_t members, do it member by member.  */
1089
1090             if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1091               {
1092                 ctf_lmember_t *lm = (ctf_lmember_t *) t;
1093                 for (ssize_t i = vlen; i > 0; i--, lm++)
1094                   {
1095                     swap_thing (lm->ctlm_name);
1096                     swap_thing (lm->ctlm_offsethi);
1097                     swap_thing (lm->ctlm_type);
1098                     swap_thing (lm->ctlm_offsetlo);
1099                   }
1100               }
1101             else
1102               {
1103                 ctf_member_t *m = (ctf_member_t *) t;
1104                 for (ssize_t i = vlen; i > 0; i--, m++)
1105                   {
1106                     swap_thing (m->ctm_name);
1107                     swap_thing (m->ctm_offset);
1108                     swap_thing (m->ctm_type);
1109                   }
1110               }
1111             break;
1112           }
1113
1114         case CTF_K_ENUM:
1115           {
1116             /* This has an array of ctf_enum_t.  */
1117
1118             ctf_enum_t *item = (ctf_enum_t *) t;
1119
1120             for (ssize_t i = vlen; i > 0; item++, i--)
1121               {
1122                 swap_thing (item->cte_name);
1123                 swap_thing (item->cte_value);
1124               }
1125             break;
1126           }
1127         default:
1128           ctf_dprintf ("unhandled CTF kind in endianness conversion -- %x\n",
1129                        kind);
1130           return ECTF_CORRUPT;
1131         }
1132
1133       t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1134     }
1135
1136   return 0;
1137 }
1138
1139 /* Flip the endianness of BASE, given the offsets in the (already endian-
1140    converted) CTH.
1141
1142    All of this stuff happens before the header is fully initialized, so the
1143    LCTF_*() macros cannot be used yet.  Since we do not try to endian-convert v1
1144    data, this is no real loss.  */
1145
1146 static int
1147 flip_ctf (ctf_header_t *cth, unsigned char *base)
1148 {
1149   base += sizeof (ctf_header_t);
1150
1151   flip_lbls (base + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1152   flip_objts (base + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1153   flip_objts (base + cth->cth_funcoff, cth->cth_varoff - cth->cth_funcoff);
1154   flip_vars (base + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1155   return flip_types (base + cth->cth_typeoff, cth->cth_stroff - cth->cth_typeoff);
1156 }
1157
1158 /* Open a CTF file, mocking up a suitable ctf_sect.  */
1159 ctf_file_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1160                              const char *symsect, size_t symsect_size,
1161                              size_t symsect_entsize,
1162                              const char *strsect, size_t strsect_size,
1163                              int *errp)
1164 {
1165   ctf_sect_t skeleton;
1166
1167   ctf_sect_t ctf_sect, sym_sect, str_sect;
1168   ctf_sect_t *ctfsectp = NULL;
1169   ctf_sect_t *symsectp = NULL;
1170   ctf_sect_t *strsectp = NULL;
1171
1172   skeleton.cts_name = _CTF_SECTION;
1173   skeleton.cts_entsize = 1;
1174
1175   if (ctfsect)
1176     {
1177       memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1178       ctf_sect.cts_data = ctfsect;
1179       ctf_sect.cts_size = ctfsect_size;
1180       ctfsectp = &ctf_sect;
1181     }
1182
1183   if (symsect)
1184     {
1185       memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1186       sym_sect.cts_data = symsect;
1187       sym_sect.cts_size = symsect_size;
1188       sym_sect.cts_entsize = symsect_entsize;
1189       symsectp = &sym_sect;
1190     }
1191
1192   if (strsect)
1193     {
1194       memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1195       str_sect.cts_data = strsect;
1196       str_sect.cts_size = strsect_size;
1197       strsectp = &str_sect;
1198     }
1199
1200   return ctf_bufopen (ctfsectp, symsectp, strsectp, errp);
1201 }
1202
1203 /* Decode the specified CTF buffer and optional symbol table, and create a new
1204    CTF container representing the symbolic debugging information.  This code can
1205    be used directly by the debugger, or it can be used as the engine for
1206    ctf_fdopen() or ctf_open(), below.  */
1207
1208 ctf_file_t *
1209 ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1210              const ctf_sect_t *strsect, int *errp)
1211 {
1212   const ctf_preamble_t *pp;
1213   ctf_header_t hp;
1214   ctf_file_t *fp;
1215   void *buf, *base;
1216   size_t size, hdrsz;
1217   int foreign_endian = 0;
1218   int err;
1219
1220   libctf_init_debug();
1221
1222   if (ctfsect == NULL || ((symsect == NULL) != (strsect == NULL)))
1223     return (ctf_set_open_errno (errp, EINVAL));
1224
1225   if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1226       symsect->cts_entsize != sizeof (Elf64_Sym))
1227     return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1228
1229   if (symsect != NULL && symsect->cts_data == NULL)
1230     return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1231
1232   if (strsect != NULL && strsect->cts_data == NULL)
1233     return (ctf_set_open_errno (errp, ECTF_STRBAD));
1234
1235   if (ctfsect->cts_size < sizeof (ctf_preamble_t))
1236     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1237
1238   pp = (const ctf_preamble_t *) ctfsect->cts_data;
1239
1240   ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1241                pp->ctp_magic, pp->ctp_version);
1242
1243   /* Validate each part of the CTF header.
1244
1245      First, we validate the preamble (common to all versions).  At that point,
1246      we know the endianness and specific header version, and can validate the
1247      version-specific parts including section offsets and alignments.
1248
1249      We specifically do not support foreign-endian old versions.  */
1250
1251   if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1252     {
1253       if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1254         {
1255           if (pp->ctp_version != CTF_VERSION_3)
1256             return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1257           foreign_endian = 1;
1258         }
1259       else
1260         return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1261     }
1262
1263   if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1264                          || (pp->ctp_version > CTF_VERSION_3)))
1265     return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1266
1267   if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1268     {
1269       /* The symtab can contain function entries which contain embedded ctf
1270          info.  We do not support dynamically upgrading such entries (none
1271          should exist in any case, since dwarf2ctf does not create them).  */
1272
1273       ctf_dprintf ("ctf_bufopen: CTF version %d symsect not "
1274                    "supported\n", pp->ctp_version);
1275       return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1276     }
1277
1278   if (ctfsect->cts_size < sizeof (ctf_header_t))
1279     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1280
1281   memcpy (&hp, ctfsect->cts_data, sizeof (hp));
1282
1283   if (foreign_endian)
1284     flip_header (&hp);
1285
1286   hdrsz = sizeof (ctf_header_t);
1287
1288   size = hp.cth_stroff + hp.cth_strlen;
1289
1290   ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n", (unsigned long) size);
1291
1292   if (hp.cth_lbloff > size || hp.cth_objtoff > size
1293       || hp.cth_funcoff > size || hp.cth_typeoff > size || hp.cth_stroff > size)
1294     return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1295
1296   if (hp.cth_lbloff > hp.cth_objtoff
1297       || hp.cth_objtoff > hp.cth_funcoff
1298       || hp.cth_funcoff > hp.cth_typeoff
1299       || hp.cth_funcoff > hp.cth_varoff
1300       || hp.cth_varoff > hp.cth_typeoff || hp.cth_typeoff > hp.cth_stroff)
1301     return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1302
1303   if ((hp.cth_lbloff & 3) || (hp.cth_objtoff & 1)
1304       || (hp.cth_funcoff & 1) || (hp.cth_varoff & 3) || (hp.cth_typeoff & 3))
1305     return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1306
1307   /* Once everything is determined to be valid, attempt to decompress the CTF
1308      data buffer if it is compressed, or copy it into new storage if it is not
1309      compressed but needs endian-flipping.  Otherwise we just put the data
1310      section's buffer pointer into ctf_buf, below.  */
1311
1312   /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1313      init_types().  */
1314
1315   if (hp.cth_flags & CTF_F_COMPRESS)
1316     {
1317       size_t srclen;
1318       uLongf dstlen;
1319       const void *src;
1320       int rc = Z_OK;
1321
1322       if ((base = ctf_data_alloc (size + hdrsz)) == NULL)
1323         return (ctf_set_open_errno (errp, ECTF_ZALLOC));
1324
1325       memcpy (base, ctfsect->cts_data, hdrsz);
1326       ((ctf_preamble_t *) base)->ctp_flags &= ~CTF_F_COMPRESS;
1327       buf = (unsigned char *) base + hdrsz;
1328
1329       src = (unsigned char *) ctfsect->cts_data + hdrsz;
1330       srclen = ctfsect->cts_size - hdrsz;
1331       dstlen = size;
1332
1333       if ((rc = uncompress (buf, &dstlen, src, srclen)) != Z_OK)
1334         {
1335           ctf_dprintf ("zlib inflate err: %s\n", zError (rc));
1336           ctf_data_free (base, size + hdrsz);
1337           return (ctf_set_open_errno (errp, ECTF_DECOMPRESS));
1338         }
1339
1340       if ((size_t) dstlen != size)
1341         {
1342           ctf_dprintf ("zlib inflate short -- got %lu of %lu "
1343                        "bytes\n", (unsigned long) dstlen, (unsigned long) size);
1344           ctf_data_free (base, size + hdrsz);
1345           return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1346         }
1347
1348     }
1349   else if (foreign_endian)
1350     {
1351       if ((base = ctf_data_alloc (size + hdrsz)) == NULL)
1352         return (ctf_set_open_errno (errp, ECTF_ZALLOC));
1353     }
1354   else
1355     {
1356       base = (void *) ctfsect->cts_data;
1357       buf = (unsigned char *) base + hdrsz;
1358     }
1359
1360   /* Once we have uncompressed and validated the CTF data buffer, we can
1361      proceed with allocating a ctf_file_t and initializing it.
1362
1363      Nothing that depends on buf or base should be set directly in this function
1364      before the init_types() call, because it may be reallocated during
1365      transparent upgrade if this recension of libctf is so configured: see
1366      ctf_set_base() and ctf_realloc_base().  */
1367
1368   if ((fp = ctf_alloc (sizeof (ctf_file_t))) == NULL)
1369     return (ctf_set_open_errno (errp, ENOMEM));
1370
1371   memset (fp, 0, sizeof (ctf_file_t));
1372   ctf_set_version (fp, &hp, hp.cth_version);
1373
1374   if (_libctf_unlikely_ (hp.cth_version < CTF_VERSION_2))
1375     fp->ctf_parmax = CTF_MAX_PTYPE_V1;
1376   else
1377     fp->ctf_parmax = CTF_MAX_PTYPE;
1378
1379   memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1380
1381   if (symsect != NULL)
1382     {
1383       memcpy (&fp->ctf_symtab, symsect, sizeof (ctf_sect_t));
1384       memcpy (&fp->ctf_strtab, strsect, sizeof (ctf_sect_t));
1385     }
1386
1387   if (fp->ctf_data.cts_name != NULL)
1388     fp->ctf_data.cts_name = ctf_strdup (fp->ctf_data.cts_name);
1389   if (fp->ctf_symtab.cts_name != NULL)
1390     fp->ctf_symtab.cts_name = ctf_strdup (fp->ctf_symtab.cts_name);
1391   if (fp->ctf_strtab.cts_name != NULL)
1392     fp->ctf_strtab.cts_name = ctf_strdup (fp->ctf_strtab.cts_name);
1393
1394   if (fp->ctf_data.cts_name == NULL)
1395     fp->ctf_data.cts_name = _CTF_NULLSTR;
1396   if (fp->ctf_symtab.cts_name == NULL)
1397     fp->ctf_symtab.cts_name = _CTF_NULLSTR;
1398   if (fp->ctf_strtab.cts_name == NULL)
1399     fp->ctf_strtab.cts_name = _CTF_NULLSTR;
1400
1401   if (strsect != NULL)
1402     {
1403       fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1404       fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1405     }
1406
1407   if (foreign_endian &&
1408       (err = flip_ctf (&hp, base)) != 0)
1409     {
1410       /* We can be certain that flip_ctf() will have endian-flipped everything
1411          other than the types table when we return.  In particular the header
1412          is fine, so set it, to allow freeing to use the usual code path.  */
1413
1414       (void) ctf_set_open_errno (errp, err);
1415       ctf_set_base (fp, &hp, base);
1416       goto bad;
1417     }
1418
1419   ctf_set_base (fp, &hp, base);
1420   fp->ctf_size = size + hdrsz;
1421
1422   if ((err = init_types (fp, &hp)) != 0)
1423     {
1424       (void) ctf_set_open_errno (errp, err);
1425       goto bad;
1426     }
1427
1428   /* The ctf region may have been reallocated by init_types(), but now
1429      that is done, it will not move again, so we can protect it, as long
1430      as it didn't come from the ctfsect, which might have been allocated
1431      with malloc().  */
1432
1433   if (fp->ctf_base != (void *) ctfsect->cts_data)
1434     ctf_data_protect ((void *) fp->ctf_base, fp->ctf_size);
1435
1436   /* If we have a symbol table section, allocate and initialize
1437      the symtab translation table, pointed to by ctf_sxlate.  */
1438
1439   if (symsect != NULL)
1440     {
1441       fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1442       fp->ctf_sxlate = ctf_alloc (fp->ctf_nsyms * sizeof (uint32_t));
1443
1444       if (fp->ctf_sxlate == NULL)
1445         {
1446           (void) ctf_set_open_errno (errp, ENOMEM);
1447           goto bad;
1448         }
1449
1450       if ((err = init_symtab (fp, &hp, symsect, strsect)) != 0)
1451         {
1452           (void) ctf_set_open_errno (errp, err);
1453           goto bad;
1454         }
1455     }
1456
1457   /* Initialize the ctf_lookup_by_name top-level dictionary.  We keep an
1458      array of type name prefixes and the corresponding ctf_hash to use.
1459      NOTE: This code must be kept in sync with the code in ctf_update().  */
1460   fp->ctf_lookups[0].ctl_prefix = "struct";
1461   fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1462   fp->ctf_lookups[0].ctl_hash = fp->ctf_structs;
1463   fp->ctf_lookups[1].ctl_prefix = "union";
1464   fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1465   fp->ctf_lookups[1].ctl_hash = fp->ctf_unions;
1466   fp->ctf_lookups[2].ctl_prefix = "enum";
1467   fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1468   fp->ctf_lookups[2].ctl_hash = fp->ctf_enums;
1469   fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1470   fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1471   fp->ctf_lookups[3].ctl_hash = fp->ctf_names;
1472   fp->ctf_lookups[4].ctl_prefix = NULL;
1473   fp->ctf_lookups[4].ctl_len = 0;
1474   fp->ctf_lookups[4].ctl_hash = NULL;
1475
1476   if (symsect != NULL)
1477     {
1478       if (symsect->cts_entsize == sizeof (Elf64_Sym))
1479         (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1480       else
1481         (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1482     }
1483   else
1484     (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1485
1486   fp->ctf_refcnt = 1;
1487   return fp;
1488
1489 bad:
1490   ctf_file_close (fp);
1491   return NULL;
1492 }
1493
1494 /* Close the specified CTF container and free associated data structures.  Note
1495    that ctf_file_close() is a reference counted operation: if the specified file
1496    is the parent of other active containers, its reference count will be greater
1497    than one and it will be freed later when no active children exist.  */
1498
1499 void
1500 ctf_file_close (ctf_file_t *fp)
1501 {
1502   ctf_dtdef_t *dtd, *ntd;
1503   ctf_dvdef_t *dvd, *nvd;
1504
1505   if (fp == NULL)
1506     return;                /* Allow ctf_file_close(NULL) to simplify caller code.  */
1507
1508   ctf_dprintf ("ctf_file_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1509
1510   if (fp->ctf_refcnt > 1)
1511     {
1512       fp->ctf_refcnt--;
1513       return;
1514     }
1515
1516   if (fp->ctf_dynparname != NULL)
1517     ctf_free (fp->ctf_dynparname);
1518
1519   if (fp->ctf_parent != NULL)
1520     ctf_file_close (fp->ctf_parent);
1521
1522   for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1523     {
1524       ntd = ctf_list_next (dtd);
1525       ctf_dtd_delete (fp, dtd);
1526     }
1527   ctf_dynhash_destroy (fp->ctf_dthash);
1528   ctf_dynhash_destroy (fp->ctf_dtbyname);
1529
1530   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1531     {
1532       nvd = ctf_list_next (dvd);
1533       ctf_dvd_delete (fp, dvd);
1534     }
1535   ctf_dynhash_destroy (fp->ctf_dvhash);
1536
1537   ctf_free (fp->ctf_tmp_typeslice);
1538
1539   if (fp->ctf_data.cts_name != _CTF_NULLSTR &&
1540       fp->ctf_data.cts_name != NULL)
1541     ctf_free ((char *) fp->ctf_data.cts_name);
1542
1543   if (fp->ctf_symtab.cts_name != _CTF_NULLSTR &&
1544       fp->ctf_symtab.cts_name != NULL)
1545     ctf_free ((char *) fp->ctf_symtab.cts_name);
1546
1547   if (fp->ctf_strtab.cts_name != _CTF_NULLSTR &&
1548       fp->ctf_strtab.cts_name != NULL)
1549     ctf_free ((char *) fp->ctf_strtab.cts_name);
1550
1551   else if (fp->ctf_data_mmapped)
1552     ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1553
1554   ctf_free_base (fp, NULL, 0);
1555
1556   if (fp->ctf_sxlate != NULL)
1557     ctf_free (fp->ctf_sxlate);
1558
1559   if (fp->ctf_txlate != NULL)
1560     ctf_free (fp->ctf_txlate);
1561
1562   if (fp->ctf_ptrtab != NULL)
1563     ctf_free (fp->ctf_ptrtab);
1564
1565   ctf_hash_destroy (fp->ctf_structs);
1566   ctf_hash_destroy (fp->ctf_unions);
1567   ctf_hash_destroy (fp->ctf_enums);
1568   ctf_hash_destroy (fp->ctf_names);
1569
1570   ctf_free (fp);
1571 }
1572
1573 /* The converse of ctf_open().  ctf_open() disguises whatever it opens as an
1574    archive, so closing one is just like closing an archive.  */
1575 void
1576 ctf_close (ctf_archive_t *arc)
1577 {
1578   ctf_arc_close (arc);
1579 }
1580
1581 /* Get the CTF archive from which this ctf_file_t is derived.  */
1582 ctf_archive_t *
1583 ctf_get_arc (const ctf_file_t *fp)
1584 {
1585   return fp->ctf_archive;
1586 }
1587
1588 /* Return the ctfsect out of the core ctf_impl.  Useful for freeing the
1589    ctfsect's data * after ctf_file_close(), which is why we return the actual
1590    structure, not a pointer to it, since that is likely to become a pointer to
1591    freed data before the return value is used under the expected use case of
1592    ctf_getsect()/ ctf_file_close()/free().  */
1593 extern ctf_sect_t
1594 ctf_getdatasect (const ctf_file_t *fp)
1595 {
1596   return fp->ctf_data;
1597 }
1598
1599 /* Return the CTF handle for the parent CTF container, if one exists.
1600    Otherwise return NULL to indicate this container has no imported parent.  */
1601 ctf_file_t *
1602 ctf_parent_file (ctf_file_t *fp)
1603 {
1604   return fp->ctf_parent;
1605 }
1606
1607 /* Return the name of the parent CTF container, if one exists.  Otherwise
1608    return NULL to indicate this container is a root container.  */
1609 const char *
1610 ctf_parent_name (ctf_file_t *fp)
1611 {
1612   return fp->ctf_parname;
1613 }
1614
1615 /* Set the parent name.  It is an error to call this routine without calling
1616    ctf_import() at some point.  */
1617 void
1618 ctf_parent_name_set (ctf_file_t *fp, const char *name)
1619 {
1620   if (fp->ctf_dynparname != NULL)
1621     ctf_free (fp->ctf_dynparname);
1622
1623   fp->ctf_dynparname = ctf_strdup (name);
1624   fp->ctf_parname = fp->ctf_dynparname;
1625 }
1626
1627 /* Import the types from the specified parent container by storing a pointer
1628    to it in ctf_parent and incrementing its reference count.  Only one parent
1629    is allowed: if a parent already exists, it is replaced by the new parent.  */
1630 int
1631 ctf_import (ctf_file_t *fp, ctf_file_t *pfp)
1632 {
1633   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1634     return (ctf_set_errno (fp, EINVAL));
1635
1636   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1637     return (ctf_set_errno (fp, ECTF_DMODEL));
1638
1639   if (fp->ctf_parent != NULL)
1640     ctf_file_close (fp->ctf_parent);
1641
1642   if (pfp != NULL)
1643     {
1644       fp->ctf_flags |= LCTF_CHILD;
1645       pfp->ctf_refcnt++;
1646
1647       if (fp->ctf_parname == NULL)
1648         ctf_parent_name_set (fp, "PARENT");
1649     }
1650   fp->ctf_parent = pfp;
1651   return 0;
1652 }
1653
1654 /* Set the data model constant for the CTF container.  */
1655 int
1656 ctf_setmodel (ctf_file_t *fp, int model)
1657 {
1658   const ctf_dmodel_t *dp;
1659
1660   for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
1661     {
1662       if (dp->ctd_code == model)
1663         {
1664           fp->ctf_dmodel = dp;
1665           return 0;
1666         }
1667     }
1668
1669   return (ctf_set_errno (fp, EINVAL));
1670 }
1671
1672 /* Return the data model constant for the CTF container.  */
1673 int
1674 ctf_getmodel (ctf_file_t *fp)
1675 {
1676   return fp->ctf_dmodel->ctd_code;
1677 }
1678
1679 /* The caller can hang an arbitrary pointer off each ctf_file_t using this
1680    function.  */
1681 void
1682 ctf_setspecific (ctf_file_t *fp, void *data)
1683 {
1684   fp->ctf_specific = data;
1685 }
1686
1687 /* Retrieve the arbitrary pointer again.  */
1688 void *
1689 ctf_getspecific (ctf_file_t *fp)
1690 {
1691   return fp->ctf_specific;
1692 }