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