change and rename gmp_string_asprintf to return an std::string
[binutils-gdb.git] / libctf / ctf-open.c
blobecf27eeeb21da6ef6ecf5bd44c7bdc480154a3d7
1 /* Opening CTF files.
2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
4 This file is part of libctf.
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.
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.
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/>. */
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>
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}
36 const char _CTF_SECTION[] = ".ctf";
37 const char _CTF_NULLSTR[] = "";
39 /* Version-sensitive accessors. */
41 static uint32_t
42 get_kind_v1 (uint32_t info)
44 return (CTF_V1_INFO_KIND (info));
47 static uint32_t
48 get_root_v1 (uint32_t info)
50 return (CTF_V1_INFO_ISROOT (info));
53 static uint32_t
54 get_vlen_v1 (uint32_t info)
56 return (CTF_V1_INFO_VLEN (info));
59 static uint32_t
60 get_kind_v2 (uint32_t info)
62 return (CTF_V2_INFO_KIND (info));
65 static uint32_t
66 get_root_v2 (uint32_t info)
68 return (CTF_V2_INFO_ISROOT (info));
71 static uint32_t
72 get_vlen_v2 (uint32_t info)
74 return (CTF_V2_INFO_VLEN (info));
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)
84 ssize_t size, increment;
86 if (csize == ctf_lsize_sent)
88 size = lsize;
89 increment = ctf_type_size;
91 else
93 size = csize;
94 increment = ctf_stype_size;
97 if (sizep)
98 *sizep = size;
99 if (incrementp)
100 *incrementp = increment;
102 return size;
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)
109 ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
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));
117 /* Return the size that a v1 will be once it is converted to v2. */
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)
123 ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
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));
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)
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));
141 static ssize_t
142 get_vbytes_common (ctf_dict_t *fp, unsigned short kind,
143 ssize_t size _libctf_unused_, size_t vlen)
145 switch (kind)
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;
169 static ssize_t
170 get_vbytes_v1 (ctf_dict_t *fp, unsigned short kind, ssize_t size, size_t vlen)
172 switch (kind)
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);
186 return (get_vbytes_common (fp, kind, size, vlen));
189 static ssize_t
190 get_vbytes_v2 (ctf_dict_t *fp, unsigned short kind, ssize_t size, size_t vlen)
192 switch (kind)
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);
206 return (get_vbytes_common (fp, kind, size, vlen));
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},
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.)
230 The SP symbol table section may be NULL if there is no symtab. */
232 static int
233 init_symtab (ctf_dict_t *fp, const ctf_header_t *hp, const ctf_sect_t *sp)
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;
241 uint32_t objtoff = hp->cth_objtoff;
242 uint32_t funcoff = hp->cth_funcoff;
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. */
248 if (!(hp->cth_flags & CTF_F_NEWFUNCINFO))
249 skip_func_info = 1;
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);
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;
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. */
270 for (i = 0, symp = sp->cts_data; xp < xend; xp++, symp += sp->cts_entsize,
271 i++)
273 ctf_link_sym_t sym;
275 switch (sp->cts_entsize)
277 case sizeof (Elf64_Sym):
279 const Elf64_Sym *symp64 = (Elf64_Sym *) (uintptr_t) symp;
280 ctf_elf64_to_link_sym (fp, &sym, symp64, i);
282 break;
283 case sizeof (Elf32_Sym):
285 const Elf32_Sym *symp32 = (Elf32_Sym *) (uintptr_t) symp;
286 ctf_elf32_to_link_sym (fp, &sym, symp32, i);
288 break;
289 default:
290 return ECTF_SYMTAB;
293 if (ctf_symtab_skippable (&sym))
295 *xp = -1u;
296 continue;
299 switch (sym.st_type)
301 case STT_OBJECT:
302 if (fp->ctf_objtidx_names || objtoff >= hp->cth_funcoff)
304 *xp = -1u;
305 break;
308 *xp = objtoff;
309 objtoff += sizeof (uint32_t);
310 break;
312 case STT_FUNC:
313 if (fp->ctf_funcidx_names || funcoff >= hp->cth_objtidxoff
314 || skip_func_info)
316 *xp = -1u;
317 break;
320 *xp = funcoff;
321 funcoff += sizeof (uint32_t);
322 break;
324 default:
325 *xp = -1u;
326 break;
330 ctf_dprintf ("loaded %lu symtab entries\n", fp->ctf_nsyms);
331 return 0;
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.
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. */
341 static void
342 ctf_set_base (ctf_dict_t *fp, const ctf_header_t *hp, unsigned char *base)
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);
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;
354 /* If we have a parent dict name and label, store the relocated string
355 pointers in the CTF dict for easy access later. */
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. */
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);
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>");
376 /* Set the version of the CTF file. */
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. */
382 static void
383 ctf_set_version (ctf_dict_t *fp, ctf_header_t *cth, int ctf_version)
385 fp->ctf_version = ctf_version;
386 cth->cth_version = ctf_version;
387 fp->ctf_dictops = &ctf_dictops[ctf_version];
391 /* Upgrade the header to CTF_VERSION_3. The upgrade is done in-place. */
392 static void
393 upgrade_header (ctf_header_t *hp)
395 ctf_header_v2_t *oldhp = (ctf_header_v2_t *) hp;
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. */
409 /* Upgrade the type table to CTF_VERSION_3 (really CTF_VERSION_1_UPGRADED_3)
410 from CTF_VERSION_1.
412 The upgrade is not done in-place: the ctf_base is moved. ctf_strptr() must
413 not be called before reallocation is complete.
415 Sections not checked here due to nonexistence or nonpopulated state in older
416 formats: objtidx, funcidx.
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)
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;
428 ssize_t increase = 0, size, increment, v2increment, vbytes, v2bytes;
429 const ctf_type_v1_t *tp;
430 ctf_type_t *t2p;
432 tbuf = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_typeoff);
433 tend = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_stroff);
435 /* Much like init_types(), this is a two-pass process.
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.)
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. */
446 for (tp = tbuf; tp < tend;
447 tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes))
449 unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
450 unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
452 size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
453 vbytes = get_vbytes_v1 (fp, kind, size, vlen);
455 get_ctt_size_v2_unconverted (fp, (const ctf_type_t *) tp, NULL,
456 &v2increment);
457 v2bytes = get_vbytes_v2 (fp, kind, size, vlen);
459 if ((vbytes < 0) || (size < 0))
460 return ECTF_CORRUPT;
462 increase += v2increment - increment; /* May be negative. */
463 increase += v2bytes - vbytes;
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. */
471 if ((ctf_base = malloc (fp->ctf_size + increase)) == NULL)
472 return ECTF_ZALLOC;
474 /* Start at ctf_buf, not ctf_base, to squeeze out the original header: we
475 never use it and it is unconverted. */
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);
481 memset (ctf_base + cth->cth_typeoff, 0, cth->cth_stroff - cth->cth_typeoff
482 + increase);
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);
492 t2buf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
494 /* Iterate through all the types again, upgrading them.
496 Everything that hasn't changed can just be outright memcpy()ed.
497 Things that have changed need field-by-field consideration. */
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))
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;
509 size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
510 vbytes = get_vbytes_v1 (fp, kind, size, vlen);
512 t2p->ctt_name = tp->ctt_name;
513 t2p->ctt_info = CTF_TYPE_INFO (kind, isroot, vlen);
515 switch (kind)
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
537 t2p->ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
538 t2p->ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
540 break;
543 v2size = get_ctt_size_v2 (fp, t2p, NULL, &v2increment);
544 v2bytes = get_vbytes_v2 (fp, kind, v2size, vlen);
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). */
550 assert (size == v2size);
552 /* Now the varlen info. */
554 vdata = (void *) ((uintptr_t) tp + increment);
555 v2data = (void *) ((uintptr_t) t2p + v2increment);
557 switch (kind)
559 case CTF_K_ARRAY:
561 const ctf_array_v1_t *ap = (const ctf_array_v1_t *) vdata;
562 ctf_array_t *a2p = (ctf_array_t *) v2data;
564 a2p->cta_contents = ap->cta_contents;
565 a2p->cta_index = ap->cta_index;
566 a2p->cta_nelems = ap->cta_nelems;
567 break;
569 case CTF_K_STRUCT:
570 case CTF_K_UNION:
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;
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. */
583 for (i = vlen; i != 0; i--, m1++, lm1++, m2++, lm2++)
585 size_t offset;
586 if (size < CTF_LSTRUCT_THRESH_V1)
588 offset = m1->ctm_offset;
589 tmp.ctm_name = m1->ctm_name;
590 tmp.ctm_type = m1->ctm_type;
592 else
594 offset = CTF_LMEM_OFFSET (lm1);
595 tmp.ctm_name = lm1->ctlm_name;
596 tmp.ctm_type = lm1->ctlm_type;
598 if (size < CTF_LSTRUCT_THRESH)
600 m2->ctm_name = tmp.ctm_name;
601 m2->ctm_type = tmp.ctm_type;
602 m2->ctm_offset = offset;
604 else
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);
612 break;
614 case CTF_K_FUNCTION:
616 unsigned long i;
617 unsigned short *a1 = (unsigned short *) vdata;
618 uint32_t *a2 = (uint32_t *) v2data;
620 for (i = vlen; i != 0; i--, a1++, a2++)
621 *a2 = *a1;
623 /* FALLTHRU */
624 default:
625 /* Catch out-of-sync get_vbytes_*(). */
626 assert (vbytes == v2bytes);
627 memcpy (v2data, vdata, vbytes);
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().) */
635 assert ((size_t) t2p - (size_t) fp->ctf_buf == cth->cth_stroff);
637 ctf_set_version (fp, cth, CTF_VERSION_1_UPGRADED_3);
638 free (old_ctf_base);
640 return 0;
643 /* Upgrade from any earlier version. */
644 static int
645 upgrade_types (ctf_dict_t *fp, ctf_header_t *cth)
647 switch (cth->cth_version)
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). */
656 case CTF_VERSION_1_UPGRADED_3:
657 fp->ctf_parmax = CTF_MAX_PTYPE_V1;
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 */
664 return 0;
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. */
672 static int
673 init_types (ctf_dict_t *fp, ctf_header_t *cth)
675 const ctf_type_t *tbuf;
676 const ctf_type_t *tend;
678 unsigned long pop[CTF_K_MAX + 1] = { 0 };
679 const ctf_type_t *tp;
680 uint32_t id, dst;
681 uint32_t *xp;
683 /* We determine whether the dict is a child or a parent based on the value of
684 cth_parname. */
686 int child = cth->cth_parname != 0;
687 int nlstructs = 0, nlunions = 0;
688 int err;
690 assert (!(fp->ctf_flags & LCTF_RDWR));
692 if (_libctf_unlikely_ (fp->ctf_version == CTF_VERSION_1))
694 int err;
695 if ((err = upgrade_types (fp, cth)) != 0)
696 return err; /* Upgrade failed. */
699 tbuf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
700 tend = (ctf_type_t *) (fp->ctf_buf + cth->cth_stroff);
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. */
705 for (tp = tbuf; tp < tend; fp->ctf_typemax++)
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;
711 (void) ctf_get_ctt_size (fp, tp, &size, &increment);
712 vbytes = LCTF_VBYTES (fp, kind, size, vlen);
714 if (vbytes < 0)
715 return ECTF_CORRUPT;
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]++;
722 tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
723 pop[kind]++;
726 if (child)
728 ctf_dprintf ("CTF dict %p is a child\n", (void *) fp);
729 fp->ctf_flags |= LCTF_CHILD;
731 else
732 ctf_dprintf ("CTF dict %p is a parent\n", (void *) fp);
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. */
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;
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;
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;
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;
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);
769 if (fp->ctf_txlate == NULL || fp->ctf_ptrtab == NULL)
770 return ENOMEM; /* Memory allocation failed. */
772 xp = fp->ctf_txlate;
773 *xp++ = 0; /* Type id 0 is used as a sentinel value. */
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));
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. */
781 for (id = 1, tp = tbuf; tp < tend; xp++, id++)
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;
788 const char *name;
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);
795 switch (kind)
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(). */
805 if (((ctf_hash_lookup_type (fp->ctf_names.ctn_readonly,
806 fp, name)) == 0)
807 || isroot)
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;
815 break;
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;
823 case CTF_K_FUNCTION:
824 if (!isroot)
825 break;
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;
834 case CTF_K_STRUCT:
835 if (size >= CTF_LSTRUCT_THRESH)
836 nlstructs++;
838 if (!isroot)
839 break;
841 err = ctf_hash_define_type (fp->ctf_structs.ctn_readonly, fp,
842 LCTF_INDEX_TO_TYPE (fp, id, child),
843 tp->ctt_name);
845 if (err != 0)
846 return err;
848 break;
850 case CTF_K_UNION:
851 if (size >= CTF_LSTRUCT_THRESH)
852 nlunions++;
854 if (!isroot)
855 break;
857 err = ctf_hash_define_type (fp->ctf_unions.ctn_readonly, fp,
858 LCTF_INDEX_TO_TYPE (fp, id, child),
859 tp->ctt_name);
861 if (err != 0)
862 return err;
863 break;
865 case CTF_K_ENUM:
866 if (!isroot)
867 break;
869 err = ctf_hash_define_type (fp->ctf_enums.ctn_readonly, fp,
870 LCTF_INDEX_TO_TYPE (fp, id, child),
871 tp->ctt_name);
873 if (err != 0)
874 return err;
875 break;
877 case CTF_K_TYPEDEF:
878 if (!isroot)
879 break;
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;
888 case CTF_K_FORWARD:
890 ctf_names_t *np = ctf_name_table (fp, tp->ctt_type);
892 if (!isroot)
893 break;
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)
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;
905 break;
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 ]. */
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*/
918 case CTF_K_VOLATILE:
919 case CTF_K_CONST:
920 case CTF_K_RESTRICT:
921 if (!isroot)
922 break;
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;
936 *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
937 tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
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));
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. */
955 for (id = 1; id <= fp->ctf_typemax; id++)
957 if ((dst = fp->ctf_ptrtab[id]) != 0)
959 tp = LCTF_INDEX_TO_TYPEPTR (fp, id);
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;
969 return 0;
972 /* Endianness-flipping routines.
974 We flip everything, mindlessly, even 1-byte entities, so that future
975 expansions do not require changes to this code. */
977 /* < C11? define away static assertions. */
979 #if !defined (__STDC_VERSION__) || __STDC_VERSION__ < 201112L
980 #define _Static_assert(cond, err)
981 #endif
983 /* Swap the endianness of something. */
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; \
997 } while (0);
999 /* Flip the endianness of the CTF header. */
1001 static void
1002 flip_header (ctf_header_t *cth)
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);
1020 /* Flip the endianness of the label section, an array of ctf_lblent_t. */
1022 static void
1023 flip_lbls (void *start, size_t len)
1025 ctf_lblent_t *lbl = start;
1026 ssize_t i;
1028 for (i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
1030 swap_thing (lbl->ctl_label);
1031 swap_thing (lbl->ctl_type);
1035 /* Flip the endianness of the data-object or function sections or their indexes,
1036 all arrays of uint32_t. */
1038 static void
1039 flip_objts (void *start, size_t len)
1041 uint32_t *obj = start;
1042 ssize_t i;
1044 for (i = len / sizeof (uint32_t); i > 0; obj++, i--)
1045 swap_thing (*obj);
1048 /* Flip the endianness of the variable section, an array of ctf_varent_t. */
1050 static void
1051 flip_vars (void *start, size_t len)
1053 ctf_varent_t *var = start;
1054 ssize_t i;
1056 for (i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
1058 swap_thing (var->ctv_name);
1059 swap_thing (var->ctv_type);
1063 /* Flip the endianness of the type section, a tagged array of ctf_type or
1064 ctf_stype followed by variable data. */
1066 static int
1067 flip_types (ctf_dict_t *fp, void *start, size_t len)
1069 ctf_type_t *t = start;
1071 while ((uintptr_t) t < ((uintptr_t) start) + len)
1073 swap_thing (t->ctt_name);
1074 swap_thing (t->ctt_info);
1075 swap_thing (t->ctt_size);
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);
1082 if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
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));
1089 else
1090 t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1092 switch (kind)
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;
1105 case CTF_K_INTEGER:
1106 case CTF_K_FLOAT:
1108 /* These types have a single uint32_t. */
1110 uint32_t *item = (uint32_t *) t;
1112 swap_thing (*item);
1113 break;
1116 case CTF_K_FUNCTION:
1118 /* This type has a bunch of uint32_ts. */
1120 uint32_t *item = (uint32_t *) t;
1121 ssize_t i;
1123 for (i = vlen; i > 0; item++, i--)
1124 swap_thing (*item);
1125 break;
1128 case CTF_K_ARRAY:
1130 /* This has a single ctf_array_t. */
1132 ctf_array_t *a = (ctf_array_t *) t;
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);
1139 break;
1142 case CTF_K_SLICE:
1144 /* This has a single ctf_slice_t. */
1146 ctf_slice_t *s = (ctf_slice_t *) t;
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);
1153 break;
1156 case CTF_K_STRUCT:
1157 case CTF_K_UNION:
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. */
1164 if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1166 ctf_lmember_t *lm = (ctf_lmember_t *) t;
1167 ssize_t i;
1168 for (i = vlen; i > 0; i--, lm++)
1170 swap_thing (lm->ctlm_name);
1171 swap_thing (lm->ctlm_offsethi);
1172 swap_thing (lm->ctlm_type);
1173 swap_thing (lm->ctlm_offsetlo);
1176 else
1178 ctf_member_t *m = (ctf_member_t *) t;
1179 ssize_t i;
1180 for (i = vlen; i > 0; i--, m++)
1182 swap_thing (m->ctm_name);
1183 swap_thing (m->ctm_offset);
1184 swap_thing (m->ctm_type);
1187 break;
1190 case CTF_K_ENUM:
1192 /* This has an array of ctf_enum_t. */
1194 ctf_enum_t *item = (ctf_enum_t *) t;
1195 ssize_t i;
1197 for (i = vlen; i > 0; item++, i--)
1199 swap_thing (item->cte_name);
1200 swap_thing (item->cte_value);
1202 break;
1204 default:
1205 ctf_err_warn (fp, 0, ECTF_CORRUPT,
1206 _("unhandled CTF kind in endianness conversion: %x"),
1207 kind);
1208 return ECTF_CORRUPT;
1211 t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1214 return 0;
1217 /* Flip the endianness of BUF, given the offsets in the (already endian-
1218 converted) CTH.
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. */
1224 static int
1225 flip_ctf (ctf_dict_t *fp, ctf_header_t *cth, unsigned char *buf)
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);
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)
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;
1259 /* Open a CTF file, mocking up a suitable ctf_sect. */
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)
1267 return ctf_simple_open_internal (ctfsect, ctfsect_size, symsect, symsect_size,
1268 symsect_entsize, strsect, strsect_size, NULL,
1269 0, errp);
1272 /* Open a CTF file, mocking up a suitable ctf_sect and overriding the external
1273 strtab with a synthetic one. */
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)
1282 ctf_sect_t skeleton;
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;
1289 skeleton.cts_name = _CTF_SECTION;
1290 skeleton.cts_entsize = 1;
1292 if (ctfsect)
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;
1300 if (symsect)
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;
1309 if (strsect)
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;
1317 return ctf_bufopen_internal (ctfsectp, symsectp, strsectp, syn_strtab,
1318 writable, errp);
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. */
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)
1330 return ctf_bufopen_internal (ctfsect, symsect, strsect, NULL, 0, errp);
1333 /* Like ctf_bufopen, but overriding the external strtab with a synthetic one. */
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)
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;
1347 libctf_init_debug();
1349 if ((ctfsect == NULL) || ((symsect != NULL) &&
1350 ((strsect == NULL) && syn_strtab == NULL)))
1351 return (ctf_set_open_errno (errp, EINVAL));
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));
1357 if (symsect != NULL && symsect->cts_data == NULL)
1358 return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1360 if (strsect != NULL && strsect->cts_data == NULL)
1361 return (ctf_set_open_errno (errp, ECTF_STRBAD));
1363 if (ctfsect->cts_size < sizeof (ctf_preamble_t))
1364 return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1366 pp = (const ctf_preamble_t *) ctfsect->cts_data;
1368 ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1369 pp->ctp_magic, pp->ctp_version);
1371 /* Validate each part of the CTF header.
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.
1377 We specifically do not support foreign-endian old versions. */
1379 if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1381 if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1383 if (pp->ctp_version != CTF_VERSION_3)
1384 return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1385 foreign_endian = 1;
1387 else
1388 return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
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));
1395 if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
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). */
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));
1407 if (pp->ctp_version < CTF_VERSION_3)
1408 hdrsz = sizeof (ctf_header_v2_t);
1410 if (_libctf_unlikely_ (pp->ctp_flags > CTF_F_MAX))
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));
1418 if (ctfsect->cts_size < hdrsz)
1419 return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1421 if ((fp = malloc (sizeof (ctf_dict_t))) == NULL)
1422 return (ctf_set_open_errno (errp, ENOMEM));
1424 memset (fp, 0, sizeof (ctf_dict_t));
1426 if (writable)
1427 fp->ctf_flags |= LCTF_RDWR;
1429 if ((fp->ctf_header = malloc (sizeof (struct ctf_header))) == NULL)
1431 free (fp);
1432 return (ctf_set_open_errno (errp, ENOMEM));
1434 hp = fp->ctf_header;
1435 memcpy (hp, ctfsect->cts_data, hdrsz);
1436 if (pp->ctp_version < CTF_VERSION_3)
1437 upgrade_header (hp);
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;
1444 ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
1445 (unsigned long) fp->ctf_size);
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)
1452 ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("header offset exceeds CTF size"));
1453 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
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)
1464 ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("overlapping CTF sections"));
1465 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
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))
1473 ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1474 _("CTF sections not properly aligned"));
1475 return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1478 /* This invariant will be lifted in v4, but for now it is true. */
1480 if ((hp->cth_funcidxoff - hp->cth_objtidxoff != 0) &&
1481 (hp->cth_funcidxoff - hp->cth_objtidxoff
1482 != hp->cth_funcoff - hp->cth_objtoff))
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));
1492 if ((hp->cth_varoff - hp->cth_funcidxoff != 0) &&
1493 (hp->cth_varoff - hp->cth_funcidxoff
1494 != hp->cth_objtidxoff - hp->cth_funcoff))
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));
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. */
1509 /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1510 init_types(). */
1512 if (hp->cth_flags & CTF_F_COMPRESS)
1514 size_t srclen;
1515 uLongf dstlen;
1516 const void *src;
1517 int rc = Z_OK;
1519 /* We are allocating this ourselves, so we can drop the ctf header
1520 copy in favour of ctf->ctf_header. */
1522 if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1524 err = ECTF_ZALLOC;
1525 goto bad;
1527 fp->ctf_dynbase = fp->ctf_base;
1528 hp->cth_flags &= ~CTF_F_COMPRESS;
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;
1535 if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
1537 ctf_err_warn (NULL, 0, ECTF_DECOMPRESS, _("zlib inflate err: %s"),
1538 zError (rc));
1539 err = ECTF_DECOMPRESS;
1540 goto bad;
1543 if ((size_t) dstlen != fp->ctf_size)
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;
1552 else if (foreign_endian)
1554 if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1556 err = ECTF_ZALLOC;
1557 goto bad;
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;
1564 else
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;
1574 /* Once we have uncompressed and validated the CTF data buffer, we can
1575 proceed with initializing the ctf_dict_t we allocated above.
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(). */
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));
1587 if (symsect != NULL)
1589 memcpy (&fp->ctf_symtab, symsect, sizeof (ctf_sect_t));
1590 memcpy (&fp->ctf_strtab, strsect, sizeof (ctf_sect_t));
1593 if (fp->ctf_data.cts_name != NULL)
1594 if ((fp->ctf_data.cts_name = strdup (fp->ctf_data.cts_name)) == NULL)
1596 err = ENOMEM;
1597 goto bad;
1599 if (fp->ctf_symtab.cts_name != NULL)
1600 if ((fp->ctf_symtab.cts_name = strdup (fp->ctf_symtab.cts_name)) == NULL)
1602 err = ENOMEM;
1603 goto bad;
1605 if (fp->ctf_strtab.cts_name != NULL)
1606 if ((fp->ctf_strtab.cts_name = strdup (fp->ctf_strtab.cts_name)) == NULL)
1608 err = ENOMEM;
1609 goto bad;
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;
1619 if (strsect != NULL)
1621 fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1622 fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1624 fp->ctf_syn_ext_strtab = syn_strtab;
1626 if (foreign_endian &&
1627 (err = flip_ctf (fp, hp, fp->ctf_buf)) != 0)
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. */
1633 ctf_set_base (fp, hp, fp->ctf_base);
1634 goto bad;
1637 ctf_set_base (fp, hp, fp->ctf_base);
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)
1643 fp->ctf_refcnt = 1;
1644 return fp;
1647 if ((err = init_types (fp, hp)) != 0)
1648 goto bad;
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. */
1657 if (symsect != NULL)
1659 fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1660 fp->ctf_sxlate = malloc (fp->ctf_nsyms * sizeof (uint32_t));
1662 if (fp->ctf_sxlate == NULL)
1664 err = ENOMEM;
1665 goto bad;
1669 if ((err = init_symtab (fp, hp, symsect)) != 0)
1670 goto bad;
1672 ctf_set_ctl_hashes (fp);
1674 if (symsect != NULL)
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);
1681 else
1682 (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1684 fp->ctf_refcnt = 1;
1685 return fp;
1687 bad:
1688 ctf_set_open_errno (errp, err);
1689 ctf_err_warn_to_open (fp);
1690 ctf_dict_close (fp);
1691 return NULL;
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.) */
1699 void
1700 ctf_ref (ctf_dict_t *fp)
1702 fp->ctf_refcnt++;
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. */
1710 void
1711 ctf_dict_close (ctf_dict_t *fp)
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;
1718 if (fp == NULL)
1719 return; /* Allow ctf_dict_close(NULL) to simplify caller code. */
1721 ctf_dprintf ("ctf_dict_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1723 if (fp->ctf_refcnt > 1)
1725 fp->ctf_refcnt--;
1726 return;
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;
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);
1741 for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1743 ntd = ctf_list_next (dtd);
1744 ctf_dtd_delete (fp, dtd);
1746 ctf_dynhash_destroy (fp->ctf_dthash);
1747 if (fp->ctf_flags & LCTF_RDWR)
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);
1754 else
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);
1762 for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1764 nvd = ctf_list_next (dvd);
1765 ctf_dvd_delete (fp, dvd);
1767 ctf_dynhash_destroy (fp->ctf_dvhash);
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)
1777 nid = ctf_list_next (did);
1778 ctf_list_delete (&fp->ctf_in_flight_dynsyms, did);
1779 free (did);
1782 ctf_str_free_atoms (fp);
1783 free (fp->ctf_tmp_typeslice);
1785 if (fp->ctf_data.cts_name != _CTF_NULLSTR)
1786 free ((char *) fp->ctf_data.cts_name);
1788 if (fp->ctf_symtab.cts_name != _CTF_NULLSTR)
1789 free ((char *) fp->ctf_symtab.cts_name);
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);
1796 free (fp->ctf_dynbase);
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);
1808 for (err = ctf_list_next (&fp->ctf_errs_warnings); err != NULL; err = nerr)
1810 nerr = ctf_list_next (err);
1811 ctf_list_delete (&fp->ctf_errs_warnings, err);
1812 free (err->cew_text);
1813 free (err);
1816 free (fp->ctf_sxlate);
1817 free (fp->ctf_txlate);
1818 free (fp->ctf_ptrtab);
1820 free (fp->ctf_header);
1821 free (fp);
1824 /* Backward compatibility. */
1825 void
1826 ctf_file_close (ctf_file_t *fp)
1828 ctf_dict_close (fp);
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)
1836 ctf_arc_close (arc);
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)
1843 return fp->ctf_archive;
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)
1854 return fp->ctf_data;
1857 ctf_sect_t
1858 ctf_getsymsect (const ctf_dict_t *fp)
1860 return fp->ctf_symtab;
1863 ctf_sect_t
1864 ctf_getstrsect (const ctf_dict_t *fp)
1866 return fp->ctf_strtab;
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)
1874 return fp->ctf_parent;
1877 /* Backward compatibility. */
1878 ctf_dict_t *
1879 ctf_parent_file (ctf_dict_t *fp)
1881 return ctf_parent_dict (fp);
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)
1888 return fp->ctf_parname;
1891 /* Set the parent name. It is an error to call this routine without calling
1892 ctf_import() at some point. */
1894 ctf_parent_name_set (ctf_dict_t *fp, const char *name)
1896 if (fp->ctf_dynparname != NULL)
1897 free (fp->ctf_dynparname);
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;
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)
1910 return fp->ctf_cuname;
1913 /* Set the compilation unit name. */
1915 ctf_cuname_set (ctf_dict_t *fp, const char *name)
1917 if (fp->ctf_dyncuname != NULL)
1918 free (fp->ctf_dyncuname);
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;
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. */
1930 ctf_import (ctf_dict_t *fp, ctf_dict_t *pfp)
1932 if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1933 return (ctf_set_errno (fp, EINVAL));
1935 if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1936 return (ctf_set_errno (fp, ECTF_DMODEL));
1938 if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1939 ctf_dict_close (fp->ctf_parent);
1940 fp->ctf_parent = NULL;
1942 if (pfp != NULL)
1944 int err;
1946 if (fp->ctf_parname == NULL)
1947 if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
1948 return err;
1950 fp->ctf_flags |= LCTF_CHILD;
1951 pfp->ctf_refcnt++;
1952 fp->ctf_parent_unreffed = 0;
1955 fp->ctf_parent = pfp;
1956 return 0;
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. */
1964 ctf_import_unref (ctf_dict_t *fp, ctf_dict_t *pfp)
1966 if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1967 return (ctf_set_errno (fp, EINVAL));
1969 if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1970 return (ctf_set_errno (fp, ECTF_DMODEL));
1972 if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1973 ctf_dict_close (fp->ctf_parent);
1974 fp->ctf_parent = NULL;
1976 if (pfp != NULL)
1978 int err;
1980 if (fp->ctf_parname == NULL)
1981 if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
1982 return err;
1984 fp->ctf_flags |= LCTF_CHILD;
1985 fp->ctf_parent_unreffed = 1;
1988 fp->ctf_parent = pfp;
1989 return 0;
1992 /* Set the data model constant for the CTF dict. */
1994 ctf_setmodel (ctf_dict_t *fp, int model)
1996 const ctf_dmodel_t *dp;
1998 for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
2000 if (dp->ctd_code == model)
2002 fp->ctf_dmodel = dp;
2003 return 0;
2007 return (ctf_set_errno (fp, EINVAL));
2010 /* Return the data model constant for the CTF dict. */
2012 ctf_getmodel (ctf_dict_t *fp)
2014 return fp->ctf_dmodel->ctd_code;
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)
2022 fp->ctf_specific = data;
2025 /* Retrieve the arbitrary pointer again. */
2026 void *
2027 ctf_getspecific (ctf_dict_t *fp)
2029 return fp->ctf_specific;