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