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