libctf: rip out dead code handling typedefs with no name
[deliverable/binutils-gdb.git] / libctf / ctf-create.c
1 /* CTF file creation.
2 Copyright (C) 2019-2021 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 <sys/param.h>
22 #include <assert.h>
23 #include <string.h>
24 #include <unistd.h>
25 #include <zlib.h>
26
27 #include <elf.h>
28 #include "elf-bfd.h"
29
30 #ifndef EOVERFLOW
31 #define EOVERFLOW ERANGE
32 #endif
33
34 #ifndef roundup
35 #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
36 #endif
37
38 /* Make sure the ptrtab has enough space for at least one more type.
39
40 We start with 4KiB of ptrtab, enough for a thousand types, then grow it 25%
41 at a time. */
42
43 static int
44 ctf_grow_ptrtab (ctf_dict_t *fp)
45 {
46 size_t new_ptrtab_len = fp->ctf_ptrtab_len;
47
48 /* We allocate one more ptrtab entry than we need, for the initial zero,
49 plus one because the caller will probably allocate a new type. */
50
51 if (fp->ctf_ptrtab == NULL)
52 new_ptrtab_len = 1024;
53 else if ((fp->ctf_typemax + 2) > fp->ctf_ptrtab_len)
54 new_ptrtab_len = fp->ctf_ptrtab_len * 1.25;
55
56 if (new_ptrtab_len != fp->ctf_ptrtab_len)
57 {
58 uint32_t *new_ptrtab;
59
60 if ((new_ptrtab = realloc (fp->ctf_ptrtab,
61 new_ptrtab_len * sizeof (uint32_t))) == NULL)
62 return (ctf_set_errno (fp, ENOMEM));
63
64 fp->ctf_ptrtab = new_ptrtab;
65 memset (fp->ctf_ptrtab + fp->ctf_ptrtab_len, 0,
66 (new_ptrtab_len - fp->ctf_ptrtab_len) * sizeof (uint32_t));
67 fp->ctf_ptrtab_len = new_ptrtab_len;
68 }
69 return 0;
70 }
71
72 /* To create an empty CTF dict, we just declare a zeroed header and call
73 ctf_bufopen() on it. If ctf_bufopen succeeds, we mark the new dict r/w and
74 initialize the dynamic members. We start assigning type IDs at 1 because
75 type ID 0 is used as a sentinel and a not-found indicator. */
76
77 ctf_dict_t *
78 ctf_create (int *errp)
79 {
80 static const ctf_header_t hdr = { .cth_preamble = { CTF_MAGIC, CTF_VERSION, 0 } };
81
82 ctf_dynhash_t *dthash;
83 ctf_dynhash_t *dvhash;
84 ctf_dynhash_t *structs = NULL, *unions = NULL, *enums = NULL, *names = NULL;
85 ctf_dynhash_t *objthash = NULL, *funchash = NULL;
86 ctf_sect_t cts;
87 ctf_dict_t *fp;
88
89 libctf_init_debug();
90 dthash = ctf_dynhash_create (ctf_hash_integer, ctf_hash_eq_integer,
91 NULL, NULL);
92 if (dthash == NULL)
93 {
94 ctf_set_open_errno (errp, EAGAIN);
95 goto err;
96 }
97
98 dvhash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
99 NULL, NULL);
100 if (dvhash == NULL)
101 {
102 ctf_set_open_errno (errp, EAGAIN);
103 goto err_dt;
104 }
105
106 structs = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
107 NULL, NULL);
108 unions = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
109 NULL, NULL);
110 enums = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
111 NULL, NULL);
112 names = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
113 NULL, NULL);
114 objthash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
115 free, NULL);
116 funchash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
117 free, NULL);
118 if (!structs || !unions || !enums || !names)
119 {
120 ctf_set_open_errno (errp, EAGAIN);
121 goto err_dv;
122 }
123
124 cts.cts_name = _CTF_SECTION;
125 cts.cts_data = &hdr;
126 cts.cts_size = sizeof (hdr);
127 cts.cts_entsize = 1;
128
129 if ((fp = ctf_bufopen_internal (&cts, NULL, NULL, NULL, 1, errp)) == NULL)
130 goto err_dv;
131
132 fp->ctf_structs.ctn_writable = structs;
133 fp->ctf_unions.ctn_writable = unions;
134 fp->ctf_enums.ctn_writable = enums;
135 fp->ctf_names.ctn_writable = names;
136 fp->ctf_objthash = objthash;
137 fp->ctf_funchash = funchash;
138 fp->ctf_dthash = dthash;
139 fp->ctf_dvhash = dvhash;
140 fp->ctf_dtoldid = 0;
141 fp->ctf_snapshots = 1;
142 fp->ctf_snapshot_lu = 0;
143 fp->ctf_flags |= LCTF_DIRTY;
144
145 ctf_set_ctl_hashes (fp);
146 ctf_setmodel (fp, CTF_MODEL_NATIVE);
147 if (ctf_grow_ptrtab (fp) < 0)
148 {
149 ctf_set_open_errno (errp, ctf_errno (fp));
150 ctf_dict_close (fp);
151 return NULL;
152 }
153
154 return fp;
155
156 err_dv:
157 ctf_dynhash_destroy (structs);
158 ctf_dynhash_destroy (unions);
159 ctf_dynhash_destroy (enums);
160 ctf_dynhash_destroy (names);
161 ctf_dynhash_destroy (objthash);
162 ctf_dynhash_destroy (funchash);
163 ctf_dynhash_destroy (dvhash);
164 err_dt:
165 ctf_dynhash_destroy (dthash);
166 err:
167 return NULL;
168 }
169
170 /* Delete data symbols that have been assigned names from the variable section.
171 Must be called from within ctf_serialize, because that is the only place
172 you can safely delete variables without messing up ctf_rollback. */
173
174 static int
175 symtypetab_delete_nonstatic_vars (ctf_dict_t *fp, ctf_dict_t *symfp)
176 {
177 ctf_dvdef_t *dvd, *nvd;
178 ctf_id_t type;
179
180 for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
181 {
182 nvd = ctf_list_next (dvd);
183
184 if (((type = (ctf_id_t) (uintptr_t)
185 ctf_dynhash_lookup (fp->ctf_objthash, dvd->dvd_name)) > 0)
186 && ctf_dynhash_lookup (symfp->ctf_dynsyms, dvd->dvd_name) != NULL
187 && type == dvd->dvd_type)
188 ctf_dvd_delete (fp, dvd);
189 }
190
191 return 0;
192 }
193
194 /* Determine if a symbol is "skippable" and should never appear in the
195 symtypetab sections. */
196
197 int
198 ctf_symtab_skippable (ctf_link_sym_t *sym)
199 {
200 /* Never skip symbols whose name is not yet known. */
201 if (sym->st_nameidx_set)
202 return 0;
203
204 return (sym->st_name == NULL || sym->st_name[0] == 0
205 || sym->st_shndx == SHN_UNDEF
206 || strcmp (sym->st_name, "_START_") == 0
207 || strcmp (sym->st_name, "_END_") == 0
208 || (sym->st_type == STT_OBJECT && sym->st_shndx == SHN_EXTABS
209 && sym->st_value == 0));
210 }
211
212 /* Symtypetab emission flags. */
213
214 #define CTF_SYMTYPETAB_EMIT_FUNCTION 0x1
215 #define CTF_SYMTYPETAB_EMIT_PAD 0x2
216 #define CTF_SYMTYPETAB_FORCE_INDEXED 0x4
217
218 /* Get the number of symbols in a symbol hash, the count of symbols, the maximum
219 seen, the eventual size, without any padding elements, of the func/data and
220 (if generated) index sections, and the size of accumulated padding elements.
221 The linker-reported set of symbols is found in SYMFP: it may be NULL if
222 symbol filtering is not desired, in which case CTF_SYMTYPETAB_FORCE_INDEXED
223 will always be set in the flags.
224
225 Also figure out if any symbols need to be moved to the variable section, and
226 add them (if not already present). */
227
228 _libctf_nonnull_ ((1,3,4,5,6,7,8))
229 static int
230 symtypetab_density (ctf_dict_t *fp, ctf_dict_t *symfp, ctf_dynhash_t *symhash,
231 size_t *count, size_t *max, size_t *unpadsize,
232 size_t *padsize, size_t *idxsize, int flags)
233 {
234 ctf_next_t *i = NULL;
235 const void *name;
236 const void *ctf_sym;
237 ctf_dynhash_t *linker_known = NULL;
238 int err;
239 int beyond_max = 0;
240
241 *count = 0;
242 *max = 0;
243 *unpadsize = 0;
244 *idxsize = 0;
245 *padsize = 0;
246
247 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
248 {
249 /* Make a dynhash citing only symbols reported by the linker of the
250 appropriate type, then traverse all potential-symbols we know the types
251 of, removing them from linker_known as we go. Once this is done, the
252 only symbols remaining in linker_known are symbols we don't know the
253 types of: we must emit pads for those symbols that are below the
254 maximum symbol we will emit (any beyond that are simply skipped).
255
256 If there are none, this symtypetab will be empty: just report that. */
257
258 if (!symfp->ctf_dynsyms)
259 return 0;
260
261 if ((linker_known = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
262 NULL, NULL)) == NULL)
263 return (ctf_set_errno (fp, ENOMEM));
264
265 while ((err = ctf_dynhash_cnext (symfp->ctf_dynsyms, &i,
266 &name, &ctf_sym)) == 0)
267 {
268 ctf_link_sym_t *sym = (ctf_link_sym_t *) ctf_sym;
269
270 if (((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
271 && sym->st_type != STT_FUNC)
272 || (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
273 && sym->st_type != STT_OBJECT))
274 continue;
275
276 if (ctf_symtab_skippable (sym))
277 continue;
278
279 /* This should only be true briefly before all the names are
280 finalized, long before we get this far. */
281 if (!ctf_assert (fp, !sym->st_nameidx_set))
282 return -1; /* errno is set for us. */
283
284 if (ctf_dynhash_cinsert (linker_known, name, ctf_sym) < 0)
285 {
286 ctf_dynhash_destroy (linker_known);
287 return (ctf_set_errno (fp, ENOMEM));
288 }
289 }
290 if (err != ECTF_NEXT_END)
291 {
292 ctf_err_warn (fp, 0, err, _("iterating over linker-known symbols during "
293 "serialization"));
294 ctf_dynhash_destroy (linker_known);
295 return (ctf_set_errno (fp, err));
296 }
297 }
298
299 while ((err = ctf_dynhash_cnext (symhash, &i, &name, NULL)) == 0)
300 {
301 ctf_link_sym_t *sym;
302
303 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
304 {
305 /* Linker did not report symbol in symtab. Remove it from the
306 set of known data symbols and continue. */
307 if ((sym = ctf_dynhash_lookup (symfp->ctf_dynsyms, name)) == NULL)
308 {
309 ctf_dynhash_remove (symhash, name);
310 continue;
311 }
312
313 /* We don't remove skippable symbols from the symhash because we don't
314 want them to be migrated into variables. */
315 if (ctf_symtab_skippable (sym))
316 continue;
317
318 if ((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
319 && sym->st_type != STT_FUNC)
320 {
321 ctf_err_warn (fp, 1, 0, _("Symbol %x added to CTF as a function "
322 "but is of type %x\n"),
323 sym->st_symidx, sym->st_type);
324 ctf_dynhash_remove (symhash, name);
325 continue;
326 }
327 else if (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
328 && sym->st_type != STT_OBJECT)
329 {
330 ctf_err_warn (fp, 1, 0, _("Symbol %x added to CTF as a data "
331 "object but is of type %x\n"),
332 sym->st_symidx, sym->st_type);
333 ctf_dynhash_remove (symhash, name);
334 continue;
335 }
336
337 ctf_dynhash_remove (linker_known, name);
338 }
339 *unpadsize += sizeof (uint32_t);
340 (*count)++;
341
342 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
343 {
344 if (*max < sym->st_symidx)
345 *max = sym->st_symidx;
346 }
347 else
348 (*max)++;
349 }
350 if (err != ECTF_NEXT_END)
351 {
352 ctf_err_warn (fp, 0, err, _("iterating over CTF symtypetab during "
353 "serialization"));
354 ctf_dynhash_destroy (linker_known);
355 return (ctf_set_errno (fp, err));
356 }
357
358 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
359 {
360 while ((err = ctf_dynhash_cnext (linker_known, &i, NULL, &ctf_sym)) == 0)
361 {
362 ctf_link_sym_t *sym = (ctf_link_sym_t *) ctf_sym;
363
364 if (sym->st_symidx > *max)
365 beyond_max++;
366 }
367 if (err != ECTF_NEXT_END)
368 {
369 ctf_err_warn (fp, 0, err, _("iterating over linker-known symbols "
370 "during CTF serialization"));
371 ctf_dynhash_destroy (linker_known);
372 return (ctf_set_errno (fp, err));
373 }
374 }
375
376 *idxsize = *count * sizeof (uint32_t);
377 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
378 *padsize = (ctf_dynhash_elements (linker_known) - beyond_max) * sizeof (uint32_t);
379
380 ctf_dynhash_destroy (linker_known);
381 return 0;
382 }
383
384 /* Emit an objt or func symtypetab into DP in a particular order defined by an
385 array of ctf_link_sym_t or symbol names passed in. The index has NIDX
386 elements in it: unindexed output would terminate at symbol OUTMAX and is in
387 any case no larger than SIZE bytes. Some index elements are expected to be
388 skipped: see symtypetab_density. The linker-reported set of symbols (if any)
389 is found in SYMFP. */
390 static int
391 emit_symtypetab (ctf_dict_t *fp, ctf_dict_t *symfp, uint32_t *dp,
392 ctf_link_sym_t **idx, const char **nameidx, uint32_t nidx,
393 uint32_t outmax, int size, int flags)
394 {
395 uint32_t i;
396 uint32_t *dpp = dp;
397 ctf_dynhash_t *symhash;
398
399 ctf_dprintf ("Emitting table of size %i, outmax %u, %u symtypetab entries, "
400 "flags %i\n", size, outmax, nidx, flags);
401
402 /* Empty table? Nothing to do. */
403 if (size == 0)
404 return 0;
405
406 if (flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
407 symhash = fp->ctf_funchash;
408 else
409 symhash = fp->ctf_objthash;
410
411 for (i = 0; i < nidx; i++)
412 {
413 const char *sym_name;
414 void *type;
415
416 /* If we have a linker-reported set of symbols, we may be given that set
417 to work from, or a set of symbol names. In both cases we want to look
418 at the corresponding linker-reported symbol (if any). */
419 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
420 {
421 ctf_link_sym_t *this_link_sym;
422
423 if (idx)
424 this_link_sym = idx[i];
425 else
426 this_link_sym = ctf_dynhash_lookup (symfp->ctf_dynsyms, nameidx[i]);
427
428 /* Unreported symbol number. No pad, no nothing. */
429 if (!this_link_sym)
430 continue;
431
432 /* Symbol of the wrong type, or skippable? This symbol is not in this
433 table. */
434 if (((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
435 && this_link_sym->st_type != STT_FUNC)
436 || (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
437 && this_link_sym->st_type != STT_OBJECT))
438 continue;
439
440 if (ctf_symtab_skippable (this_link_sym))
441 continue;
442
443 sym_name = this_link_sym->st_name;
444
445 /* Linker reports symbol of a different type to the symbol we actually
446 added? Skip the symbol. No pad, since the symbol doesn't actually
447 belong in this table at all. (Warned about in
448 symtypetab_density.) */
449 if ((this_link_sym->st_type == STT_FUNC)
450 && (ctf_dynhash_lookup (fp->ctf_objthash, sym_name)))
451 continue;
452
453 if ((this_link_sym->st_type == STT_OBJECT)
454 && (ctf_dynhash_lookup (fp->ctf_funchash, sym_name)))
455 continue;
456 }
457 else
458 sym_name = nameidx[i];
459
460 /* Symbol in index but no type set? Silently skip and (optionally)
461 pad. (In force-indexed mode, this is also where we track symbols of
462 the wrong type for this round of insertion.) */
463 if ((type = ctf_dynhash_lookup (symhash, sym_name)) == NULL)
464 {
465 if (flags & CTF_SYMTYPETAB_EMIT_PAD)
466 *dpp++ = 0;
467 continue;
468 }
469
470 if (!ctf_assert (fp, (((char *) dpp) - (char *) dp) < size))
471 return -1; /* errno is set for us. */
472
473 *dpp++ = (ctf_id_t) (uintptr_t) type;
474
475 /* When emitting unindexed output, all later symbols are pads: stop
476 early. */
477 if ((flags & CTF_SYMTYPETAB_EMIT_PAD) && idx[i]->st_symidx == outmax)
478 break;
479 }
480
481 return 0;
482 }
483
484 /* Emit an objt or func symtypetab index into DP in a paticular order defined by
485 an array of symbol names passed in. Stop at NIDX. The linker-reported set
486 of symbols (if any) is found in SYMFP. */
487 static int
488 emit_symtypetab_index (ctf_dict_t *fp, ctf_dict_t *symfp, uint32_t *dp,
489 const char **idx, uint32_t nidx, int size, int flags)
490 {
491 uint32_t i;
492 uint32_t *dpp = dp;
493 ctf_dynhash_t *symhash;
494
495 ctf_dprintf ("Emitting index of size %i, %u entries reported by linker, "
496 "flags %i\n", size, nidx, flags);
497
498 /* Empty table? Nothing to do. */
499 if (size == 0)
500 return 0;
501
502 if (flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
503 symhash = fp->ctf_funchash;
504 else
505 symhash = fp->ctf_objthash;
506
507 /* Indexes should always be unpadded. */
508 if (!ctf_assert (fp, !(flags & CTF_SYMTYPETAB_EMIT_PAD)))
509 return -1; /* errno is set for us. */
510
511 for (i = 0; i < nidx; i++)
512 {
513 const char *sym_name;
514 void *type;
515
516 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
517 {
518 ctf_link_sym_t *this_link_sym;
519
520 this_link_sym = ctf_dynhash_lookup (symfp->ctf_dynsyms, idx[i]);
521
522 /* This is an index: unreported symbols should never appear in it. */
523 if (!ctf_assert (fp, this_link_sym != NULL))
524 return -1; /* errno is set for us. */
525
526 /* Symbol of the wrong type, or skippable? This symbol is not in this
527 table. */
528 if (((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
529 && this_link_sym->st_type != STT_FUNC)
530 || (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
531 && this_link_sym->st_type != STT_OBJECT))
532 continue;
533
534 if (ctf_symtab_skippable (this_link_sym))
535 continue;
536
537 sym_name = this_link_sym->st_name;
538
539 /* Linker reports symbol of a different type to the symbol we actually
540 added? Skip the symbol. */
541 if ((this_link_sym->st_type == STT_FUNC)
542 && (ctf_dynhash_lookup (fp->ctf_objthash, sym_name)))
543 continue;
544
545 if ((this_link_sym->st_type == STT_OBJECT)
546 && (ctf_dynhash_lookup (fp->ctf_funchash, sym_name)))
547 continue;
548 }
549 else
550 sym_name = idx[i];
551
552 /* Symbol in index and reported by linker, but no type set? Silently skip
553 and (optionally) pad. (In force-indexed mode, this is also where we
554 track symbols of the wrong type for this round of insertion.) */
555 if ((type = ctf_dynhash_lookup (symhash, sym_name)) == NULL)
556 continue;
557
558 ctf_str_add_ref (fp, sym_name, dpp++);
559
560 if (!ctf_assert (fp, (((char *) dpp) - (char *) dp) <= size))
561 return -1; /* errno is set for us. */
562 }
563
564 return 0;
565 }
566
567 static unsigned char *
568 ctf_copy_smembers (ctf_dict_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
569 {
570 ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
571 ctf_member_t ctm;
572
573 for (; dmd != NULL; dmd = ctf_list_next (dmd))
574 {
575 ctf_member_t *copied;
576
577 ctm.ctm_name = 0;
578 ctm.ctm_type = (uint32_t) dmd->dmd_type;
579 ctm.ctm_offset = (uint32_t) dmd->dmd_offset;
580
581 memcpy (t, &ctm, sizeof (ctm));
582 copied = (ctf_member_t *) t;
583 if (dmd->dmd_name)
584 ctf_str_add_ref (fp, dmd->dmd_name, &copied->ctm_name);
585
586 t += sizeof (ctm);
587 }
588
589 return t;
590 }
591
592 static unsigned char *
593 ctf_copy_lmembers (ctf_dict_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
594 {
595 ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
596 ctf_lmember_t ctlm;
597
598 for (; dmd != NULL; dmd = ctf_list_next (dmd))
599 {
600 ctf_lmember_t *copied;
601
602 ctlm.ctlm_name = 0;
603 ctlm.ctlm_type = (uint32_t) dmd->dmd_type;
604 ctlm.ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (dmd->dmd_offset);
605 ctlm.ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (dmd->dmd_offset);
606
607 memcpy (t, &ctlm, sizeof (ctlm));
608 copied = (ctf_lmember_t *) t;
609 if (dmd->dmd_name)
610 ctf_str_add_ref (fp, dmd->dmd_name, &copied->ctlm_name);
611
612 t += sizeof (ctlm);
613 }
614
615 return t;
616 }
617
618 static unsigned char *
619 ctf_copy_emembers (ctf_dict_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
620 {
621 ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
622 ctf_enum_t cte;
623
624 for (; dmd != NULL; dmd = ctf_list_next (dmd))
625 {
626 ctf_enum_t *copied;
627
628 cte.cte_value = dmd->dmd_value;
629 memcpy (t, &cte, sizeof (cte));
630 copied = (ctf_enum_t *) t;
631 ctf_str_add_ref (fp, dmd->dmd_name, &copied->cte_name);
632 t += sizeof (cte);
633 }
634
635 return t;
636 }
637
638 /* Sort a newly-constructed static variable array. */
639
640 typedef struct ctf_sort_var_arg_cb
641 {
642 ctf_dict_t *fp;
643 ctf_strs_t *strtab;
644 } ctf_sort_var_arg_cb_t;
645
646 static int
647 ctf_sort_var (const void *one_, const void *two_, void *arg_)
648 {
649 const ctf_varent_t *one = one_;
650 const ctf_varent_t *two = two_;
651 ctf_sort_var_arg_cb_t *arg = arg_;
652
653 return (strcmp (ctf_strraw_explicit (arg->fp, one->ctv_name, arg->strtab),
654 ctf_strraw_explicit (arg->fp, two->ctv_name, arg->strtab)));
655 }
656
657 /* Compatibility: just update the threshold for ctf_discard. */
658 int
659 ctf_update (ctf_dict_t *fp)
660 {
661 if (!(fp->ctf_flags & LCTF_RDWR))
662 return (ctf_set_errno (fp, ECTF_RDONLY));
663
664 fp->ctf_dtoldid = fp->ctf_typemax;
665 return 0;
666 }
667
668 /* If the specified CTF dict is writable and has been modified, reload this dict
669 with the updated type definitions, ready for serialization. In order to make
670 this code and the rest of libctf as simple as possible, we perform updates by
671 taking the dynamic type definitions and creating an in-memory CTF dict
672 containing the definitions, and then call ctf_simple_open_internal() on it.
673 We perform one extra trick here for the benefit of callers and to keep our
674 code simple: ctf_simple_open_internal() will return a new ctf_dict_t, but we
675 want to keep the fp constant for the caller, so after
676 ctf_simple_open_internal() returns, we use memcpy to swap the interior of the
677 old and new ctf_dict_t's, and then free the old. */
678 int
679 ctf_serialize (ctf_dict_t *fp)
680 {
681 ctf_dict_t ofp, *nfp;
682 ctf_header_t hdr, *hdrp;
683 ctf_dtdef_t *dtd;
684 ctf_dvdef_t *dvd;
685 ctf_varent_t *dvarents;
686 ctf_strs_writable_t strtab;
687
688 unsigned char *t;
689 unsigned long i;
690 size_t buf_size, type_size, objt_size, func_size;
691 size_t objt_unpadsize, func_unpadsize, objt_padsize, func_padsize;
692 size_t funcidx_size, objtidx_size;
693 size_t nvars, nfuncs, nobjts, maxobjt, maxfunc;
694 size_t nsymtypes = 0;
695 const char **sym_name_order = NULL;
696 unsigned char *buf = NULL, *newbuf;
697 int err;
698
699 /* Symtab filtering. If filter_syms is true, symfp is set: otherwise,
700 CTF_SYMTYPETAB_FORCE_INDEXED is set in symflags. */
701 int filter_syms = 0;
702 int sort_syms = 1;
703 int symflags = 0;
704 ctf_dict_t *symfp = NULL;
705
706 if (!(fp->ctf_flags & LCTF_RDWR))
707 return (ctf_set_errno (fp, ECTF_RDONLY));
708
709 /* Update required? */
710 if (!(fp->ctf_flags & LCTF_DIRTY))
711 return 0;
712
713 /* If doing a writeout as part of linking, and the link flags request it,
714 filter out reported symbols from the variable section, and filter out all
715 other symbols from the symtypetab sections. (If we are not linking, the
716 symbols are sorted; if we are linking, don't bother sorting if we are not
717 filtering out reported symbols: this is almost certaily an ld -r and only
718 the linker is likely to consume these symtypetabs again. The linker
719 doesn't care what order the symtypetab entries is in, since it only
720 iterates over symbols and does not use the ctf_lookup_by_symbol* API.) */
721
722 if (fp->ctf_flags & LCTF_LINKING)
723 {
724 filter_syms = !(fp->ctf_link_flags & CTF_LINK_NO_FILTER_REPORTED_SYMS);
725 if (!filter_syms)
726 sort_syms = 0;
727 }
728
729 /* Fill in an initial CTF header. We will leave the label, object,
730 and function sections empty and only output a header, type section,
731 and string table. The type section begins at a 4-byte aligned
732 boundary past the CTF header itself (at relative offset zero). The flag
733 indicating a new-style function info section (an array of CTF_K_FUNCTION
734 type IDs in the types section) is flipped on. */
735
736 memset (&hdr, 0, sizeof (hdr));
737 hdr.cth_magic = CTF_MAGIC;
738 hdr.cth_version = CTF_VERSION;
739
740 /* This is a new-format func info section, and the symtab and strtab come out
741 of the dynsym and dynstr these days. */
742 hdr.cth_flags = (CTF_F_NEWFUNCINFO | CTF_F_DYNSTR);
743
744 /* Iterate through the dynamic type definition list and compute the
745 size of the CTF type section we will need to generate. */
746
747 for (type_size = 0, dtd = ctf_list_next (&fp->ctf_dtdefs);
748 dtd != NULL; dtd = ctf_list_next (dtd))
749 {
750 uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
751 uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
752
753 if (dtd->dtd_data.ctt_size != CTF_LSIZE_SENT)
754 type_size += sizeof (ctf_stype_t);
755 else
756 type_size += sizeof (ctf_type_t);
757
758 switch (kind)
759 {
760 case CTF_K_INTEGER:
761 case CTF_K_FLOAT:
762 type_size += sizeof (uint32_t);
763 break;
764 case CTF_K_ARRAY:
765 type_size += sizeof (ctf_array_t);
766 break;
767 case CTF_K_SLICE:
768 type_size += sizeof (ctf_slice_t);
769 break;
770 case CTF_K_FUNCTION:
771 type_size += sizeof (uint32_t) * (vlen + (vlen & 1));
772 break;
773 case CTF_K_STRUCT:
774 case CTF_K_UNION:
775 if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH)
776 type_size += sizeof (ctf_member_t) * vlen;
777 else
778 type_size += sizeof (ctf_lmember_t) * vlen;
779 break;
780 case CTF_K_ENUM:
781 type_size += sizeof (ctf_enum_t) * vlen;
782 break;
783 }
784 }
785
786 /* Find the dict to which the linker has reported symbols, if any. */
787
788 if (filter_syms)
789 {
790 if (!fp->ctf_dynsyms && fp->ctf_parent && fp->ctf_parent->ctf_dynsyms)
791 symfp = fp->ctf_parent;
792 else
793 symfp = fp;
794 }
795
796 /* If not filtering, keep all potential symbols in an unsorted, indexed
797 dict. */
798 if (!filter_syms)
799 symflags = CTF_SYMTYPETAB_FORCE_INDEXED;
800 else
801 hdr.cth_flags |= CTF_F_IDXSORTED;
802
803 if (!ctf_assert (fp, (filter_syms && symfp)
804 || (!filter_syms && !symfp
805 && ((symflags & CTF_SYMTYPETAB_FORCE_INDEXED) != 0))))
806 return -1;
807
808 /* Work out the sizes of the object and function sections, and work out the
809 number of pad (unassigned) symbols in each, and the overall size of the
810 sections. */
811
812 if (symtypetab_density (fp, symfp, fp->ctf_objthash, &nobjts, &maxobjt,
813 &objt_unpadsize, &objt_padsize, &objtidx_size,
814 symflags) < 0)
815 return -1; /* errno is set for us. */
816
817 ctf_dprintf ("Object symtypetab: %i objects, max %i, unpadded size %i, "
818 "%i bytes of pads, index size %i\n", (int) nobjts, (int) maxobjt,
819 (int) objt_unpadsize, (int) objt_padsize, (int) objtidx_size);
820
821 if (symtypetab_density (fp, symfp, fp->ctf_funchash, &nfuncs, &maxfunc,
822 &func_unpadsize, &func_padsize, &funcidx_size,
823 symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
824 return -1; /* errno is set for us. */
825
826 ctf_dprintf ("Function symtypetab: %i functions, max %i, unpadded size %i, "
827 "%i bytes of pads, index size %i\n", (int) nfuncs, (int) maxfunc,
828 (int) func_unpadsize, (int) func_padsize, (int) funcidx_size);
829
830 /* If we are filtering symbols out, those symbols that the linker has not
831 reported have now been removed from the ctf_objthash and ctf_funchash.
832 Delete entries from the variable section that duplicate newly-added data
833 symbols. There's no need to migrate new ones in, because the compiler
834 always emits both a variable and a data symbol simultaneously, and
835 filtering only happens at final link time. */
836
837 if (filter_syms && symfp->ctf_dynsyms &&
838 symtypetab_delete_nonstatic_vars (fp, symfp) < 0)
839 return -1;
840
841 /* It is worth indexing each section if it would save space to do so, due to
842 reducing the number of pads sufficiently. A pad is the same size as a
843 single index entry: but index sections compress relatively poorly compared
844 to constant pads, so it takes a lot of contiguous padding to equal one
845 index section entry. It would be nice to be able to *verify* whether we
846 would save space after compression rather than guessing, but this seems
847 difficult, since it would require complete reserialization. Regardless, if
848 the linker has not reported any symbols (e.g. if this is not a final link
849 but just an ld -r), we must emit things in indexed fashion just as the
850 compiler does. */
851
852 objt_size = objt_unpadsize;
853 if (!(symflags & CTF_SYMTYPETAB_FORCE_INDEXED)
854 && ((objt_padsize + objt_unpadsize) * CTF_INDEX_PAD_THRESHOLD
855 > objt_padsize))
856 {
857 objt_size += objt_padsize;
858 objtidx_size = 0;
859 }
860
861 func_size = func_unpadsize;
862 if (!(symflags & CTF_SYMTYPETAB_FORCE_INDEXED)
863 && ((func_padsize + func_unpadsize) * CTF_INDEX_PAD_THRESHOLD
864 > func_padsize))
865 {
866 func_size += func_padsize;
867 funcidx_size = 0;
868 }
869
870 /* Computing the number of entries in the CTF variable section is much
871 simpler. */
872
873 for (nvars = 0, dvd = ctf_list_next (&fp->ctf_dvdefs);
874 dvd != NULL; dvd = ctf_list_next (dvd), nvars++);
875
876 /* Compute the size of the CTF buffer we need, sans only the string table,
877 then allocate a new buffer and memcpy the finished header to the start of
878 the buffer. (We will adjust this later with strtab length info.) */
879
880 hdr.cth_lbloff = hdr.cth_objtoff = 0;
881 hdr.cth_funcoff = hdr.cth_objtoff + objt_size;
882 hdr.cth_objtidxoff = hdr.cth_funcoff + func_size;
883 hdr.cth_funcidxoff = hdr.cth_objtidxoff + objtidx_size;
884 hdr.cth_varoff = hdr.cth_funcidxoff + funcidx_size;
885 hdr.cth_typeoff = hdr.cth_varoff + (nvars * sizeof (ctf_varent_t));
886 hdr.cth_stroff = hdr.cth_typeoff + type_size;
887 hdr.cth_strlen = 0;
888
889 buf_size = sizeof (ctf_header_t) + hdr.cth_stroff + hdr.cth_strlen;
890
891 if ((buf = malloc (buf_size)) == NULL)
892 return (ctf_set_errno (fp, EAGAIN));
893
894 memcpy (buf, &hdr, sizeof (ctf_header_t));
895 t = (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_objtoff;
896
897 hdrp = (ctf_header_t *) buf;
898 if ((fp->ctf_flags & LCTF_CHILD) && (fp->ctf_parname != NULL))
899 ctf_str_add_ref (fp, fp->ctf_parname, &hdrp->cth_parname);
900 if (fp->ctf_cuname != NULL)
901 ctf_str_add_ref (fp, fp->ctf_cuname, &hdrp->cth_cuname);
902
903 /* Sort the linker's symbols into name order if need be. */
904
905 if ((objtidx_size != 0) || (funcidx_size != 0))
906 {
907 ctf_next_t *i = NULL;
908 void *symname;
909 const char **walk;
910 int err;
911
912 if (filter_syms)
913 {
914 if (symfp->ctf_dynsyms)
915 nsymtypes = ctf_dynhash_elements (symfp->ctf_dynsyms);
916 else
917 nsymtypes = 0;
918 }
919 else
920 nsymtypes = ctf_dynhash_elements (fp->ctf_objthash)
921 + ctf_dynhash_elements (fp->ctf_funchash);
922
923 if ((sym_name_order = calloc (nsymtypes, sizeof (const char *))) == NULL)
924 goto oom;
925
926 walk = sym_name_order;
927
928 if (filter_syms)
929 {
930 if (symfp->ctf_dynsyms)
931 {
932 while ((err = ctf_dynhash_next_sorted (symfp->ctf_dynsyms, &i,
933 &symname, NULL,
934 ctf_dynhash_sort_by_name,
935 NULL)) == 0)
936 *walk++ = (const char *) symname;
937 if (err != ECTF_NEXT_END)
938 goto symerr;
939 }
940 }
941 else
942 {
943 ctf_hash_sort_f sort_fun = NULL;
944
945 /* Since we partition the set of symbols back into objt and func,
946 we can sort the two independently without harm. */
947 if (sort_syms)
948 sort_fun = ctf_dynhash_sort_by_name;
949
950 while ((err = ctf_dynhash_next_sorted (fp->ctf_objthash, &i, &symname,
951 NULL, sort_fun, NULL)) == 0)
952 *walk++ = (const char *) symname;
953 if (err != ECTF_NEXT_END)
954 goto symerr;
955
956 while ((err = ctf_dynhash_next_sorted (fp->ctf_funchash, &i, &symname,
957 NULL, sort_fun, NULL)) == 0)
958 *walk++ = (const char *) symname;
959 if (err != ECTF_NEXT_END)
960 goto symerr;
961 }
962 }
963
964 /* Emit the object and function sections, and if necessary their indexes.
965 Emission is done in symtab order if there is no index, and in index
966 (name) order otherwise. */
967
968 if ((objtidx_size == 0) && symfp && symfp->ctf_dynsymidx)
969 {
970 ctf_dprintf ("Emitting unindexed objt symtypetab\n");
971 if (emit_symtypetab (fp, symfp, (uint32_t *) t, symfp->ctf_dynsymidx,
972 NULL, symfp->ctf_dynsymmax + 1, maxobjt, objt_size,
973 symflags | CTF_SYMTYPETAB_EMIT_PAD) < 0)
974 goto err; /* errno is set for us. */
975 }
976 else
977 {
978 ctf_dprintf ("Emitting indexed objt symtypetab\n");
979 if (emit_symtypetab (fp, symfp, (uint32_t *) t, NULL, sym_name_order,
980 nsymtypes, maxobjt, objt_size, symflags) < 0)
981 goto err; /* errno is set for us. */
982 }
983
984 t += objt_size;
985
986 if ((funcidx_size == 0) && symfp && symfp->ctf_dynsymidx)
987 {
988 ctf_dprintf ("Emitting unindexed func symtypetab\n");
989 if (emit_symtypetab (fp, symfp, (uint32_t *) t, symfp->ctf_dynsymidx,
990 NULL, symfp->ctf_dynsymmax + 1, maxfunc,
991 func_size, symflags | CTF_SYMTYPETAB_EMIT_FUNCTION
992 | CTF_SYMTYPETAB_EMIT_PAD) < 0)
993 goto err; /* errno is set for us. */
994 }
995 else
996 {
997 ctf_dprintf ("Emitting indexed func symtypetab\n");
998 if (emit_symtypetab (fp, symfp, (uint32_t *) t, NULL, sym_name_order,
999 nsymtypes, maxfunc, func_size,
1000 symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
1001 goto err; /* errno is set for us. */
1002 }
1003
1004 t += func_size;
1005
1006 if (objtidx_size > 0)
1007 if (emit_symtypetab_index (fp, symfp, (uint32_t *) t, sym_name_order,
1008 nsymtypes, objtidx_size, symflags) < 0)
1009 goto err;
1010
1011 t += objtidx_size;
1012
1013 if (funcidx_size > 0)
1014 if (emit_symtypetab_index (fp, symfp, (uint32_t *) t, sym_name_order,
1015 nsymtypes, funcidx_size,
1016 symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
1017 goto err;
1018
1019 t += funcidx_size;
1020 free (sym_name_order);
1021 sym_name_order = NULL;
1022
1023 /* Work over the variable list, translating everything into ctf_varent_t's and
1024 prepping the string table. */
1025
1026 dvarents = (ctf_varent_t *) t;
1027 for (i = 0, dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL;
1028 dvd = ctf_list_next (dvd), i++)
1029 {
1030 ctf_varent_t *var = &dvarents[i];
1031
1032 ctf_str_add_ref (fp, dvd->dvd_name, &var->ctv_name);
1033 var->ctv_type = (uint32_t) dvd->dvd_type;
1034 }
1035 assert (i == nvars);
1036
1037 t += sizeof (ctf_varent_t) * nvars;
1038
1039 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_typeoff);
1040
1041 /* We now take a final lap through the dynamic type definition list and copy
1042 the appropriate type records to the output buffer, noting down the
1043 strings as we go. */
1044
1045 for (dtd = ctf_list_next (&fp->ctf_dtdefs);
1046 dtd != NULL; dtd = ctf_list_next (dtd))
1047 {
1048 uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1049 uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
1050
1051 ctf_array_t cta;
1052 uint32_t encoding;
1053 size_t len;
1054 ctf_stype_t *copied;
1055 const char *name;
1056
1057 if (dtd->dtd_data.ctt_size != CTF_LSIZE_SENT)
1058 len = sizeof (ctf_stype_t);
1059 else
1060 len = sizeof (ctf_type_t);
1061
1062 memcpy (t, &dtd->dtd_data, len);
1063 copied = (ctf_stype_t *) t; /* name is at the start: constant offset. */
1064 if (copied->ctt_name
1065 && (name = ctf_strraw (fp, copied->ctt_name)) != NULL)
1066 ctf_str_add_ref (fp, name, &copied->ctt_name);
1067 t += len;
1068
1069 switch (kind)
1070 {
1071 case CTF_K_INTEGER:
1072 case CTF_K_FLOAT:
1073 if (kind == CTF_K_INTEGER)
1074 {
1075 encoding = CTF_INT_DATA (dtd->dtd_u.dtu_enc.cte_format,
1076 dtd->dtd_u.dtu_enc.cte_offset,
1077 dtd->dtd_u.dtu_enc.cte_bits);
1078 }
1079 else
1080 {
1081 encoding = CTF_FP_DATA (dtd->dtd_u.dtu_enc.cte_format,
1082 dtd->dtd_u.dtu_enc.cte_offset,
1083 dtd->dtd_u.dtu_enc.cte_bits);
1084 }
1085 memcpy (t, &encoding, sizeof (encoding));
1086 t += sizeof (encoding);
1087 break;
1088
1089 case CTF_K_SLICE:
1090 memcpy (t, &dtd->dtd_u.dtu_slice, sizeof (struct ctf_slice));
1091 t += sizeof (struct ctf_slice);
1092 break;
1093
1094 case CTF_K_ARRAY:
1095 cta.cta_contents = (uint32_t) dtd->dtd_u.dtu_arr.ctr_contents;
1096 cta.cta_index = (uint32_t) dtd->dtd_u.dtu_arr.ctr_index;
1097 cta.cta_nelems = dtd->dtd_u.dtu_arr.ctr_nelems;
1098 memcpy (t, &cta, sizeof (cta));
1099 t += sizeof (cta);
1100 break;
1101
1102 case CTF_K_FUNCTION:
1103 {
1104 uint32_t *argv = (uint32_t *) (uintptr_t) t;
1105 uint32_t argc;
1106
1107 for (argc = 0; argc < vlen; argc++)
1108 *argv++ = dtd->dtd_u.dtu_argv[argc];
1109
1110 if (vlen & 1)
1111 *argv++ = 0; /* Pad to 4-byte boundary. */
1112
1113 t = (unsigned char *) argv;
1114 break;
1115 }
1116
1117 case CTF_K_STRUCT:
1118 case CTF_K_UNION:
1119 if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH)
1120 t = ctf_copy_smembers (fp, dtd, t);
1121 else
1122 t = ctf_copy_lmembers (fp, dtd, t);
1123 break;
1124
1125 case CTF_K_ENUM:
1126 t = ctf_copy_emembers (fp, dtd, t);
1127 break;
1128 }
1129 }
1130 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_stroff);
1131
1132 /* Construct the final string table and fill out all the string refs with the
1133 final offsets. Then purge the refs list, because we're about to move this
1134 strtab onto the end of the buf, invalidating all the offsets. */
1135 strtab = ctf_str_write_strtab (fp);
1136 ctf_str_purge_refs (fp);
1137
1138 if (strtab.cts_strs == NULL)
1139 goto oom;
1140
1141 /* Now the string table is constructed, we can sort the buffer of
1142 ctf_varent_t's. */
1143 ctf_sort_var_arg_cb_t sort_var_arg = { fp, (ctf_strs_t *) &strtab };
1144 ctf_qsort_r (dvarents, nvars, sizeof (ctf_varent_t), ctf_sort_var,
1145 &sort_var_arg);
1146
1147 if ((newbuf = ctf_realloc (fp, buf, buf_size + strtab.cts_len)) == NULL)
1148 {
1149 free (strtab.cts_strs);
1150 goto oom;
1151 }
1152 buf = newbuf;
1153 memcpy (buf + buf_size, strtab.cts_strs, strtab.cts_len);
1154 hdrp = (ctf_header_t *) buf;
1155 hdrp->cth_strlen = strtab.cts_len;
1156 buf_size += hdrp->cth_strlen;
1157 free (strtab.cts_strs);
1158
1159 /* Finally, we are ready to ctf_simple_open() the new dict. If this is
1160 successful, we then switch nfp and fp and free the old dict. */
1161
1162 if ((nfp = ctf_simple_open_internal ((char *) buf, buf_size, NULL, 0,
1163 0, NULL, 0, fp->ctf_syn_ext_strtab,
1164 1, &err)) == NULL)
1165 {
1166 free (buf);
1167 return (ctf_set_errno (fp, err));
1168 }
1169
1170 (void) ctf_setmodel (nfp, ctf_getmodel (fp));
1171
1172 nfp->ctf_parent = fp->ctf_parent;
1173 nfp->ctf_parent_unreffed = fp->ctf_parent_unreffed;
1174 nfp->ctf_refcnt = fp->ctf_refcnt;
1175 nfp->ctf_flags |= fp->ctf_flags & ~LCTF_DIRTY;
1176 if (nfp->ctf_dynbase == NULL)
1177 nfp->ctf_dynbase = buf; /* Make sure buf is freed on close. */
1178 nfp->ctf_dthash = fp->ctf_dthash;
1179 nfp->ctf_dtdefs = fp->ctf_dtdefs;
1180 nfp->ctf_dvhash = fp->ctf_dvhash;
1181 nfp->ctf_dvdefs = fp->ctf_dvdefs;
1182 nfp->ctf_dtoldid = fp->ctf_dtoldid;
1183 nfp->ctf_add_processing = fp->ctf_add_processing;
1184 nfp->ctf_snapshots = fp->ctf_snapshots + 1;
1185 nfp->ctf_specific = fp->ctf_specific;
1186 nfp->ctf_nfuncidx = fp->ctf_nfuncidx;
1187 nfp->ctf_nobjtidx = fp->ctf_nobjtidx;
1188 nfp->ctf_objthash = fp->ctf_objthash;
1189 nfp->ctf_funchash = fp->ctf_funchash;
1190 nfp->ctf_dynsyms = fp->ctf_dynsyms;
1191 nfp->ctf_ptrtab = fp->ctf_ptrtab;
1192 nfp->ctf_pptrtab = fp->ctf_pptrtab;
1193 nfp->ctf_dynsymidx = fp->ctf_dynsymidx;
1194 nfp->ctf_dynsymmax = fp->ctf_dynsymmax;
1195 nfp->ctf_ptrtab_len = fp->ctf_ptrtab_len;
1196 nfp->ctf_pptrtab_len = fp->ctf_pptrtab_len;
1197 nfp->ctf_link_inputs = fp->ctf_link_inputs;
1198 nfp->ctf_link_outputs = fp->ctf_link_outputs;
1199 nfp->ctf_errs_warnings = fp->ctf_errs_warnings;
1200 nfp->ctf_funcidx_names = fp->ctf_funcidx_names;
1201 nfp->ctf_objtidx_names = fp->ctf_objtidx_names;
1202 nfp->ctf_funcidx_sxlate = fp->ctf_funcidx_sxlate;
1203 nfp->ctf_objtidx_sxlate = fp->ctf_objtidx_sxlate;
1204 nfp->ctf_str_prov_offset = fp->ctf_str_prov_offset;
1205 nfp->ctf_syn_ext_strtab = fp->ctf_syn_ext_strtab;
1206 nfp->ctf_pptrtab_typemax = fp->ctf_pptrtab_typemax;
1207 nfp->ctf_in_flight_dynsyms = fp->ctf_in_flight_dynsyms;
1208 nfp->ctf_link_in_cu_mapping = fp->ctf_link_in_cu_mapping;
1209 nfp->ctf_link_out_cu_mapping = fp->ctf_link_out_cu_mapping;
1210 nfp->ctf_link_type_mapping = fp->ctf_link_type_mapping;
1211 nfp->ctf_link_memb_name_changer = fp->ctf_link_memb_name_changer;
1212 nfp->ctf_link_memb_name_changer_arg = fp->ctf_link_memb_name_changer_arg;
1213 nfp->ctf_link_variable_filter = fp->ctf_link_variable_filter;
1214 nfp->ctf_link_variable_filter_arg = fp->ctf_link_variable_filter_arg;
1215 nfp->ctf_symsect_little_endian = fp->ctf_symsect_little_endian;
1216 nfp->ctf_link_flags = fp->ctf_link_flags;
1217 nfp->ctf_dedup_atoms = fp->ctf_dedup_atoms;
1218 nfp->ctf_dedup_atoms_alloc = fp->ctf_dedup_atoms_alloc;
1219 memcpy (&nfp->ctf_dedup, &fp->ctf_dedup, sizeof (fp->ctf_dedup));
1220
1221 nfp->ctf_snapshot_lu = fp->ctf_snapshots;
1222
1223 memcpy (&nfp->ctf_lookups, fp->ctf_lookups, sizeof (fp->ctf_lookups));
1224 nfp->ctf_structs = fp->ctf_structs;
1225 nfp->ctf_unions = fp->ctf_unions;
1226 nfp->ctf_enums = fp->ctf_enums;
1227 nfp->ctf_names = fp->ctf_names;
1228
1229 fp->ctf_dthash = NULL;
1230 ctf_str_free_atoms (nfp);
1231 nfp->ctf_str_atoms = fp->ctf_str_atoms;
1232 nfp->ctf_prov_strtab = fp->ctf_prov_strtab;
1233 fp->ctf_str_atoms = NULL;
1234 fp->ctf_prov_strtab = NULL;
1235 memset (&fp->ctf_dtdefs, 0, sizeof (ctf_list_t));
1236 memset (&fp->ctf_errs_warnings, 0, sizeof (ctf_list_t));
1237 fp->ctf_add_processing = NULL;
1238 fp->ctf_ptrtab = NULL;
1239 fp->ctf_pptrtab = NULL;
1240 fp->ctf_funcidx_names = NULL;
1241 fp->ctf_objtidx_names = NULL;
1242 fp->ctf_funcidx_sxlate = NULL;
1243 fp->ctf_objtidx_sxlate = NULL;
1244 fp->ctf_objthash = NULL;
1245 fp->ctf_funchash = NULL;
1246 fp->ctf_dynsyms = NULL;
1247 fp->ctf_dynsymidx = NULL;
1248 fp->ctf_link_inputs = NULL;
1249 fp->ctf_link_outputs = NULL;
1250 fp->ctf_syn_ext_strtab = NULL;
1251 fp->ctf_link_in_cu_mapping = NULL;
1252 fp->ctf_link_out_cu_mapping = NULL;
1253 fp->ctf_link_type_mapping = NULL;
1254 fp->ctf_dedup_atoms = NULL;
1255 fp->ctf_dedup_atoms_alloc = NULL;
1256 fp->ctf_parent_unreffed = 1;
1257
1258 fp->ctf_dvhash = NULL;
1259 memset (&fp->ctf_dvdefs, 0, sizeof (ctf_list_t));
1260 memset (fp->ctf_lookups, 0, sizeof (fp->ctf_lookups));
1261 memset (&fp->ctf_in_flight_dynsyms, 0, sizeof (fp->ctf_in_flight_dynsyms));
1262 memset (&fp->ctf_dedup, 0, sizeof (fp->ctf_dedup));
1263 fp->ctf_structs.ctn_writable = NULL;
1264 fp->ctf_unions.ctn_writable = NULL;
1265 fp->ctf_enums.ctn_writable = NULL;
1266 fp->ctf_names.ctn_writable = NULL;
1267
1268 memcpy (&ofp, fp, sizeof (ctf_dict_t));
1269 memcpy (fp, nfp, sizeof (ctf_dict_t));
1270 memcpy (nfp, &ofp, sizeof (ctf_dict_t));
1271
1272 nfp->ctf_refcnt = 1; /* Force nfp to be freed. */
1273 ctf_dict_close (nfp);
1274
1275 return 0;
1276
1277 symerr:
1278 ctf_err_warn (fp, 0, err, _("error serializing symtypetabs"));
1279 goto err;
1280 oom:
1281 free (buf);
1282 free (sym_name_order);
1283 return (ctf_set_errno (fp, EAGAIN));
1284 err:
1285 free (buf);
1286 free (sym_name_order);
1287 return -1; /* errno is set for us. */
1288 }
1289
1290 ctf_names_t *
1291 ctf_name_table (ctf_dict_t *fp, int kind)
1292 {
1293 switch (kind)
1294 {
1295 case CTF_K_STRUCT:
1296 return &fp->ctf_structs;
1297 case CTF_K_UNION:
1298 return &fp->ctf_unions;
1299 case CTF_K_ENUM:
1300 return &fp->ctf_enums;
1301 default:
1302 return &fp->ctf_names;
1303 }
1304 }
1305
1306 int
1307 ctf_dtd_insert (ctf_dict_t *fp, ctf_dtdef_t *dtd, int flag, int kind)
1308 {
1309 const char *name;
1310 if (ctf_dynhash_insert (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type,
1311 dtd) < 0)
1312 {
1313 ctf_set_errno (fp, ENOMEM);
1314 return -1;
1315 }
1316
1317 if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name
1318 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL)
1319 {
1320 if (ctf_dynhash_insert (ctf_name_table (fp, kind)->ctn_writable,
1321 (char *) name, (void *) (uintptr_t)
1322 dtd->dtd_type) < 0)
1323 {
1324 ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t)
1325 dtd->dtd_type);
1326 ctf_set_errno (fp, ENOMEM);
1327 return -1;
1328 }
1329 }
1330 ctf_list_append (&fp->ctf_dtdefs, dtd);
1331 return 0;
1332 }
1333
1334 void
1335 ctf_dtd_delete (ctf_dict_t *fp, ctf_dtdef_t *dtd)
1336 {
1337 ctf_dmdef_t *dmd, *nmd;
1338 int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1339 int name_kind = kind;
1340 const char *name;
1341
1342 ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type);
1343
1344 switch (kind)
1345 {
1346 case CTF_K_STRUCT:
1347 case CTF_K_UNION:
1348 case CTF_K_ENUM:
1349 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
1350 dmd != NULL; dmd = nmd)
1351 {
1352 if (dmd->dmd_name != NULL)
1353 free (dmd->dmd_name);
1354 nmd = ctf_list_next (dmd);
1355 free (dmd);
1356 }
1357 break;
1358 case CTF_K_FUNCTION:
1359 free (dtd->dtd_u.dtu_argv);
1360 break;
1361 case CTF_K_FORWARD:
1362 name_kind = dtd->dtd_data.ctt_type;
1363 break;
1364 }
1365
1366 if (dtd->dtd_data.ctt_name
1367 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
1368 && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
1369 {
1370 ctf_dynhash_remove (ctf_name_table (fp, name_kind)->ctn_writable,
1371 name);
1372 ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
1373 }
1374
1375 ctf_list_delete (&fp->ctf_dtdefs, dtd);
1376 free (dtd);
1377 }
1378
1379 ctf_dtdef_t *
1380 ctf_dtd_lookup (const ctf_dict_t *fp, ctf_id_t type)
1381 {
1382 return (ctf_dtdef_t *)
1383 ctf_dynhash_lookup (fp->ctf_dthash, (void *) (uintptr_t) type);
1384 }
1385
1386 ctf_dtdef_t *
1387 ctf_dynamic_type (const ctf_dict_t *fp, ctf_id_t id)
1388 {
1389 ctf_id_t idx;
1390
1391 if (!(fp->ctf_flags & LCTF_RDWR))
1392 return NULL;
1393
1394 if ((fp->ctf_flags & LCTF_CHILD) && LCTF_TYPE_ISPARENT (fp, id))
1395 fp = fp->ctf_parent;
1396
1397 idx = LCTF_TYPE_TO_INDEX(fp, id);
1398
1399 if ((unsigned long) idx <= fp->ctf_typemax)
1400 return ctf_dtd_lookup (fp, id);
1401 return NULL;
1402 }
1403
1404 int
1405 ctf_dvd_insert (ctf_dict_t *fp, ctf_dvdef_t *dvd)
1406 {
1407 if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0)
1408 {
1409 ctf_set_errno (fp, ENOMEM);
1410 return -1;
1411 }
1412 ctf_list_append (&fp->ctf_dvdefs, dvd);
1413 return 0;
1414 }
1415
1416 void
1417 ctf_dvd_delete (ctf_dict_t *fp, ctf_dvdef_t *dvd)
1418 {
1419 ctf_dynhash_remove (fp->ctf_dvhash, dvd->dvd_name);
1420 free (dvd->dvd_name);
1421
1422 ctf_list_delete (&fp->ctf_dvdefs, dvd);
1423 free (dvd);
1424 }
1425
1426 ctf_dvdef_t *
1427 ctf_dvd_lookup (const ctf_dict_t *fp, const char *name)
1428 {
1429 return (ctf_dvdef_t *) ctf_dynhash_lookup (fp->ctf_dvhash, name);
1430 }
1431
1432 /* Discard all of the dynamic type definitions and variable definitions that
1433 have been added to the dict since the last call to ctf_update(). We locate
1434 such types by scanning the dtd list and deleting elements that have type IDs
1435 greater than ctf_dtoldid, which is set by ctf_update(), above, and by
1436 scanning the variable list and deleting elements that have update IDs equal
1437 to the current value of the last-update snapshot count (indicating that they
1438 were added after the most recent call to ctf_update()). */
1439 int
1440 ctf_discard (ctf_dict_t *fp)
1441 {
1442 ctf_snapshot_id_t last_update =
1443 { fp->ctf_dtoldid,
1444 fp->ctf_snapshot_lu + 1 };
1445
1446 /* Update required? */
1447 if (!(fp->ctf_flags & LCTF_DIRTY))
1448 return 0;
1449
1450 return (ctf_rollback (fp, last_update));
1451 }
1452
1453 ctf_snapshot_id_t
1454 ctf_snapshot (ctf_dict_t *fp)
1455 {
1456 ctf_snapshot_id_t snapid;
1457 snapid.dtd_id = fp->ctf_typemax;
1458 snapid.snapshot_id = fp->ctf_snapshots++;
1459 return snapid;
1460 }
1461
1462 /* Like ctf_discard(), only discards everything after a particular ID. */
1463 int
1464 ctf_rollback (ctf_dict_t *fp, ctf_snapshot_id_t id)
1465 {
1466 ctf_dtdef_t *dtd, *ntd;
1467 ctf_dvdef_t *dvd, *nvd;
1468
1469 if (!(fp->ctf_flags & LCTF_RDWR))
1470 return (ctf_set_errno (fp, ECTF_RDONLY));
1471
1472 if (fp->ctf_snapshot_lu >= id.snapshot_id)
1473 return (ctf_set_errno (fp, ECTF_OVERROLLBACK));
1474
1475 for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1476 {
1477 int kind;
1478 const char *name;
1479
1480 ntd = ctf_list_next (dtd);
1481
1482 if (LCTF_TYPE_TO_INDEX (fp, dtd->dtd_type) <= id.dtd_id)
1483 continue;
1484
1485 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1486 if (kind == CTF_K_FORWARD)
1487 kind = dtd->dtd_data.ctt_type;
1488
1489 if (dtd->dtd_data.ctt_name
1490 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
1491 && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
1492 {
1493 ctf_dynhash_remove (ctf_name_table (fp, kind)->ctn_writable,
1494 name);
1495 ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
1496 }
1497
1498 ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type);
1499 ctf_dtd_delete (fp, dtd);
1500 }
1501
1502 for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1503 {
1504 nvd = ctf_list_next (dvd);
1505
1506 if (dvd->dvd_snapshots <= id.snapshot_id)
1507 continue;
1508
1509 ctf_dvd_delete (fp, dvd);
1510 }
1511
1512 fp->ctf_typemax = id.dtd_id;
1513 fp->ctf_snapshots = id.snapshot_id;
1514
1515 if (fp->ctf_snapshots == fp->ctf_snapshot_lu)
1516 fp->ctf_flags &= ~LCTF_DIRTY;
1517
1518 return 0;
1519 }
1520
1521 static ctf_id_t
1522 ctf_add_generic (ctf_dict_t *fp, uint32_t flag, const char *name, int kind,
1523 ctf_dtdef_t **rp)
1524 {
1525 ctf_dtdef_t *dtd;
1526 ctf_id_t type;
1527
1528 if (flag != CTF_ADD_NONROOT && flag != CTF_ADD_ROOT)
1529 return (ctf_set_errno (fp, EINVAL));
1530
1531 if (!(fp->ctf_flags & LCTF_RDWR))
1532 return (ctf_set_errno (fp, ECTF_RDONLY));
1533
1534 if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) >= CTF_MAX_TYPE)
1535 return (ctf_set_errno (fp, ECTF_FULL));
1536
1537 if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) == (CTF_MAX_PTYPE - 1))
1538 return (ctf_set_errno (fp, ECTF_FULL));
1539
1540 /* Make sure ptrtab always grows to be big enough for all types. */
1541 if (ctf_grow_ptrtab (fp) < 0)
1542 return CTF_ERR; /* errno is set for us. */
1543
1544 if ((dtd = malloc (sizeof (ctf_dtdef_t))) == NULL)
1545 return (ctf_set_errno (fp, EAGAIN));
1546
1547 type = ++fp->ctf_typemax;
1548 type = LCTF_INDEX_TO_TYPE (fp, type, (fp->ctf_flags & LCTF_CHILD));
1549
1550 memset (dtd, 0, sizeof (ctf_dtdef_t));
1551 dtd->dtd_data.ctt_name = ctf_str_add_ref (fp, name, &dtd->dtd_data.ctt_name);
1552 dtd->dtd_type = type;
1553
1554 if (dtd->dtd_data.ctt_name == 0 && name != NULL && name[0] != '\0')
1555 {
1556 free (dtd);
1557 return (ctf_set_errno (fp, EAGAIN));
1558 }
1559
1560 if (ctf_dtd_insert (fp, dtd, flag, kind) < 0)
1561 {
1562 free (dtd);
1563 return CTF_ERR; /* errno is set for us. */
1564 }
1565 fp->ctf_flags |= LCTF_DIRTY;
1566
1567 *rp = dtd;
1568 return type;
1569 }
1570
1571 /* When encoding integer sizes, we want to convert a byte count in the range
1572 1-8 to the closest power of 2 (e.g. 3->4, 5->8, etc). The clp2() function
1573 is a clever implementation from "Hacker's Delight" by Henry Warren, Jr. */
1574 static size_t
1575 clp2 (size_t x)
1576 {
1577 x--;
1578
1579 x |= (x >> 1);
1580 x |= (x >> 2);
1581 x |= (x >> 4);
1582 x |= (x >> 8);
1583 x |= (x >> 16);
1584
1585 return (x + 1);
1586 }
1587
1588 ctf_id_t
1589 ctf_add_encoded (ctf_dict_t *fp, uint32_t flag,
1590 const char *name, const ctf_encoding_t *ep, uint32_t kind)
1591 {
1592 ctf_dtdef_t *dtd;
1593 ctf_id_t type;
1594
1595 if (ep == NULL)
1596 return (ctf_set_errno (fp, EINVAL));
1597
1598 if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
1599 return CTF_ERR; /* errno is set for us. */
1600
1601 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
1602 dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
1603 / CHAR_BIT);
1604 dtd->dtd_u.dtu_enc = *ep;
1605
1606 return type;
1607 }
1608
1609 ctf_id_t
1610 ctf_add_reftype (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref, uint32_t kind)
1611 {
1612 ctf_dtdef_t *dtd;
1613 ctf_id_t type;
1614 ctf_dict_t *tmp = fp;
1615 int child = fp->ctf_flags & LCTF_CHILD;
1616
1617 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1618 return (ctf_set_errno (fp, EINVAL));
1619
1620 if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
1621 return CTF_ERR; /* errno is set for us. */
1622
1623 if ((type = ctf_add_generic (fp, flag, NULL, kind, &dtd)) == CTF_ERR)
1624 return CTF_ERR; /* errno is set for us. */
1625
1626 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
1627 dtd->dtd_data.ctt_type = (uint32_t) ref;
1628
1629 if (kind != CTF_K_POINTER)
1630 return type;
1631
1632 /* If we are adding a pointer, update the ptrtab, pointing at this type from
1633 the type it points to. Note that ctf_typemax is at this point one higher
1634 than we want to check against, because it's just been incremented for the
1635 addition of this type. The pptrtab is lazily-updated as needed, so is not
1636 touched here. */
1637
1638 uint32_t type_idx = LCTF_TYPE_TO_INDEX (fp, type);
1639 uint32_t ref_idx = LCTF_TYPE_TO_INDEX (fp, ref);
1640
1641 if (LCTF_TYPE_ISCHILD (fp, ref) == child
1642 && ref_idx < fp->ctf_typemax)
1643 fp->ctf_ptrtab[ref_idx] = type_idx;
1644
1645 return type;
1646 }
1647
1648 ctf_id_t
1649 ctf_add_slice (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref,
1650 const ctf_encoding_t *ep)
1651 {
1652 ctf_dtdef_t *dtd;
1653 ctf_id_t resolved_ref = ref;
1654 ctf_id_t type;
1655 int kind;
1656 const ctf_type_t *tp;
1657 ctf_dict_t *tmp = fp;
1658
1659 if (ep == NULL)
1660 return (ctf_set_errno (fp, EINVAL));
1661
1662 if ((ep->cte_bits > 255) || (ep->cte_offset > 255))
1663 return (ctf_set_errno (fp, ECTF_SLICEOVERFLOW));
1664
1665 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1666 return (ctf_set_errno (fp, EINVAL));
1667
1668 if (ref != 0 && ((tp = ctf_lookup_by_id (&tmp, ref)) == NULL))
1669 return CTF_ERR; /* errno is set for us. */
1670
1671 /* Make sure we ultimately point to an integral type. We also allow slices to
1672 point to the unimplemented type, for now, because the compiler can emit
1673 such slices, though they're not very much use. */
1674
1675 resolved_ref = ctf_type_resolve_unsliced (tmp, ref);
1676 kind = ctf_type_kind_unsliced (tmp, resolved_ref);
1677
1678 if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) &&
1679 (kind != CTF_K_ENUM)
1680 && (ref != 0))
1681 return (ctf_set_errno (fp, ECTF_NOTINTFP));
1682
1683 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_SLICE, &dtd)) == CTF_ERR)
1684 return CTF_ERR; /* errno is set for us. */
1685
1686 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_SLICE, flag, 0);
1687 dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
1688 / CHAR_BIT);
1689 dtd->dtd_u.dtu_slice.cts_type = (uint32_t) ref;
1690 dtd->dtd_u.dtu_slice.cts_bits = ep->cte_bits;
1691 dtd->dtd_u.dtu_slice.cts_offset = ep->cte_offset;
1692
1693 return type;
1694 }
1695
1696 ctf_id_t
1697 ctf_add_integer (ctf_dict_t *fp, uint32_t flag,
1698 const char *name, const ctf_encoding_t *ep)
1699 {
1700 return (ctf_add_encoded (fp, flag, name, ep, CTF_K_INTEGER));
1701 }
1702
1703 ctf_id_t
1704 ctf_add_float (ctf_dict_t *fp, uint32_t flag,
1705 const char *name, const ctf_encoding_t *ep)
1706 {
1707 return (ctf_add_encoded (fp, flag, name, ep, CTF_K_FLOAT));
1708 }
1709
1710 ctf_id_t
1711 ctf_add_pointer (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
1712 {
1713 return (ctf_add_reftype (fp, flag, ref, CTF_K_POINTER));
1714 }
1715
1716 ctf_id_t
1717 ctf_add_array (ctf_dict_t *fp, uint32_t flag, const ctf_arinfo_t *arp)
1718 {
1719 ctf_dtdef_t *dtd;
1720 ctf_id_t type;
1721 ctf_dict_t *tmp = fp;
1722
1723 if (arp == NULL)
1724 return (ctf_set_errno (fp, EINVAL));
1725
1726 if (arp->ctr_contents != 0
1727 && ctf_lookup_by_id (&tmp, arp->ctr_contents) == NULL)
1728 return CTF_ERR; /* errno is set for us. */
1729
1730 tmp = fp;
1731 if (ctf_lookup_by_id (&tmp, arp->ctr_index) == NULL)
1732 return CTF_ERR; /* errno is set for us. */
1733
1734 if (ctf_type_kind (fp, arp->ctr_index) == CTF_K_FORWARD)
1735 {
1736 ctf_err_warn (fp, 1, ECTF_INCOMPLETE,
1737 _("ctf_add_array: index type %lx is incomplete"),
1738 arp->ctr_contents);
1739 return (ctf_set_errno (fp, ECTF_INCOMPLETE));
1740 }
1741
1742 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_ARRAY, &dtd)) == CTF_ERR)
1743 return CTF_ERR; /* errno is set for us. */
1744
1745 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ARRAY, flag, 0);
1746 dtd->dtd_data.ctt_size = 0;
1747 dtd->dtd_u.dtu_arr = *arp;
1748
1749 return type;
1750 }
1751
1752 int
1753 ctf_set_array (ctf_dict_t *fp, ctf_id_t type, const ctf_arinfo_t *arp)
1754 {
1755 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
1756
1757 if (!(fp->ctf_flags & LCTF_RDWR))
1758 return (ctf_set_errno (fp, ECTF_RDONLY));
1759
1760 if (dtd == NULL
1761 || LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) != CTF_K_ARRAY)
1762 return (ctf_set_errno (fp, ECTF_BADID));
1763
1764 fp->ctf_flags |= LCTF_DIRTY;
1765 dtd->dtd_u.dtu_arr = *arp;
1766
1767 return 0;
1768 }
1769
1770 ctf_id_t
1771 ctf_add_function (ctf_dict_t *fp, uint32_t flag,
1772 const ctf_funcinfo_t *ctc, const ctf_id_t *argv)
1773 {
1774 ctf_dtdef_t *dtd;
1775 ctf_id_t type;
1776 uint32_t vlen;
1777 uint32_t *vdat = NULL;
1778 ctf_dict_t *tmp = fp;
1779 size_t i;
1780
1781 if (!(fp->ctf_flags & LCTF_RDWR))
1782 return (ctf_set_errno (fp, ECTF_RDONLY));
1783
1784 if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0
1785 || (ctc->ctc_argc != 0 && argv == NULL))
1786 return (ctf_set_errno (fp, EINVAL));
1787
1788 vlen = ctc->ctc_argc;
1789 if (ctc->ctc_flags & CTF_FUNC_VARARG)
1790 vlen++; /* Add trailing zero to indicate varargs (see below). */
1791
1792 if (ctc->ctc_return != 0
1793 && ctf_lookup_by_id (&tmp, ctc->ctc_return) == NULL)
1794 return CTF_ERR; /* errno is set for us. */
1795
1796 if (vlen > CTF_MAX_VLEN)
1797 return (ctf_set_errno (fp, EOVERFLOW));
1798
1799 if (vlen != 0 && (vdat = malloc (sizeof (ctf_id_t) * vlen)) == NULL)
1800 return (ctf_set_errno (fp, EAGAIN));
1801
1802 for (i = 0; i < ctc->ctc_argc; i++)
1803 {
1804 tmp = fp;
1805 if (argv[i] != 0 && ctf_lookup_by_id (&tmp, argv[i]) == NULL)
1806 {
1807 free (vdat);
1808 return CTF_ERR; /* errno is set for us. */
1809 }
1810 vdat[i] = (uint32_t) argv[i];
1811 }
1812
1813 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_FUNCTION,
1814 &dtd)) == CTF_ERR)
1815 {
1816 free (vdat);
1817 return CTF_ERR; /* errno is set for us. */
1818 }
1819
1820 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
1821 dtd->dtd_data.ctt_type = (uint32_t) ctc->ctc_return;
1822
1823 if (ctc->ctc_flags & CTF_FUNC_VARARG)
1824 vdat[vlen - 1] = 0; /* Add trailing zero to indicate varargs. */
1825 dtd->dtd_u.dtu_argv = vdat;
1826
1827 return type;
1828 }
1829
1830 ctf_id_t
1831 ctf_add_struct_sized (ctf_dict_t *fp, uint32_t flag, const char *name,
1832 size_t size)
1833 {
1834 ctf_dtdef_t *dtd;
1835 ctf_id_t type = 0;
1836
1837 /* Promote root-visible forwards to structs. */
1838 if (name != NULL)
1839 type = ctf_lookup_by_rawname (fp, CTF_K_STRUCT, name);
1840
1841 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1842 dtd = ctf_dtd_lookup (fp, type);
1843 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_STRUCT,
1844 &dtd)) == CTF_ERR)
1845 return CTF_ERR; /* errno is set for us. */
1846
1847 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_STRUCT, flag, 0);
1848
1849 if (size > CTF_MAX_SIZE)
1850 {
1851 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1852 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1853 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1854 }
1855 else
1856 dtd->dtd_data.ctt_size = (uint32_t) size;
1857
1858 return type;
1859 }
1860
1861 ctf_id_t
1862 ctf_add_struct (ctf_dict_t *fp, uint32_t flag, const char *name)
1863 {
1864 return (ctf_add_struct_sized (fp, flag, name, 0));
1865 }
1866
1867 ctf_id_t
1868 ctf_add_union_sized (ctf_dict_t *fp, uint32_t flag, const char *name,
1869 size_t size)
1870 {
1871 ctf_dtdef_t *dtd;
1872 ctf_id_t type = 0;
1873
1874 /* Promote root-visible forwards to unions. */
1875 if (name != NULL)
1876 type = ctf_lookup_by_rawname (fp, CTF_K_UNION, name);
1877
1878 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1879 dtd = ctf_dtd_lookup (fp, type);
1880 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_UNION,
1881 &dtd)) == CTF_ERR)
1882 return CTF_ERR; /* errno is set for us */
1883
1884 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_UNION, flag, 0);
1885
1886 if (size > CTF_MAX_SIZE)
1887 {
1888 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1889 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1890 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1891 }
1892 else
1893 dtd->dtd_data.ctt_size = (uint32_t) size;
1894
1895 return type;
1896 }
1897
1898 ctf_id_t
1899 ctf_add_union (ctf_dict_t *fp, uint32_t flag, const char *name)
1900 {
1901 return (ctf_add_union_sized (fp, flag, name, 0));
1902 }
1903
1904 ctf_id_t
1905 ctf_add_enum (ctf_dict_t *fp, uint32_t flag, const char *name)
1906 {
1907 ctf_dtdef_t *dtd;
1908 ctf_id_t type = 0;
1909
1910 /* Promote root-visible forwards to enums. */
1911 if (name != NULL)
1912 type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1913
1914 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1915 dtd = ctf_dtd_lookup (fp, type);
1916 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_ENUM,
1917 &dtd)) == CTF_ERR)
1918 return CTF_ERR; /* errno is set for us. */
1919
1920 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ENUM, flag, 0);
1921 dtd->dtd_data.ctt_size = fp->ctf_dmodel->ctd_int;
1922
1923 return type;
1924 }
1925
1926 ctf_id_t
1927 ctf_add_enum_encoded (ctf_dict_t *fp, uint32_t flag, const char *name,
1928 const ctf_encoding_t *ep)
1929 {
1930 ctf_id_t type = 0;
1931
1932 /* First, create the enum if need be, using most of the same machinery as
1933 ctf_add_enum(), to ensure that we do not allow things past that are not
1934 enums or forwards to them. (This includes other slices: you cannot slice a
1935 slice, which would be a useless thing to do anyway.) */
1936
1937 if (name != NULL)
1938 type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1939
1940 if (type != 0)
1941 {
1942 if ((ctf_type_kind (fp, type) != CTF_K_FORWARD) &&
1943 (ctf_type_kind_unsliced (fp, type) != CTF_K_ENUM))
1944 return (ctf_set_errno (fp, ECTF_NOTINTFP));
1945 }
1946 else if ((type = ctf_add_enum (fp, flag, name)) == CTF_ERR)
1947 return CTF_ERR; /* errno is set for us. */
1948
1949 /* Now attach a suitable slice to it. */
1950
1951 return ctf_add_slice (fp, flag, type, ep);
1952 }
1953
1954 ctf_id_t
1955 ctf_add_forward (ctf_dict_t *fp, uint32_t flag, const char *name,
1956 uint32_t kind)
1957 {
1958 ctf_dtdef_t *dtd;
1959 ctf_id_t type = 0;
1960
1961 if (!ctf_forwardable_kind (kind))
1962 return (ctf_set_errno (fp, ECTF_NOTSUE));
1963
1964 /* If the type is already defined or exists as a forward tag, just
1965 return the ctf_id_t of the existing definition. */
1966
1967 if (name != NULL)
1968 type = ctf_lookup_by_rawname (fp, kind, name);
1969
1970 if (type)
1971 return type;
1972
1973 if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
1974 return CTF_ERR; /* errno is set for us. */
1975
1976 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FORWARD, flag, 0);
1977 dtd->dtd_data.ctt_type = kind;
1978
1979 return type;
1980 }
1981
1982 ctf_id_t
1983 ctf_add_typedef (ctf_dict_t *fp, uint32_t flag, const char *name,
1984 ctf_id_t ref)
1985 {
1986 ctf_dtdef_t *dtd;
1987 ctf_id_t type;
1988 ctf_dict_t *tmp = fp;
1989
1990 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1991 return (ctf_set_errno (fp, EINVAL));
1992
1993 if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
1994 return CTF_ERR; /* errno is set for us. */
1995
1996 if ((type = ctf_add_generic (fp, flag, name, CTF_K_TYPEDEF,
1997 &dtd)) == CTF_ERR)
1998 return CTF_ERR; /* errno is set for us. */
1999
2000 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_TYPEDEF, flag, 0);
2001 dtd->dtd_data.ctt_type = (uint32_t) ref;
2002
2003 return type;
2004 }
2005
2006 ctf_id_t
2007 ctf_add_volatile (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
2008 {
2009 return (ctf_add_reftype (fp, flag, ref, CTF_K_VOLATILE));
2010 }
2011
2012 ctf_id_t
2013 ctf_add_const (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
2014 {
2015 return (ctf_add_reftype (fp, flag, ref, CTF_K_CONST));
2016 }
2017
2018 ctf_id_t
2019 ctf_add_restrict (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
2020 {
2021 return (ctf_add_reftype (fp, flag, ref, CTF_K_RESTRICT));
2022 }
2023
2024 int
2025 ctf_add_enumerator (ctf_dict_t *fp, ctf_id_t enid, const char *name,
2026 int value)
2027 {
2028 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, enid);
2029 ctf_dmdef_t *dmd;
2030
2031 uint32_t kind, vlen, root;
2032 char *s;
2033
2034 if (name == NULL)
2035 return (ctf_set_errno (fp, EINVAL));
2036
2037 if (!(fp->ctf_flags & LCTF_RDWR))
2038 return (ctf_set_errno (fp, ECTF_RDONLY));
2039
2040 if (dtd == NULL)
2041 return (ctf_set_errno (fp, ECTF_BADID));
2042
2043 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
2044 root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
2045 vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
2046
2047 if (kind != CTF_K_ENUM)
2048 return (ctf_set_errno (fp, ECTF_NOTENUM));
2049
2050 if (vlen == CTF_MAX_VLEN)
2051 return (ctf_set_errno (fp, ECTF_DTFULL));
2052
2053 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
2054 dmd != NULL; dmd = ctf_list_next (dmd))
2055 {
2056 if (strcmp (dmd->dmd_name, name) == 0)
2057 return (ctf_set_errno (fp, ECTF_DUPLICATE));
2058 }
2059
2060 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
2061 return (ctf_set_errno (fp, EAGAIN));
2062
2063 if ((s = strdup (name)) == NULL)
2064 {
2065 free (dmd);
2066 return (ctf_set_errno (fp, EAGAIN));
2067 }
2068
2069 dmd->dmd_name = s;
2070 dmd->dmd_type = CTF_ERR;
2071 dmd->dmd_offset = 0;
2072 dmd->dmd_value = value;
2073
2074 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
2075 ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
2076
2077 fp->ctf_flags |= LCTF_DIRTY;
2078
2079 return 0;
2080 }
2081
2082 int
2083 ctf_add_member_offset (ctf_dict_t *fp, ctf_id_t souid, const char *name,
2084 ctf_id_t type, unsigned long bit_offset)
2085 {
2086 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, souid);
2087 ctf_dmdef_t *dmd;
2088
2089 ssize_t msize, malign, ssize;
2090 uint32_t kind, vlen, root;
2091 char *s = NULL;
2092 int is_incomplete = 0;
2093
2094 if (!(fp->ctf_flags & LCTF_RDWR))
2095 return (ctf_set_errno (fp, ECTF_RDONLY));
2096
2097 if (dtd == NULL)
2098 return (ctf_set_errno (fp, ECTF_BADID));
2099
2100 if (name != NULL && name[0] == '\0')
2101 name = NULL;
2102
2103 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
2104 root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
2105 vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
2106
2107 if (kind != CTF_K_STRUCT && kind != CTF_K_UNION)
2108 return (ctf_set_errno (fp, ECTF_NOTSOU));
2109
2110 if (vlen == CTF_MAX_VLEN)
2111 return (ctf_set_errno (fp, ECTF_DTFULL));
2112
2113 if (name != NULL)
2114 {
2115 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
2116 dmd != NULL; dmd = ctf_list_next (dmd))
2117 {
2118 if (dmd->dmd_name != NULL && strcmp (dmd->dmd_name, name) == 0)
2119 return (ctf_set_errno (fp, ECTF_DUPLICATE));
2120 }
2121 }
2122
2123 if ((msize = ctf_type_size (fp, type)) < 0 ||
2124 (malign = ctf_type_align (fp, type)) < 0)
2125 {
2126 /* The unimplemented type, and any type that resolves to it, has no size
2127 and no alignment: it can correspond to any number of compiler-inserted
2128 types. We allow incomplete types through since they are routinely
2129 added to the ends of structures, and can even be added elsewhere in
2130 structures by the deduplicator. They are assumed to be zero-size with
2131 no alignment: this is often wrong, but problems can be avoided in this
2132 case by explicitly specifying the size of the structure via the _sized
2133 functions. The deduplicator always does this. */
2134
2135 msize = 0;
2136 malign = 0;
2137 if (ctf_errno (fp) == ECTF_NONREPRESENTABLE)
2138 ctf_set_errno (fp, 0);
2139 else if (ctf_errno (fp) == ECTF_INCOMPLETE)
2140 is_incomplete = 1;
2141 else
2142 return -1; /* errno is set for us. */
2143 }
2144
2145 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
2146 return (ctf_set_errno (fp, EAGAIN));
2147
2148 if (name != NULL && (s = strdup (name)) == NULL)
2149 {
2150 free (dmd);
2151 return (ctf_set_errno (fp, EAGAIN));
2152 }
2153
2154 dmd->dmd_name = s;
2155 dmd->dmd_type = type;
2156 dmd->dmd_value = -1;
2157
2158 if (kind == CTF_K_STRUCT && vlen != 0)
2159 {
2160 if (bit_offset == (unsigned long) - 1)
2161 {
2162 /* Natural alignment. */
2163
2164 ctf_dmdef_t *lmd = ctf_list_prev (&dtd->dtd_u.dtu_members);
2165 ctf_id_t ltype = ctf_type_resolve (fp, lmd->dmd_type);
2166 size_t off = lmd->dmd_offset;
2167
2168 ctf_encoding_t linfo;
2169 ssize_t lsize;
2170
2171 /* Propagate any error from ctf_type_resolve. If the last member was
2172 of unimplemented type, this may be -ECTF_NONREPRESENTABLE: we
2173 cannot insert right after such a member without explicit offset
2174 specification, because its alignment and size is not known. */
2175 if (ltype == CTF_ERR)
2176 {
2177 free (dmd);
2178 return -1; /* errno is set for us. */
2179 }
2180
2181 if (is_incomplete)
2182 {
2183 ctf_err_warn (fp, 1, ECTF_INCOMPLETE,
2184 _("ctf_add_member_offset: cannot add member %s of "
2185 "incomplete type %lx to struct %lx without "
2186 "specifying explicit offset\n"),
2187 name ? name : _("(unnamed member)"), type, souid);
2188 return (ctf_set_errno (fp, ECTF_INCOMPLETE));
2189 }
2190
2191 if (ctf_type_encoding (fp, ltype, &linfo) == 0)
2192 off += linfo.cte_bits;
2193 else if ((lsize = ctf_type_size (fp, ltype)) > 0)
2194 off += lsize * CHAR_BIT;
2195 else if (lsize == -1 && ctf_errno (fp) == ECTF_INCOMPLETE)
2196 {
2197 ctf_err_warn (fp, 1, ECTF_INCOMPLETE,
2198 _("ctf_add_member_offset: cannot add member %s of "
2199 "type %lx to struct %lx without specifying "
2200 "explicit offset after member %s of type %lx, "
2201 "which is an incomplete type\n"),
2202 name ? name : _("(unnamed member)"), type, souid,
2203 lmd->dmd_name ? lmd->dmd_name
2204 : _("(unnamed member)"), ltype);
2205 return -1; /* errno is set for us. */
2206 }
2207
2208 /* Round up the offset of the end of the last member to
2209 the next byte boundary, convert 'off' to bytes, and
2210 then round it up again to the next multiple of the
2211 alignment required by the new member. Finally,
2212 convert back to bits and store the result in
2213 dmd_offset. Technically we could do more efficient
2214 packing if the new member is a bit-field, but we're
2215 the "compiler" and ANSI says we can do as we choose. */
2216
2217 off = roundup (off, CHAR_BIT) / CHAR_BIT;
2218 off = roundup (off, MAX (malign, 1));
2219 dmd->dmd_offset = off * CHAR_BIT;
2220 ssize = off + msize;
2221 }
2222 else
2223 {
2224 /* Specified offset in bits. */
2225
2226 dmd->dmd_offset = bit_offset;
2227 ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
2228 ssize = MAX (ssize, ((signed) bit_offset / CHAR_BIT) + msize);
2229 }
2230 }
2231 else
2232 {
2233 dmd->dmd_offset = 0;
2234 ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
2235 ssize = MAX (ssize, msize);
2236 }
2237
2238 if ((size_t) ssize > CTF_MAX_SIZE)
2239 {
2240 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
2241 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (ssize);
2242 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (ssize);
2243 }
2244 else
2245 dtd->dtd_data.ctt_size = (uint32_t) ssize;
2246
2247 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
2248 ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
2249
2250 fp->ctf_flags |= LCTF_DIRTY;
2251 return 0;
2252 }
2253
2254 int
2255 ctf_add_member_encoded (ctf_dict_t *fp, ctf_id_t souid, const char *name,
2256 ctf_id_t type, unsigned long bit_offset,
2257 const ctf_encoding_t encoding)
2258 {
2259 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
2260 int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
2261 int otype = type;
2262
2263 if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) && (kind != CTF_K_ENUM))
2264 return (ctf_set_errno (fp, ECTF_NOTINTFP));
2265
2266 if ((type = ctf_add_slice (fp, CTF_ADD_NONROOT, otype, &encoding)) == CTF_ERR)
2267 return -1; /* errno is set for us. */
2268
2269 return ctf_add_member_offset (fp, souid, name, type, bit_offset);
2270 }
2271
2272 int
2273 ctf_add_member (ctf_dict_t *fp, ctf_id_t souid, const char *name,
2274 ctf_id_t type)
2275 {
2276 return ctf_add_member_offset (fp, souid, name, type, (unsigned long) - 1);
2277 }
2278
2279 int
2280 ctf_add_variable (ctf_dict_t *fp, const char *name, ctf_id_t ref)
2281 {
2282 ctf_dvdef_t *dvd;
2283 ctf_dict_t *tmp = fp;
2284
2285 if (!(fp->ctf_flags & LCTF_RDWR))
2286 return (ctf_set_errno (fp, ECTF_RDONLY));
2287
2288 if (ctf_dvd_lookup (fp, name) != NULL)
2289 return (ctf_set_errno (fp, ECTF_DUPLICATE));
2290
2291 if (ctf_lookup_by_id (&tmp, ref) == NULL)
2292 return -1; /* errno is set for us. */
2293
2294 /* Make sure this type is representable. */
2295 if ((ctf_type_resolve (fp, ref) == CTF_ERR)
2296 && (ctf_errno (fp) == ECTF_NONREPRESENTABLE))
2297 return -1;
2298
2299 if ((dvd = malloc (sizeof (ctf_dvdef_t))) == NULL)
2300 return (ctf_set_errno (fp, EAGAIN));
2301
2302 if (name != NULL && (dvd->dvd_name = strdup (name)) == NULL)
2303 {
2304 free (dvd);
2305 return (ctf_set_errno (fp, EAGAIN));
2306 }
2307 dvd->dvd_type = ref;
2308 dvd->dvd_snapshots = fp->ctf_snapshots;
2309
2310 if (ctf_dvd_insert (fp, dvd) < 0)
2311 {
2312 free (dvd->dvd_name);
2313 free (dvd);
2314 return -1; /* errno is set for us. */
2315 }
2316
2317 fp->ctf_flags |= LCTF_DIRTY;
2318 return 0;
2319 }
2320
2321 int
2322 ctf_add_funcobjt_sym (ctf_dict_t *fp, int is_function, const char *name, ctf_id_t id)
2323 {
2324 ctf_dict_t *tmp = fp;
2325 char *dupname;
2326 ctf_dynhash_t *h = is_function ? fp->ctf_funchash : fp->ctf_objthash;
2327
2328 if (!(fp->ctf_flags & LCTF_RDWR))
2329 return (ctf_set_errno (fp, ECTF_RDONLY));
2330
2331 if (ctf_dynhash_lookup (fp->ctf_objthash, name) != NULL ||
2332 ctf_dynhash_lookup (fp->ctf_funchash, name) != NULL)
2333 return (ctf_set_errno (fp, ECTF_DUPLICATE));
2334
2335 if (ctf_lookup_by_id (&tmp, id) == NULL)
2336 return -1; /* errno is set for us. */
2337
2338 if (is_function && ctf_type_kind (fp, id) != CTF_K_FUNCTION)
2339 return (ctf_set_errno (fp, ECTF_NOTFUNC));
2340
2341 if ((dupname = strdup (name)) == NULL)
2342 return (ctf_set_errno (fp, ENOMEM));
2343
2344 if (ctf_dynhash_insert (h, dupname, (void *) (uintptr_t) id) < 0)
2345 {
2346 free (dupname);
2347 return (ctf_set_errno (fp, ENOMEM));
2348 }
2349 return 0;
2350 }
2351
2352 int
2353 ctf_add_objt_sym (ctf_dict_t *fp, const char *name, ctf_id_t id)
2354 {
2355 return (ctf_add_funcobjt_sym (fp, 0, name, id));
2356 }
2357
2358 int
2359 ctf_add_func_sym (ctf_dict_t *fp, const char *name, ctf_id_t id)
2360 {
2361 return (ctf_add_funcobjt_sym (fp, 1, name, id));
2362 }
2363
2364 typedef struct ctf_bundle
2365 {
2366 ctf_dict_t *ctb_dict; /* CTF dict handle. */
2367 ctf_id_t ctb_type; /* CTF type identifier. */
2368 ctf_dtdef_t *ctb_dtd; /* CTF dynamic type definition (if any). */
2369 } ctf_bundle_t;
2370
2371 static int
2372 enumcmp (const char *name, int value, void *arg)
2373 {
2374 ctf_bundle_t *ctb = arg;
2375 int bvalue;
2376
2377 if (ctf_enum_value (ctb->ctb_dict, ctb->ctb_type, name, &bvalue) < 0)
2378 {
2379 ctf_err_warn (ctb->ctb_dict, 0, 0,
2380 _("conflict due to enum %s iteration error"), name);
2381 return 1;
2382 }
2383 if (value != bvalue)
2384 {
2385 ctf_err_warn (ctb->ctb_dict, 1, ECTF_CONFLICT,
2386 _("conflict due to enum value change: %i versus %i"),
2387 value, bvalue);
2388 return 1;
2389 }
2390 return 0;
2391 }
2392
2393 static int
2394 enumadd (const char *name, int value, void *arg)
2395 {
2396 ctf_bundle_t *ctb = arg;
2397
2398 return (ctf_add_enumerator (ctb->ctb_dict, ctb->ctb_type,
2399 name, value) < 0);
2400 }
2401
2402 static int
2403 membcmp (const char *name, ctf_id_t type _libctf_unused_, unsigned long offset,
2404 void *arg)
2405 {
2406 ctf_bundle_t *ctb = arg;
2407 ctf_membinfo_t ctm;
2408
2409 /* Don't check nameless members (e.g. anonymous structs/unions) against each
2410 other. */
2411 if (name[0] == 0)
2412 return 0;
2413
2414 if (ctf_member_info (ctb->ctb_dict, ctb->ctb_type, name, &ctm) < 0)
2415 {
2416 ctf_err_warn (ctb->ctb_dict, 0, 0,
2417 _("conflict due to struct member %s iteration error"),
2418 name);
2419 return 1;
2420 }
2421 if (ctm.ctm_offset != offset)
2422 {
2423 ctf_err_warn (ctb->ctb_dict, 1, ECTF_CONFLICT,
2424 _("conflict due to struct member %s offset change: "
2425 "%lx versus %lx"),
2426 name, ctm.ctm_offset, offset);
2427 return 1;
2428 }
2429 return 0;
2430 }
2431
2432 static int
2433 membadd (const char *name, ctf_id_t type, unsigned long offset, void *arg)
2434 {
2435 ctf_bundle_t *ctb = arg;
2436 ctf_dmdef_t *dmd;
2437 char *s = NULL;
2438
2439 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
2440 return (ctf_set_errno (ctb->ctb_dict, EAGAIN));
2441
2442 /* Unnamed members in non-dynamic dicts have a name of "", while dynamic dicts
2443 use NULL. Adapt. */
2444
2445 if (name[0] == 0)
2446 name = NULL;
2447
2448 if (name != NULL && (s = strdup (name)) == NULL)
2449 {
2450 free (dmd);
2451 return (ctf_set_errno (ctb->ctb_dict, EAGAIN));
2452 }
2453
2454 /* For now, dmd_type is copied as the src_fp's type; it is reset to an
2455 equivalent dst_fp type by a final loop in ctf_add_type(), below. */
2456 dmd->dmd_name = s;
2457 dmd->dmd_type = type;
2458 dmd->dmd_offset = offset;
2459 dmd->dmd_value = -1;
2460
2461 ctf_list_append (&ctb->ctb_dtd->dtd_u.dtu_members, dmd);
2462
2463 ctb->ctb_dict->ctf_flags |= LCTF_DIRTY;
2464 return 0;
2465 }
2466
2467 /* The ctf_add_type routine is used to copy a type from a source CTF dictionary
2468 to a dynamic destination dictionary. This routine operates recursively by
2469 following the source type's links and embedded member types. If the
2470 destination dict already contains a named type which has the same attributes,
2471 then we succeed and return this type but no changes occur. */
2472 static ctf_id_t
2473 ctf_add_type_internal (ctf_dict_t *dst_fp, ctf_dict_t *src_fp, ctf_id_t src_type,
2474 ctf_dict_t *proc_tracking_fp)
2475 {
2476 ctf_id_t dst_type = CTF_ERR;
2477 uint32_t dst_kind = CTF_K_UNKNOWN;
2478 ctf_dict_t *tmp_fp = dst_fp;
2479 ctf_id_t tmp;
2480
2481 const char *name;
2482 uint32_t kind, forward_kind, flag, vlen;
2483
2484 const ctf_type_t *src_tp, *dst_tp;
2485 ctf_bundle_t src, dst;
2486 ctf_encoding_t src_en, dst_en;
2487 ctf_arinfo_t src_ar, dst_ar;
2488
2489 ctf_funcinfo_t ctc;
2490
2491 ctf_id_t orig_src_type = src_type;
2492
2493 if (!(dst_fp->ctf_flags & LCTF_RDWR))
2494 return (ctf_set_errno (dst_fp, ECTF_RDONLY));
2495
2496 if ((src_tp = ctf_lookup_by_id (&src_fp, src_type)) == NULL)
2497 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
2498
2499 if ((ctf_type_resolve (src_fp, src_type) == CTF_ERR)
2500 && (ctf_errno (src_fp) == ECTF_NONREPRESENTABLE))
2501 return (ctf_set_errno (dst_fp, ECTF_NONREPRESENTABLE));
2502
2503 name = ctf_strptr (src_fp, src_tp->ctt_name);
2504 kind = LCTF_INFO_KIND (src_fp, src_tp->ctt_info);
2505 flag = LCTF_INFO_ISROOT (src_fp, src_tp->ctt_info);
2506 vlen = LCTF_INFO_VLEN (src_fp, src_tp->ctt_info);
2507
2508 /* If this is a type we are currently in the middle of adding, hand it
2509 straight back. (This lets us handle self-referential structures without
2510 considering forwards and empty structures the same as their completed
2511 forms.) */
2512
2513 tmp = ctf_type_mapping (src_fp, src_type, &tmp_fp);
2514
2515 if (tmp != 0)
2516 {
2517 if (ctf_dynhash_lookup (proc_tracking_fp->ctf_add_processing,
2518 (void *) (uintptr_t) src_type))
2519 return tmp;
2520
2521 /* If this type has already been added from this dictionary, and is the
2522 same kind and (if a struct or union) has the same number of members,
2523 hand it straight back. */
2524
2525 if (ctf_type_kind_unsliced (tmp_fp, tmp) == (int) kind)
2526 {
2527 if (kind == CTF_K_STRUCT || kind == CTF_K_UNION
2528 || kind == CTF_K_ENUM)
2529 {
2530 if ((dst_tp = ctf_lookup_by_id (&tmp_fp, dst_type)) != NULL)
2531 if (vlen == LCTF_INFO_VLEN (tmp_fp, dst_tp->ctt_info))
2532 return tmp;
2533 }
2534 else
2535 return tmp;
2536 }
2537 }
2538
2539 forward_kind = kind;
2540 if (kind == CTF_K_FORWARD)
2541 forward_kind = src_tp->ctt_type;
2542
2543 /* If the source type has a name and is a root type (visible at the top-level
2544 scope), lookup the name in the destination dictionary and verify that it is
2545 of the same kind before we do anything else. */
2546
2547 if ((flag & CTF_ADD_ROOT) && name[0] != '\0'
2548 && (tmp = ctf_lookup_by_rawname (dst_fp, forward_kind, name)) != 0)
2549 {
2550 dst_type = tmp;
2551 dst_kind = ctf_type_kind_unsliced (dst_fp, dst_type);
2552 }
2553
2554 /* If an identically named dst_type exists, fail with ECTF_CONFLICT
2555 unless dst_type is a forward declaration and src_type is a struct,
2556 union, or enum (i.e. the definition of the previous forward decl).
2557
2558 We also allow addition in the opposite order (addition of a forward when a
2559 struct, union, or enum already exists), which is a NOP and returns the
2560 already-present struct, union, or enum. */
2561
2562 if (dst_type != CTF_ERR && dst_kind != kind)
2563 {
2564 if (kind == CTF_K_FORWARD
2565 && (dst_kind == CTF_K_ENUM || dst_kind == CTF_K_STRUCT
2566 || dst_kind == CTF_K_UNION))
2567 {
2568 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2569 return dst_type;
2570 }
2571
2572 if (dst_kind != CTF_K_FORWARD
2573 || (kind != CTF_K_ENUM && kind != CTF_K_STRUCT
2574 && kind != CTF_K_UNION))
2575 {
2576 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2577 _("ctf_add_type: conflict for type %s: "
2578 "kinds differ, new: %i; old (ID %lx): %i"),
2579 name, kind, dst_type, dst_kind);
2580 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2581 }
2582 }
2583
2584 /* We take special action for an integer, float, or slice since it is
2585 described not only by its name but also its encoding. For integers,
2586 bit-fields exploit this degeneracy. */
2587
2588 if (kind == CTF_K_INTEGER || kind == CTF_K_FLOAT || kind == CTF_K_SLICE)
2589 {
2590 if (ctf_type_encoding (src_fp, src_type, &src_en) != 0)
2591 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
2592
2593 if (dst_type != CTF_ERR)
2594 {
2595 ctf_dict_t *fp = dst_fp;
2596
2597 if ((dst_tp = ctf_lookup_by_id (&fp, dst_type)) == NULL)
2598 return CTF_ERR;
2599
2600 if (ctf_type_encoding (dst_fp, dst_type, &dst_en) != 0)
2601 return CTF_ERR; /* errno set for us. */
2602
2603 if (LCTF_INFO_ISROOT (fp, dst_tp->ctt_info) & CTF_ADD_ROOT)
2604 {
2605 /* The type that we found in the hash is also root-visible. If
2606 the two types match then use the existing one; otherwise,
2607 declare a conflict. Note: slices are not certain to match
2608 even if there is no conflict: we must check the contained type
2609 too. */
2610
2611 if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
2612 {
2613 if (kind != CTF_K_SLICE)
2614 {
2615 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2616 return dst_type;
2617 }
2618 }
2619 else
2620 {
2621 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2622 }
2623 }
2624 else
2625 {
2626 /* We found a non-root-visible type in the hash. If its encoding
2627 is the same, we can reuse it, unless it is a slice. */
2628
2629 if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
2630 {
2631 if (kind != CTF_K_SLICE)
2632 {
2633 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2634 return dst_type;
2635 }
2636 }
2637 }
2638 }
2639 }
2640
2641 src.ctb_dict = src_fp;
2642 src.ctb_type = src_type;
2643 src.ctb_dtd = NULL;
2644
2645 dst.ctb_dict = dst_fp;
2646 dst.ctb_type = dst_type;
2647 dst.ctb_dtd = NULL;
2648
2649 /* Now perform kind-specific processing. If dst_type is CTF_ERR, then we add
2650 a new type with the same properties as src_type to dst_fp. If dst_type is
2651 not CTF_ERR, then we verify that dst_type has the same attributes as
2652 src_type. We recurse for embedded references. Before we start, we note
2653 that we are processing this type, to prevent infinite recursion: we do not
2654 re-process any type that appears in this list. The list is emptied
2655 wholesale at the end of processing everything in this recursive stack. */
2656
2657 if (ctf_dynhash_insert (proc_tracking_fp->ctf_add_processing,
2658 (void *) (uintptr_t) src_type, (void *) 1) < 0)
2659 return ctf_set_errno (dst_fp, ENOMEM);
2660
2661 switch (kind)
2662 {
2663 case CTF_K_INTEGER:
2664 /* If we found a match we will have either returned it or declared a
2665 conflict. */
2666 dst_type = ctf_add_integer (dst_fp, flag, name, &src_en);
2667 break;
2668
2669 case CTF_K_FLOAT:
2670 /* If we found a match we will have either returned it or declared a
2671 conflict. */
2672 dst_type = ctf_add_float (dst_fp, flag, name, &src_en);
2673 break;
2674
2675 case CTF_K_SLICE:
2676 /* We have checked for conflicting encodings: now try to add the
2677 contained type. */
2678 src_type = ctf_type_reference (src_fp, src_type);
2679 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2680 proc_tracking_fp);
2681
2682 if (src_type == CTF_ERR)
2683 return CTF_ERR; /* errno is set for us. */
2684
2685 dst_type = ctf_add_slice (dst_fp, flag, src_type, &src_en);
2686 break;
2687
2688 case CTF_K_POINTER:
2689 case CTF_K_VOLATILE:
2690 case CTF_K_CONST:
2691 case CTF_K_RESTRICT:
2692 src_type = ctf_type_reference (src_fp, src_type);
2693 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2694 proc_tracking_fp);
2695
2696 if (src_type == CTF_ERR)
2697 return CTF_ERR; /* errno is set for us. */
2698
2699 dst_type = ctf_add_reftype (dst_fp, flag, src_type, kind);
2700 break;
2701
2702 case CTF_K_ARRAY:
2703 if (ctf_array_info (src_fp, src_type, &src_ar) != 0)
2704 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
2705
2706 src_ar.ctr_contents =
2707 ctf_add_type_internal (dst_fp, src_fp, src_ar.ctr_contents,
2708 proc_tracking_fp);
2709 src_ar.ctr_index = ctf_add_type_internal (dst_fp, src_fp,
2710 src_ar.ctr_index,
2711 proc_tracking_fp);
2712 src_ar.ctr_nelems = src_ar.ctr_nelems;
2713
2714 if (src_ar.ctr_contents == CTF_ERR || src_ar.ctr_index == CTF_ERR)
2715 return CTF_ERR; /* errno is set for us. */
2716
2717 if (dst_type != CTF_ERR)
2718 {
2719 if (ctf_array_info (dst_fp, dst_type, &dst_ar) != 0)
2720 return CTF_ERR; /* errno is set for us. */
2721
2722 if (memcmp (&src_ar, &dst_ar, sizeof (ctf_arinfo_t)))
2723 {
2724 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2725 _("conflict for type %s against ID %lx: array info "
2726 "differs, old %lx/%lx/%x; new: %lx/%lx/%x"),
2727 name, dst_type, src_ar.ctr_contents,
2728 src_ar.ctr_index, src_ar.ctr_nelems,
2729 dst_ar.ctr_contents, dst_ar.ctr_index,
2730 dst_ar.ctr_nelems);
2731 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2732 }
2733 }
2734 else
2735 dst_type = ctf_add_array (dst_fp, flag, &src_ar);
2736 break;
2737
2738 case CTF_K_FUNCTION:
2739 ctc.ctc_return = ctf_add_type_internal (dst_fp, src_fp,
2740 src_tp->ctt_type,
2741 proc_tracking_fp);
2742 ctc.ctc_argc = 0;
2743 ctc.ctc_flags = 0;
2744
2745 if (ctc.ctc_return == CTF_ERR)
2746 return CTF_ERR; /* errno is set for us. */
2747
2748 dst_type = ctf_add_function (dst_fp, flag, &ctc, NULL);
2749 break;
2750
2751 case CTF_K_STRUCT:
2752 case CTF_K_UNION:
2753 {
2754 ctf_dmdef_t *dmd;
2755 int errs = 0;
2756 size_t size;
2757 ssize_t ssize;
2758 ctf_dtdef_t *dtd;
2759
2760 /* Technically to match a struct or union we need to check both
2761 ways (src members vs. dst, dst members vs. src) but we make
2762 this more optimal by only checking src vs. dst and comparing
2763 the total size of the structure (which we must do anyway)
2764 which covers the possibility of dst members not in src.
2765 This optimization can be defeated for unions, but is so
2766 pathological as to render it irrelevant for our purposes. */
2767
2768 if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
2769 && dst_kind != CTF_K_FORWARD)
2770 {
2771 if (ctf_type_size (src_fp, src_type) !=
2772 ctf_type_size (dst_fp, dst_type))
2773 {
2774 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2775 _("conflict for type %s against ID %lx: union "
2776 "size differs, old %li, new %li"), name,
2777 dst_type, (long) ctf_type_size (src_fp, src_type),
2778 (long) ctf_type_size (dst_fp, dst_type));
2779 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2780 }
2781
2782 if (ctf_member_iter (src_fp, src_type, membcmp, &dst))
2783 {
2784 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2785 _("conflict for type %s against ID %lx: members "
2786 "differ, see above"), name, dst_type);
2787 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2788 }
2789
2790 break;
2791 }
2792
2793 /* Unlike the other cases, copying structs and unions is done
2794 manually so as to avoid repeated lookups in ctf_add_member
2795 and to ensure the exact same member offsets as in src_type. */
2796
2797 dst_type = ctf_add_generic (dst_fp, flag, name, kind, &dtd);
2798 if (dst_type == CTF_ERR)
2799 return CTF_ERR; /* errno is set for us. */
2800
2801 dst.ctb_type = dst_type;
2802 dst.ctb_dtd = dtd;
2803
2804 /* Pre-emptively add this struct to the type mapping so that
2805 structures that refer to themselves work. */
2806 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2807
2808 if (ctf_member_iter (src_fp, src_type, membadd, &dst) != 0)
2809 errs++; /* Increment errs and fail at bottom of case. */
2810
2811 if ((ssize = ctf_type_size (src_fp, src_type)) < 0)
2812 return CTF_ERR; /* errno is set for us. */
2813
2814 size = (size_t) ssize;
2815 if (size > CTF_MAX_SIZE)
2816 {
2817 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
2818 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
2819 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
2820 }
2821 else
2822 dtd->dtd_data.ctt_size = (uint32_t) size;
2823
2824 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, vlen);
2825
2826 /* Make a final pass through the members changing each dmd_type (a
2827 src_fp type) to an equivalent type in dst_fp. We pass through all
2828 members, leaving any that fail set to CTF_ERR, unless they fail
2829 because they are marking a member of type not representable in this
2830 version of CTF, in which case we just want to silently omit them:
2831 no consumer can do anything with them anyway. */
2832 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
2833 dmd != NULL; dmd = ctf_list_next (dmd))
2834 {
2835 ctf_dict_t *dst = dst_fp;
2836 ctf_id_t memb_type;
2837
2838 memb_type = ctf_type_mapping (src_fp, dmd->dmd_type, &dst);
2839 if (memb_type == 0)
2840 {
2841 if ((dmd->dmd_type =
2842 ctf_add_type_internal (dst_fp, src_fp, dmd->dmd_type,
2843 proc_tracking_fp)) == CTF_ERR)
2844 {
2845 if (ctf_errno (dst_fp) != ECTF_NONREPRESENTABLE)
2846 errs++;
2847 }
2848 }
2849 else
2850 dmd->dmd_type = memb_type;
2851 }
2852
2853 if (errs)
2854 return CTF_ERR; /* errno is set for us. */
2855 break;
2856 }
2857
2858 case CTF_K_ENUM:
2859 if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
2860 && dst_kind != CTF_K_FORWARD)
2861 {
2862 if (ctf_enum_iter (src_fp, src_type, enumcmp, &dst)
2863 || ctf_enum_iter (dst_fp, dst_type, enumcmp, &src))
2864 {
2865 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2866 _("conflict for enum %s against ID %lx: members "
2867 "differ, see above"), name, dst_type);
2868 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2869 }
2870 }
2871 else
2872 {
2873 dst_type = ctf_add_enum (dst_fp, flag, name);
2874 if ((dst.ctb_type = dst_type) == CTF_ERR
2875 || ctf_enum_iter (src_fp, src_type, enumadd, &dst))
2876 return CTF_ERR; /* errno is set for us */
2877 }
2878 break;
2879
2880 case CTF_K_FORWARD:
2881 if (dst_type == CTF_ERR)
2882 dst_type = ctf_add_forward (dst_fp, flag, name, forward_kind);
2883 break;
2884
2885 case CTF_K_TYPEDEF:
2886 src_type = ctf_type_reference (src_fp, src_type);
2887 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2888 proc_tracking_fp);
2889
2890 if (src_type == CTF_ERR)
2891 return CTF_ERR; /* errno is set for us. */
2892
2893 /* If dst_type is not CTF_ERR at this point, we should check if
2894 ctf_type_reference(dst_fp, dst_type) != src_type and if so fail with
2895 ECTF_CONFLICT. However, this causes problems with bitness typedefs
2896 that vary based on things like if 32-bit then pid_t is int otherwise
2897 long. We therefore omit this check and assume that if the identically
2898 named typedef already exists in dst_fp, it is correct or
2899 equivalent. */
2900
2901 if (dst_type == CTF_ERR)
2902 dst_type = ctf_add_typedef (dst_fp, flag, name, src_type);
2903
2904 break;
2905
2906 default:
2907 return (ctf_set_errno (dst_fp, ECTF_CORRUPT));
2908 }
2909
2910 if (dst_type != CTF_ERR)
2911 ctf_add_type_mapping (src_fp, orig_src_type, dst_fp, dst_type);
2912 return dst_type;
2913 }
2914
2915 ctf_id_t
2916 ctf_add_type (ctf_dict_t *dst_fp, ctf_dict_t *src_fp, ctf_id_t src_type)
2917 {
2918 ctf_id_t id;
2919
2920 if (!src_fp->ctf_add_processing)
2921 src_fp->ctf_add_processing = ctf_dynhash_create (ctf_hash_integer,
2922 ctf_hash_eq_integer,
2923 NULL, NULL);
2924
2925 /* We store the hash on the source, because it contains only source type IDs:
2926 but callers will invariably expect errors to appear on the dest. */
2927 if (!src_fp->ctf_add_processing)
2928 return (ctf_set_errno (dst_fp, ENOMEM));
2929
2930 id = ctf_add_type_internal (dst_fp, src_fp, src_type, src_fp);
2931 ctf_dynhash_empty (src_fp->ctf_add_processing);
2932
2933 return id;
2934 }
2935
2936 /* Write the compressed CTF data stream to the specified gzFile descriptor. */
2937 int
2938 ctf_gzwrite (ctf_dict_t *fp, gzFile fd)
2939 {
2940 const unsigned char *buf;
2941 ssize_t resid;
2942 ssize_t len;
2943
2944 resid = sizeof (ctf_header_t);
2945 buf = (unsigned char *) fp->ctf_header;
2946 while (resid != 0)
2947 {
2948 if ((len = gzwrite (fd, buf, resid)) <= 0)
2949 return (ctf_set_errno (fp, errno));
2950 resid -= len;
2951 buf += len;
2952 }
2953
2954 resid = fp->ctf_size;
2955 buf = fp->ctf_buf;
2956 while (resid != 0)
2957 {
2958 if ((len = gzwrite (fd, buf, resid)) <= 0)
2959 return (ctf_set_errno (fp, errno));
2960 resid -= len;
2961 buf += len;
2962 }
2963
2964 return 0;
2965 }
2966
2967 /* Compress the specified CTF data stream and write it to the specified file
2968 descriptor. */
2969 int
2970 ctf_compress_write (ctf_dict_t *fp, int fd)
2971 {
2972 unsigned char *buf;
2973 unsigned char *bp;
2974 ctf_header_t h;
2975 ctf_header_t *hp = &h;
2976 ssize_t header_len = sizeof (ctf_header_t);
2977 ssize_t compress_len;
2978 ssize_t len;
2979 int rc;
2980 int err = 0;
2981
2982 if (ctf_serialize (fp) < 0)
2983 return -1; /* errno is set for us. */
2984
2985 memcpy (hp, fp->ctf_header, header_len);
2986 hp->cth_flags |= CTF_F_COMPRESS;
2987 compress_len = compressBound (fp->ctf_size);
2988
2989 if ((buf = malloc (compress_len)) == NULL)
2990 {
2991 ctf_err_warn (fp, 0, 0, _("ctf_compress_write: cannot allocate %li bytes"),
2992 (unsigned long) compress_len);
2993 return (ctf_set_errno (fp, ECTF_ZALLOC));
2994 }
2995
2996 if ((rc = compress (buf, (uLongf *) &compress_len,
2997 fp->ctf_buf, fp->ctf_size)) != Z_OK)
2998 {
2999 err = ctf_set_errno (fp, ECTF_COMPRESS);
3000 ctf_err_warn (fp, 0, 0, _("zlib deflate err: %s"), zError (rc));
3001 goto ret;
3002 }
3003
3004 while (header_len > 0)
3005 {
3006 if ((len = write (fd, hp, header_len)) < 0)
3007 {
3008 err = ctf_set_errno (fp, errno);
3009 ctf_err_warn (fp, 0, 0, _("ctf_compress_write: error writing header"));
3010 goto ret;
3011 }
3012 header_len -= len;
3013 hp += len;
3014 }
3015
3016 bp = buf;
3017 while (compress_len > 0)
3018 {
3019 if ((len = write (fd, bp, compress_len)) < 0)
3020 {
3021 err = ctf_set_errno (fp, errno);
3022 ctf_err_warn (fp, 0, 0, _("ctf_compress_write: error writing"));
3023 goto ret;
3024 }
3025 compress_len -= len;
3026 bp += len;
3027 }
3028
3029 ret:
3030 free (buf);
3031 return err;
3032 }
3033
3034 /* Optionally compress the specified CTF data stream and return it as a new
3035 dynamically-allocated string. */
3036 unsigned char *
3037 ctf_write_mem (ctf_dict_t *fp, size_t *size, size_t threshold)
3038 {
3039 unsigned char *buf;
3040 unsigned char *bp;
3041 ctf_header_t *hp;
3042 ssize_t header_len = sizeof (ctf_header_t);
3043 ssize_t compress_len;
3044 int rc;
3045
3046 if (ctf_serialize (fp) < 0)
3047 return NULL; /* errno is set for us. */
3048
3049 compress_len = compressBound (fp->ctf_size);
3050 if (fp->ctf_size < threshold)
3051 compress_len = fp->ctf_size;
3052 if ((buf = malloc (compress_len
3053 + sizeof (struct ctf_header))) == NULL)
3054 {
3055 ctf_set_errno (fp, ENOMEM);
3056 ctf_err_warn (fp, 0, 0, _("ctf_write_mem: cannot allocate %li bytes"),
3057 (unsigned long) (compress_len + sizeof (struct ctf_header)));
3058 return NULL;
3059 }
3060
3061 hp = (ctf_header_t *) buf;
3062 memcpy (hp, fp->ctf_header, header_len);
3063 bp = buf + sizeof (struct ctf_header);
3064 *size = sizeof (struct ctf_header);
3065
3066 if (fp->ctf_size < threshold)
3067 {
3068 hp->cth_flags &= ~CTF_F_COMPRESS;
3069 memcpy (bp, fp->ctf_buf, fp->ctf_size);
3070 *size += fp->ctf_size;
3071 }
3072 else
3073 {
3074 hp->cth_flags |= CTF_F_COMPRESS;
3075 if ((rc = compress (bp, (uLongf *) &compress_len,
3076 fp->ctf_buf, fp->ctf_size)) != Z_OK)
3077 {
3078 ctf_set_errno (fp, ECTF_COMPRESS);
3079 ctf_err_warn (fp, 0, 0, _("zlib deflate err: %s"), zError (rc));
3080 free (buf);
3081 return NULL;
3082 }
3083 *size += compress_len;
3084 }
3085 return buf;
3086 }
3087
3088 /* Write the uncompressed CTF data stream to the specified file descriptor. */
3089 int
3090 ctf_write (ctf_dict_t *fp, int fd)
3091 {
3092 const unsigned char *buf;
3093 ssize_t resid;
3094 ssize_t len;
3095
3096 if (ctf_serialize (fp) < 0)
3097 return -1; /* errno is set for us. */
3098
3099 resid = sizeof (ctf_header_t);
3100 buf = (unsigned char *) fp->ctf_header;
3101 while (resid != 0)
3102 {
3103 if ((len = write (fd, buf, resid)) <= 0)
3104 {
3105 ctf_err_warn (fp, 0, errno, _("ctf_write: error writing header"));
3106 return (ctf_set_errno (fp, errno));
3107 }
3108 resid -= len;
3109 buf += len;
3110 }
3111
3112 resid = fp->ctf_size;
3113 buf = fp->ctf_buf;
3114 while (resid != 0)
3115 {
3116 if ((len = write (fd, buf, resid)) <= 0)
3117 {
3118 ctf_err_warn (fp, 0, errno, _("ctf_write: error writing"));
3119 return (ctf_set_errno (fp, errno));
3120 }
3121 resid -= len;
3122 buf += len;
3123 }
3124
3125 return 0;
3126 }
This page took 0.100856 seconds and 4 git commands to generate.