libctf: symbol type linking support
[deliverable/binutils-gdb.git] / libctf / ctf-create.c
1 /* CTF file creation.
2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
3
4 This file is part of libctf.
5
6 libctf is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 See the GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; see the file COPYING. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include <ctf-impl.h>
21 #include <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_link_flags = fp->ctf_link_flags;
1166 nfp->ctf_dedup_atoms = fp->ctf_dedup_atoms;
1167 nfp->ctf_dedup_atoms_alloc = fp->ctf_dedup_atoms_alloc;
1168 memcpy (&nfp->ctf_dedup, &fp->ctf_dedup, sizeof (fp->ctf_dedup));
1169
1170 nfp->ctf_snapshot_lu = fp->ctf_snapshots;
1171
1172 memcpy (&nfp->ctf_lookups, fp->ctf_lookups, sizeof (fp->ctf_lookups));
1173 nfp->ctf_structs = fp->ctf_structs;
1174 nfp->ctf_unions = fp->ctf_unions;
1175 nfp->ctf_enums = fp->ctf_enums;
1176 nfp->ctf_names = fp->ctf_names;
1177
1178 fp->ctf_dthash = NULL;
1179 ctf_str_free_atoms (nfp);
1180 nfp->ctf_str_atoms = fp->ctf_str_atoms;
1181 nfp->ctf_prov_strtab = fp->ctf_prov_strtab;
1182 fp->ctf_str_atoms = NULL;
1183 fp->ctf_prov_strtab = NULL;
1184 memset (&fp->ctf_dtdefs, 0, sizeof (ctf_list_t));
1185 memset (&fp->ctf_errs_warnings, 0, sizeof (ctf_list_t));
1186 fp->ctf_add_processing = NULL;
1187 fp->ctf_ptrtab = NULL;
1188 fp->ctf_funcidx_names = NULL;
1189 fp->ctf_objtidx_names = NULL;
1190 fp->ctf_funcidx_sxlate = NULL;
1191 fp->ctf_objtidx_sxlate = NULL;
1192 fp->ctf_objthash = NULL;
1193 fp->ctf_funchash = NULL;
1194 fp->ctf_dynsyms = NULL;
1195 fp->ctf_dynsymidx = NULL;
1196 fp->ctf_link_inputs = NULL;
1197 fp->ctf_link_outputs = NULL;
1198 fp->ctf_syn_ext_strtab = NULL;
1199 fp->ctf_link_in_cu_mapping = NULL;
1200 fp->ctf_link_out_cu_mapping = NULL;
1201 fp->ctf_link_type_mapping = NULL;
1202 fp->ctf_dedup_atoms = NULL;
1203 fp->ctf_dedup_atoms_alloc = NULL;
1204 fp->ctf_parent_unreffed = 1;
1205
1206 fp->ctf_dvhash = NULL;
1207 memset (&fp->ctf_dvdefs, 0, sizeof (ctf_list_t));
1208 memset (fp->ctf_lookups, 0, sizeof (fp->ctf_lookups));
1209 memset (&fp->ctf_in_flight_dynsyms, 0, sizeof (fp->ctf_in_flight_dynsyms));
1210 memset (&fp->ctf_dedup, 0, sizeof (fp->ctf_dedup));
1211 fp->ctf_structs.ctn_writable = NULL;
1212 fp->ctf_unions.ctn_writable = NULL;
1213 fp->ctf_enums.ctn_writable = NULL;
1214 fp->ctf_names.ctn_writable = NULL;
1215
1216 memcpy (&ofp, fp, sizeof (ctf_dict_t));
1217 memcpy (fp, nfp, sizeof (ctf_dict_t));
1218 memcpy (nfp, &ofp, sizeof (ctf_dict_t));
1219
1220 nfp->ctf_refcnt = 1; /* Force nfp to be freed. */
1221 ctf_dict_close (nfp);
1222
1223 return 0;
1224
1225 symerr:
1226 ctf_err_warn (fp, 0, err, _("error serializing symtypetabs"));
1227 goto err;
1228 oom:
1229 free (buf);
1230 free (sym_name_order);
1231 return (ctf_set_errno (fp, EAGAIN));
1232 err:
1233 free (buf);
1234 free (sym_name_order);
1235 return -1; /* errno is set for us. */
1236 }
1237
1238 ctf_names_t *
1239 ctf_name_table (ctf_dict_t *fp, int kind)
1240 {
1241 switch (kind)
1242 {
1243 case CTF_K_STRUCT:
1244 return &fp->ctf_structs;
1245 case CTF_K_UNION:
1246 return &fp->ctf_unions;
1247 case CTF_K_ENUM:
1248 return &fp->ctf_enums;
1249 default:
1250 return &fp->ctf_names;
1251 }
1252 }
1253
1254 int
1255 ctf_dtd_insert (ctf_dict_t *fp, ctf_dtdef_t *dtd, int flag, int kind)
1256 {
1257 const char *name;
1258 if (ctf_dynhash_insert (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type,
1259 dtd) < 0)
1260 return -1;
1261
1262 if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name
1263 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL)
1264 {
1265 if (ctf_dynhash_insert (ctf_name_table (fp, kind)->ctn_writable,
1266 (char *) name, (void *) (uintptr_t)
1267 dtd->dtd_type) < 0)
1268 {
1269 ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t)
1270 dtd->dtd_type);
1271 return -1;
1272 }
1273 }
1274 ctf_list_append (&fp->ctf_dtdefs, dtd);
1275 return 0;
1276 }
1277
1278 void
1279 ctf_dtd_delete (ctf_dict_t *fp, ctf_dtdef_t *dtd)
1280 {
1281 ctf_dmdef_t *dmd, *nmd;
1282 int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1283 int name_kind = kind;
1284 const char *name;
1285
1286 ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type);
1287
1288 switch (kind)
1289 {
1290 case CTF_K_STRUCT:
1291 case CTF_K_UNION:
1292 case CTF_K_ENUM:
1293 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
1294 dmd != NULL; dmd = nmd)
1295 {
1296 if (dmd->dmd_name != NULL)
1297 free (dmd->dmd_name);
1298 nmd = ctf_list_next (dmd);
1299 free (dmd);
1300 }
1301 break;
1302 case CTF_K_FUNCTION:
1303 free (dtd->dtd_u.dtu_argv);
1304 break;
1305 case CTF_K_FORWARD:
1306 name_kind = dtd->dtd_data.ctt_type;
1307 break;
1308 }
1309
1310 if (dtd->dtd_data.ctt_name
1311 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
1312 && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
1313 {
1314 ctf_dynhash_remove (ctf_name_table (fp, name_kind)->ctn_writable,
1315 name);
1316 ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
1317 }
1318
1319 ctf_list_delete (&fp->ctf_dtdefs, dtd);
1320 free (dtd);
1321 }
1322
1323 ctf_dtdef_t *
1324 ctf_dtd_lookup (const ctf_dict_t *fp, ctf_id_t type)
1325 {
1326 return (ctf_dtdef_t *)
1327 ctf_dynhash_lookup (fp->ctf_dthash, (void *) (uintptr_t) type);
1328 }
1329
1330 ctf_dtdef_t *
1331 ctf_dynamic_type (const ctf_dict_t *fp, ctf_id_t id)
1332 {
1333 ctf_id_t idx;
1334
1335 if (!(fp->ctf_flags & LCTF_RDWR))
1336 return NULL;
1337
1338 if ((fp->ctf_flags & LCTF_CHILD) && LCTF_TYPE_ISPARENT (fp, id))
1339 fp = fp->ctf_parent;
1340
1341 idx = LCTF_TYPE_TO_INDEX(fp, id);
1342
1343 if ((unsigned long) idx <= fp->ctf_typemax)
1344 return ctf_dtd_lookup (fp, id);
1345 return NULL;
1346 }
1347
1348 int
1349 ctf_dvd_insert (ctf_dict_t *fp, ctf_dvdef_t *dvd)
1350 {
1351 if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0)
1352 return -1;
1353 ctf_list_append (&fp->ctf_dvdefs, dvd);
1354 return 0;
1355 }
1356
1357 void
1358 ctf_dvd_delete (ctf_dict_t *fp, ctf_dvdef_t *dvd)
1359 {
1360 ctf_dynhash_remove (fp->ctf_dvhash, dvd->dvd_name);
1361 free (dvd->dvd_name);
1362
1363 ctf_list_delete (&fp->ctf_dvdefs, dvd);
1364 free (dvd);
1365 }
1366
1367 ctf_dvdef_t *
1368 ctf_dvd_lookup (const ctf_dict_t *fp, const char *name)
1369 {
1370 return (ctf_dvdef_t *) ctf_dynhash_lookup (fp->ctf_dvhash, name);
1371 }
1372
1373 /* Discard all of the dynamic type definitions and variable definitions that
1374 have been added to the dict since the last call to ctf_update(). We locate
1375 such types by scanning the dtd list and deleting elements that have type IDs
1376 greater than ctf_dtoldid, which is set by ctf_update(), above, and by
1377 scanning the variable list and deleting elements that have update IDs equal
1378 to the current value of the last-update snapshot count (indicating that they
1379 were added after the most recent call to ctf_update()). */
1380 int
1381 ctf_discard (ctf_dict_t *fp)
1382 {
1383 ctf_snapshot_id_t last_update =
1384 { fp->ctf_dtoldid,
1385 fp->ctf_snapshot_lu + 1 };
1386
1387 /* Update required? */
1388 if (!(fp->ctf_flags & LCTF_DIRTY))
1389 return 0;
1390
1391 return (ctf_rollback (fp, last_update));
1392 }
1393
1394 ctf_snapshot_id_t
1395 ctf_snapshot (ctf_dict_t *fp)
1396 {
1397 ctf_snapshot_id_t snapid;
1398 snapid.dtd_id = fp->ctf_typemax;
1399 snapid.snapshot_id = fp->ctf_snapshots++;
1400 return snapid;
1401 }
1402
1403 /* Like ctf_discard(), only discards everything after a particular ID. */
1404 int
1405 ctf_rollback (ctf_dict_t *fp, ctf_snapshot_id_t id)
1406 {
1407 ctf_dtdef_t *dtd, *ntd;
1408 ctf_dvdef_t *dvd, *nvd;
1409
1410 if (!(fp->ctf_flags & LCTF_RDWR))
1411 return (ctf_set_errno (fp, ECTF_RDONLY));
1412
1413 if (fp->ctf_snapshot_lu >= id.snapshot_id)
1414 return (ctf_set_errno (fp, ECTF_OVERROLLBACK));
1415
1416 for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1417 {
1418 int kind;
1419 const char *name;
1420
1421 ntd = ctf_list_next (dtd);
1422
1423 if (LCTF_TYPE_TO_INDEX (fp, dtd->dtd_type) <= id.dtd_id)
1424 continue;
1425
1426 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1427 if (kind == CTF_K_FORWARD)
1428 kind = dtd->dtd_data.ctt_type;
1429
1430 if (dtd->dtd_data.ctt_name
1431 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
1432 && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
1433 {
1434 ctf_dynhash_remove (ctf_name_table (fp, kind)->ctn_writable,
1435 name);
1436 ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
1437 }
1438
1439 ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type);
1440 ctf_dtd_delete (fp, dtd);
1441 }
1442
1443 for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1444 {
1445 nvd = ctf_list_next (dvd);
1446
1447 if (dvd->dvd_snapshots <= id.snapshot_id)
1448 continue;
1449
1450 ctf_dvd_delete (fp, dvd);
1451 }
1452
1453 fp->ctf_typemax = id.dtd_id;
1454 fp->ctf_snapshots = id.snapshot_id;
1455
1456 if (fp->ctf_snapshots == fp->ctf_snapshot_lu)
1457 fp->ctf_flags &= ~LCTF_DIRTY;
1458
1459 return 0;
1460 }
1461
1462 static ctf_id_t
1463 ctf_add_generic (ctf_dict_t *fp, uint32_t flag, const char *name, int kind,
1464 ctf_dtdef_t **rp)
1465 {
1466 ctf_dtdef_t *dtd;
1467 ctf_id_t type;
1468
1469 if (flag != CTF_ADD_NONROOT && flag != CTF_ADD_ROOT)
1470 return (ctf_set_errno (fp, EINVAL));
1471
1472 if (!(fp->ctf_flags & LCTF_RDWR))
1473 return (ctf_set_errno (fp, ECTF_RDONLY));
1474
1475 if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) >= CTF_MAX_TYPE)
1476 return (ctf_set_errno (fp, ECTF_FULL));
1477
1478 if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) == (CTF_MAX_PTYPE - 1))
1479 return (ctf_set_errno (fp, ECTF_FULL));
1480
1481 /* Make sure ptrtab always grows to be big enough for all types. */
1482 if (ctf_grow_ptrtab (fp) < 0)
1483 return CTF_ERR; /* errno is set for us. */
1484
1485 if ((dtd = malloc (sizeof (ctf_dtdef_t))) == NULL)
1486 return (ctf_set_errno (fp, EAGAIN));
1487
1488 type = ++fp->ctf_typemax;
1489 type = LCTF_INDEX_TO_TYPE (fp, type, (fp->ctf_flags & LCTF_CHILD));
1490
1491 memset (dtd, 0, sizeof (ctf_dtdef_t));
1492 dtd->dtd_data.ctt_name = ctf_str_add_ref (fp, name, &dtd->dtd_data.ctt_name);
1493 dtd->dtd_type = type;
1494
1495 if (dtd->dtd_data.ctt_name == 0 && name != NULL && name[0] != '\0')
1496 {
1497 free (dtd);
1498 return (ctf_set_errno (fp, EAGAIN));
1499 }
1500
1501 if (ctf_dtd_insert (fp, dtd, flag, kind) < 0)
1502 {
1503 free (dtd);
1504 return CTF_ERR; /* errno is set for us. */
1505 }
1506 fp->ctf_flags |= LCTF_DIRTY;
1507
1508 *rp = dtd;
1509 return type;
1510 }
1511
1512 /* When encoding integer sizes, we want to convert a byte count in the range
1513 1-8 to the closest power of 2 (e.g. 3->4, 5->8, etc). The clp2() function
1514 is a clever implementation from "Hacker's Delight" by Henry Warren, Jr. */
1515 static size_t
1516 clp2 (size_t x)
1517 {
1518 x--;
1519
1520 x |= (x >> 1);
1521 x |= (x >> 2);
1522 x |= (x >> 4);
1523 x |= (x >> 8);
1524 x |= (x >> 16);
1525
1526 return (x + 1);
1527 }
1528
1529 ctf_id_t
1530 ctf_add_encoded (ctf_dict_t *fp, uint32_t flag,
1531 const char *name, const ctf_encoding_t *ep, uint32_t kind)
1532 {
1533 ctf_dtdef_t *dtd;
1534 ctf_id_t type;
1535
1536 if (ep == NULL)
1537 return (ctf_set_errno (fp, EINVAL));
1538
1539 if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
1540 return CTF_ERR; /* errno is set for us. */
1541
1542 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
1543 dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
1544 / CHAR_BIT);
1545 dtd->dtd_u.dtu_enc = *ep;
1546
1547 return type;
1548 }
1549
1550 ctf_id_t
1551 ctf_add_reftype (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref, uint32_t kind)
1552 {
1553 ctf_dtdef_t *dtd;
1554 ctf_id_t type;
1555 ctf_dict_t *tmp = fp;
1556 int child = fp->ctf_flags & LCTF_CHILD;
1557
1558 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1559 return (ctf_set_errno (fp, EINVAL));
1560
1561 if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
1562 return CTF_ERR; /* errno is set for us. */
1563
1564 if ((type = ctf_add_generic (fp, flag, NULL, kind, &dtd)) == CTF_ERR)
1565 return CTF_ERR; /* errno is set for us. */
1566
1567 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
1568 dtd->dtd_data.ctt_type = (uint32_t) ref;
1569
1570 if (kind != CTF_K_POINTER)
1571 return type;
1572
1573 /* If we are adding a pointer, update the ptrtab, both the directly pointed-to
1574 type and (if an anonymous typedef node is being pointed at) the type that
1575 points at too. Note that ctf_typemax is at this point one higher than we
1576 want to check against, because it's just been incremented for the addition
1577 of this type. */
1578
1579 uint32_t type_idx = LCTF_TYPE_TO_INDEX (fp, type);
1580 uint32_t ref_idx = LCTF_TYPE_TO_INDEX (fp, ref);
1581
1582 if (LCTF_TYPE_ISCHILD (fp, ref) == child
1583 && ref_idx < fp->ctf_typemax)
1584 {
1585 fp->ctf_ptrtab[ref_idx] = type_idx;
1586
1587 ctf_id_t refref_idx = LCTF_TYPE_TO_INDEX (fp, dtd->dtd_data.ctt_type);
1588
1589 if (tmp == fp
1590 && (LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) == CTF_K_TYPEDEF)
1591 && strcmp (ctf_strptr (fp, dtd->dtd_data.ctt_name), "") == 0
1592 && refref_idx < fp->ctf_typemax)
1593 fp->ctf_ptrtab[refref_idx] = type_idx;
1594 }
1595
1596 return type;
1597 }
1598
1599 ctf_id_t
1600 ctf_add_slice (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref,
1601 const ctf_encoding_t *ep)
1602 {
1603 ctf_dtdef_t *dtd;
1604 ctf_id_t resolved_ref = ref;
1605 ctf_id_t type;
1606 int kind;
1607 const ctf_type_t *tp;
1608 ctf_dict_t *tmp = fp;
1609
1610 if (ep == NULL)
1611 return (ctf_set_errno (fp, EINVAL));
1612
1613 if ((ep->cte_bits > 255) || (ep->cte_offset > 255))
1614 return (ctf_set_errno (fp, ECTF_SLICEOVERFLOW));
1615
1616 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1617 return (ctf_set_errno (fp, EINVAL));
1618
1619 if (ref != 0 && ((tp = ctf_lookup_by_id (&tmp, ref)) == NULL))
1620 return CTF_ERR; /* errno is set for us. */
1621
1622 /* Make sure we ultimately point to an integral type. We also allow slices to
1623 point to the unimplemented type, for now, because the compiler can emit
1624 such slices, though they're not very much use. */
1625
1626 resolved_ref = ctf_type_resolve_unsliced (tmp, ref);
1627 kind = ctf_type_kind_unsliced (tmp, resolved_ref);
1628
1629 if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) &&
1630 (kind != CTF_K_ENUM)
1631 && (ref != 0))
1632 return (ctf_set_errno (fp, ECTF_NOTINTFP));
1633
1634 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_SLICE, &dtd)) == CTF_ERR)
1635 return CTF_ERR; /* errno is set for us. */
1636
1637 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_SLICE, flag, 0);
1638 dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
1639 / CHAR_BIT);
1640 dtd->dtd_u.dtu_slice.cts_type = (uint32_t) ref;
1641 dtd->dtd_u.dtu_slice.cts_bits = ep->cte_bits;
1642 dtd->dtd_u.dtu_slice.cts_offset = ep->cte_offset;
1643
1644 return type;
1645 }
1646
1647 ctf_id_t
1648 ctf_add_integer (ctf_dict_t *fp, uint32_t flag,
1649 const char *name, const ctf_encoding_t *ep)
1650 {
1651 return (ctf_add_encoded (fp, flag, name, ep, CTF_K_INTEGER));
1652 }
1653
1654 ctf_id_t
1655 ctf_add_float (ctf_dict_t *fp, uint32_t flag,
1656 const char *name, const ctf_encoding_t *ep)
1657 {
1658 return (ctf_add_encoded (fp, flag, name, ep, CTF_K_FLOAT));
1659 }
1660
1661 ctf_id_t
1662 ctf_add_pointer (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
1663 {
1664 return (ctf_add_reftype (fp, flag, ref, CTF_K_POINTER));
1665 }
1666
1667 ctf_id_t
1668 ctf_add_array (ctf_dict_t *fp, uint32_t flag, const ctf_arinfo_t *arp)
1669 {
1670 ctf_dtdef_t *dtd;
1671 ctf_id_t type;
1672 ctf_dict_t *tmp = fp;
1673
1674 if (arp == NULL)
1675 return (ctf_set_errno (fp, EINVAL));
1676
1677 if (arp->ctr_contents != 0
1678 && ctf_lookup_by_id (&tmp, arp->ctr_contents) == NULL)
1679 return CTF_ERR; /* errno is set for us. */
1680
1681 tmp = fp;
1682 if (ctf_lookup_by_id (&tmp, arp->ctr_index) == NULL)
1683 return CTF_ERR; /* errno is set for us. */
1684
1685 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_ARRAY, &dtd)) == CTF_ERR)
1686 return CTF_ERR; /* errno is set for us. */
1687
1688 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ARRAY, flag, 0);
1689 dtd->dtd_data.ctt_size = 0;
1690 dtd->dtd_u.dtu_arr = *arp;
1691
1692 return type;
1693 }
1694
1695 int
1696 ctf_set_array (ctf_dict_t *fp, ctf_id_t type, const ctf_arinfo_t *arp)
1697 {
1698 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
1699
1700 if (!(fp->ctf_flags & LCTF_RDWR))
1701 return (ctf_set_errno (fp, ECTF_RDONLY));
1702
1703 if (dtd == NULL
1704 || LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) != CTF_K_ARRAY)
1705 return (ctf_set_errno (fp, ECTF_BADID));
1706
1707 fp->ctf_flags |= LCTF_DIRTY;
1708 dtd->dtd_u.dtu_arr = *arp;
1709
1710 return 0;
1711 }
1712
1713 ctf_id_t
1714 ctf_add_function (ctf_dict_t *fp, uint32_t flag,
1715 const ctf_funcinfo_t *ctc, const ctf_id_t *argv)
1716 {
1717 ctf_dtdef_t *dtd;
1718 ctf_id_t type;
1719 uint32_t vlen;
1720 uint32_t *vdat = NULL;
1721 ctf_dict_t *tmp = fp;
1722 size_t i;
1723
1724 if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0
1725 || (ctc->ctc_argc != 0 && argv == NULL))
1726 return (ctf_set_errno (fp, EINVAL));
1727
1728 vlen = ctc->ctc_argc;
1729 if (ctc->ctc_flags & CTF_FUNC_VARARG)
1730 vlen++; /* Add trailing zero to indicate varargs (see below). */
1731
1732 if (ctc->ctc_return != 0
1733 && ctf_lookup_by_id (&tmp, ctc->ctc_return) == NULL)
1734 return CTF_ERR; /* errno is set for us. */
1735
1736 if (vlen > CTF_MAX_VLEN)
1737 return (ctf_set_errno (fp, EOVERFLOW));
1738
1739 if (vlen != 0 && (vdat = malloc (sizeof (ctf_id_t) * vlen)) == NULL)
1740 return (ctf_set_errno (fp, EAGAIN));
1741
1742 for (i = 0; i < ctc->ctc_argc; i++)
1743 {
1744 tmp = fp;
1745 if (argv[i] != 0 && ctf_lookup_by_id (&tmp, argv[i]) == NULL)
1746 {
1747 free (vdat);
1748 return CTF_ERR; /* errno is set for us. */
1749 }
1750 vdat[i] = (uint32_t) argv[i];
1751 }
1752
1753 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_FUNCTION,
1754 &dtd)) == CTF_ERR)
1755 {
1756 free (vdat);
1757 return CTF_ERR; /* errno is set for us. */
1758 }
1759
1760 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
1761 dtd->dtd_data.ctt_type = (uint32_t) ctc->ctc_return;
1762
1763 if (ctc->ctc_flags & CTF_FUNC_VARARG)
1764 vdat[vlen - 1] = 0; /* Add trailing zero to indicate varargs. */
1765 dtd->dtd_u.dtu_argv = vdat;
1766
1767 return type;
1768 }
1769
1770 ctf_id_t
1771 ctf_add_struct_sized (ctf_dict_t *fp, uint32_t flag, const char *name,
1772 size_t size)
1773 {
1774 ctf_dtdef_t *dtd;
1775 ctf_id_t type = 0;
1776
1777 /* Promote root-visible forwards to structs. */
1778 if (name != NULL)
1779 type = ctf_lookup_by_rawname (fp, CTF_K_STRUCT, name);
1780
1781 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1782 dtd = ctf_dtd_lookup (fp, type);
1783 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_STRUCT,
1784 &dtd)) == CTF_ERR)
1785 return CTF_ERR; /* errno is set for us. */
1786
1787 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_STRUCT, flag, 0);
1788
1789 if (size > CTF_MAX_SIZE)
1790 {
1791 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1792 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1793 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1794 }
1795 else
1796 dtd->dtd_data.ctt_size = (uint32_t) size;
1797
1798 return type;
1799 }
1800
1801 ctf_id_t
1802 ctf_add_struct (ctf_dict_t *fp, uint32_t flag, const char *name)
1803 {
1804 return (ctf_add_struct_sized (fp, flag, name, 0));
1805 }
1806
1807 ctf_id_t
1808 ctf_add_union_sized (ctf_dict_t *fp, uint32_t flag, const char *name,
1809 size_t size)
1810 {
1811 ctf_dtdef_t *dtd;
1812 ctf_id_t type = 0;
1813
1814 /* Promote root-visible forwards to unions. */
1815 if (name != NULL)
1816 type = ctf_lookup_by_rawname (fp, CTF_K_UNION, name);
1817
1818 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1819 dtd = ctf_dtd_lookup (fp, type);
1820 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_UNION,
1821 &dtd)) == CTF_ERR)
1822 return CTF_ERR; /* errno is set for us */
1823
1824 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_UNION, flag, 0);
1825
1826 if (size > CTF_MAX_SIZE)
1827 {
1828 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1829 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1830 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1831 }
1832 else
1833 dtd->dtd_data.ctt_size = (uint32_t) size;
1834
1835 return type;
1836 }
1837
1838 ctf_id_t
1839 ctf_add_union (ctf_dict_t *fp, uint32_t flag, const char *name)
1840 {
1841 return (ctf_add_union_sized (fp, flag, name, 0));
1842 }
1843
1844 ctf_id_t
1845 ctf_add_enum (ctf_dict_t *fp, uint32_t flag, const char *name)
1846 {
1847 ctf_dtdef_t *dtd;
1848 ctf_id_t type = 0;
1849
1850 /* Promote root-visible forwards to enums. */
1851 if (name != NULL)
1852 type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1853
1854 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1855 dtd = ctf_dtd_lookup (fp, type);
1856 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_ENUM,
1857 &dtd)) == CTF_ERR)
1858 return CTF_ERR; /* errno is set for us. */
1859
1860 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ENUM, flag, 0);
1861 dtd->dtd_data.ctt_size = fp->ctf_dmodel->ctd_int;
1862
1863 return type;
1864 }
1865
1866 ctf_id_t
1867 ctf_add_enum_encoded (ctf_dict_t *fp, uint32_t flag, const char *name,
1868 const ctf_encoding_t *ep)
1869 {
1870 ctf_id_t type = 0;
1871
1872 /* First, create the enum if need be, using most of the same machinery as
1873 ctf_add_enum(), to ensure that we do not allow things past that are not
1874 enums or forwards to them. (This includes other slices: you cannot slice a
1875 slice, which would be a useless thing to do anyway.) */
1876
1877 if (name != NULL)
1878 type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1879
1880 if (type != 0)
1881 {
1882 if ((ctf_type_kind (fp, type) != CTF_K_FORWARD) &&
1883 (ctf_type_kind_unsliced (fp, type) != CTF_K_ENUM))
1884 return (ctf_set_errno (fp, ECTF_NOTINTFP));
1885 }
1886 else if ((type = ctf_add_enum (fp, flag, name)) == CTF_ERR)
1887 return CTF_ERR; /* errno is set for us. */
1888
1889 /* Now attach a suitable slice to it. */
1890
1891 return ctf_add_slice (fp, flag, type, ep);
1892 }
1893
1894 ctf_id_t
1895 ctf_add_forward (ctf_dict_t *fp, uint32_t flag, const char *name,
1896 uint32_t kind)
1897 {
1898 ctf_dtdef_t *dtd;
1899 ctf_id_t type = 0;
1900
1901 if (!ctf_forwardable_kind (kind))
1902 return (ctf_set_errno (fp, ECTF_NOTSUE));
1903
1904 /* If the type is already defined or exists as a forward tag, just
1905 return the ctf_id_t of the existing definition. */
1906
1907 if (name != NULL)
1908 type = ctf_lookup_by_rawname (fp, kind, name);
1909
1910 if (type)
1911 return type;
1912
1913 if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
1914 return CTF_ERR; /* errno is set for us. */
1915
1916 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FORWARD, flag, 0);
1917 dtd->dtd_data.ctt_type = kind;
1918
1919 return type;
1920 }
1921
1922 ctf_id_t
1923 ctf_add_typedef (ctf_dict_t *fp, uint32_t flag, const char *name,
1924 ctf_id_t ref)
1925 {
1926 ctf_dtdef_t *dtd;
1927 ctf_id_t type;
1928 ctf_dict_t *tmp = fp;
1929
1930 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1931 return (ctf_set_errno (fp, EINVAL));
1932
1933 if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
1934 return CTF_ERR; /* errno is set for us. */
1935
1936 if ((type = ctf_add_generic (fp, flag, name, CTF_K_TYPEDEF,
1937 &dtd)) == CTF_ERR)
1938 return CTF_ERR; /* errno is set for us. */
1939
1940 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_TYPEDEF, flag, 0);
1941 dtd->dtd_data.ctt_type = (uint32_t) ref;
1942
1943 return type;
1944 }
1945
1946 ctf_id_t
1947 ctf_add_volatile (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
1948 {
1949 return (ctf_add_reftype (fp, flag, ref, CTF_K_VOLATILE));
1950 }
1951
1952 ctf_id_t
1953 ctf_add_const (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
1954 {
1955 return (ctf_add_reftype (fp, flag, ref, CTF_K_CONST));
1956 }
1957
1958 ctf_id_t
1959 ctf_add_restrict (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
1960 {
1961 return (ctf_add_reftype (fp, flag, ref, CTF_K_RESTRICT));
1962 }
1963
1964 int
1965 ctf_add_enumerator (ctf_dict_t *fp, ctf_id_t enid, const char *name,
1966 int value)
1967 {
1968 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, enid);
1969 ctf_dmdef_t *dmd;
1970
1971 uint32_t kind, vlen, root;
1972 char *s;
1973
1974 if (name == NULL)
1975 return (ctf_set_errno (fp, EINVAL));
1976
1977 if (!(fp->ctf_flags & LCTF_RDWR))
1978 return (ctf_set_errno (fp, ECTF_RDONLY));
1979
1980 if (dtd == NULL)
1981 return (ctf_set_errno (fp, ECTF_BADID));
1982
1983 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1984 root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
1985 vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
1986
1987 if (kind != CTF_K_ENUM)
1988 return (ctf_set_errno (fp, ECTF_NOTENUM));
1989
1990 if (vlen == CTF_MAX_VLEN)
1991 return (ctf_set_errno (fp, ECTF_DTFULL));
1992
1993 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
1994 dmd != NULL; dmd = ctf_list_next (dmd))
1995 {
1996 if (strcmp (dmd->dmd_name, name) == 0)
1997 return (ctf_set_errno (fp, ECTF_DUPLICATE));
1998 }
1999
2000 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
2001 return (ctf_set_errno (fp, EAGAIN));
2002
2003 if ((s = strdup (name)) == NULL)
2004 {
2005 free (dmd);
2006 return (ctf_set_errno (fp, EAGAIN));
2007 }
2008
2009 dmd->dmd_name = s;
2010 dmd->dmd_type = CTF_ERR;
2011 dmd->dmd_offset = 0;
2012 dmd->dmd_value = value;
2013
2014 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
2015 ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
2016
2017 fp->ctf_flags |= LCTF_DIRTY;
2018
2019 return 0;
2020 }
2021
2022 int
2023 ctf_add_member_offset (ctf_dict_t *fp, ctf_id_t souid, const char *name,
2024 ctf_id_t type, unsigned long bit_offset)
2025 {
2026 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, souid);
2027 ctf_dmdef_t *dmd;
2028
2029 ssize_t msize, malign, ssize;
2030 uint32_t kind, vlen, root;
2031 char *s = NULL;
2032
2033 if (!(fp->ctf_flags & LCTF_RDWR))
2034 return (ctf_set_errno (fp, ECTF_RDONLY));
2035
2036 if (dtd == NULL)
2037 return (ctf_set_errno (fp, ECTF_BADID));
2038
2039 if (name != NULL && name[0] == '\0')
2040 name = NULL;
2041
2042 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
2043 root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
2044 vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
2045
2046 if (kind != CTF_K_STRUCT && kind != CTF_K_UNION)
2047 return (ctf_set_errno (fp, ECTF_NOTSOU));
2048
2049 if (vlen == CTF_MAX_VLEN)
2050 return (ctf_set_errno (fp, ECTF_DTFULL));
2051
2052 if (name != NULL)
2053 {
2054 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
2055 dmd != NULL; dmd = ctf_list_next (dmd))
2056 {
2057 if (dmd->dmd_name != NULL && strcmp (dmd->dmd_name, name) == 0)
2058 return (ctf_set_errno (fp, ECTF_DUPLICATE));
2059 }
2060 }
2061
2062 if ((msize = ctf_type_size (fp, type)) < 0 ||
2063 (malign = ctf_type_align (fp, type)) < 0)
2064 {
2065 /* The unimplemented type, and any type that resolves to it, has no size
2066 and no alignment: it can correspond to any number of compiler-inserted
2067 types. */
2068
2069 if (ctf_errno (fp) == ECTF_NONREPRESENTABLE)
2070 {
2071 msize = 0;
2072 malign = 0;
2073 ctf_set_errno (fp, 0);
2074 }
2075 else
2076 return -1; /* errno is set for us. */
2077 }
2078
2079 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
2080 return (ctf_set_errno (fp, EAGAIN));
2081
2082 if (name != NULL && (s = strdup (name)) == NULL)
2083 {
2084 free (dmd);
2085 return (ctf_set_errno (fp, EAGAIN));
2086 }
2087
2088 dmd->dmd_name = s;
2089 dmd->dmd_type = type;
2090 dmd->dmd_value = -1;
2091
2092 if (kind == CTF_K_STRUCT && vlen != 0)
2093 {
2094 if (bit_offset == (unsigned long) - 1)
2095 {
2096 /* Natural alignment. */
2097
2098 ctf_dmdef_t *lmd = ctf_list_prev (&dtd->dtd_u.dtu_members);
2099 ctf_id_t ltype = ctf_type_resolve (fp, lmd->dmd_type);
2100 size_t off = lmd->dmd_offset;
2101
2102 ctf_encoding_t linfo;
2103 ssize_t lsize;
2104
2105 /* Propagate any error from ctf_type_resolve. If the last member was
2106 of unimplemented type, this may be -ECTF_NONREPRESENTABLE: we
2107 cannot insert right after such a member without explicit offset
2108 specification, because its alignment and size is not known. */
2109 if (ltype == CTF_ERR)
2110 {
2111 free (dmd);
2112 return -1; /* errno is set for us. */
2113 }
2114
2115 if (ctf_type_encoding (fp, ltype, &linfo) == 0)
2116 off += linfo.cte_bits;
2117 else if ((lsize = ctf_type_size (fp, ltype)) > 0)
2118 off += lsize * CHAR_BIT;
2119
2120 /* Round up the offset of the end of the last member to
2121 the next byte boundary, convert 'off' to bytes, and
2122 then round it up again to the next multiple of the
2123 alignment required by the new member. Finally,
2124 convert back to bits and store the result in
2125 dmd_offset. Technically we could do more efficient
2126 packing if the new member is a bit-field, but we're
2127 the "compiler" and ANSI says we can do as we choose. */
2128
2129 off = roundup (off, CHAR_BIT) / CHAR_BIT;
2130 off = roundup (off, MAX (malign, 1));
2131 dmd->dmd_offset = off * CHAR_BIT;
2132 ssize = off + msize;
2133 }
2134 else
2135 {
2136 /* Specified offset in bits. */
2137
2138 dmd->dmd_offset = bit_offset;
2139 ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
2140 ssize = MAX (ssize, ((signed) bit_offset / CHAR_BIT) + msize);
2141 }
2142 }
2143 else
2144 {
2145 dmd->dmd_offset = 0;
2146 ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
2147 ssize = MAX (ssize, msize);
2148 }
2149
2150 if ((size_t) ssize > CTF_MAX_SIZE)
2151 {
2152 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
2153 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (ssize);
2154 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (ssize);
2155 }
2156 else
2157 dtd->dtd_data.ctt_size = (uint32_t) ssize;
2158
2159 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
2160 ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
2161
2162 fp->ctf_flags |= LCTF_DIRTY;
2163 return 0;
2164 }
2165
2166 int
2167 ctf_add_member_encoded (ctf_dict_t *fp, ctf_id_t souid, const char *name,
2168 ctf_id_t type, unsigned long bit_offset,
2169 const ctf_encoding_t encoding)
2170 {
2171 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
2172 int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
2173 int otype = type;
2174
2175 if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) && (kind != CTF_K_ENUM))
2176 return (ctf_set_errno (fp, ECTF_NOTINTFP));
2177
2178 if ((type = ctf_add_slice (fp, CTF_ADD_NONROOT, otype, &encoding)) == CTF_ERR)
2179 return -1; /* errno is set for us. */
2180
2181 return ctf_add_member_offset (fp, souid, name, type, bit_offset);
2182 }
2183
2184 int
2185 ctf_add_member (ctf_dict_t *fp, ctf_id_t souid, const char *name,
2186 ctf_id_t type)
2187 {
2188 return ctf_add_member_offset (fp, souid, name, type, (unsigned long) - 1);
2189 }
2190
2191 int
2192 ctf_add_variable (ctf_dict_t *fp, const char *name, ctf_id_t ref)
2193 {
2194 ctf_dvdef_t *dvd;
2195 ctf_dict_t *tmp = fp;
2196
2197 if (!(fp->ctf_flags & LCTF_RDWR))
2198 return (ctf_set_errno (fp, ECTF_RDONLY));
2199
2200 if (ctf_dvd_lookup (fp, name) != NULL)
2201 return (ctf_set_errno (fp, ECTF_DUPLICATE));
2202
2203 if (ctf_lookup_by_id (&tmp, ref) == NULL)
2204 return -1; /* errno is set for us. */
2205
2206 /* Make sure this type is representable. */
2207 if ((ctf_type_resolve (fp, ref) == CTF_ERR)
2208 && (ctf_errno (fp) == ECTF_NONREPRESENTABLE))
2209 return -1;
2210
2211 if ((dvd = malloc (sizeof (ctf_dvdef_t))) == NULL)
2212 return (ctf_set_errno (fp, EAGAIN));
2213
2214 if (name != NULL && (dvd->dvd_name = strdup (name)) == NULL)
2215 {
2216 free (dvd);
2217 return (ctf_set_errno (fp, EAGAIN));
2218 }
2219 dvd->dvd_type = ref;
2220 dvd->dvd_snapshots = fp->ctf_snapshots;
2221
2222 if (ctf_dvd_insert (fp, dvd) < 0)
2223 {
2224 free (dvd->dvd_name);
2225 free (dvd);
2226 return -1; /* errno is set for us. */
2227 }
2228
2229 fp->ctf_flags |= LCTF_DIRTY;
2230 return 0;
2231 }
2232
2233 int
2234 ctf_add_funcobjt_sym (ctf_dict_t *fp, int is_function, const char *name, ctf_id_t id)
2235 {
2236 ctf_dict_t *tmp = fp;
2237 char *dupname;
2238 ctf_dynhash_t *h = is_function ? fp->ctf_funchash : fp->ctf_objthash;
2239
2240 if (!(fp->ctf_flags & LCTF_RDWR))
2241 return (ctf_set_errno (fp, ECTF_RDONLY));
2242
2243 if (ctf_dynhash_lookup (fp->ctf_objthash, name) != NULL ||
2244 ctf_dynhash_lookup (fp->ctf_funchash, name) != NULL)
2245 return (ctf_set_errno (fp, ECTF_DUPLICATE));
2246
2247 if (ctf_lookup_by_id (&tmp, id) == NULL)
2248 return -1; /* errno is set for us. */
2249
2250 if (is_function && ctf_type_kind (fp, id) != CTF_K_FUNCTION)
2251 return (ctf_set_errno (fp, ECTF_NOTFUNC));
2252
2253 if ((dupname = strdup (name)) == NULL)
2254 return (ctf_set_errno (fp, ENOMEM));
2255
2256 if (ctf_dynhash_insert (h, dupname, (void *) (uintptr_t) id) < 0)
2257 {
2258 free (dupname);
2259 return (ctf_set_errno (fp, ENOMEM));
2260 }
2261 return 0;
2262 }
2263
2264 int
2265 ctf_add_objt_sym (ctf_dict_t *fp, const char *name, ctf_id_t id)
2266 {
2267 return (ctf_add_funcobjt_sym (fp, 0, name, id));
2268 }
2269
2270 int
2271 ctf_add_func_sym (ctf_dict_t *fp, const char *name, ctf_id_t id)
2272 {
2273 return (ctf_add_funcobjt_sym (fp, 1, name, id));
2274 }
2275
2276 typedef struct ctf_bundle
2277 {
2278 ctf_dict_t *ctb_dict; /* CTF dict handle. */
2279 ctf_id_t ctb_type; /* CTF type identifier. */
2280 ctf_dtdef_t *ctb_dtd; /* CTF dynamic type definition (if any). */
2281 } ctf_bundle_t;
2282
2283 static int
2284 enumcmp (const char *name, int value, void *arg)
2285 {
2286 ctf_bundle_t *ctb = arg;
2287 int bvalue;
2288
2289 if (ctf_enum_value (ctb->ctb_dict, ctb->ctb_type, name, &bvalue) < 0)
2290 {
2291 ctf_err_warn (ctb->ctb_dict, 0, 0,
2292 _("conflict due to enum %s iteration error"), name);
2293 return 1;
2294 }
2295 if (value != bvalue)
2296 {
2297 ctf_err_warn (ctb->ctb_dict, 1, ECTF_CONFLICT,
2298 _("conflict due to enum value change: %i versus %i"),
2299 value, bvalue);
2300 return 1;
2301 }
2302 return 0;
2303 }
2304
2305 static int
2306 enumadd (const char *name, int value, void *arg)
2307 {
2308 ctf_bundle_t *ctb = arg;
2309
2310 return (ctf_add_enumerator (ctb->ctb_dict, ctb->ctb_type,
2311 name, value) < 0);
2312 }
2313
2314 static int
2315 membcmp (const char *name, ctf_id_t type _libctf_unused_, unsigned long offset,
2316 void *arg)
2317 {
2318 ctf_bundle_t *ctb = arg;
2319 ctf_membinfo_t ctm;
2320
2321 /* Don't check nameless members (e.g. anonymous structs/unions) against each
2322 other. */
2323 if (name[0] == 0)
2324 return 0;
2325
2326 if (ctf_member_info (ctb->ctb_dict, ctb->ctb_type, name, &ctm) < 0)
2327 {
2328 ctf_err_warn (ctb->ctb_dict, 0, 0,
2329 _("conflict due to struct member %s iteration error"),
2330 name);
2331 return 1;
2332 }
2333 if (ctm.ctm_offset != offset)
2334 {
2335 ctf_err_warn (ctb->ctb_dict, 1, ECTF_CONFLICT,
2336 _("conflict due to struct member %s offset change: "
2337 "%lx versus %lx"),
2338 name, ctm.ctm_offset, offset);
2339 return 1;
2340 }
2341 return 0;
2342 }
2343
2344 static int
2345 membadd (const char *name, ctf_id_t type, unsigned long offset, void *arg)
2346 {
2347 ctf_bundle_t *ctb = arg;
2348 ctf_dmdef_t *dmd;
2349 char *s = NULL;
2350
2351 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
2352 return (ctf_set_errno (ctb->ctb_dict, EAGAIN));
2353
2354 if (name != NULL && (s = strdup (name)) == NULL)
2355 {
2356 free (dmd);
2357 return (ctf_set_errno (ctb->ctb_dict, EAGAIN));
2358 }
2359
2360 /* For now, dmd_type is copied as the src_fp's type; it is reset to an
2361 equivalent dst_fp type by a final loop in ctf_add_type(), below. */
2362 dmd->dmd_name = s;
2363 dmd->dmd_type = type;
2364 dmd->dmd_offset = offset;
2365 dmd->dmd_value = -1;
2366
2367 ctf_list_append (&ctb->ctb_dtd->dtd_u.dtu_members, dmd);
2368
2369 ctb->ctb_dict->ctf_flags |= LCTF_DIRTY;
2370 return 0;
2371 }
2372
2373 /* The ctf_add_type routine is used to copy a type from a source CTF dictionary
2374 to a dynamic destination dictionary. This routine operates recursively by
2375 following the source type's links and embedded member types. If the
2376 destination dict already contains a named type which has the same attributes,
2377 then we succeed and return this type but no changes occur. */
2378 static ctf_id_t
2379 ctf_add_type_internal (ctf_dict_t *dst_fp, ctf_dict_t *src_fp, ctf_id_t src_type,
2380 ctf_dict_t *proc_tracking_fp)
2381 {
2382 ctf_id_t dst_type = CTF_ERR;
2383 uint32_t dst_kind = CTF_K_UNKNOWN;
2384 ctf_dict_t *tmp_fp = dst_fp;
2385 ctf_id_t tmp;
2386
2387 const char *name;
2388 uint32_t kind, forward_kind, flag, vlen;
2389
2390 const ctf_type_t *src_tp, *dst_tp;
2391 ctf_bundle_t src, dst;
2392 ctf_encoding_t src_en, dst_en;
2393 ctf_arinfo_t src_ar, dst_ar;
2394
2395 ctf_funcinfo_t ctc;
2396
2397 ctf_id_t orig_src_type = src_type;
2398
2399 if (!(dst_fp->ctf_flags & LCTF_RDWR))
2400 return (ctf_set_errno (dst_fp, ECTF_RDONLY));
2401
2402 if ((src_tp = ctf_lookup_by_id (&src_fp, src_type)) == NULL)
2403 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
2404
2405 if ((ctf_type_resolve (src_fp, src_type) == CTF_ERR)
2406 && (ctf_errno (src_fp) == ECTF_NONREPRESENTABLE))
2407 return (ctf_set_errno (dst_fp, ECTF_NONREPRESENTABLE));
2408
2409 name = ctf_strptr (src_fp, src_tp->ctt_name);
2410 kind = LCTF_INFO_KIND (src_fp, src_tp->ctt_info);
2411 flag = LCTF_INFO_ISROOT (src_fp, src_tp->ctt_info);
2412 vlen = LCTF_INFO_VLEN (src_fp, src_tp->ctt_info);
2413
2414 /* If this is a type we are currently in the middle of adding, hand it
2415 straight back. (This lets us handle self-referential structures without
2416 considering forwards and empty structures the same as their completed
2417 forms.) */
2418
2419 tmp = ctf_type_mapping (src_fp, src_type, &tmp_fp);
2420
2421 if (tmp != 0)
2422 {
2423 if (ctf_dynhash_lookup (proc_tracking_fp->ctf_add_processing,
2424 (void *) (uintptr_t) src_type))
2425 return tmp;
2426
2427 /* If this type has already been added from this dictionary, and is the
2428 same kind and (if a struct or union) has the same number of members,
2429 hand it straight back. */
2430
2431 if (ctf_type_kind_unsliced (tmp_fp, tmp) == (int) kind)
2432 {
2433 if (kind == CTF_K_STRUCT || kind == CTF_K_UNION
2434 || kind == CTF_K_ENUM)
2435 {
2436 if ((dst_tp = ctf_lookup_by_id (&tmp_fp, dst_type)) != NULL)
2437 if (vlen == LCTF_INFO_VLEN (tmp_fp, dst_tp->ctt_info))
2438 return tmp;
2439 }
2440 else
2441 return tmp;
2442 }
2443 }
2444
2445 forward_kind = kind;
2446 if (kind == CTF_K_FORWARD)
2447 forward_kind = src_tp->ctt_type;
2448
2449 /* If the source type has a name and is a root type (visible at the top-level
2450 scope), lookup the name in the destination dictionary and verify that it is
2451 of the same kind before we do anything else. */
2452
2453 if ((flag & CTF_ADD_ROOT) && name[0] != '\0'
2454 && (tmp = ctf_lookup_by_rawname (dst_fp, forward_kind, name)) != 0)
2455 {
2456 dst_type = tmp;
2457 dst_kind = ctf_type_kind_unsliced (dst_fp, dst_type);
2458 }
2459
2460 /* If an identically named dst_type exists, fail with ECTF_CONFLICT
2461 unless dst_type is a forward declaration and src_type is a struct,
2462 union, or enum (i.e. the definition of the previous forward decl).
2463
2464 We also allow addition in the opposite order (addition of a forward when a
2465 struct, union, or enum already exists), which is a NOP and returns the
2466 already-present struct, union, or enum. */
2467
2468 if (dst_type != CTF_ERR && dst_kind != kind)
2469 {
2470 if (kind == CTF_K_FORWARD
2471 && (dst_kind == CTF_K_ENUM || dst_kind == CTF_K_STRUCT
2472 || dst_kind == CTF_K_UNION))
2473 {
2474 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2475 return dst_type;
2476 }
2477
2478 if (dst_kind != CTF_K_FORWARD
2479 || (kind != CTF_K_ENUM && kind != CTF_K_STRUCT
2480 && kind != CTF_K_UNION))
2481 {
2482 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2483 _("ctf_add_type: conflict for type %s: "
2484 "kinds differ, new: %i; old (ID %lx): %i"),
2485 name, kind, dst_type, dst_kind);
2486 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2487 }
2488 }
2489
2490 /* We take special action for an integer, float, or slice since it is
2491 described not only by its name but also its encoding. For integers,
2492 bit-fields exploit this degeneracy. */
2493
2494 if (kind == CTF_K_INTEGER || kind == CTF_K_FLOAT || kind == CTF_K_SLICE)
2495 {
2496 if (ctf_type_encoding (src_fp, src_type, &src_en) != 0)
2497 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
2498
2499 if (dst_type != CTF_ERR)
2500 {
2501 ctf_dict_t *fp = dst_fp;
2502
2503 if ((dst_tp = ctf_lookup_by_id (&fp, dst_type)) == NULL)
2504 return CTF_ERR;
2505
2506 if (ctf_type_encoding (dst_fp, dst_type, &dst_en) != 0)
2507 return CTF_ERR; /* errno set for us. */
2508
2509 if (LCTF_INFO_ISROOT (fp, dst_tp->ctt_info) & CTF_ADD_ROOT)
2510 {
2511 /* The type that we found in the hash is also root-visible. If
2512 the two types match then use the existing one; otherwise,
2513 declare a conflict. Note: slices are not certain to match
2514 even if there is no conflict: we must check the contained type
2515 too. */
2516
2517 if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
2518 {
2519 if (kind != CTF_K_SLICE)
2520 {
2521 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2522 return dst_type;
2523 }
2524 }
2525 else
2526 {
2527 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2528 }
2529 }
2530 else
2531 {
2532 /* We found a non-root-visible type in the hash. If its encoding
2533 is the same, we can reuse it, unless it is a slice. */
2534
2535 if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
2536 {
2537 if (kind != CTF_K_SLICE)
2538 {
2539 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2540 return dst_type;
2541 }
2542 }
2543 }
2544 }
2545 }
2546
2547 src.ctb_dict = src_fp;
2548 src.ctb_type = src_type;
2549 src.ctb_dtd = NULL;
2550
2551 dst.ctb_dict = dst_fp;
2552 dst.ctb_type = dst_type;
2553 dst.ctb_dtd = NULL;
2554
2555 /* Now perform kind-specific processing. If dst_type is CTF_ERR, then we add
2556 a new type with the same properties as src_type to dst_fp. If dst_type is
2557 not CTF_ERR, then we verify that dst_type has the same attributes as
2558 src_type. We recurse for embedded references. Before we start, we note
2559 that we are processing this type, to prevent infinite recursion: we do not
2560 re-process any type that appears in this list. The list is emptied
2561 wholesale at the end of processing everything in this recursive stack. */
2562
2563 if (ctf_dynhash_insert (proc_tracking_fp->ctf_add_processing,
2564 (void *) (uintptr_t) src_type, (void *) 1) < 0)
2565 return ctf_set_errno (dst_fp, ENOMEM);
2566
2567 switch (kind)
2568 {
2569 case CTF_K_INTEGER:
2570 /* If we found a match we will have either returned it or declared a
2571 conflict. */
2572 dst_type = ctf_add_integer (dst_fp, flag, name, &src_en);
2573 break;
2574
2575 case CTF_K_FLOAT:
2576 /* If we found a match we will have either returned it or declared a
2577 conflict. */
2578 dst_type = ctf_add_float (dst_fp, flag, name, &src_en);
2579 break;
2580
2581 case CTF_K_SLICE:
2582 /* We have checked for conflicting encodings: now try to add the
2583 contained type. */
2584 src_type = ctf_type_reference (src_fp, src_type);
2585 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2586 proc_tracking_fp);
2587
2588 if (src_type == CTF_ERR)
2589 return CTF_ERR; /* errno is set for us. */
2590
2591 dst_type = ctf_add_slice (dst_fp, flag, src_type, &src_en);
2592 break;
2593
2594 case CTF_K_POINTER:
2595 case CTF_K_VOLATILE:
2596 case CTF_K_CONST:
2597 case CTF_K_RESTRICT:
2598 src_type = ctf_type_reference (src_fp, src_type);
2599 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2600 proc_tracking_fp);
2601
2602 if (src_type == CTF_ERR)
2603 return CTF_ERR; /* errno is set for us. */
2604
2605 dst_type = ctf_add_reftype (dst_fp, flag, src_type, kind);
2606 break;
2607
2608 case CTF_K_ARRAY:
2609 if (ctf_array_info (src_fp, src_type, &src_ar) != 0)
2610 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
2611
2612 src_ar.ctr_contents =
2613 ctf_add_type_internal (dst_fp, src_fp, src_ar.ctr_contents,
2614 proc_tracking_fp);
2615 src_ar.ctr_index = ctf_add_type_internal (dst_fp, src_fp,
2616 src_ar.ctr_index,
2617 proc_tracking_fp);
2618 src_ar.ctr_nelems = src_ar.ctr_nelems;
2619
2620 if (src_ar.ctr_contents == CTF_ERR || src_ar.ctr_index == CTF_ERR)
2621 return CTF_ERR; /* errno is set for us. */
2622
2623 if (dst_type != CTF_ERR)
2624 {
2625 if (ctf_array_info (dst_fp, dst_type, &dst_ar) != 0)
2626 return CTF_ERR; /* errno is set for us. */
2627
2628 if (memcmp (&src_ar, &dst_ar, sizeof (ctf_arinfo_t)))
2629 {
2630 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2631 _("conflict for type %s against ID %lx: array info "
2632 "differs, old %lx/%lx/%x; new: %lx/%lx/%x"),
2633 name, dst_type, src_ar.ctr_contents,
2634 src_ar.ctr_index, src_ar.ctr_nelems,
2635 dst_ar.ctr_contents, dst_ar.ctr_index,
2636 dst_ar.ctr_nelems);
2637 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2638 }
2639 }
2640 else
2641 dst_type = ctf_add_array (dst_fp, flag, &src_ar);
2642 break;
2643
2644 case CTF_K_FUNCTION:
2645 ctc.ctc_return = ctf_add_type_internal (dst_fp, src_fp,
2646 src_tp->ctt_type,
2647 proc_tracking_fp);
2648 ctc.ctc_argc = 0;
2649 ctc.ctc_flags = 0;
2650
2651 if (ctc.ctc_return == CTF_ERR)
2652 return CTF_ERR; /* errno is set for us. */
2653
2654 dst_type = ctf_add_function (dst_fp, flag, &ctc, NULL);
2655 break;
2656
2657 case CTF_K_STRUCT:
2658 case CTF_K_UNION:
2659 {
2660 ctf_dmdef_t *dmd;
2661 int errs = 0;
2662 size_t size;
2663 ssize_t ssize;
2664 ctf_dtdef_t *dtd;
2665
2666 /* Technically to match a struct or union we need to check both
2667 ways (src members vs. dst, dst members vs. src) but we make
2668 this more optimal by only checking src vs. dst and comparing
2669 the total size of the structure (which we must do anyway)
2670 which covers the possibility of dst members not in src.
2671 This optimization can be defeated for unions, but is so
2672 pathological as to render it irrelevant for our purposes. */
2673
2674 if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
2675 && dst_kind != CTF_K_FORWARD)
2676 {
2677 if (ctf_type_size (src_fp, src_type) !=
2678 ctf_type_size (dst_fp, dst_type))
2679 {
2680 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2681 _("conflict for type %s against ID %lx: union "
2682 "size differs, old %li, new %li"), name,
2683 dst_type, (long) ctf_type_size (src_fp, src_type),
2684 (long) ctf_type_size (dst_fp, dst_type));
2685 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2686 }
2687
2688 if (ctf_member_iter (src_fp, src_type, membcmp, &dst))
2689 {
2690 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2691 _("conflict for type %s against ID %lx: members "
2692 "differ, see above"), name, dst_type);
2693 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2694 }
2695
2696 break;
2697 }
2698
2699 /* Unlike the other cases, copying structs and unions is done
2700 manually so as to avoid repeated lookups in ctf_add_member
2701 and to ensure the exact same member offsets as in src_type. */
2702
2703 dst_type = ctf_add_generic (dst_fp, flag, name, kind, &dtd);
2704 if (dst_type == CTF_ERR)
2705 return CTF_ERR; /* errno is set for us. */
2706
2707 dst.ctb_type = dst_type;
2708 dst.ctb_dtd = dtd;
2709
2710 /* Pre-emptively add this struct to the type mapping so that
2711 structures that refer to themselves work. */
2712 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2713
2714 if (ctf_member_iter (src_fp, src_type, membadd, &dst) != 0)
2715 errs++; /* Increment errs and fail at bottom of case. */
2716
2717 if ((ssize = ctf_type_size (src_fp, src_type)) < 0)
2718 return CTF_ERR; /* errno is set for us. */
2719
2720 size = (size_t) ssize;
2721 if (size > CTF_MAX_SIZE)
2722 {
2723 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
2724 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
2725 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
2726 }
2727 else
2728 dtd->dtd_data.ctt_size = (uint32_t) size;
2729
2730 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, vlen);
2731
2732 /* Make a final pass through the members changing each dmd_type (a
2733 src_fp type) to an equivalent type in dst_fp. We pass through all
2734 members, leaving any that fail set to CTF_ERR, unless they fail
2735 because they are marking a member of type not representable in this
2736 version of CTF, in which case we just want to silently omit them:
2737 no consumer can do anything with them anyway. */
2738 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
2739 dmd != NULL; dmd = ctf_list_next (dmd))
2740 {
2741 ctf_dict_t *dst = dst_fp;
2742 ctf_id_t memb_type;
2743
2744 memb_type = ctf_type_mapping (src_fp, dmd->dmd_type, &dst);
2745 if (memb_type == 0)
2746 {
2747 if ((dmd->dmd_type =
2748 ctf_add_type_internal (dst_fp, src_fp, dmd->dmd_type,
2749 proc_tracking_fp)) == CTF_ERR)
2750 {
2751 if (ctf_errno (dst_fp) != ECTF_NONREPRESENTABLE)
2752 errs++;
2753 }
2754 }
2755 else
2756 dmd->dmd_type = memb_type;
2757 }
2758
2759 if (errs)
2760 return CTF_ERR; /* errno is set for us. */
2761 break;
2762 }
2763
2764 case CTF_K_ENUM:
2765 if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
2766 && dst_kind != CTF_K_FORWARD)
2767 {
2768 if (ctf_enum_iter (src_fp, src_type, enumcmp, &dst)
2769 || ctf_enum_iter (dst_fp, dst_type, enumcmp, &src))
2770 {
2771 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
2772 _("conflict for enum %s against ID %lx: members "
2773 "differ, see above"), name, dst_type);
2774 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2775 }
2776 }
2777 else
2778 {
2779 dst_type = ctf_add_enum (dst_fp, flag, name);
2780 if ((dst.ctb_type = dst_type) == CTF_ERR
2781 || ctf_enum_iter (src_fp, src_type, enumadd, &dst))
2782 return CTF_ERR; /* errno is set for us */
2783 }
2784 break;
2785
2786 case CTF_K_FORWARD:
2787 if (dst_type == CTF_ERR)
2788 dst_type = ctf_add_forward (dst_fp, flag, name, forward_kind);
2789 break;
2790
2791 case CTF_K_TYPEDEF:
2792 src_type = ctf_type_reference (src_fp, src_type);
2793 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2794 proc_tracking_fp);
2795
2796 if (src_type == CTF_ERR)
2797 return CTF_ERR; /* errno is set for us. */
2798
2799 /* If dst_type is not CTF_ERR at this point, we should check if
2800 ctf_type_reference(dst_fp, dst_type) != src_type and if so fail with
2801 ECTF_CONFLICT. However, this causes problems with bitness typedefs
2802 that vary based on things like if 32-bit then pid_t is int otherwise
2803 long. We therefore omit this check and assume that if the identically
2804 named typedef already exists in dst_fp, it is correct or
2805 equivalent. */
2806
2807 if (dst_type == CTF_ERR)
2808 dst_type = ctf_add_typedef (dst_fp, flag, name, src_type);
2809
2810 break;
2811
2812 default:
2813 return (ctf_set_errno (dst_fp, ECTF_CORRUPT));
2814 }
2815
2816 if (dst_type != CTF_ERR)
2817 ctf_add_type_mapping (src_fp, orig_src_type, dst_fp, dst_type);
2818 return dst_type;
2819 }
2820
2821 ctf_id_t
2822 ctf_add_type (ctf_dict_t *dst_fp, ctf_dict_t *src_fp, ctf_id_t src_type)
2823 {
2824 ctf_id_t id;
2825
2826 if (!src_fp->ctf_add_processing)
2827 src_fp->ctf_add_processing = ctf_dynhash_create (ctf_hash_integer,
2828 ctf_hash_eq_integer,
2829 NULL, NULL);
2830
2831 /* We store the hash on the source, because it contains only source type IDs:
2832 but callers will invariably expect errors to appear on the dest. */
2833 if (!src_fp->ctf_add_processing)
2834 return (ctf_set_errno (dst_fp, ENOMEM));
2835
2836 id = ctf_add_type_internal (dst_fp, src_fp, src_type, src_fp);
2837 ctf_dynhash_empty (src_fp->ctf_add_processing);
2838
2839 return id;
2840 }
2841
2842 /* Write the compressed CTF data stream to the specified gzFile descriptor. */
2843 int
2844 ctf_gzwrite (ctf_dict_t *fp, gzFile fd)
2845 {
2846 const unsigned char *buf;
2847 ssize_t resid;
2848 ssize_t len;
2849
2850 resid = sizeof (ctf_header_t);
2851 buf = (unsigned char *) fp->ctf_header;
2852 while (resid != 0)
2853 {
2854 if ((len = gzwrite (fd, buf, resid)) <= 0)
2855 return (ctf_set_errno (fp, errno));
2856 resid -= len;
2857 buf += len;
2858 }
2859
2860 resid = fp->ctf_size;
2861 buf = fp->ctf_buf;
2862 while (resid != 0)
2863 {
2864 if ((len = gzwrite (fd, buf, resid)) <= 0)
2865 return (ctf_set_errno (fp, errno));
2866 resid -= len;
2867 buf += len;
2868 }
2869
2870 return 0;
2871 }
2872
2873 /* Compress the specified CTF data stream and write it to the specified file
2874 descriptor. */
2875 int
2876 ctf_compress_write (ctf_dict_t *fp, int fd)
2877 {
2878 unsigned char *buf;
2879 unsigned char *bp;
2880 ctf_header_t h;
2881 ctf_header_t *hp = &h;
2882 ssize_t header_len = sizeof (ctf_header_t);
2883 ssize_t compress_len;
2884 ssize_t len;
2885 int rc;
2886 int err = 0;
2887
2888 if (ctf_serialize (fp) < 0)
2889 return -1; /* errno is set for us. */
2890
2891 memcpy (hp, fp->ctf_header, header_len);
2892 hp->cth_flags |= CTF_F_COMPRESS;
2893 compress_len = compressBound (fp->ctf_size);
2894
2895 if ((buf = malloc (compress_len)) == NULL)
2896 {
2897 ctf_err_warn (fp, 0, 0, _("ctf_compress_write: cannot allocate %li bytes"),
2898 (unsigned long) compress_len);
2899 return (ctf_set_errno (fp, ECTF_ZALLOC));
2900 }
2901
2902 if ((rc = compress (buf, (uLongf *) &compress_len,
2903 fp->ctf_buf, fp->ctf_size)) != Z_OK)
2904 {
2905 err = ctf_set_errno (fp, ECTF_COMPRESS);
2906 ctf_err_warn (fp, 0, 0, _("zlib deflate err: %s"), zError (rc));
2907 goto ret;
2908 }
2909
2910 while (header_len > 0)
2911 {
2912 if ((len = write (fd, hp, header_len)) < 0)
2913 {
2914 err = ctf_set_errno (fp, errno);
2915 ctf_err_warn (fp, 0, 0, _("ctf_compress_write: error writing header"));
2916 goto ret;
2917 }
2918 header_len -= len;
2919 hp += len;
2920 }
2921
2922 bp = buf;
2923 while (compress_len > 0)
2924 {
2925 if ((len = write (fd, bp, compress_len)) < 0)
2926 {
2927 err = ctf_set_errno (fp, errno);
2928 ctf_err_warn (fp, 0, 0, _("ctf_compress_write: error writing"));
2929 goto ret;
2930 }
2931 compress_len -= len;
2932 bp += len;
2933 }
2934
2935 ret:
2936 free (buf);
2937 return err;
2938 }
2939
2940 /* Optionally compress the specified CTF data stream and return it as a new
2941 dynamically-allocated string. */
2942 unsigned char *
2943 ctf_write_mem (ctf_dict_t *fp, size_t *size, size_t threshold)
2944 {
2945 unsigned char *buf;
2946 unsigned char *bp;
2947 ctf_header_t *hp;
2948 ssize_t header_len = sizeof (ctf_header_t);
2949 ssize_t compress_len;
2950 int rc;
2951
2952 if (ctf_serialize (fp) < 0)
2953 return NULL; /* errno is set for us. */
2954
2955 compress_len = compressBound (fp->ctf_size);
2956 if (fp->ctf_size < threshold)
2957 compress_len = fp->ctf_size;
2958 if ((buf = malloc (compress_len
2959 + sizeof (struct ctf_header))) == NULL)
2960 {
2961 ctf_set_errno (fp, ENOMEM);
2962 ctf_err_warn (fp, 0, 0, _("ctf_write_mem: cannot allocate %li bytes"),
2963 (unsigned long) (compress_len + sizeof (struct ctf_header)));
2964 return NULL;
2965 }
2966
2967 hp = (ctf_header_t *) buf;
2968 memcpy (hp, fp->ctf_header, header_len);
2969 bp = buf + sizeof (struct ctf_header);
2970 *size = sizeof (struct ctf_header);
2971
2972 if (fp->ctf_size < threshold)
2973 {
2974 hp->cth_flags &= ~CTF_F_COMPRESS;
2975 memcpy (bp, fp->ctf_buf, fp->ctf_size);
2976 *size += fp->ctf_size;
2977 }
2978 else
2979 {
2980 hp->cth_flags |= CTF_F_COMPRESS;
2981 if ((rc = compress (bp, (uLongf *) &compress_len,
2982 fp->ctf_buf, fp->ctf_size)) != Z_OK)
2983 {
2984 ctf_set_errno (fp, ECTF_COMPRESS);
2985 ctf_err_warn (fp, 0, 0, _("zlib deflate err: %s"), zError (rc));
2986 free (buf);
2987 return NULL;
2988 }
2989 *size += compress_len;
2990 }
2991 return buf;
2992 }
2993
2994 /* Write the uncompressed CTF data stream to the specified file descriptor. */
2995 int
2996 ctf_write (ctf_dict_t *fp, int fd)
2997 {
2998 const unsigned char *buf;
2999 ssize_t resid;
3000 ssize_t len;
3001
3002 if (ctf_serialize (fp) < 0)
3003 return -1; /* errno is set for us. */
3004
3005 resid = sizeof (ctf_header_t);
3006 buf = (unsigned char *) fp->ctf_header;
3007 while (resid != 0)
3008 {
3009 if ((len = write (fd, buf, resid)) <= 0)
3010 {
3011 ctf_err_warn (fp, 0, errno, _("ctf_write: error writing header"));
3012 return (ctf_set_errno (fp, errno));
3013 }
3014 resid -= len;
3015 buf += len;
3016 }
3017
3018 resid = fp->ctf_size;
3019 buf = fp->ctf_buf;
3020 while (resid != 0)
3021 {
3022 if ((len = write (fd, buf, resid)) <= 0)
3023 {
3024 ctf_err_warn (fp, 0, errno, _("ctf_write: error writing"));
3025 return (ctf_set_errno (fp, errno));
3026 }
3027 resid -= len;
3028 buf += len;
3029 }
3030
3031 return 0;
3032 }
This page took 0.119034 seconds and 5 git commands to generate.