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