]> Git Repo - binutils.git/blob - libctf/ctf-open.c
libctf: map from old to corresponding newly-added types in ctf_add_type
[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
990   for (ssize_t i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
991     {
992       swap_thing (lbl->ctl_label);
993       swap_thing (lbl->ctl_type);
994     }
995 }
996
997 /* Flip the endianness of the data-object or function sections or their indexes,
998    all arrays of uint32_t.  (The function section has more internal structure,
999    but that structure is an array of uint32_t, so can be treated as one big
1000    array for byte-swapping.)  */
1001
1002 static void
1003 flip_objts (void *start, size_t len)
1004 {
1005   uint32_t *obj = start;
1006
1007   for (ssize_t i = len / sizeof (uint32_t); i > 0; obj++, i--)
1008       swap_thing (*obj);
1009 }
1010
1011 /* Flip the endianness of the variable section, an array of ctf_varent_t.  */
1012
1013 static void
1014 flip_vars (void *start, size_t len)
1015 {
1016   ctf_varent_t *var = start;
1017
1018   for (ssize_t i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
1019     {
1020       swap_thing (var->ctv_name);
1021       swap_thing (var->ctv_type);
1022     }
1023 }
1024
1025 /* Flip the endianness of the type section, a tagged array of ctf_type or
1026    ctf_stype followed by variable data.  */
1027
1028 static int
1029 flip_types (void *start, size_t len)
1030 {
1031   ctf_type_t *t = start;
1032
1033   while ((uintptr_t) t < ((uintptr_t) start) + len)
1034     {
1035       swap_thing (t->ctt_name);
1036       swap_thing (t->ctt_info);
1037       swap_thing (t->ctt_size);
1038
1039       uint32_t kind = CTF_V2_INFO_KIND (t->ctt_info);
1040       size_t size = t->ctt_size;
1041       uint32_t vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1042       size_t vbytes = get_vbytes_v2 (kind, size, vlen);
1043
1044       if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1045         {
1046           swap_thing (t->ctt_lsizehi);
1047           swap_thing (t->ctt_lsizelo);
1048           size = CTF_TYPE_LSIZE (t);
1049           t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1050         }
1051       else
1052         t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1053
1054       switch (kind)
1055         {
1056         case CTF_K_FORWARD:
1057         case CTF_K_UNKNOWN:
1058         case CTF_K_POINTER:
1059         case CTF_K_TYPEDEF:
1060         case CTF_K_VOLATILE:
1061         case CTF_K_CONST:
1062         case CTF_K_RESTRICT:
1063           /* These types have no vlen data to swap.  */
1064           assert (vbytes == 0);
1065           break;
1066
1067         case CTF_K_INTEGER:
1068         case CTF_K_FLOAT:
1069           {
1070             /* These types have a single uint32_t.  */
1071
1072             uint32_t *item = (uint32_t *) t;
1073
1074             swap_thing (*item);
1075             break;
1076           }
1077
1078         case CTF_K_FUNCTION:
1079           {
1080             /* This type has a bunch of uint32_ts.  */
1081
1082             uint32_t *item = (uint32_t *) t;
1083
1084             for (ssize_t i = vlen; i > 0; item++, i--)
1085               swap_thing (*item);
1086             break;
1087           }
1088
1089         case CTF_K_ARRAY:
1090           {
1091             /* This has a single ctf_array_t.  */
1092
1093             ctf_array_t *a = (ctf_array_t *) t;
1094
1095             assert (vbytes == sizeof (ctf_array_t));
1096             swap_thing (a->cta_contents);
1097             swap_thing (a->cta_index);
1098             swap_thing (a->cta_nelems);
1099
1100             break;
1101           }
1102
1103         case CTF_K_SLICE:
1104           {
1105             /* This has a single ctf_slice_t.  */
1106
1107             ctf_slice_t *s = (ctf_slice_t *) t;
1108
1109             assert (vbytes == sizeof (ctf_slice_t));
1110             swap_thing (s->cts_type);
1111             swap_thing (s->cts_offset);
1112             swap_thing (s->cts_bits);
1113
1114             break;
1115           }
1116
1117         case CTF_K_STRUCT:
1118         case CTF_K_UNION:
1119           {
1120             /* This has an array of ctf_member or ctf_lmember, depending on
1121                size.  We could consider it to be a simple array of uint32_t,
1122                but for safety's sake in case these structures ever acquire
1123                non-uint32_t members, do it member by member.  */
1124
1125             if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1126               {
1127                 ctf_lmember_t *lm = (ctf_lmember_t *) t;
1128                 for (ssize_t i = vlen; i > 0; i--, lm++)
1129                   {
1130                     swap_thing (lm->ctlm_name);
1131                     swap_thing (lm->ctlm_offsethi);
1132                     swap_thing (lm->ctlm_type);
1133                     swap_thing (lm->ctlm_offsetlo);
1134                   }
1135               }
1136             else
1137               {
1138                 ctf_member_t *m = (ctf_member_t *) t;
1139                 for (ssize_t i = vlen; i > 0; i--, m++)
1140                   {
1141                     swap_thing (m->ctm_name);
1142                     swap_thing (m->ctm_offset);
1143                     swap_thing (m->ctm_type);
1144                   }
1145               }
1146             break;
1147           }
1148
1149         case CTF_K_ENUM:
1150           {
1151             /* This has an array of ctf_enum_t.  */
1152
1153             ctf_enum_t *item = (ctf_enum_t *) t;
1154
1155             for (ssize_t i = vlen; i > 0; item++, i--)
1156               {
1157                 swap_thing (item->cte_name);
1158                 swap_thing (item->cte_value);
1159               }
1160             break;
1161           }
1162         default:
1163           ctf_dprintf ("unhandled CTF kind in endianness conversion -- %x\n",
1164                        kind);
1165           return ECTF_CORRUPT;
1166         }
1167
1168       t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1169     }
1170
1171   return 0;
1172 }
1173
1174 /* Flip the endianness of BUF, given the offsets in the (already endian-
1175    converted) CTH.
1176
1177    All of this stuff happens before the header is fully initialized, so the
1178    LCTF_*() macros cannot be used yet.  Since we do not try to endian-convert v1
1179    data, this is no real loss.  */
1180
1181 static int
1182 flip_ctf (ctf_header_t *cth, unsigned char *buf)
1183 {
1184   flip_lbls (buf + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1185   flip_objts (buf + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1186   flip_objts (buf + cth->cth_funcoff, cth->cth_objtidxoff - cth->cth_funcoff);
1187   flip_objts (buf + cth->cth_objtidxoff, cth->cth_funcidxoff - cth->cth_objtidxoff);
1188   flip_objts (buf + cth->cth_funcidxoff, cth->cth_varoff - cth->cth_funcidxoff);
1189   flip_vars (buf + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1190   return flip_types (buf + cth->cth_typeoff, cth->cth_stroff - cth->cth_typeoff);
1191 }
1192
1193 /* Open a CTF file, mocking up a suitable ctf_sect.  */
1194
1195 ctf_file_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1196                              const char *symsect, size_t symsect_size,
1197                              size_t symsect_entsize,
1198                              const char *strsect, size_t strsect_size,
1199                              int *errp)
1200 {
1201   return ctf_simple_open_internal (ctfsect, ctfsect_size, symsect, symsect_size,
1202                                    symsect_entsize, strsect, strsect_size, NULL,
1203                                    errp);
1204 }
1205
1206 /* Open a CTF file, mocking up a suitable ctf_sect and overriding the external
1207    strtab with a synthetic one.  */
1208
1209 ctf_file_t *ctf_simple_open_internal (const char *ctfsect, size_t ctfsect_size,
1210                                       const char *symsect, size_t symsect_size,
1211                                       size_t symsect_entsize,
1212                                       const char *strsect, size_t strsect_size,
1213                                       ctf_dynhash_t *syn_strtab, int *errp)
1214 {
1215   ctf_sect_t skeleton;
1216
1217   ctf_sect_t ctf_sect, sym_sect, str_sect;
1218   ctf_sect_t *ctfsectp = NULL;
1219   ctf_sect_t *symsectp = NULL;
1220   ctf_sect_t *strsectp = NULL;
1221
1222   skeleton.cts_name = _CTF_SECTION;
1223   skeleton.cts_entsize = 1;
1224
1225   if (ctfsect)
1226     {
1227       memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1228       ctf_sect.cts_data = ctfsect;
1229       ctf_sect.cts_size = ctfsect_size;
1230       ctfsectp = &ctf_sect;
1231     }
1232
1233   if (symsect)
1234     {
1235       memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1236       sym_sect.cts_data = symsect;
1237       sym_sect.cts_size = symsect_size;
1238       sym_sect.cts_entsize = symsect_entsize;
1239       symsectp = &sym_sect;
1240     }
1241
1242   if (strsect)
1243     {
1244       memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1245       str_sect.cts_data = strsect;
1246       str_sect.cts_size = strsect_size;
1247       strsectp = &str_sect;
1248     }
1249
1250   return ctf_bufopen_internal (ctfsectp, symsectp, strsectp, syn_strtab, errp);
1251 }
1252
1253 /* Decode the specified CTF buffer and optional symbol table, and create a new
1254    CTF container representing the symbolic debugging information.  This code can
1255    be used directly by the debugger, or it can be used as the engine for
1256    ctf_fdopen() or ctf_open(), below.  */
1257
1258 ctf_file_t *
1259 ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1260              const ctf_sect_t *strsect, int *errp)
1261 {
1262   return ctf_bufopen_internal (ctfsect, symsect, strsect, NULL, errp);
1263 }
1264
1265 /* Like ctf_bufopen, but overriding the external strtab with a synthetic one.  */
1266
1267 ctf_file_t *
1268 ctf_bufopen_internal (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1269                       const ctf_sect_t *strsect, ctf_dynhash_t *syn_strtab,
1270                       int *errp)
1271 {
1272   const ctf_preamble_t *pp;
1273   size_t hdrsz = sizeof (ctf_header_t);
1274   ctf_header_t *hp;
1275   ctf_file_t *fp;
1276   int foreign_endian = 0;
1277   int err;
1278
1279   libctf_init_debug();
1280
1281   if ((ctfsect == NULL) || ((symsect != NULL) &&
1282                             ((strsect == NULL) && syn_strtab == NULL)))
1283     return (ctf_set_open_errno (errp, EINVAL));
1284
1285   if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1286       symsect->cts_entsize != sizeof (Elf64_Sym))
1287     return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1288
1289   if (symsect != NULL && symsect->cts_data == NULL)
1290     return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1291
1292   if (strsect != NULL && strsect->cts_data == NULL)
1293     return (ctf_set_open_errno (errp, ECTF_STRBAD));
1294
1295   if (ctfsect->cts_size < sizeof (ctf_preamble_t))
1296     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1297
1298   pp = (const ctf_preamble_t *) ctfsect->cts_data;
1299
1300   ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1301                pp->ctp_magic, pp->ctp_version);
1302
1303   /* Validate each part of the CTF header.
1304
1305      First, we validate the preamble (common to all versions).  At that point,
1306      we know the endianness and specific header version, and can validate the
1307      version-specific parts including section offsets and alignments.
1308
1309      We specifically do not support foreign-endian old versions.  */
1310
1311   if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1312     {
1313       if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1314         {
1315           if (pp->ctp_version != CTF_VERSION_3)
1316             return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1317           foreign_endian = 1;
1318         }
1319       else
1320         return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1321     }
1322
1323   if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1324                          || (pp->ctp_version > CTF_VERSION_3)))
1325     return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1326
1327   if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1328     {
1329       /* The symtab can contain function entries which contain embedded ctf
1330          info.  We do not support dynamically upgrading such entries (none
1331          should exist in any case, since dwarf2ctf does not create them).  */
1332
1333       ctf_dprintf ("ctf_bufopen: CTF version %d symsect not "
1334                    "supported\n", pp->ctp_version);
1335       return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1336     }
1337
1338   if (pp->ctp_version < CTF_VERSION_3)
1339     hdrsz = sizeof (ctf_header_v2_t);
1340
1341   if (ctfsect->cts_size < hdrsz)
1342     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1343
1344   if ((fp = ctf_alloc (sizeof (ctf_file_t))) == NULL)
1345     return (ctf_set_open_errno (errp, ENOMEM));
1346
1347   memset (fp, 0, sizeof (ctf_file_t));
1348
1349   if ((fp->ctf_header = ctf_alloc (sizeof (struct ctf_header))) == NULL)
1350     {
1351       ctf_free (fp);
1352       return (ctf_set_open_errno (errp, ENOMEM));
1353     }
1354   hp = fp->ctf_header;
1355   memcpy (hp, ctfsect->cts_data, hdrsz);
1356   if (pp->ctp_version < CTF_VERSION_3)
1357     upgrade_header (hp);
1358
1359   if (foreign_endian)
1360     flip_header (hp);
1361   fp->ctf_openflags = hp->cth_flags;
1362   fp->ctf_size = hp->cth_stroff + hp->cth_strlen;
1363
1364   ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
1365                (unsigned long) fp->ctf_size);
1366
1367   if (hp->cth_lbloff > fp->ctf_size || hp->cth_objtoff > fp->ctf_size
1368       || hp->cth_funcoff > fp->ctf_size || hp->cth_objtidxoff > fp->ctf_size
1369       || hp->cth_funcidxoff > fp->ctf_size || hp->cth_typeoff > fp->ctf_size
1370       || hp->cth_stroff > fp->ctf_size)
1371     return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1372
1373   if (hp->cth_lbloff > hp->cth_objtoff
1374       || hp->cth_objtoff > hp->cth_funcoff
1375       || hp->cth_funcoff > hp->cth_typeoff
1376       || hp->cth_funcoff > hp->cth_objtidxoff
1377       || hp->cth_objtidxoff > hp->cth_funcidxoff
1378       || hp->cth_funcidxoff > hp->cth_varoff
1379       || hp->cth_varoff > hp->cth_typeoff || hp->cth_typeoff > hp->cth_stroff)
1380     return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1381
1382   if ((hp->cth_lbloff & 3) || (hp->cth_objtoff & 2)
1383       || (hp->cth_funcoff & 2) || (hp->cth_objtidxoff & 2)
1384       || (hp->cth_funcidxoff & 2) || (hp->cth_varoff & 3)
1385       || (hp->cth_typeoff & 3))
1386     return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1387
1388   /* Once everything is determined to be valid, attempt to decompress the CTF
1389      data buffer if it is compressed, or copy it into new storage if it is not
1390      compressed but needs endian-flipping.  Otherwise we just put the data
1391      section's buffer pointer into ctf_buf, below.  */
1392
1393   /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1394      init_types().  */
1395
1396   if (hp->cth_flags & CTF_F_COMPRESS)
1397     {
1398       size_t srclen;
1399       uLongf dstlen;
1400       const void *src;
1401       int rc = Z_OK;
1402
1403       /* We are allocating this ourselves, so we can drop the ctf header
1404          copy in favour of ctf->ctf_header.  */
1405
1406       if ((fp->ctf_base = ctf_alloc (fp->ctf_size)) == NULL)
1407         {
1408           err = ECTF_ZALLOC;
1409           goto bad;
1410         }
1411       fp->ctf_dynbase = fp->ctf_base;
1412       hp->cth_flags &= ~CTF_F_COMPRESS;
1413
1414       src = (unsigned char *) ctfsect->cts_data + hdrsz;
1415       srclen = ctfsect->cts_size - hdrsz;
1416       dstlen = fp->ctf_size;
1417       fp->ctf_buf = fp->ctf_base;
1418
1419       if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
1420         {
1421           ctf_dprintf ("zlib inflate err: %s\n", zError (rc));
1422           err = ECTF_DECOMPRESS;
1423           goto bad;
1424         }
1425
1426       if ((size_t) dstlen != fp->ctf_size)
1427         {
1428           ctf_dprintf ("zlib inflate short -- got %lu of %lu "
1429                        "bytes\n", (unsigned long) dstlen,
1430                        (unsigned long) fp->ctf_size);
1431           err = ECTF_CORRUPT;
1432           goto bad;
1433         }
1434     }
1435   else if (foreign_endian)
1436     {
1437       if ((fp->ctf_base = ctf_alloc (fp->ctf_size)) == NULL)
1438         {
1439           err = ECTF_ZALLOC;
1440           goto bad;
1441         }
1442       fp->ctf_dynbase = fp->ctf_base;
1443       memcpy (fp->ctf_base, ((unsigned char *) ctfsect->cts_data) + hdrsz,
1444               fp->ctf_size);
1445       fp->ctf_buf = fp->ctf_base;
1446     }
1447   else
1448     {
1449       /* We are just using the section passed in -- but its header may be an old
1450          version.  Point ctf_buf past the old header, and never touch it
1451          again.  */
1452       fp->ctf_base = (unsigned char *) ctfsect->cts_data;
1453       fp->ctf_dynbase = NULL;
1454       fp->ctf_buf = fp->ctf_base + hdrsz;
1455     }
1456
1457   /* Once we have uncompressed and validated the CTF data buffer, we can
1458      proceed with initializing the ctf_file_t we allocated above.
1459
1460      Nothing that depends on buf or base should be set directly in this function
1461      before the init_types() call, because it may be reallocated during
1462      transparent upgrade if this recension of libctf is so configured: see
1463      ctf_set_base().  */
1464
1465   ctf_set_version (fp, hp, hp->cth_version);
1466   ctf_str_create_atoms (fp);
1467   fp->ctf_parmax = CTF_MAX_PTYPE;
1468   memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1469
1470   if (symsect != NULL)
1471     {
1472       memcpy (&fp->ctf_symtab, symsect, sizeof (ctf_sect_t));
1473       memcpy (&fp->ctf_strtab, strsect, sizeof (ctf_sect_t));
1474     }
1475
1476   if (fp->ctf_data.cts_name != NULL)
1477     fp->ctf_data.cts_name = ctf_strdup (fp->ctf_data.cts_name);
1478   if (fp->ctf_symtab.cts_name != NULL)
1479     fp->ctf_symtab.cts_name = ctf_strdup (fp->ctf_symtab.cts_name);
1480   if (fp->ctf_strtab.cts_name != NULL)
1481     fp->ctf_strtab.cts_name = ctf_strdup (fp->ctf_strtab.cts_name);
1482
1483   if (fp->ctf_data.cts_name == NULL)
1484     fp->ctf_data.cts_name = _CTF_NULLSTR;
1485   if (fp->ctf_symtab.cts_name == NULL)
1486     fp->ctf_symtab.cts_name = _CTF_NULLSTR;
1487   if (fp->ctf_strtab.cts_name == NULL)
1488     fp->ctf_strtab.cts_name = _CTF_NULLSTR;
1489
1490   if (strsect != NULL)
1491     {
1492       fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1493       fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1494     }
1495   fp->ctf_syn_ext_strtab = syn_strtab;
1496
1497   if (foreign_endian &&
1498       (err = flip_ctf (hp, fp->ctf_buf)) != 0)
1499     {
1500       /* We can be certain that flip_ctf() will have endian-flipped everything
1501          other than the types table when we return.  In particular the header
1502          is fine, so set it, to allow freeing to use the usual code path.  */
1503
1504       ctf_set_base (fp, hp, fp->ctf_base);
1505       goto bad;
1506     }
1507
1508   ctf_set_base (fp, hp, fp->ctf_base);
1509
1510   if ((err = init_types (fp, hp)) != 0)
1511     goto bad;
1512
1513   /* If we have a symbol table section, allocate and initialize
1514      the symtab translation table, pointed to by ctf_sxlate.  This table may be
1515      too large for the actual size of the object and function info sections: if
1516      so, ctf_nsyms will be adjusted and the excess will never be used.  */
1517
1518   if (symsect != NULL)
1519     {
1520       fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1521       fp->ctf_sxlate = ctf_alloc (fp->ctf_nsyms * sizeof (uint32_t));
1522
1523       if (fp->ctf_sxlate == NULL)
1524         {
1525           err = ENOMEM;
1526           goto bad;
1527         }
1528
1529       if ((err = init_symtab (fp, hp, symsect, strsect)) != 0)
1530         goto bad;
1531     }
1532
1533   /* Initialize the ctf_lookup_by_name top-level dictionary.  We keep an
1534      array of type name prefixes and the corresponding ctf_hash to use.
1535      NOTE: This code must be kept in sync with the code in ctf_update().  */
1536   fp->ctf_lookups[0].ctl_prefix = "struct";
1537   fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1538   fp->ctf_lookups[0].ctl_hash = fp->ctf_structs;
1539   fp->ctf_lookups[1].ctl_prefix = "union";
1540   fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1541   fp->ctf_lookups[1].ctl_hash = fp->ctf_unions;
1542   fp->ctf_lookups[2].ctl_prefix = "enum";
1543   fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1544   fp->ctf_lookups[2].ctl_hash = fp->ctf_enums;
1545   fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1546   fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1547   fp->ctf_lookups[3].ctl_hash = fp->ctf_names;
1548   fp->ctf_lookups[4].ctl_prefix = NULL;
1549   fp->ctf_lookups[4].ctl_len = 0;
1550   fp->ctf_lookups[4].ctl_hash = NULL;
1551
1552   if (symsect != NULL)
1553     {
1554       if (symsect->cts_entsize == sizeof (Elf64_Sym))
1555         (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1556       else
1557         (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1558     }
1559   else
1560     (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1561
1562   fp->ctf_refcnt = 1;
1563   return fp;
1564
1565 bad:
1566   ctf_set_open_errno (errp, err);
1567   ctf_file_close (fp);
1568   return NULL;
1569 }
1570
1571 /* Close the specified CTF container and free associated data structures.  Note
1572    that ctf_file_close() is a reference counted operation: if the specified file
1573    is the parent of other active containers, its reference count will be greater
1574    than one and it will be freed later when no active children exist.  */
1575
1576 void
1577 ctf_file_close (ctf_file_t *fp)
1578 {
1579   ctf_dtdef_t *dtd, *ntd;
1580   ctf_dvdef_t *dvd, *nvd;
1581
1582   if (fp == NULL)
1583     return;                /* Allow ctf_file_close(NULL) to simplify caller code.  */
1584
1585   ctf_dprintf ("ctf_file_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1586
1587   if (fp->ctf_refcnt > 1)
1588     {
1589       fp->ctf_refcnt--;
1590       return;
1591     }
1592
1593   ctf_free (fp->ctf_dyncuname);
1594   ctf_free (fp->ctf_dynparname);
1595   ctf_file_close (fp->ctf_parent);
1596
1597   for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1598     {
1599       ntd = ctf_list_next (dtd);
1600       ctf_dtd_delete (fp, dtd);
1601     }
1602   ctf_dynhash_destroy (fp->ctf_dthash);
1603   ctf_dynhash_destroy (fp->ctf_dtbyname);
1604
1605   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1606     {
1607       nvd = ctf_list_next (dvd);
1608       ctf_dvd_delete (fp, dvd);
1609     }
1610   ctf_dynhash_destroy (fp->ctf_dvhash);
1611   ctf_str_free_atoms (fp);
1612   ctf_free (fp->ctf_tmp_typeslice);
1613
1614   if (fp->ctf_data.cts_name != _CTF_NULLSTR)
1615     ctf_free ((char *) fp->ctf_data.cts_name);
1616
1617   if (fp->ctf_symtab.cts_name != _CTF_NULLSTR)
1618     ctf_free ((char *) fp->ctf_symtab.cts_name);
1619
1620   if (fp->ctf_strtab.cts_name != _CTF_NULLSTR)
1621     ctf_free ((char *) fp->ctf_strtab.cts_name);
1622   else if (fp->ctf_data_mmapped)
1623     ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1624
1625   ctf_free (fp->ctf_dynbase);
1626
1627   ctf_dynhash_destroy (fp->ctf_syn_ext_strtab);
1628   ctf_dynhash_destroy (fp->ctf_link_inputs);
1629   ctf_dynhash_destroy (fp->ctf_link_outputs);
1630   ctf_dynhash_destroy (fp->ctf_link_type_mapping);
1631
1632   ctf_free (fp->ctf_sxlate);
1633   ctf_free (fp->ctf_txlate);
1634   ctf_free (fp->ctf_ptrtab);
1635
1636   ctf_hash_destroy (fp->ctf_structs);
1637   ctf_hash_destroy (fp->ctf_unions);
1638   ctf_hash_destroy (fp->ctf_enums);
1639   ctf_hash_destroy (fp->ctf_names);
1640
1641   ctf_free (fp->ctf_header);
1642   ctf_free (fp);
1643 }
1644
1645 /* The converse of ctf_open().  ctf_open() disguises whatever it opens as an
1646    archive, so closing one is just like closing an archive.  */
1647 void
1648 ctf_close (ctf_archive_t *arc)
1649 {
1650   ctf_arc_close (arc);
1651 }
1652
1653 /* Get the CTF archive from which this ctf_file_t is derived.  */
1654 ctf_archive_t *
1655 ctf_get_arc (const ctf_file_t *fp)
1656 {
1657   return fp->ctf_archive;
1658 }
1659
1660 /* Return the ctfsect out of the core ctf_impl.  Useful for freeing the
1661    ctfsect's data * after ctf_file_close(), which is why we return the actual
1662    structure, not a pointer to it, since that is likely to become a pointer to
1663    freed data before the return value is used under the expected use case of
1664    ctf_getsect()/ ctf_file_close()/free().  */
1665 extern ctf_sect_t
1666 ctf_getdatasect (const ctf_file_t *fp)
1667 {
1668   return fp->ctf_data;
1669 }
1670
1671 /* Return the CTF handle for the parent CTF container, if one exists.
1672    Otherwise return NULL to indicate this container has no imported parent.  */
1673 ctf_file_t *
1674 ctf_parent_file (ctf_file_t *fp)
1675 {
1676   return fp->ctf_parent;
1677 }
1678
1679 /* Return the name of the parent CTF container, if one exists.  Otherwise
1680    return NULL to indicate this container is a root container.  */
1681 const char *
1682 ctf_parent_name (ctf_file_t *fp)
1683 {
1684   return fp->ctf_parname;
1685 }
1686
1687 /* Set the parent name.  It is an error to call this routine without calling
1688    ctf_import() at some point.  */
1689 void
1690 ctf_parent_name_set (ctf_file_t *fp, const char *name)
1691 {
1692   if (fp->ctf_dynparname != NULL)
1693     ctf_free (fp->ctf_dynparname);
1694
1695   fp->ctf_dynparname = ctf_strdup (name);
1696   fp->ctf_parname = fp->ctf_dynparname;
1697 }
1698
1699 /* Return the name of the compilation unit this CTF file applies to.  Usually
1700    non-NULL only for non-parent containers.  */
1701 const char *
1702 ctf_cuname (ctf_file_t *fp)
1703 {
1704   return fp->ctf_cuname;
1705 }
1706
1707 /* Set the compilation unit name.  */
1708 void
1709 ctf_cuname_set (ctf_file_t *fp, const char *name)
1710 {
1711   if (fp->ctf_dyncuname != NULL)
1712     ctf_free (fp->ctf_dyncuname);
1713
1714   fp->ctf_dyncuname = ctf_strdup (name);
1715   fp->ctf_cuname = fp->ctf_dyncuname;
1716 }
1717
1718 /* Import the types from the specified parent container by storing a pointer
1719    to it in ctf_parent and incrementing its reference count.  Only one parent
1720    is allowed: if a parent already exists, it is replaced by the new parent.  */
1721 int
1722 ctf_import (ctf_file_t *fp, ctf_file_t *pfp)
1723 {
1724   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1725     return (ctf_set_errno (fp, EINVAL));
1726
1727   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1728     return (ctf_set_errno (fp, ECTF_DMODEL));
1729
1730   if (fp->ctf_parent != NULL)
1731     ctf_file_close (fp->ctf_parent);
1732
1733   if (pfp != NULL)
1734     {
1735       fp->ctf_flags |= LCTF_CHILD;
1736       pfp->ctf_refcnt++;
1737
1738       if (fp->ctf_parname == NULL)
1739         ctf_parent_name_set (fp, "PARENT");
1740     }
1741   fp->ctf_parent = pfp;
1742   return 0;
1743 }
1744
1745 /* Set the data model constant for the CTF container.  */
1746 int
1747 ctf_setmodel (ctf_file_t *fp, int model)
1748 {
1749   const ctf_dmodel_t *dp;
1750
1751   for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
1752     {
1753       if (dp->ctd_code == model)
1754         {
1755           fp->ctf_dmodel = dp;
1756           return 0;
1757         }
1758     }
1759
1760   return (ctf_set_errno (fp, EINVAL));
1761 }
1762
1763 /* Return the data model constant for the CTF container.  */
1764 int
1765 ctf_getmodel (ctf_file_t *fp)
1766 {
1767   return fp->ctf_dmodel->ctd_code;
1768 }
1769
1770 /* The caller can hang an arbitrary pointer off each ctf_file_t using this
1771    function.  */
1772 void
1773 ctf_setspecific (ctf_file_t *fp, void *data)
1774 {
1775   fp->ctf_specific = data;
1776 }
1777
1778 /* Retrieve the arbitrary pointer again.  */
1779 void *
1780 ctf_getspecific (ctf_file_t *fp)
1781 {
1782   return fp->ctf_specific;
1783 }
This page took 0.124122 seconds and 4 git commands to generate.