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