libctf, include: CTF-archive-wide symbol lookup
[deliverable/binutils-gdb.git] / libctf / ctf-create.c
CommitLineData
47d546f4 1/* CTF file creation.
b3adc24a 2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
47d546f4
NA
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>
c1401ecc 24#include <unistd.h>
47d546f4
NA
25#include <zlib.h>
26
1136c379
NA
27#include <elf.h>
28#include "elf-bfd.h"
29
555adca2
EZ
30#ifndef EOVERFLOW
31#define EOVERFLOW ERANGE
32#endif
33
a0486bac
JM
34#ifndef roundup
35#define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
36#endif
37
676c3ecb
NA
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
43static int
139633c3 44ctf_grow_ptrtab (ctf_dict_t *fp)
676c3ecb
NA
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
139633c3
NA
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
f5e9c9bd 75 type ID 0 is used as a sentinel and a not-found indicator. */
47d546f4 76
139633c3 77ctf_dict_t *
47d546f4
NA
78ctf_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;
676c3ecb 84 ctf_dynhash_t *structs = NULL, *unions = NULL, *enums = NULL, *names = NULL;
1136c379 85 ctf_dynhash_t *objthash = NULL, *funchash = NULL;
47d546f4 86 ctf_sect_t cts;
139633c3 87 ctf_dict_t *fp;
47d546f4
NA
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
676c3ecb
NA
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);
1136c379
NA
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);
676c3ecb 118 if (!structs || !unions || !enums || !names)
47d546f4
NA
119 {
120 ctf_set_open_errno (errp, EAGAIN);
121 goto err_dv;
122 }
123
124 cts.cts_name = _CTF_SECTION;
47d546f4
NA
125 cts.cts_data = &hdr;
126 cts.cts_size = sizeof (hdr);
127 cts.cts_entsize = 1;
47d546f4 128
676c3ecb
NA
129 if ((fp = ctf_bufopen_internal (&cts, NULL, NULL, NULL, 1, errp)) == NULL)
130 goto err_dv;
47d546f4 131
676c3ecb
NA
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;
1136c379
NA
136 fp->ctf_objthash = objthash;
137 fp->ctf_funchash = funchash;
47d546f4
NA
138 fp->ctf_dthash = dthash;
139 fp->ctf_dvhash = dvhash;
47d546f4 140 fp->ctf_dtoldid = 0;
f57cf0e3 141 fp->ctf_snapshots = 1;
47d546f4 142 fp->ctf_snapshot_lu = 0;
dd987f00 143 fp->ctf_flags |= LCTF_DIRTY;
47d546f4 144
676c3ecb
NA
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));
139633c3 150 ctf_dict_close (fp);
676c3ecb
NA
151 return NULL;
152 }
153
47d546f4
NA
154 return fp;
155
47d546f4 156 err_dv:
676c3ecb
NA
157 ctf_dynhash_destroy (structs);
158 ctf_dynhash_destroy (unions);
159 ctf_dynhash_destroy (enums);
160 ctf_dynhash_destroy (names);
1136c379
NA
161 ctf_dynhash_destroy (objthash);
162 ctf_dynhash_destroy (funchash);
47d546f4
NA
163 ctf_dynhash_destroy (dvhash);
164 err_dt:
165 ctf_dynhash_destroy (dthash);
166 err:
167 return NULL;
168}
169
1136c379
NA
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
174static int
175symtypetab_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
196int
197ctf_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_
226static int
227symtypetab_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. */
382static int
383emit_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. */
479static int
480emit_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
47d546f4 559static unsigned char *
139633c3 560ctf_copy_smembers (ctf_dict_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
47d546f4
NA
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 {
f5e9c9bd 567 ctf_member_t *copied;
47d546f4 568
f5e9c9bd 569 ctm.ctm_name = 0;
47d546f4
NA
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));
f5e9c9bd
NA
574 copied = (ctf_member_t *) t;
575 if (dmd->dmd_name)
576 ctf_str_add_ref (fp, dmd->dmd_name, &copied->ctm_name);
577
47d546f4
NA
578 t += sizeof (ctm);
579 }
580
581 return t;
582}
583
584static unsigned char *
139633c3 585ctf_copy_lmembers (ctf_dict_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
47d546f4
NA
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 {
f5e9c9bd 592 ctf_lmember_t *copied;
47d546f4 593
f5e9c9bd 594 ctlm.ctlm_name = 0;
47d546f4
NA
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));
f5e9c9bd
NA
600 copied = (ctf_lmember_t *) t;
601 if (dmd->dmd_name)
602 ctf_str_add_ref (fp, dmd->dmd_name, &copied->ctlm_name);
603
47d546f4
NA
604 t += sizeof (ctlm);
605 }
606
607 return t;
608}
609
610static unsigned char *
139633c3 611ctf_copy_emembers (ctf_dict_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
47d546f4
NA
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 {
f5e9c9bd
NA
618 ctf_enum_t *copied;
619
47d546f4 620 cte.cte_value = dmd->dmd_value;
47d546f4 621 memcpy (t, &cte, sizeof (cte));
f5e9c9bd
NA
622 copied = (ctf_enum_t *) t;
623 ctf_str_add_ref (fp, dmd->dmd_name, &copied->cte_name);
47d546f4
NA
624 t += sizeof (cte);
625 }
626
627 return t;
628}
629
47d546f4
NA
630/* Sort a newly-constructed static variable array. */
631
d851ecd3
NA
632typedef struct ctf_sort_var_arg_cb
633{
139633c3 634 ctf_dict_t *fp;
d851ecd3
NA
635 ctf_strs_t *strtab;
636} ctf_sort_var_arg_cb_t;
637
47d546f4 638static int
d851ecd3 639ctf_sort_var (const void *one_, const void *two_, void *arg_)
47d546f4
NA
640{
641 const ctf_varent_t *one = one_;
642 const ctf_varent_t *two = two_;
d851ecd3 643 ctf_sort_var_arg_cb_t *arg = arg_;
47d546f4 644
d851ecd3
NA
645 return (strcmp (ctf_strraw_explicit (arg->fp, one->ctv_name, arg->strtab),
646 ctf_strraw_explicit (arg->fp, two->ctv_name, arg->strtab)));
47d546f4
NA
647}
648
676c3ecb 649/* Compatibility: just update the threshold for ctf_discard. */
47d546f4 650int
139633c3 651ctf_update (ctf_dict_t *fp)
676c3ecb
NA
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
139633c3
NA
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. */
676c3ecb 670int
139633c3 671ctf_serialize (ctf_dict_t *fp)
47d546f4 672{
139633c3 673 ctf_dict_t ofp, *nfp;
f5e9c9bd 674 ctf_header_t hdr, *hdrp;
47d546f4
NA
675 ctf_dtdef_t *dtd;
676 ctf_dvdef_t *dvd;
677 ctf_varent_t *dvarents;
f5e9c9bd 678 ctf_strs_writable_t strtab;
1136c379 679 ctf_dict_t *symfp = fp;
47d546f4 680
f5e9c9bd 681 unsigned char *t;
47d546f4 682 unsigned long i;
1136c379
NA
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;
47d546f4
NA
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
1136c379
NA
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. */
47d546f4
NA
706
707 memset (&hdr, 0, sizeof (hdr));
708 hdr.cth_magic = CTF_MAGIC;
709 hdr.cth_version = CTF_VERSION;
710
1136c379
NA
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);
3d16b64e 714
47d546f4
NA
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
1136c379
NA
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
47d546f4
NA
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
f5e9c9bd
NA
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.) */
47d546f4 844
1136c379
NA
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;
47d546f4
NA
850 hdr.cth_typeoff = hdr.cth_varoff + (nvars * sizeof (ctf_varent_t));
851 hdr.cth_stroff = hdr.cth_typeoff + type_size;
f5e9c9bd 852 hdr.cth_strlen = 0;
47d546f4
NA
853
854 buf_size = sizeof (ctf_header_t) + hdr.cth_stroff + hdr.cth_strlen;
855
65365aa8 856 if ((buf = malloc (buf_size)) == NULL)
47d546f4
NA
857 return (ctf_set_errno (fp, EAGAIN));
858
859 memcpy (buf, &hdr, sizeof (ctf_header_t));
1136c379 860 t = (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_objtoff;
47d546f4 861
f5e9c9bd
NA
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);
fd55eae8
NA
865 if (fp->ctf_cuname != NULL)
866 ctf_str_add_ref (fp, fp->ctf_cuname, &hdrp->cth_cuname);
47d546f4 867
1136c379
NA
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
f5e9c9bd
NA
976 /* Work over the variable list, translating everything into ctf_varent_t's and
977 prepping the string table. */
47d546f4
NA
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];
47d546f4 984
f5e9c9bd 985 ctf_str_add_ref (fp, dvd->dvd_name, &var->ctv_name);
9943fa3a 986 var->ctv_type = (uint32_t) dvd->dvd_type;
47d546f4
NA
987 }
988 assert (i == nvars);
989
47d546f4
NA
990 t += sizeof (ctf_varent_t) * nvars;
991
992 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_typeoff);
993
f5e9c9bd
NA
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. */
47d546f4
NA
997
998 for (dtd = ctf_list_next (&fp->ctf_dtdefs);
999 dtd != NULL; dtd = ctf_list_next (dtd))
1000 {
47d546f4
NA
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;
f5e9c9bd 1007 ctf_stype_t *copied;
676c3ecb 1008 const char *name;
47d546f4
NA
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);
f5e9c9bd 1016 copied = (ctf_stype_t *) t; /* name is at the start: constant offset. */
676c3ecb
NA
1017 if (copied->ctt_name
1018 && (name = ctf_strraw (fp, copied->ctt_name)) != NULL)
1019 ctf_str_add_ref (fp, name, &copied->ctt_name);
47d546f4
NA
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++)
afd78bd6 1061 *argv++ = dtd->dtd_u.dtu_argv[argc];
47d546f4
NA
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)
f5e9c9bd 1073 t = ctf_copy_smembers (fp, dtd, t);
47d546f4 1074 else
f5e9c9bd 1075 t = ctf_copy_lmembers (fp, dtd, t);
47d546f4
NA
1076 break;
1077
1078 case CTF_K_ENUM:
f5e9c9bd 1079 t = ctf_copy_emembers (fp, dtd, t);
47d546f4
NA
1080 break;
1081 }
1082 }
1083 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_stroff);
1084
f5e9c9bd
NA
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
d851ecd3 1091 if (strtab.cts_strs == NULL)
1136c379 1092 goto oom;
d851ecd3 1093
f5e9c9bd
NA
1094 /* Now the string table is constructed, we can sort the buffer of
1095 ctf_varent_t's. */
d851ecd3 1096 ctf_sort_var_arg_cb_t sort_var_arg = { fp, (ctf_strs_t *) &strtab };
f5e9c9bd 1097 ctf_qsort_r (dvarents, nvars, sizeof (ctf_varent_t), ctf_sort_var,
d851ecd3 1098 &sort_var_arg);
f5e9c9bd
NA
1099
1100 if ((newbuf = ctf_realloc (fp, buf, buf_size + strtab.cts_len)) == NULL)
1101 {
de07e349 1102 free (strtab.cts_strs);
1136c379 1103 goto oom;
f5e9c9bd
NA
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;
de07e349 1110 free (strtab.cts_strs);
f5e9c9bd 1111
139633c3
NA
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. */
47d546f4 1114
d851ecd3
NA
1115 if ((nfp = ctf_simple_open_internal ((char *) buf, buf_size, NULL, 0,
1116 0, NULL, 0, fp->ctf_syn_ext_strtab,
676c3ecb 1117 1, &err)) == NULL)
47d546f4 1118 {
de07e349 1119 free (buf);
47d546f4
NA
1120 return (ctf_set_errno (fp, err));
1121 }
1122
1123 (void) ctf_setmodel (nfp, ctf_getmodel (fp));
47d546f4 1124
1fa7a0c2
NA
1125 nfp->ctf_parent = fp->ctf_parent;
1126 nfp->ctf_parent_unreffed = fp->ctf_parent_unreffed;
47d546f4
NA
1127 nfp->ctf_refcnt = fp->ctf_refcnt;
1128 nfp->ctf_flags |= fp->ctf_flags & ~LCTF_DIRTY;
fd55eae8
NA
1129 if (nfp->ctf_dynbase == NULL)
1130 nfp->ctf_dynbase = buf; /* Make sure buf is freed on close. */
47d546f4
NA
1131 nfp->ctf_dthash = fp->ctf_dthash;
1132 nfp->ctf_dtdefs = fp->ctf_dtdefs;
47d546f4
NA
1133 nfp->ctf_dvhash = fp->ctf_dvhash;
1134 nfp->ctf_dvdefs = fp->ctf_dvdefs;
676c3ecb 1135 nfp->ctf_dtoldid = fp->ctf_dtoldid;
99dc3ebd 1136 nfp->ctf_add_processing = fp->ctf_add_processing;
47d546f4
NA
1137 nfp->ctf_snapshots = fp->ctf_snapshots + 1;
1138 nfp->ctf_specific = fp->ctf_specific;
1136c379
NA
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;
676c3ecb 1144 nfp->ctf_ptrtab = fp->ctf_ptrtab;
1136c379
NA
1145 nfp->ctf_dynsymidx = fp->ctf_dynsymidx;
1146 nfp->ctf_dynsymmax = fp->ctf_dynsymmax;
676c3ecb 1147 nfp->ctf_ptrtab_len = fp->ctf_ptrtab_len;
72c83edd
NA
1148 nfp->ctf_link_inputs = fp->ctf_link_inputs;
1149 nfp->ctf_link_outputs = fp->ctf_link_outputs;
8b37e7b6 1150 nfp->ctf_errs_warnings = fp->ctf_errs_warnings;
1136c379
NA
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;
676c3ecb 1155 nfp->ctf_str_prov_offset = fp->ctf_str_prov_offset;
d851ecd3 1156 nfp->ctf_syn_ext_strtab = fp->ctf_syn_ext_strtab;
1136c379 1157 nfp->ctf_in_flight_dynsyms = fp->ctf_in_flight_dynsyms;
5f54462c
NA
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;
886453cb 1160 nfp->ctf_link_type_mapping = fp->ctf_link_type_mapping;
49ea9b45
NA
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;
6dd2819f
NA
1163 nfp->ctf_link_variable_filter = fp->ctf_link_variable_filter;
1164 nfp->ctf_link_variable_filter_arg = fp->ctf_link_variable_filter_arg;
8d2229ad 1165 nfp->ctf_link_flags = fp->ctf_link_flags;
0f0c11f7
NA
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));
47d546f4
NA
1169
1170 nfp->ctf_snapshot_lu = fp->ctf_snapshots;
1171
676c3ecb
NA
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
47d546f4 1178 fp->ctf_dthash = NULL;
f5e9c9bd
NA
1179 ctf_str_free_atoms (nfp);
1180 nfp->ctf_str_atoms = fp->ctf_str_atoms;
676c3ecb 1181 nfp->ctf_prov_strtab = fp->ctf_prov_strtab;
f5e9c9bd 1182 fp->ctf_str_atoms = NULL;
676c3ecb 1183 fp->ctf_prov_strtab = NULL;
47d546f4 1184 memset (&fp->ctf_dtdefs, 0, sizeof (ctf_list_t));
8b37e7b6 1185 memset (&fp->ctf_errs_warnings, 0, sizeof (ctf_list_t));
99dc3ebd 1186 fp->ctf_add_processing = NULL;
676c3ecb 1187 fp->ctf_ptrtab = NULL;
1136c379
NA
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;
72c83edd
NA
1196 fp->ctf_link_inputs = NULL;
1197 fp->ctf_link_outputs = NULL;
d851ecd3 1198 fp->ctf_syn_ext_strtab = NULL;
5f54462c
NA
1199 fp->ctf_link_in_cu_mapping = NULL;
1200 fp->ctf_link_out_cu_mapping = NULL;
886453cb 1201 fp->ctf_link_type_mapping = NULL;
0f0c11f7
NA
1202 fp->ctf_dedup_atoms = NULL;
1203 fp->ctf_dedup_atoms_alloc = NULL;
1fa7a0c2 1204 fp->ctf_parent_unreffed = 1;
47d546f4
NA
1205
1206 fp->ctf_dvhash = NULL;
1207 memset (&fp->ctf_dvdefs, 0, sizeof (ctf_list_t));
676c3ecb 1208 memset (fp->ctf_lookups, 0, sizeof (fp->ctf_lookups));
1136c379 1209 memset (&fp->ctf_in_flight_dynsyms, 0, sizeof (fp->ctf_in_flight_dynsyms));
0f0c11f7 1210 memset (&fp->ctf_dedup, 0, sizeof (fp->ctf_dedup));
676c3ecb
NA
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;
47d546f4 1215
139633c3
NA
1216 memcpy (&ofp, fp, sizeof (ctf_dict_t));
1217 memcpy (fp, nfp, sizeof (ctf_dict_t));
1218 memcpy (nfp, &ofp, sizeof (ctf_dict_t));
47d546f4 1219
1136c379 1220 nfp->ctf_refcnt = 1; /* Force nfp to be freed. */
139633c3 1221 ctf_dict_close (nfp);
47d546f4
NA
1222
1223 return 0;
1136c379
NA
1224
1225symerr:
1226 ctf_err_warn (fp, 0, err, _("error serializing symtypetabs"));
1227 goto err;
1228oom:
1229 free (buf);
1230 free (sym_name_order);
1231 return (ctf_set_errno (fp, EAGAIN));
1232err:
1233 free (buf);
1234 free (sym_name_order);
1235 return -1; /* errno is set for us. */
47d546f4
NA
1236}
1237
676c3ecb 1238ctf_names_t *
139633c3 1239ctf_name_table (ctf_dict_t *fp, int kind)
47d546f4 1240{
47d546f4
NA
1241 switch (kind)
1242 {
1243 case CTF_K_STRUCT:
676c3ecb 1244 return &fp->ctf_structs;
47d546f4 1245 case CTF_K_UNION:
676c3ecb 1246 return &fp->ctf_unions;
47d546f4 1247 case CTF_K_ENUM:
676c3ecb 1248 return &fp->ctf_enums;
47d546f4 1249 default:
676c3ecb 1250 return &fp->ctf_names;
47d546f4 1251 }
47d546f4
NA
1252}
1253
24865428 1254int
139633c3 1255ctf_dtd_insert (ctf_dict_t *fp, ctf_dtdef_t *dtd, int flag, int kind)
47d546f4 1256{
676c3ecb 1257 const char *name;
8c419a91
NA
1258 if (ctf_dynhash_insert (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type,
1259 dtd) < 0)
24865428
NA
1260 return -1;
1261
fe4c2d55 1262 if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name
676c3ecb 1263 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL)
47d546f4 1264 {
676c3ecb 1265 if (ctf_dynhash_insert (ctf_name_table (fp, kind)->ctn_writable,
8c419a91
NA
1266 (char *) name, (void *) (uintptr_t)
1267 dtd->dtd_type) < 0)
676c3ecb 1268 {
8c419a91
NA
1269 ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t)
1270 dtd->dtd_type);
676c3ecb
NA
1271 return -1;
1272 }
47d546f4 1273 }
24865428
NA
1274 ctf_list_append (&fp->ctf_dtdefs, dtd);
1275 return 0;
47d546f4
NA
1276}
1277
1278void
139633c3 1279ctf_dtd_delete (ctf_dict_t *fp, ctf_dtdef_t *dtd)
47d546f4
NA
1280{
1281 ctf_dmdef_t *dmd, *nmd;
1282 int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
8ffcdf18 1283 int name_kind = kind;
676c3ecb 1284 const char *name;
47d546f4 1285
8c419a91 1286 ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type);
47d546f4
NA
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)
de07e349 1297 free (dmd->dmd_name);
47d546f4 1298 nmd = ctf_list_next (dmd);
de07e349 1299 free (dmd);
47d546f4
NA
1300 }
1301 break;
1302 case CTF_K_FUNCTION:
de07e349 1303 free (dtd->dtd_u.dtu_argv);
47d546f4 1304 break;
8ffcdf18
NA
1305 case CTF_K_FORWARD:
1306 name_kind = dtd->dtd_data.ctt_type;
1307 break;
47d546f4
NA
1308 }
1309
676c3ecb 1310 if (dtd->dtd_data.ctt_name
fe4c2d55
NA
1311 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
1312 && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
47d546f4 1313 {
8ffcdf18 1314 ctf_dynhash_remove (ctf_name_table (fp, name_kind)->ctn_writable,
676c3ecb
NA
1315 name);
1316 ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
47d546f4
NA
1317 }
1318
1319 ctf_list_delete (&fp->ctf_dtdefs, dtd);
de07e349 1320 free (dtd);
47d546f4
NA
1321}
1322
1323ctf_dtdef_t *
139633c3 1324ctf_dtd_lookup (const ctf_dict_t *fp, ctf_id_t type)
47d546f4 1325{
8c419a91
NA
1326 return (ctf_dtdef_t *)
1327 ctf_dynhash_lookup (fp->ctf_dthash, (void *) (uintptr_t) type);
47d546f4
NA
1328}
1329
47d546f4 1330ctf_dtdef_t *
139633c3 1331ctf_dynamic_type (const ctf_dict_t *fp, ctf_id_t id)
47d546f4
NA
1332{
1333 ctf_id_t idx;
1334
676c3ecb
NA
1335 if (!(fp->ctf_flags & LCTF_RDWR))
1336 return NULL;
1337
47d546f4
NA
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
676c3ecb 1343 if ((unsigned long) idx <= fp->ctf_typemax)
47d546f4
NA
1344 return ctf_dtd_lookup (fp, id);
1345 return NULL;
1346}
1347
24865428 1348int
139633c3 1349ctf_dvd_insert (ctf_dict_t *fp, ctf_dvdef_t *dvd)
47d546f4 1350{
24865428
NA
1351 if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0)
1352 return -1;
47d546f4 1353 ctf_list_append (&fp->ctf_dvdefs, dvd);
24865428 1354 return 0;
47d546f4
NA
1355}
1356
1357void
139633c3 1358ctf_dvd_delete (ctf_dict_t *fp, ctf_dvdef_t *dvd)
47d546f4
NA
1359{
1360 ctf_dynhash_remove (fp->ctf_dvhash, dvd->dvd_name);
de07e349 1361 free (dvd->dvd_name);
47d546f4
NA
1362
1363 ctf_list_delete (&fp->ctf_dvdefs, dvd);
de07e349 1364 free (dvd);
47d546f4
NA
1365}
1366
1367ctf_dvdef_t *
139633c3 1368ctf_dvd_lookup (const ctf_dict_t *fp, const char *name)
47d546f4
NA
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
139633c3
NA
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()). */
47d546f4 1380int
139633c3 1381ctf_discard (ctf_dict_t *fp)
47d546f4
NA
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
1394ctf_snapshot_id_t
139633c3 1395ctf_snapshot (ctf_dict_t *fp)
47d546f4
NA
1396{
1397 ctf_snapshot_id_t snapid;
676c3ecb 1398 snapid.dtd_id = fp->ctf_typemax;
47d546f4
NA
1399 snapid.snapshot_id = fp->ctf_snapshots++;
1400 return snapid;
1401}
1402
1403/* Like ctf_discard(), only discards everything after a particular ID. */
1404int
139633c3 1405ctf_rollback (ctf_dict_t *fp, ctf_snapshot_id_t id)
47d546f4
NA
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
47d546f4
NA
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 {
676c3ecb
NA
1418 int kind;
1419 const char *name;
1420
47d546f4
NA
1421 ntd = ctf_list_next (dtd);
1422
1423 if (LCTF_TYPE_TO_INDEX (fp, dtd->dtd_type) <= id.dtd_id)
1424 continue;
1425
676c3ecb 1426 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
8ffcdf18
NA
1427 if (kind == CTF_K_FORWARD)
1428 kind = dtd->dtd_data.ctt_type;
676c3ecb
NA
1429
1430 if (dtd->dtd_data.ctt_name
fe4c2d55
NA
1431 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
1432 && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
676c3ecb
NA
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
8c419a91 1439 ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type);
47d546f4
NA
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
676c3ecb 1453 fp->ctf_typemax = id.dtd_id;
47d546f4
NA
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
1462static ctf_id_t
139633c3 1463ctf_add_generic (ctf_dict_t *fp, uint32_t flag, const char *name, int kind,
47d546f4
NA
1464 ctf_dtdef_t **rp)
1465{
1466 ctf_dtdef_t *dtd;
1467 ctf_id_t type;
47d546f4
NA
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
676c3ecb 1475 if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) >= CTF_MAX_TYPE)
47d546f4
NA
1476 return (ctf_set_errno (fp, ECTF_FULL));
1477
676c3ecb 1478 if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) == (CTF_MAX_PTYPE - 1))
47d546f4
NA
1479 return (ctf_set_errno (fp, ECTF_FULL));
1480
676c3ecb
NA
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
de07e349 1485 if ((dtd = malloc (sizeof (ctf_dtdef_t))) == NULL)
47d546f4
NA
1486 return (ctf_set_errno (fp, EAGAIN));
1487
676c3ecb 1488 type = ++fp->ctf_typemax;
47d546f4
NA
1489 type = LCTF_INDEX_TO_TYPE (fp, type, (fp->ctf_flags & LCTF_CHILD));
1490
1491 memset (dtd, 0, sizeof (ctf_dtdef_t));
676c3ecb 1492 dtd->dtd_data.ctt_name = ctf_str_add_ref (fp, name, &dtd->dtd_data.ctt_name);
47d546f4
NA
1493 dtd->dtd_type = type;
1494
676c3ecb
NA
1495 if (dtd->dtd_data.ctt_name == 0 && name != NULL && name[0] != '\0')
1496 {
de07e349 1497 free (dtd);
676c3ecb
NA
1498 return (ctf_set_errno (fp, EAGAIN));
1499 }
1500
fe4c2d55 1501 if (ctf_dtd_insert (fp, dtd, flag, kind) < 0)
24865428 1502 {
de07e349 1503 free (dtd);
24865428
NA
1504 return CTF_ERR; /* errno is set for us. */
1505 }
47d546f4
NA
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. */
1515static size_t
1516clp2 (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
0f0c11f7 1529ctf_id_t
139633c3 1530ctf_add_encoded (ctf_dict_t *fp, uint32_t flag,
47d546f4
NA
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
676c3ecb 1539 if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
47d546f4
NA
1540 return CTF_ERR; /* errno is set for us. */
1541
1542 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
76fad999
TT
1543 dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
1544 / CHAR_BIT);
47d546f4
NA
1545 dtd->dtd_u.dtu_enc = *ep;
1546
1547 return type;
1548}
1549
0f0c11f7 1550ctf_id_t
139633c3 1551ctf_add_reftype (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref, uint32_t kind)
47d546f4
NA
1552{
1553 ctf_dtdef_t *dtd;
1554 ctf_id_t type;
139633c3 1555 ctf_dict_t *tmp = fp;
676c3ecb 1556 int child = fp->ctf_flags & LCTF_CHILD;
47d546f4 1557
a0486bac 1558 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
47d546f4
NA
1559 return (ctf_set_errno (fp, EINVAL));
1560
2361f1c8 1561 if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
47d546f4
NA
1562 return CTF_ERR; /* errno is set for us. */
1563
676c3ecb 1564 if ((type = ctf_add_generic (fp, flag, NULL, kind, &dtd)) == CTF_ERR)
47d546f4
NA
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
676c3ecb
NA
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
47d546f4
NA
1596 return type;
1597}
1598
1599ctf_id_t
139633c3 1600ctf_add_slice (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref,
47d546f4
NA
1601 const ctf_encoding_t *ep)
1602{
1603 ctf_dtdef_t *dtd;
502e838e 1604 ctf_id_t resolved_ref = ref;
47d546f4
NA
1605 ctf_id_t type;
1606 int kind;
1607 const ctf_type_t *tp;
139633c3 1608 ctf_dict_t *tmp = fp;
47d546f4
NA
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
a0486bac 1616 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
47d546f4
NA
1617 return (ctf_set_errno (fp, EINVAL));
1618
2361f1c8 1619 if (ref != 0 && ((tp = ctf_lookup_by_id (&tmp, ref)) == NULL))
47d546f4
NA
1620 return CTF_ERR; /* errno is set for us. */
1621
502e838e
NA
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
47d546f4 1629 if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) &&
2361f1c8
NA
1630 (kind != CTF_K_ENUM)
1631 && (ref != 0))
47d546f4
NA
1632 return (ctf_set_errno (fp, ECTF_NOTINTFP));
1633
676c3ecb 1634 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_SLICE, &dtd)) == CTF_ERR)
47d546f4
NA
1635 return CTF_ERR; /* errno is set for us. */
1636
1637 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_SLICE, flag, 0);
76fad999
TT
1638 dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
1639 / CHAR_BIT);
9943fa3a 1640 dtd->dtd_u.dtu_slice.cts_type = (uint32_t) ref;
47d546f4
NA
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
1647ctf_id_t
139633c3 1648ctf_add_integer (ctf_dict_t *fp, uint32_t flag,
47d546f4
NA
1649 const char *name, const ctf_encoding_t *ep)
1650{
1651 return (ctf_add_encoded (fp, flag, name, ep, CTF_K_INTEGER));
1652}
1653
1654ctf_id_t
139633c3 1655ctf_add_float (ctf_dict_t *fp, uint32_t flag,
47d546f4
NA
1656 const char *name, const ctf_encoding_t *ep)
1657{
1658 return (ctf_add_encoded (fp, flag, name, ep, CTF_K_FLOAT));
1659}
1660
1661ctf_id_t
139633c3 1662ctf_add_pointer (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
47d546f4
NA
1663{
1664 return (ctf_add_reftype (fp, flag, ref, CTF_K_POINTER));
1665}
1666
1667ctf_id_t
139633c3 1668ctf_add_array (ctf_dict_t *fp, uint32_t flag, const ctf_arinfo_t *arp)
47d546f4
NA
1669{
1670 ctf_dtdef_t *dtd;
1671 ctf_id_t type;
139633c3 1672 ctf_dict_t *tmp = fp;
47d546f4
NA
1673
1674 if (arp == NULL)
1675 return (ctf_set_errno (fp, EINVAL));
1676
2361f1c8
NA
1677 if (arp->ctr_contents != 0
1678 && ctf_lookup_by_id (&tmp, arp->ctr_contents) == NULL)
47d546f4
NA
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
676c3ecb 1685 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_ARRAY, &dtd)) == CTF_ERR)
47d546f4
NA
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
1695int
139633c3 1696ctf_set_array (ctf_dict_t *fp, ctf_id_t type, const ctf_arinfo_t *arp)
47d546f4
NA
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
1713ctf_id_t
139633c3 1714ctf_add_function (ctf_dict_t *fp, uint32_t flag,
47d546f4
NA
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;
afd78bd6 1720 uint32_t *vdat = NULL;
139633c3 1721 ctf_dict_t *tmp = fp;
47d546f4
NA
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
2361f1c8
NA
1732 if (ctc->ctc_return != 0
1733 && ctf_lookup_by_id (&tmp, ctc->ctc_return) == NULL)
47d546f4
NA
1734 return CTF_ERR; /* errno is set for us. */
1735
47d546f4
NA
1736 if (vlen > CTF_MAX_VLEN)
1737 return (ctf_set_errno (fp, EOVERFLOW));
1738
de07e349 1739 if (vlen != 0 && (vdat = malloc (sizeof (ctf_id_t) * vlen)) == NULL)
47d546f4
NA
1740 return (ctf_set_errno (fp, EAGAIN));
1741
afd78bd6
NA
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
676c3ecb
NA
1753 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_FUNCTION,
1754 &dtd)) == CTF_ERR)
47d546f4 1755 {
de07e349 1756 free (vdat);
47d546f4
NA
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
47d546f4
NA
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
1770ctf_id_t
139633c3 1771ctf_add_struct_sized (ctf_dict_t *fp, uint32_t flag, const char *name,
47d546f4
NA
1772 size_t size)
1773{
47d546f4
NA
1774 ctf_dtdef_t *dtd;
1775 ctf_id_t type = 0;
1776
fe4c2d55 1777 /* Promote root-visible forwards to structs. */
47d546f4 1778 if (name != NULL)
676c3ecb 1779 type = ctf_lookup_by_rawname (fp, CTF_K_STRUCT, name);
47d546f4
NA
1780
1781 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1782 dtd = ctf_dtd_lookup (fp, type);
676c3ecb
NA
1783 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_STRUCT,
1784 &dtd)) == CTF_ERR)
47d546f4
NA
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
1801ctf_id_t
139633c3 1802ctf_add_struct (ctf_dict_t *fp, uint32_t flag, const char *name)
47d546f4
NA
1803{
1804 return (ctf_add_struct_sized (fp, flag, name, 0));
1805}
1806
1807ctf_id_t
139633c3 1808ctf_add_union_sized (ctf_dict_t *fp, uint32_t flag, const char *name,
47d546f4
NA
1809 size_t size)
1810{
47d546f4
NA
1811 ctf_dtdef_t *dtd;
1812 ctf_id_t type = 0;
1813
fe4c2d55 1814 /* Promote root-visible forwards to unions. */
47d546f4 1815 if (name != NULL)
676c3ecb 1816 type = ctf_lookup_by_rawname (fp, CTF_K_UNION, name);
47d546f4
NA
1817
1818 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1819 dtd = ctf_dtd_lookup (fp, type);
676c3ecb
NA
1820 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_UNION,
1821 &dtd)) == CTF_ERR)
47d546f4
NA
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
1838ctf_id_t
139633c3 1839ctf_add_union (ctf_dict_t *fp, uint32_t flag, const char *name)
47d546f4
NA
1840{
1841 return (ctf_add_union_sized (fp, flag, name, 0));
1842}
1843
1844ctf_id_t
139633c3 1845ctf_add_enum (ctf_dict_t *fp, uint32_t flag, const char *name)
47d546f4 1846{
47d546f4
NA
1847 ctf_dtdef_t *dtd;
1848 ctf_id_t type = 0;
1849
fe4c2d55 1850 /* Promote root-visible forwards to enums. */
47d546f4 1851 if (name != NULL)
676c3ecb 1852 type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
47d546f4
NA
1853
1854 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1855 dtd = ctf_dtd_lookup (fp, type);
676c3ecb
NA
1856 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_ENUM,
1857 &dtd)) == CTF_ERR)
47d546f4
NA
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
1866ctf_id_t
139633c3 1867ctf_add_enum_encoded (ctf_dict_t *fp, uint32_t flag, const char *name,
47d546f4
NA
1868 const ctf_encoding_t *ep)
1869{
47d546f4
NA
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)
676c3ecb 1878 type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
47d546f4
NA
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
1894ctf_id_t
139633c3 1895ctf_add_forward (ctf_dict_t *fp, uint32_t flag, const char *name,
47d546f4
NA
1896 uint32_t kind)
1897{
47d546f4
NA
1898 ctf_dtdef_t *dtd;
1899 ctf_id_t type = 0;
1900
9850ce4d 1901 if (!ctf_forwardable_kind (kind))
676c3ecb 1902 return (ctf_set_errno (fp, ECTF_NOTSUE));
47d546f4
NA
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)
676c3ecb 1908 type = ctf_lookup_by_rawname (fp, kind, name);
47d546f4 1909
6bbf9da8
NA
1910 if (type)
1911 return type;
1912
8ffcdf18 1913 if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
47d546f4
NA
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
1922ctf_id_t
139633c3 1923ctf_add_typedef (ctf_dict_t *fp, uint32_t flag, const char *name,
47d546f4
NA
1924 ctf_id_t ref)
1925{
1926 ctf_dtdef_t *dtd;
1927 ctf_id_t type;
139633c3 1928 ctf_dict_t *tmp = fp;
47d546f4 1929
a0486bac 1930 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
47d546f4
NA
1931 return (ctf_set_errno (fp, EINVAL));
1932
2361f1c8 1933 if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
47d546f4
NA
1934 return CTF_ERR; /* errno is set for us. */
1935
676c3ecb
NA
1936 if ((type = ctf_add_generic (fp, flag, name, CTF_K_TYPEDEF,
1937 &dtd)) == CTF_ERR)
47d546f4
NA
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
1946ctf_id_t
139633c3 1947ctf_add_volatile (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
47d546f4
NA
1948{
1949 return (ctf_add_reftype (fp, flag, ref, CTF_K_VOLATILE));
1950}
1951
1952ctf_id_t
139633c3 1953ctf_add_const (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
47d546f4
NA
1954{
1955 return (ctf_add_reftype (fp, flag, ref, CTF_K_CONST));
1956}
1957
1958ctf_id_t
139633c3 1959ctf_add_restrict (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
47d546f4
NA
1960{
1961 return (ctf_add_reftype (fp, flag, ref, CTF_K_RESTRICT));
1962}
1963
1964int
139633c3 1965ctf_add_enumerator (ctf_dict_t *fp, ctf_id_t enid, const char *name,
47d546f4
NA
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
de07e349 2000 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
47d546f4
NA
2001 return (ctf_set_errno (fp, EAGAIN));
2002
de07e349 2003 if ((s = strdup (name)) == NULL)
47d546f4 2004 {
de07e349 2005 free (dmd);
47d546f4
NA
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
47d546f4
NA
2017 fp->ctf_flags |= LCTF_DIRTY;
2018
2019 return 0;
2020}
2021
2022int
139633c3 2023ctf_add_member_offset (ctf_dict_t *fp, ctf_id_t souid, const char *name,
47d546f4
NA
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
ab769488
NA
2039 if (name != NULL && name[0] == '\0')
2040 name = NULL;
2041
47d546f4
NA
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
a0486bac
JM
2062 if ((msize = ctf_type_size (fp, type)) < 0 ||
2063 (malign = ctf_type_align (fp, type)) < 0)
2361f1c8
NA
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 }
47d546f4 2078
de07e349 2079 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
47d546f4
NA
2080 return (ctf_set_errno (fp, EAGAIN));
2081
de07e349 2082 if (name != NULL && (s = strdup (name)) == NULL)
47d546f4 2083 {
de07e349 2084 free (dmd);
47d546f4
NA
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
2361f1c8
NA
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
a0486bac 2115 if (ctf_type_encoding (fp, ltype, &linfo) == 0)
47d546f4 2116 off += linfo.cte_bits;
a0486bac 2117 else if ((lsize = ctf_type_size (fp, ltype)) > 0)
76fad999 2118 off += lsize * CHAR_BIT;
47d546f4
NA
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
76fad999 2129 off = roundup (off, CHAR_BIT) / CHAR_BIT;
47d546f4 2130 off = roundup (off, MAX (malign, 1));
76fad999 2131 dmd->dmd_offset = off * CHAR_BIT;
47d546f4
NA
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);
76fad999 2140 ssize = MAX (ssize, ((signed) bit_offset / CHAR_BIT) + msize);
47d546f4
NA
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
a0486bac 2150 if ((size_t) ssize > CTF_MAX_SIZE)
47d546f4
NA
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
47d546f4
NA
2162 fp->ctf_flags |= LCTF_DIRTY;
2163 return 0;
2164}
2165
2166int
139633c3 2167ctf_add_member_encoded (ctf_dict_t *fp, ctf_id_t souid, const char *name,
47d546f4
NA
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)
a0486bac 2179 return -1; /* errno is set for us. */
47d546f4
NA
2180
2181 return ctf_add_member_offset (fp, souid, name, type, bit_offset);
2182}
2183
2184int
139633c3 2185ctf_add_member (ctf_dict_t *fp, ctf_id_t souid, const char *name,
47d546f4
NA
2186 ctf_id_t type)
2187{
2188 return ctf_add_member_offset (fp, souid, name, type, (unsigned long) - 1);
2189}
2190
2191int
139633c3 2192ctf_add_variable (ctf_dict_t *fp, const char *name, ctf_id_t ref)
47d546f4
NA
2193{
2194 ctf_dvdef_t *dvd;
139633c3 2195 ctf_dict_t *tmp = fp;
47d546f4
NA
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)
a0486bac 2204 return -1; /* errno is set for us. */
47d546f4 2205
791915db
NA
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
de07e349 2211 if ((dvd = malloc (sizeof (ctf_dvdef_t))) == NULL)
47d546f4
NA
2212 return (ctf_set_errno (fp, EAGAIN));
2213
de07e349 2214 if (name != NULL && (dvd->dvd_name = strdup (name)) == NULL)
47d546f4 2215 {
de07e349 2216 free (dvd);
47d546f4
NA
2217 return (ctf_set_errno (fp, EAGAIN));
2218 }
2219 dvd->dvd_type = ref;
2220 dvd->dvd_snapshots = fp->ctf_snapshots;
2221
24865428
NA
2222 if (ctf_dvd_insert (fp, dvd) < 0)
2223 {
de07e349
NA
2224 free (dvd->dvd_name);
2225 free (dvd);
24865428
NA
2226 return -1; /* errno is set for us. */
2227 }
47d546f4 2228
47d546f4
NA
2229 fp->ctf_flags |= LCTF_DIRTY;
2230 return 0;
2231}
2232
1136c379
NA
2233int
2234ctf_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
2264int
2265ctf_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
2270int
2271ctf_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
926c9e76
NA
2276typedef struct ctf_bundle
2277{
139633c3 2278 ctf_dict_t *ctb_dict; /* CTF dict handle. */
926c9e76
NA
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
c499eb68
NA
2283static int
2284enumcmp (const char *name, int value, void *arg)
2285{
2286 ctf_bundle_t *ctb = arg;
2287 int bvalue;
2288
139633c3 2289 if (ctf_enum_value (ctb->ctb_dict, ctb->ctb_type, name, &bvalue) < 0)
c499eb68 2290 {
139633c3 2291 ctf_err_warn (ctb->ctb_dict, 0, 0,
926c9e76 2292 _("conflict due to enum %s iteration error"), name);
c499eb68
NA
2293 return 1;
2294 }
2295 if (value != bvalue)
2296 {
139633c3 2297 ctf_err_warn (ctb->ctb_dict, 1, ECTF_CONFLICT,
926c9e76
NA
2298 _("conflict due to enum value change: %i versus %i"),
2299 value, bvalue);
c499eb68
NA
2300 return 1;
2301 }
2302 return 0;
2303}
2304
2305static int
2306enumadd (const char *name, int value, void *arg)
2307{
2308 ctf_bundle_t *ctb = arg;
2309
139633c3 2310 return (ctf_add_enumerator (ctb->ctb_dict, ctb->ctb_type,
a0486bac 2311 name, value) < 0);
c499eb68
NA
2312}
2313
2314static int
2315membcmp (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
f47ca311
NA
2321 /* Don't check nameless members (e.g. anonymous structs/unions) against each
2322 other. */
2323 if (name[0] == 0)
2324 return 0;
2325
139633c3 2326 if (ctf_member_info (ctb->ctb_dict, ctb->ctb_type, name, &ctm) < 0)
c499eb68 2327 {
139633c3 2328 ctf_err_warn (ctb->ctb_dict, 0, 0,
926c9e76
NA
2329 _("conflict due to struct member %s iteration error"),
2330 name);
c499eb68
NA
2331 return 1;
2332 }
2333 if (ctm.ctm_offset != offset)
2334 {
139633c3 2335 ctf_err_warn (ctb->ctb_dict, 1, ECTF_CONFLICT,
926c9e76
NA
2336 _("conflict due to struct member %s offset change: "
2337 "%lx versus %lx"),
2338 name, ctm.ctm_offset, offset);
c499eb68
NA
2339 return 1;
2340 }
2341 return 0;
2342}
2343
2344static int
2345membadd (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
de07e349 2351 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
139633c3 2352 return (ctf_set_errno (ctb->ctb_dict, EAGAIN));
c499eb68 2353
de07e349 2354 if (name != NULL && (s = strdup (name)) == NULL)
c499eb68 2355 {
de07e349 2356 free (dmd);
139633c3 2357 return (ctf_set_errno (ctb->ctb_dict, EAGAIN));
c499eb68
NA
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
139633c3 2369 ctb->ctb_dict->ctf_flags |= LCTF_DIRTY;
c499eb68
NA
2370 return 0;
2371}
2372
139633c3
NA
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
c499eb68 2375 following the source type's links and embedded member types. If the
139633c3
NA
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. */
99dc3ebd 2378static ctf_id_t
139633c3
NA
2379ctf_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)
c499eb68
NA
2381{
2382 ctf_id_t dst_type = CTF_ERR;
2383 uint32_t dst_kind = CTF_K_UNKNOWN;
139633c3 2384 ctf_dict_t *tmp_fp = dst_fp;
c499eb68
NA
2385 ctf_id_t tmp;
2386
2387 const char *name;
5de9eada 2388 uint32_t kind, forward_kind, flag, vlen;
c499eb68
NA
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
c499eb68 2395 ctf_funcinfo_t ctc;
c499eb68 2396
886453cb 2397 ctf_id_t orig_src_type = src_type;
c499eb68
NA
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
791915db
NA
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
c499eb68
NA
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
99dc3ebd
NA
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
139633c3
NA
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. */
99dc3ebd 2430
d04a47ac 2431 if (ctf_type_kind_unsliced (tmp_fp, tmp) == (int) kind)
99dc3ebd 2432 {
d04a47ac
NA
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;
99dc3ebd
NA
2442 }
2443 }
2444
5de9eada
NA
2445 forward_kind = kind;
2446 if (kind == CTF_K_FORWARD)
2447 forward_kind = src_tp->ctt_type;
2448
139633c3
NA
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. */
c499eb68
NA
2452
2453 if ((flag & CTF_ADD_ROOT) && name[0] != '\0'
676c3ecb 2454 && (tmp = ctf_lookup_by_rawname (dst_fp, forward_kind, name)) != 0)
c499eb68
NA
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,
5de9eada 2462 union, or enum (i.e. the definition of the previous forward decl).
c499eb68 2463
5de9eada
NA
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)
c499eb68 2469 {
5de9eada
NA
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 {
926c9e76 2482 ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
139633c3 2483 _("ctf_add_type: conflict for type %s: "
926c9e76
NA
2484 "kinds differ, new: %i; old (ID %lx): %i"),
2485 name, kind, dst_type, dst_kind);
5de9eada
NA
2486 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2487 }
c499eb68
NA
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 {
139633c3 2501 ctf_dict_t *fp = dst_fp;
c499eb68
NA
2502
2503 if ((dst_tp = ctf_lookup_by_id (&fp, dst_type)) == NULL)
2504 return CTF_ERR;
2505
99dc3ebd
NA
2506 if (ctf_type_encoding (dst_fp, dst_type, &dst_en) != 0)
2507 return CTF_ERR; /* errno set for us. */
2508
c499eb68
NA
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
c499eb68
NA
2517 if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
2518 {
2519 if (kind != CTF_K_SLICE)
886453cb
NA
2520 {
2521 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2522 return dst_type;
2523 }
c499eb68
NA
2524 }
2525 else
2526 {
2527 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2528 }
2529 }
2530 else
2531 {
99dc3ebd
NA
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. */
c499eb68 2534
99dc3ebd 2535 if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
c499eb68
NA
2536 {
2537 if (kind != CTF_K_SLICE)
886453cb 2538 {
99dc3ebd
NA
2539 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2540 return dst_type;
886453cb 2541 }
c499eb68 2542 }
c499eb68
NA
2543 }
2544 }
2545 }
2546
139633c3 2547 src.ctb_dict = src_fp;
c499eb68
NA
2548 src.ctb_type = src_type;
2549 src.ctb_dtd = NULL;
2550
139633c3 2551 dst.ctb_dict = dst_fp;
c499eb68
NA
2552 dst.ctb_type = dst_type;
2553 dst.ctb_dtd = NULL;
2554
99dc3ebd
NA
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
c499eb68
NA
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);
99dc3ebd
NA
2585 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2586 proc_tracking_fp);
c499eb68
NA
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);
99dc3ebd
NA
2599 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2600 proc_tracking_fp);
c499eb68
NA
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:
a0486bac 2609 if (ctf_array_info (src_fp, src_type, &src_ar) != 0)
c499eb68
NA
2610 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
2611
2612 src_ar.ctr_contents =
99dc3ebd
NA
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);
c499eb68
NA
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 {
926c9e76
NA
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);
c499eb68
NA
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:
99dc3ebd
NA
2645 ctc.ctc_return = ctf_add_type_internal (dst_fp, src_fp,
2646 src_tp->ctt_type,
2647 proc_tracking_fp);
c499eb68
NA
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;
a0486bac
JM
2662 size_t size;
2663 ssize_t ssize;
99dc3ebd 2664 ctf_dtdef_t *dtd;
c499eb68
NA
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
99dc3ebd
NA
2674 if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
2675 && dst_kind != CTF_K_FORWARD)
c499eb68
NA
2676 {
2677 if (ctf_type_size (src_fp, src_type) !=
2678 ctf_type_size (dst_fp, dst_type))
2679 {
926c9e76
NA
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));
c499eb68
NA
2685 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2686 }
2687
2688 if (ctf_member_iter (src_fp, src_type, membcmp, &dst))
2689 {
926c9e76
NA
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);
c499eb68
NA
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
676c3ecb 2703 dst_type = ctf_add_generic (dst_fp, flag, name, kind, &dtd);
c499eb68
NA
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
99dc3ebd
NA
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
c499eb68
NA
2714 if (ctf_member_iter (src_fp, src_type, membadd, &dst) != 0)
2715 errs++; /* Increment errs and fail at bottom of case. */
2716
a0486bac
JM
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)
c499eb68
NA
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
791915db
NA
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. */
c499eb68
NA
2738 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
2739 dmd != NULL; dmd = ctf_list_next (dmd))
2740 {
139633c3 2741 ctf_dict_t *dst = dst_fp;
99dc3ebd
NA
2742 ctf_id_t memb_type;
2743
2744 memb_type = ctf_type_mapping (src_fp, dmd->dmd_type, &dst);
2745 if (memb_type == 0)
791915db 2746 {
99dc3ebd
NA
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 }
791915db 2754 }
99dc3ebd
NA
2755 else
2756 dmd->dmd_type = memb_type;
c499eb68
NA
2757 }
2758
2759 if (errs)
2760 return CTF_ERR; /* errno is set for us. */
2761 break;
2762 }
2763
2764 case CTF_K_ENUM:
99dc3ebd
NA
2765 if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
2766 && dst_kind != CTF_K_FORWARD)
c499eb68
NA
2767 {
2768 if (ctf_enum_iter (src_fp, src_type, enumcmp, &dst)
2769 || ctf_enum_iter (dst_fp, dst_type, enumcmp, &src))
2770 {
926c9e76
NA
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);
c499eb68
NA
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)
5de9eada 2788 dst_type = ctf_add_forward (dst_fp, flag, name, forward_kind);
c499eb68
NA
2789 break;
2790
2791 case CTF_K_TYPEDEF:
2792 src_type = ctf_type_reference (src_fp, src_type);
99dc3ebd
NA
2793 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2794 proc_tracking_fp);
c499eb68
NA
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)
c499eb68 2808 dst_type = ctf_add_typedef (dst_fp, flag, name, src_type);
99dc3ebd 2809
c499eb68
NA
2810 break;
2811
2812 default:
2813 return (ctf_set_errno (dst_fp, ECTF_CORRUPT));
2814 }
2815
886453cb
NA
2816 if (dst_type != CTF_ERR)
2817 ctf_add_type_mapping (src_fp, orig_src_type, dst_fp, dst_type);
c499eb68
NA
2818 return dst_type;
2819}
2820
99dc3ebd 2821ctf_id_t
139633c3 2822ctf_add_type (ctf_dict_t *dst_fp, ctf_dict_t *src_fp, ctf_id_t src_type)
99dc3ebd
NA
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
fd55eae8 2842/* Write the compressed CTF data stream to the specified gzFile descriptor. */
47d546f4 2843int
139633c3 2844ctf_gzwrite (ctf_dict_t *fp, gzFile fd)
47d546f4 2845{
fd55eae8
NA
2846 const unsigned char *buf;
2847 ssize_t resid;
47d546f4
NA
2848 ssize_t len;
2849
fd55eae8
NA
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;
47d546f4
NA
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. */
2875int
139633c3 2876ctf_compress_write (ctf_dict_t *fp, int fd)
47d546f4
NA
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;
47d546f4
NA
2884 ssize_t len;
2885 int rc;
2886 int err = 0;
2887
676c3ecb
NA
2888 if (ctf_serialize (fp) < 0)
2889 return -1; /* errno is set for us. */
2890
fd55eae8 2891 memcpy (hp, fp->ctf_header, header_len);
47d546f4 2892 hp->cth_flags |= CTF_F_COMPRESS;
676c3ecb 2893 compress_len = compressBound (fp->ctf_size);
47d546f4 2894
de07e349 2895 if ((buf = malloc (compress_len)) == NULL)
926c9e76
NA
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 }
47d546f4 2901
65365aa8 2902 if ((rc = compress (buf, (uLongf *) &compress_len,
fd55eae8 2903 fp->ctf_buf, fp->ctf_size)) != Z_OK)
47d546f4 2904 {
47d546f4 2905 err = ctf_set_errno (fp, ECTF_COMPRESS);
926c9e76 2906 ctf_err_warn (fp, 0, 0, _("zlib deflate err: %s"), zError (rc));
47d546f4
NA
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);
926c9e76 2915 ctf_err_warn (fp, 0, 0, _("ctf_compress_write: error writing header"));
47d546f4
NA
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);
926c9e76 2928 ctf_err_warn (fp, 0, 0, _("ctf_compress_write: error writing"));
47d546f4
NA
2929 goto ret;
2930 }
2931 compress_len -= len;
2932 bp += len;
2933 }
2934
2935ret:
de07e349 2936 free (buf);
47d546f4
NA
2937 return err;
2938}
2939
5537f9b9
NA
2940/* Optionally compress the specified CTF data stream and return it as a new
2941 dynamically-allocated string. */
2942unsigned char *
139633c3 2943ctf_write_mem (ctf_dict_t *fp, size_t *size, size_t threshold)
5537f9b9
NA
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;
5537f9b9
NA
2950 int rc;
2951
676c3ecb
NA
2952 if (ctf_serialize (fp) < 0)
2953 return NULL; /* errno is set for us. */
2954
2955 compress_len = compressBound (fp->ctf_size);
5537f9b9 2956 if (fp->ctf_size < threshold)
676c3ecb
NA
2957 compress_len = fp->ctf_size;
2958 if ((buf = malloc (compress_len
5537f9b9
NA
2959 + sizeof (struct ctf_header))) == NULL)
2960 {
2961 ctf_set_errno (fp, ENOMEM);
926c9e76
NA
2962 ctf_err_warn (fp, 0, 0, _("ctf_write_mem: cannot allocate %li bytes"),
2963 (unsigned long) (compress_len + sizeof (struct ctf_header)));
5537f9b9
NA
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
5537f9b9
NA
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 {
5537f9b9 2984 ctf_set_errno (fp, ECTF_COMPRESS);
926c9e76 2985 ctf_err_warn (fp, 0, 0, _("zlib deflate err: %s"), zError (rc));
de07e349 2986 free (buf);
5537f9b9
NA
2987 return NULL;
2988 }
2989 *size += compress_len;
2990 }
2991 return buf;
2992}
2993
fd55eae8 2994/* Write the uncompressed CTF data stream to the specified file descriptor. */
47d546f4 2995int
139633c3 2996ctf_write (ctf_dict_t *fp, int fd)
47d546f4 2997{
fd55eae8
NA
2998 const unsigned char *buf;
2999 ssize_t resid;
47d546f4
NA
3000 ssize_t len;
3001
676c3ecb
NA
3002 if (ctf_serialize (fp) < 0)
3003 return -1; /* errno is set for us. */
3004
fd55eae8
NA
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)
926c9e76
NA
3010 {
3011 ctf_err_warn (fp, 0, errno, _("ctf_write: error writing header"));
3012 return (ctf_set_errno (fp, errno));
3013 }
fd55eae8
NA
3014 resid -= len;
3015 buf += len;
3016 }
3017
3018 resid = fp->ctf_size;
3019 buf = fp->ctf_buf;
47d546f4
NA
3020 while (resid != 0)
3021 {
fd55eae8 3022 if ((len = write (fd, buf, resid)) <= 0)
926c9e76
NA
3023 {
3024 ctf_err_warn (fp, 0, errno, _("ctf_write: error writing"));
3025 return (ctf_set_errno (fp, errno));
3026 }
47d546f4
NA
3027 resid -= len;
3028 buf += len;
3029 }
3030
3031 return 0;
3032}
This page took 0.235485 seconds and 4 git commands to generate.