]> Git Repo - binutils.git/blob - libctf/ctf-open.c
libctf: add ctf_ref
[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 #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 = malloc (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   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   uint32_t id, dst;
659   uint32_t *xp;
660
661   /* We determine whether the container is a child or a parent based on
662      the value of cth_parname.  */
663
664   int child = cth->cth_parname != 0;
665   int nlstructs = 0, nlunions = 0;
666   int err;
667
668   assert (!(fp->ctf_flags & LCTF_RDWR));
669
670   if (_libctf_unlikely_ (fp->ctf_version == CTF_VERSION_1))
671     {
672       int err;
673       if ((err = upgrade_types (fp, cth)) != 0)
674         return err;                             /* Upgrade failed.  */
675     }
676
677   tbuf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
678   tend = (ctf_type_t *) (fp->ctf_buf + cth->cth_stroff);
679
680   /* We make two passes through the entire type section.  In this first
681      pass, we count the number of each type and the total number of types.  */
682
683   for (tp = tbuf; tp < tend; fp->ctf_typemax++)
684     {
685       unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
686       unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
687       ssize_t size, increment, vbytes;
688
689       (void) ctf_get_ctt_size (fp, tp, &size, &increment);
690       vbytes = LCTF_VBYTES (fp, kind, size, vlen);
691
692       if (vbytes < 0)
693         return ECTF_CORRUPT;
694
695       /* For forward declarations, ctt_type is the CTF_K_* kind for the tag,
696          so bump that population count too.  */
697       if (kind == CTF_K_FORWARD)
698         pop[tp->ctt_type]++;
699
700       tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
701       pop[kind]++;
702     }
703
704   if (child)
705     {
706       ctf_dprintf ("CTF container %p is a child\n", (void *) fp);
707       fp->ctf_flags |= LCTF_CHILD;
708     }
709   else
710     ctf_dprintf ("CTF container %p is a parent\n", (void *) fp);
711
712   /* Now that we've counted up the number of each type, we can allocate
713      the hash tables, type translation table, and pointer table.  */
714
715   if ((fp->ctf_structs.ctn_readonly
716        = ctf_hash_create (pop[CTF_K_STRUCT], ctf_hash_string,
717                           ctf_hash_eq_string)) == NULL)
718     return ENOMEM;
719
720   if ((fp->ctf_unions.ctn_readonly
721        = ctf_hash_create (pop[CTF_K_UNION], ctf_hash_string,
722                           ctf_hash_eq_string)) == NULL)
723     return ENOMEM;
724
725   if ((fp->ctf_enums.ctn_readonly
726        = ctf_hash_create (pop[CTF_K_ENUM], ctf_hash_string,
727                           ctf_hash_eq_string)) == NULL)
728     return ENOMEM;
729
730   if ((fp->ctf_names.ctn_readonly
731        = ctf_hash_create (pop[CTF_K_INTEGER] +
732                           pop[CTF_K_FLOAT] +
733                           pop[CTF_K_FUNCTION] +
734                           pop[CTF_K_TYPEDEF] +
735                           pop[CTF_K_POINTER] +
736                           pop[CTF_K_VOLATILE] +
737                           pop[CTF_K_CONST] +
738                           pop[CTF_K_RESTRICT],
739                           ctf_hash_string,
740                           ctf_hash_eq_string)) == NULL)
741     return ENOMEM;
742
743   fp->ctf_txlate = malloc (sizeof (uint32_t) * (fp->ctf_typemax + 1));
744   fp->ctf_ptrtab_len = fp->ctf_typemax + 1;
745   fp->ctf_ptrtab = malloc (sizeof (uint32_t) * fp->ctf_ptrtab_len);
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 isroot = 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.ctn_readonly,
783                                       fp, name)) == 0)
784               || isroot)
785             {
786               err = ctf_hash_define_type (fp->ctf_names.ctn_readonly, fp,
787                                           LCTF_INDEX_TO_TYPE (fp, id, child),
788                                           tp->ctt_name);
789               if (err != 0)
790                 return err;
791             }
792           break;
793
794           /* These kinds have no name, so do not need interning into any
795              hashtables.  */
796         case CTF_K_ARRAY:
797         case CTF_K_SLICE:
798           break;
799
800         case CTF_K_FUNCTION:
801           if (!isroot)
802             break;
803
804           err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
805                                       LCTF_INDEX_TO_TYPE (fp, id, child),
806                                       tp->ctt_name);
807           if (err != 0)
808             return err;
809           break;
810
811         case CTF_K_STRUCT:
812           if (size >= CTF_LSTRUCT_THRESH)
813             nlstructs++;
814
815           if (!isroot)
816             break;
817
818           err = ctf_hash_define_type (fp->ctf_structs.ctn_readonly, fp,
819                                       LCTF_INDEX_TO_TYPE (fp, id, child),
820                                       tp->ctt_name);
821
822           if (err != 0)
823             return err;
824
825           break;
826
827         case CTF_K_UNION:
828           if (size >= CTF_LSTRUCT_THRESH)
829             nlunions++;
830
831           if (!isroot)
832             break;
833
834           err = ctf_hash_define_type (fp->ctf_unions.ctn_readonly, fp,
835                                       LCTF_INDEX_TO_TYPE (fp, id, child),
836                                       tp->ctt_name);
837
838           if (err != 0)
839             return err;
840           break;
841
842         case CTF_K_ENUM:
843           if (!isroot)
844             break;
845
846           err = ctf_hash_define_type (fp->ctf_enums.ctn_readonly, fp,
847                                       LCTF_INDEX_TO_TYPE (fp, id, child),
848                                       tp->ctt_name);
849
850           if (err != 0)
851             return err;
852           break;
853
854         case CTF_K_TYPEDEF:
855           if (!isroot)
856             break;
857
858           err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
859                                       LCTF_INDEX_TO_TYPE (fp, id, child),
860                                       tp->ctt_name);
861           if (err != 0)
862             return err;
863           break;
864
865         case CTF_K_FORWARD:
866           {
867             ctf_names_t *np = ctf_name_table (fp, tp->ctt_type);
868
869             if (!isroot)
870               break;
871
872             /* Only insert forward tags into the given hash if the type or tag
873                name is not already present.  */
874             if (ctf_hash_lookup_type (np->ctn_readonly, fp, name) == 0)
875               {
876                 err = ctf_hash_insert_type (np->ctn_readonly, fp,
877                                             LCTF_INDEX_TO_TYPE (fp, id, child),
878                                             tp->ctt_name);
879                 if (err != 0)
880                   return err;
881               }
882             break;
883           }
884
885         case CTF_K_POINTER:
886           /* If the type referenced by the pointer is in this CTF container,
887              then store the index of the pointer type in
888              fp->ctf_ptrtab[ index of referenced type ].  */
889
890           if (LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
891               && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
892             fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = id;
893          /*FALLTHRU*/
894
895         case CTF_K_VOLATILE:
896         case CTF_K_CONST:
897         case CTF_K_RESTRICT:
898           if (!isroot)
899             break;
900
901           err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
902                                       LCTF_INDEX_TO_TYPE (fp, id, child),
903                                       tp->ctt_name);
904           if (err != 0)
905             return err;
906           break;
907         default:
908           ctf_dprintf ("unhandled CTF kind in endianness conversion -- %x\n",
909                        kind);
910           return ECTF_CORRUPT;
911         }
912
913       *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
914       tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
915     }
916
917   ctf_dprintf ("%lu total types processed\n", fp->ctf_typemax);
918   ctf_dprintf ("%u enum names hashed\n",
919                ctf_hash_size (fp->ctf_enums.ctn_readonly));
920   ctf_dprintf ("%u struct names hashed (%d long)\n",
921                ctf_hash_size (fp->ctf_structs.ctn_readonly), nlstructs);
922   ctf_dprintf ("%u union names hashed (%d long)\n",
923                ctf_hash_size (fp->ctf_unions.ctn_readonly), nlunions);
924   ctf_dprintf ("%u base type names hashed\n",
925                ctf_hash_size (fp->ctf_names.ctn_readonly));
926
927   /* Make an additional pass through the pointer table to find pointers that
928      point to anonymous typedef nodes.  If we find one, modify the pointer table
929      so that the pointer is also known to point to the node that is referenced
930      by the anonymous typedef node.  */
931
932   for (id = 1; id <= fp->ctf_typemax; id++)
933     {
934       if ((dst = fp->ctf_ptrtab[id]) != 0)
935         {
936           tp = LCTF_INDEX_TO_TYPEPTR (fp, id);
937
938           if (LCTF_INFO_KIND (fp, tp->ctt_info) == CTF_K_TYPEDEF
939               && strcmp (ctf_strptr (fp, tp->ctt_name), "") == 0
940               && LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
941               && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
942               fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = dst;
943         }
944     }
945
946   return 0;
947 }
948
949 /* Endianness-flipping routines.
950
951    We flip everything, mindlessly, even 1-byte entities, so that future
952    expansions do not require changes to this code.  */
953
954 /* < C11? define away static assertions.  */
955
956 #if !defined (__STDC_VERSION__) || __STDC_VERSION__ < 201112L
957 #define _Static_assert(cond, err)
958 #endif
959
960 /* Swap the endianness of something.  */
961
962 #define swap_thing(x)                                                   \
963   do {                                                                  \
964     _Static_assert (sizeof (x) == 1 || (sizeof (x) % 2 == 0             \
965                                         && sizeof (x) <= 8),            \
966                     "Invalid size, update endianness code");            \
967     switch (sizeof (x)) {                                               \
968     case 2: x = bswap_16 (x); break;                                    \
969     case 4: x = bswap_32 (x); break;                                    \
970     case 8: x = bswap_64 (x); break;                                    \
971     case 1: /* Nothing needs doing */                                   \
972       break;                                                            \
973     }                                                                   \
974   } while (0);
975
976 /* Flip the endianness of the CTF header.  */
977
978 static void
979 flip_header (ctf_header_t *cth)
980 {
981   swap_thing (cth->cth_preamble.ctp_magic);
982   swap_thing (cth->cth_preamble.ctp_version);
983   swap_thing (cth->cth_preamble.ctp_flags);
984   swap_thing (cth->cth_parlabel);
985   swap_thing (cth->cth_parname);
986   swap_thing (cth->cth_cuname);
987   swap_thing (cth->cth_objtoff);
988   swap_thing (cth->cth_funcoff);
989   swap_thing (cth->cth_objtidxoff);
990   swap_thing (cth->cth_funcidxoff);
991   swap_thing (cth->cth_varoff);
992   swap_thing (cth->cth_typeoff);
993   swap_thing (cth->cth_stroff);
994   swap_thing (cth->cth_strlen);
995 }
996
997 /* Flip the endianness of the label section, an array of ctf_lblent_t.  */
998
999 static void
1000 flip_lbls (void *start, size_t len)
1001 {
1002   ctf_lblent_t *lbl = start;
1003   ssize_t i;
1004
1005   for (i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
1006     {
1007       swap_thing (lbl->ctl_label);
1008       swap_thing (lbl->ctl_type);
1009     }
1010 }
1011
1012 /* Flip the endianness of the data-object or function sections or their indexes,
1013    all arrays of uint32_t.  (The function section has more internal structure,
1014    but that structure is an array of uint32_t, so can be treated as one big
1015    array for byte-swapping.)  */
1016
1017 static void
1018 flip_objts (void *start, size_t len)
1019 {
1020   uint32_t *obj = start;
1021   ssize_t i;
1022
1023   for (i = len / sizeof (uint32_t); i > 0; obj++, i--)
1024       swap_thing (*obj);
1025 }
1026
1027 /* Flip the endianness of the variable section, an array of ctf_varent_t.  */
1028
1029 static void
1030 flip_vars (void *start, size_t len)
1031 {
1032   ctf_varent_t *var = start;
1033   ssize_t i;
1034
1035   for (i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
1036     {
1037       swap_thing (var->ctv_name);
1038       swap_thing (var->ctv_type);
1039     }
1040 }
1041
1042 /* Flip the endianness of the type section, a tagged array of ctf_type or
1043    ctf_stype followed by variable data.  */
1044
1045 static int
1046 flip_types (void *start, size_t len)
1047 {
1048   ctf_type_t *t = start;
1049
1050   while ((uintptr_t) t < ((uintptr_t) start) + len)
1051     {
1052       swap_thing (t->ctt_name);
1053       swap_thing (t->ctt_info);
1054       swap_thing (t->ctt_size);
1055
1056       uint32_t kind = CTF_V2_INFO_KIND (t->ctt_info);
1057       size_t size = t->ctt_size;
1058       uint32_t vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1059       size_t vbytes = get_vbytes_v2 (kind, size, vlen);
1060
1061       if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1062         {
1063           swap_thing (t->ctt_lsizehi);
1064           swap_thing (t->ctt_lsizelo);
1065           size = CTF_TYPE_LSIZE (t);
1066           t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1067         }
1068       else
1069         t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1070
1071       switch (kind)
1072         {
1073         case CTF_K_FORWARD:
1074         case CTF_K_UNKNOWN:
1075         case CTF_K_POINTER:
1076         case CTF_K_TYPEDEF:
1077         case CTF_K_VOLATILE:
1078         case CTF_K_CONST:
1079         case CTF_K_RESTRICT:
1080           /* These types have no vlen data to swap.  */
1081           assert (vbytes == 0);
1082           break;
1083
1084         case CTF_K_INTEGER:
1085         case CTF_K_FLOAT:
1086           {
1087             /* These types have a single uint32_t.  */
1088
1089             uint32_t *item = (uint32_t *) t;
1090
1091             swap_thing (*item);
1092             break;
1093           }
1094
1095         case CTF_K_FUNCTION:
1096           {
1097             /* This type has a bunch of uint32_ts.  */
1098
1099             uint32_t *item = (uint32_t *) t;
1100             ssize_t i;
1101
1102             for (i = vlen; i > 0; item++, i--)
1103               swap_thing (*item);
1104             break;
1105           }
1106
1107         case CTF_K_ARRAY:
1108           {
1109             /* This has a single ctf_array_t.  */
1110
1111             ctf_array_t *a = (ctf_array_t *) t;
1112
1113             assert (vbytes == sizeof (ctf_array_t));
1114             swap_thing (a->cta_contents);
1115             swap_thing (a->cta_index);
1116             swap_thing (a->cta_nelems);
1117
1118             break;
1119           }
1120
1121         case CTF_K_SLICE:
1122           {
1123             /* This has a single ctf_slice_t.  */
1124
1125             ctf_slice_t *s = (ctf_slice_t *) t;
1126
1127             assert (vbytes == sizeof (ctf_slice_t));
1128             swap_thing (s->cts_type);
1129             swap_thing (s->cts_offset);
1130             swap_thing (s->cts_bits);
1131
1132             break;
1133           }
1134
1135         case CTF_K_STRUCT:
1136         case CTF_K_UNION:
1137           {
1138             /* This has an array of ctf_member or ctf_lmember, depending on
1139                size.  We could consider it to be a simple array of uint32_t,
1140                but for safety's sake in case these structures ever acquire
1141                non-uint32_t members, do it member by member.  */
1142
1143             if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1144               {
1145                 ctf_lmember_t *lm = (ctf_lmember_t *) t;
1146                 ssize_t i;
1147                 for (i = vlen; i > 0; i--, lm++)
1148                   {
1149                     swap_thing (lm->ctlm_name);
1150                     swap_thing (lm->ctlm_offsethi);
1151                     swap_thing (lm->ctlm_type);
1152                     swap_thing (lm->ctlm_offsetlo);
1153                   }
1154               }
1155             else
1156               {
1157                 ctf_member_t *m = (ctf_member_t *) t;
1158                 ssize_t i;
1159                 for (i = vlen; i > 0; i--, m++)
1160                   {
1161                     swap_thing (m->ctm_name);
1162                     swap_thing (m->ctm_offset);
1163                     swap_thing (m->ctm_type);
1164                   }
1165               }
1166             break;
1167           }
1168
1169         case CTF_K_ENUM:
1170           {
1171             /* This has an array of ctf_enum_t.  */
1172
1173             ctf_enum_t *item = (ctf_enum_t *) t;
1174             ssize_t i;
1175
1176             for (i = vlen; i > 0; item++, i--)
1177               {
1178                 swap_thing (item->cte_name);
1179                 swap_thing (item->cte_value);
1180               }
1181             break;
1182           }
1183         default:
1184           ctf_dprintf ("unhandled CTF kind in endianness conversion -- %x\n",
1185                        kind);
1186           return ECTF_CORRUPT;
1187         }
1188
1189       t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1190     }
1191
1192   return 0;
1193 }
1194
1195 /* Flip the endianness of BUF, given the offsets in the (already endian-
1196    converted) CTH.
1197
1198    All of this stuff happens before the header is fully initialized, so the
1199    LCTF_*() macros cannot be used yet.  Since we do not try to endian-convert v1
1200    data, this is no real loss.  */
1201
1202 static int
1203 flip_ctf (ctf_header_t *cth, unsigned char *buf)
1204 {
1205   flip_lbls (buf + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1206   flip_objts (buf + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1207   flip_objts (buf + cth->cth_funcoff, cth->cth_objtidxoff - cth->cth_funcoff);
1208   flip_objts (buf + cth->cth_objtidxoff, cth->cth_funcidxoff - cth->cth_objtidxoff);
1209   flip_objts (buf + cth->cth_funcidxoff, cth->cth_varoff - cth->cth_funcidxoff);
1210   flip_vars (buf + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1211   return flip_types (buf + cth->cth_typeoff, cth->cth_stroff - cth->cth_typeoff);
1212 }
1213
1214 /* Set up the ctl hashes in a ctf_file_t.  Called by both writable and
1215    non-writable dictionary initialization.  */
1216 void ctf_set_ctl_hashes (ctf_file_t *fp)
1217 {
1218   /* Initialize the ctf_lookup_by_name top-level dictionary.  We keep an
1219      array of type name prefixes and the corresponding ctf_hash to use.  */
1220   fp->ctf_lookups[0].ctl_prefix = "struct";
1221   fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1222   fp->ctf_lookups[0].ctl_hash = &fp->ctf_structs;
1223   fp->ctf_lookups[1].ctl_prefix = "union";
1224   fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1225   fp->ctf_lookups[1].ctl_hash = &fp->ctf_unions;
1226   fp->ctf_lookups[2].ctl_prefix = "enum";
1227   fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1228   fp->ctf_lookups[2].ctl_hash = &fp->ctf_enums;
1229   fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1230   fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1231   fp->ctf_lookups[3].ctl_hash = &fp->ctf_names;
1232   fp->ctf_lookups[4].ctl_prefix = NULL;
1233   fp->ctf_lookups[4].ctl_len = 0;
1234   fp->ctf_lookups[4].ctl_hash = NULL;
1235 }
1236
1237 /* Open a CTF file, mocking up a suitable ctf_sect.  */
1238
1239 ctf_file_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1240                              const char *symsect, size_t symsect_size,
1241                              size_t symsect_entsize,
1242                              const char *strsect, size_t strsect_size,
1243                              int *errp)
1244 {
1245   return ctf_simple_open_internal (ctfsect, ctfsect_size, symsect, symsect_size,
1246                                    symsect_entsize, strsect, strsect_size, NULL,
1247                                    0, errp);
1248 }
1249
1250 /* Open a CTF file, mocking up a suitable ctf_sect and overriding the external
1251    strtab with a synthetic one.  */
1252
1253 ctf_file_t *ctf_simple_open_internal (const char *ctfsect, size_t ctfsect_size,
1254                                       const char *symsect, size_t symsect_size,
1255                                       size_t symsect_entsize,
1256                                       const char *strsect, size_t strsect_size,
1257                                       ctf_dynhash_t *syn_strtab, int writable,
1258                                       int *errp)
1259 {
1260   ctf_sect_t skeleton;
1261
1262   ctf_sect_t ctf_sect, sym_sect, str_sect;
1263   ctf_sect_t *ctfsectp = NULL;
1264   ctf_sect_t *symsectp = NULL;
1265   ctf_sect_t *strsectp = NULL;
1266
1267   skeleton.cts_name = _CTF_SECTION;
1268   skeleton.cts_entsize = 1;
1269
1270   if (ctfsect)
1271     {
1272       memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1273       ctf_sect.cts_data = ctfsect;
1274       ctf_sect.cts_size = ctfsect_size;
1275       ctfsectp = &ctf_sect;
1276     }
1277
1278   if (symsect)
1279     {
1280       memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1281       sym_sect.cts_data = symsect;
1282       sym_sect.cts_size = symsect_size;
1283       sym_sect.cts_entsize = symsect_entsize;
1284       symsectp = &sym_sect;
1285     }
1286
1287   if (strsect)
1288     {
1289       memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1290       str_sect.cts_data = strsect;
1291       str_sect.cts_size = strsect_size;
1292       strsectp = &str_sect;
1293     }
1294
1295   return ctf_bufopen_internal (ctfsectp, symsectp, strsectp, syn_strtab,
1296                                writable, errp);
1297 }
1298
1299 /* Decode the specified CTF buffer and optional symbol table, and create a new
1300    CTF container representing the symbolic debugging information.  This code can
1301    be used directly by the debugger, or it can be used as the engine for
1302    ctf_fdopen() or ctf_open(), below.  */
1303
1304 ctf_file_t *
1305 ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1306              const ctf_sect_t *strsect, int *errp)
1307 {
1308   return ctf_bufopen_internal (ctfsect, symsect, strsect, NULL, 0, errp);
1309 }
1310
1311 /* Like ctf_bufopen, but overriding the external strtab with a synthetic one.  */
1312
1313 ctf_file_t *
1314 ctf_bufopen_internal (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1315                       const ctf_sect_t *strsect, ctf_dynhash_t *syn_strtab,
1316                       int writable, int *errp)
1317 {
1318   const ctf_preamble_t *pp;
1319   size_t hdrsz = sizeof (ctf_header_t);
1320   ctf_header_t *hp;
1321   ctf_file_t *fp;
1322   int foreign_endian = 0;
1323   int err;
1324
1325   libctf_init_debug();
1326
1327   if ((ctfsect == NULL) || ((symsect != NULL) &&
1328                             ((strsect == NULL) && syn_strtab == NULL)))
1329     return (ctf_set_open_errno (errp, EINVAL));
1330
1331   if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1332       symsect->cts_entsize != sizeof (Elf64_Sym))
1333     return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1334
1335   if (symsect != NULL && symsect->cts_data == NULL)
1336     return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1337
1338   if (strsect != NULL && strsect->cts_data == NULL)
1339     return (ctf_set_open_errno (errp, ECTF_STRBAD));
1340
1341   if (ctfsect->cts_size < sizeof (ctf_preamble_t))
1342     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1343
1344   pp = (const ctf_preamble_t *) ctfsect->cts_data;
1345
1346   ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1347                pp->ctp_magic, pp->ctp_version);
1348
1349   /* Validate each part of the CTF header.
1350
1351      First, we validate the preamble (common to all versions).  At that point,
1352      we know the endianness and specific header version, and can validate the
1353      version-specific parts including section offsets and alignments.
1354
1355      We specifically do not support foreign-endian old versions.  */
1356
1357   if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1358     {
1359       if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1360         {
1361           if (pp->ctp_version != CTF_VERSION_3)
1362             return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1363           foreign_endian = 1;
1364         }
1365       else
1366         return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1367     }
1368
1369   if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1370                          || (pp->ctp_version > CTF_VERSION_3)))
1371     return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1372
1373   if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1374     {
1375       /* The symtab can contain function entries which contain embedded ctf
1376          info.  We do not support dynamically upgrading such entries (none
1377          should exist in any case, since dwarf2ctf does not create them).  */
1378
1379       ctf_dprintf ("ctf_bufopen: CTF version %d symsect not "
1380                    "supported\n", pp->ctp_version);
1381       return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1382     }
1383
1384   if (pp->ctp_version < CTF_VERSION_3)
1385     hdrsz = sizeof (ctf_header_v2_t);
1386
1387   if (ctfsect->cts_size < hdrsz)
1388     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1389
1390   if ((fp = malloc (sizeof (ctf_file_t))) == NULL)
1391     return (ctf_set_open_errno (errp, ENOMEM));
1392
1393   memset (fp, 0, sizeof (ctf_file_t));
1394
1395   if (writable)
1396     fp->ctf_flags |= LCTF_RDWR;
1397
1398   if ((fp->ctf_header = malloc (sizeof (struct ctf_header))) == NULL)
1399     {
1400       free (fp);
1401       return (ctf_set_open_errno (errp, ENOMEM));
1402     }
1403   hp = fp->ctf_header;
1404   memcpy (hp, ctfsect->cts_data, hdrsz);
1405   if (pp->ctp_version < CTF_VERSION_3)
1406     upgrade_header (hp);
1407
1408   if (foreign_endian)
1409     flip_header (hp);
1410   fp->ctf_openflags = hp->cth_flags;
1411   fp->ctf_size = hp->cth_stroff + hp->cth_strlen;
1412
1413   ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
1414                (unsigned long) fp->ctf_size);
1415
1416   if (hp->cth_lbloff > fp->ctf_size || hp->cth_objtoff > fp->ctf_size
1417       || hp->cth_funcoff > fp->ctf_size || hp->cth_objtidxoff > fp->ctf_size
1418       || hp->cth_funcidxoff > fp->ctf_size || hp->cth_typeoff > fp->ctf_size
1419       || hp->cth_stroff > fp->ctf_size)
1420     return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1421
1422   if (hp->cth_lbloff > hp->cth_objtoff
1423       || hp->cth_objtoff > hp->cth_funcoff
1424       || hp->cth_funcoff > hp->cth_typeoff
1425       || hp->cth_funcoff > hp->cth_objtidxoff
1426       || hp->cth_objtidxoff > hp->cth_funcidxoff
1427       || hp->cth_funcidxoff > hp->cth_varoff
1428       || hp->cth_varoff > hp->cth_typeoff || hp->cth_typeoff > hp->cth_stroff)
1429     return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1430
1431   if ((hp->cth_lbloff & 3) || (hp->cth_objtoff & 2)
1432       || (hp->cth_funcoff & 2) || (hp->cth_objtidxoff & 2)
1433       || (hp->cth_funcidxoff & 2) || (hp->cth_varoff & 3)
1434       || (hp->cth_typeoff & 3))
1435     return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1436
1437   /* Once everything is determined to be valid, attempt to decompress the CTF
1438      data buffer if it is compressed, or copy it into new storage if it is not
1439      compressed but needs endian-flipping.  Otherwise we just put the data
1440      section's buffer pointer into ctf_buf, below.  */
1441
1442   /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1443      init_types().  */
1444
1445   if (hp->cth_flags & CTF_F_COMPRESS)
1446     {
1447       size_t srclen;
1448       uLongf dstlen;
1449       const void *src;
1450       int rc = Z_OK;
1451
1452       /* We are allocating this ourselves, so we can drop the ctf header
1453          copy in favour of ctf->ctf_header.  */
1454
1455       if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1456         {
1457           err = ECTF_ZALLOC;
1458           goto bad;
1459         }
1460       fp->ctf_dynbase = fp->ctf_base;
1461       hp->cth_flags &= ~CTF_F_COMPRESS;
1462
1463       src = (unsigned char *) ctfsect->cts_data + hdrsz;
1464       srclen = ctfsect->cts_size - hdrsz;
1465       dstlen = fp->ctf_size;
1466       fp->ctf_buf = fp->ctf_base;
1467
1468       if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
1469         {
1470           ctf_dprintf ("zlib inflate err: %s\n", zError (rc));
1471           err = ECTF_DECOMPRESS;
1472           goto bad;
1473         }
1474
1475       if ((size_t) dstlen != fp->ctf_size)
1476         {
1477           ctf_dprintf ("zlib inflate short -- got %lu of %lu "
1478                        "bytes\n", (unsigned long) dstlen,
1479                        (unsigned long) fp->ctf_size);
1480           err = ECTF_CORRUPT;
1481           goto bad;
1482         }
1483     }
1484   else if (foreign_endian)
1485     {
1486       if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1487         {
1488           err = ECTF_ZALLOC;
1489           goto bad;
1490         }
1491       fp->ctf_dynbase = fp->ctf_base;
1492       memcpy (fp->ctf_base, ((unsigned char *) ctfsect->cts_data) + hdrsz,
1493               fp->ctf_size);
1494       fp->ctf_buf = fp->ctf_base;
1495     }
1496   else
1497     {
1498       /* We are just using the section passed in -- but its header may be an old
1499          version.  Point ctf_buf past the old header, and never touch it
1500          again.  */
1501       fp->ctf_base = (unsigned char *) ctfsect->cts_data;
1502       fp->ctf_dynbase = NULL;
1503       fp->ctf_buf = fp->ctf_base + hdrsz;
1504     }
1505
1506   /* Once we have uncompressed and validated the CTF data buffer, we can
1507      proceed with initializing the ctf_file_t we allocated above.
1508
1509      Nothing that depends on buf or base should be set directly in this function
1510      before the init_types() call, because it may be reallocated during
1511      transparent upgrade if this recension of libctf is so configured: see
1512      ctf_set_base().  */
1513
1514   ctf_set_version (fp, hp, hp->cth_version);
1515   ctf_str_create_atoms (fp);
1516   fp->ctf_parmax = CTF_MAX_PTYPE;
1517   memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1518
1519   if (symsect != NULL)
1520     {
1521       memcpy (&fp->ctf_symtab, symsect, sizeof (ctf_sect_t));
1522       memcpy (&fp->ctf_strtab, strsect, sizeof (ctf_sect_t));
1523     }
1524
1525   if (fp->ctf_data.cts_name != NULL)
1526     if ((fp->ctf_data.cts_name = strdup (fp->ctf_data.cts_name)) == NULL)
1527       {
1528         err = ENOMEM;
1529         goto bad;
1530       }
1531   if (fp->ctf_symtab.cts_name != NULL)
1532     if ((fp->ctf_symtab.cts_name = strdup (fp->ctf_symtab.cts_name)) == NULL)
1533       {
1534         err = ENOMEM;
1535         goto bad;
1536       }
1537   if (fp->ctf_strtab.cts_name != NULL)
1538     if ((fp->ctf_strtab.cts_name = strdup (fp->ctf_strtab.cts_name)) == NULL)
1539       {
1540         err = ENOMEM;
1541         goto bad;
1542       }
1543
1544   if (fp->ctf_data.cts_name == NULL)
1545     fp->ctf_data.cts_name = _CTF_NULLSTR;
1546   if (fp->ctf_symtab.cts_name == NULL)
1547     fp->ctf_symtab.cts_name = _CTF_NULLSTR;
1548   if (fp->ctf_strtab.cts_name == NULL)
1549     fp->ctf_strtab.cts_name = _CTF_NULLSTR;
1550
1551   if (strsect != NULL)
1552     {
1553       fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1554       fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1555     }
1556   fp->ctf_syn_ext_strtab = syn_strtab;
1557
1558   if (foreign_endian &&
1559       (err = flip_ctf (hp, fp->ctf_buf)) != 0)
1560     {
1561       /* We can be certain that flip_ctf() will have endian-flipped everything
1562          other than the types table when we return.  In particular the header
1563          is fine, so set it, to allow freeing to use the usual code path.  */
1564
1565       ctf_set_base (fp, hp, fp->ctf_base);
1566       goto bad;
1567     }
1568
1569   ctf_set_base (fp, hp, fp->ctf_base);
1570
1571   /* No need to do anything else for dynamic containers: they do not support
1572      symbol lookups, and the type table is maintained in the dthashes.  */
1573   if (fp->ctf_flags & LCTF_RDWR)
1574     {
1575       fp->ctf_refcnt = 1;
1576       return fp;
1577     }
1578
1579   if ((err = init_types (fp, hp)) != 0)
1580     goto bad;
1581
1582   /* If we have a symbol table section, allocate and initialize
1583      the symtab translation table, pointed to by ctf_sxlate.  This table may be
1584      too large for the actual size of the object and function info sections: if
1585      so, ctf_nsyms will be adjusted and the excess will never be used.  */
1586
1587   if (symsect != NULL)
1588     {
1589       fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1590       fp->ctf_sxlate = malloc (fp->ctf_nsyms * sizeof (uint32_t));
1591
1592       if (fp->ctf_sxlate == NULL)
1593         {
1594           err = ENOMEM;
1595           goto bad;
1596         }
1597
1598       if ((err = init_symtab (fp, hp, symsect, strsect)) != 0)
1599         goto bad;
1600     }
1601
1602   ctf_set_ctl_hashes (fp);
1603
1604   if (symsect != NULL)
1605     {
1606       if (symsect->cts_entsize == sizeof (Elf64_Sym))
1607         (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1608       else
1609         (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1610     }
1611   else
1612     (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1613
1614   fp->ctf_refcnt = 1;
1615   return fp;
1616
1617 bad:
1618   ctf_set_open_errno (errp, err);
1619   ctf_file_close (fp);
1620   return NULL;
1621 }
1622
1623 /* Bump the refcount on the specified CTF container, to allow export of
1624    ctf_file_t's from iterators that open and close the ctf_file_t around the
1625    loop.  (This does not extend their lifetime beyond that of the ctf_archive_t
1626    in which they are contained.)  */
1627
1628 void
1629 ctf_ref (ctf_file_t *fp)
1630 {
1631   fp->ctf_refcnt++;
1632 }
1633
1634 /* Close the specified CTF container and free associated data structures.  Note
1635    that ctf_file_close() is a reference counted operation: if the specified file
1636    is the parent of other active containers, its reference count will be greater
1637    than one and it will be freed later when no active children exist.  */
1638
1639 void
1640 ctf_file_close (ctf_file_t *fp)
1641 {
1642   ctf_dtdef_t *dtd, *ntd;
1643   ctf_dvdef_t *dvd, *nvd;
1644
1645   if (fp == NULL)
1646     return;                /* Allow ctf_file_close(NULL) to simplify caller code.  */
1647
1648   ctf_dprintf ("ctf_file_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1649
1650   if (fp->ctf_refcnt > 1)
1651     {
1652       fp->ctf_refcnt--;
1653       return;
1654     }
1655
1656   free (fp->ctf_dyncuname);
1657   free (fp->ctf_dynparname);
1658   ctf_file_close (fp->ctf_parent);
1659
1660   for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1661     {
1662       ntd = ctf_list_next (dtd);
1663       ctf_dtd_delete (fp, dtd);
1664     }
1665   ctf_dynhash_destroy (fp->ctf_dthash);
1666   if (fp->ctf_flags & LCTF_RDWR)
1667     {
1668       ctf_dynhash_destroy (fp->ctf_structs.ctn_writable);
1669       ctf_dynhash_destroy (fp->ctf_unions.ctn_writable);
1670       ctf_dynhash_destroy (fp->ctf_enums.ctn_writable);
1671       ctf_dynhash_destroy (fp->ctf_names.ctn_writable);
1672     }
1673   else
1674     {
1675       ctf_hash_destroy (fp->ctf_structs.ctn_readonly);
1676       ctf_hash_destroy (fp->ctf_unions.ctn_readonly);
1677       ctf_hash_destroy (fp->ctf_enums.ctn_readonly);
1678       ctf_hash_destroy (fp->ctf_names.ctn_readonly);
1679     }
1680
1681   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1682     {
1683       nvd = ctf_list_next (dvd);
1684       ctf_dvd_delete (fp, dvd);
1685     }
1686   ctf_dynhash_destroy (fp->ctf_dvhash);
1687   ctf_str_free_atoms (fp);
1688   free (fp->ctf_tmp_typeslice);
1689
1690   if (fp->ctf_data.cts_name != _CTF_NULLSTR)
1691     free ((char *) fp->ctf_data.cts_name);
1692
1693   if (fp->ctf_symtab.cts_name != _CTF_NULLSTR)
1694     free ((char *) fp->ctf_symtab.cts_name);
1695
1696   if (fp->ctf_strtab.cts_name != _CTF_NULLSTR)
1697     free ((char *) fp->ctf_strtab.cts_name);
1698   else if (fp->ctf_data_mmapped)
1699     ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1700
1701   free (fp->ctf_dynbase);
1702
1703   ctf_dynhash_destroy (fp->ctf_syn_ext_strtab);
1704   ctf_dynhash_destroy (fp->ctf_link_inputs);
1705   ctf_dynhash_destroy (fp->ctf_link_outputs);
1706   ctf_dynhash_destroy (fp->ctf_link_type_mapping);
1707   ctf_dynhash_destroy (fp->ctf_link_cu_mapping);
1708   ctf_dynhash_destroy (fp->ctf_add_processing);
1709
1710   free (fp->ctf_sxlate);
1711   free (fp->ctf_txlate);
1712   free (fp->ctf_ptrtab);
1713
1714   free (fp->ctf_header);
1715   free (fp);
1716 }
1717
1718 /* The converse of ctf_open().  ctf_open() disguises whatever it opens as an
1719    archive, so closing one is just like closing an archive.  */
1720 void
1721 ctf_close (ctf_archive_t *arc)
1722 {
1723   ctf_arc_close (arc);
1724 }
1725
1726 /* Get the CTF archive from which this ctf_file_t is derived.  */
1727 ctf_archive_t *
1728 ctf_get_arc (const ctf_file_t *fp)
1729 {
1730   return fp->ctf_archive;
1731 }
1732
1733 /* Return the ctfsect out of the core ctf_impl.  Useful for freeing the
1734    ctfsect's data * after ctf_file_close(), which is why we return the actual
1735    structure, not a pointer to it, since that is likely to become a pointer to
1736    freed data before the return value is used under the expected use case of
1737    ctf_getsect()/ ctf_file_close()/free().  */
1738 ctf_sect_t
1739 ctf_getdatasect (const ctf_file_t *fp)
1740 {
1741   return fp->ctf_data;
1742 }
1743
1744 /* Return the CTF handle for the parent CTF container, if one exists.
1745    Otherwise return NULL to indicate this container has no imported parent.  */
1746 ctf_file_t *
1747 ctf_parent_file (ctf_file_t *fp)
1748 {
1749   return fp->ctf_parent;
1750 }
1751
1752 /* Return the name of the parent CTF container, if one exists.  Otherwise
1753    return NULL to indicate this container is a root container.  */
1754 const char *
1755 ctf_parent_name (ctf_file_t *fp)
1756 {
1757   return fp->ctf_parname;
1758 }
1759
1760 /* Set the parent name.  It is an error to call this routine without calling
1761    ctf_import() at some point.  */
1762 int
1763 ctf_parent_name_set (ctf_file_t *fp, const char *name)
1764 {
1765   if (fp->ctf_dynparname != NULL)
1766     free (fp->ctf_dynparname);
1767
1768   if ((fp->ctf_dynparname = strdup (name)) == NULL)
1769     return (ctf_set_errno (fp, ENOMEM));
1770   fp->ctf_parname = fp->ctf_dynparname;
1771   return 0;
1772 }
1773
1774 /* Return the name of the compilation unit this CTF file applies to.  Usually
1775    non-NULL only for non-parent containers.  */
1776 const char *
1777 ctf_cuname (ctf_file_t *fp)
1778 {
1779   return fp->ctf_cuname;
1780 }
1781
1782 /* Set the compilation unit name.  */
1783 int
1784 ctf_cuname_set (ctf_file_t *fp, const char *name)
1785 {
1786   if (fp->ctf_dyncuname != NULL)
1787     free (fp->ctf_dyncuname);
1788
1789   if ((fp->ctf_dyncuname = strdup (name)) == NULL)
1790     return (ctf_set_errno (fp, ENOMEM));
1791   fp->ctf_cuname = fp->ctf_dyncuname;
1792   return 0;
1793 }
1794
1795 /* Import the types from the specified parent container by storing a pointer
1796    to it in ctf_parent and incrementing its reference count.  Only one parent
1797    is allowed: if a parent already exists, it is replaced by the new parent.  */
1798 int
1799 ctf_import (ctf_file_t *fp, ctf_file_t *pfp)
1800 {
1801   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1802     return (ctf_set_errno (fp, EINVAL));
1803
1804   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1805     return (ctf_set_errno (fp, ECTF_DMODEL));
1806
1807   if (fp->ctf_parent != NULL)
1808     {
1809       fp->ctf_parent->ctf_refcnt--;
1810       ctf_file_close (fp->ctf_parent);
1811       fp->ctf_parent = NULL;
1812     }
1813
1814   if (pfp != NULL)
1815     {
1816       int err;
1817
1818       if (fp->ctf_parname == NULL)
1819         if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
1820           return err;
1821
1822       fp->ctf_flags |= LCTF_CHILD;
1823       pfp->ctf_refcnt++;
1824     }
1825
1826   fp->ctf_parent = pfp;
1827   return 0;
1828 }
1829
1830 /* Set the data model constant for the CTF container.  */
1831 int
1832 ctf_setmodel (ctf_file_t *fp, int model)
1833 {
1834   const ctf_dmodel_t *dp;
1835
1836   for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
1837     {
1838       if (dp->ctd_code == model)
1839         {
1840           fp->ctf_dmodel = dp;
1841           return 0;
1842         }
1843     }
1844
1845   return (ctf_set_errno (fp, EINVAL));
1846 }
1847
1848 /* Return the data model constant for the CTF container.  */
1849 int
1850 ctf_getmodel (ctf_file_t *fp)
1851 {
1852   return fp->ctf_dmodel->ctd_code;
1853 }
1854
1855 /* The caller can hang an arbitrary pointer off each ctf_file_t using this
1856    function.  */
1857 void
1858 ctf_setspecific (ctf_file_t *fp, void *data)
1859 {
1860   fp->ctf_specific = data;
1861 }
1862
1863 /* Retrieve the arbitrary pointer again.  */
1864 void *
1865 ctf_getspecific (ctf_file_t *fp)
1866 {
1867   return fp->ctf_specific;
1868 }
This page took 0.133202 seconds and 4 git commands to generate.