libctf, link: add the ability to filter out variables from the link
[binutils-gdb.git] / libctf / ctf-create.c
1 /* CTF file creation.
2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
3
4 This file is part of libctf.
5
6 libctf is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 See the GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; see the file COPYING. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include <ctf-impl.h>
21 #include <sys/param.h>
22 #include <assert.h>
23 #include <string.h>
24 #include <unistd.h>
25 #include <zlib.h>
26
27 #ifndef roundup
28 #define roundup(x, y) ((((x) + ((y) - 1)) / (y)) * (y))
29 #endif
30
31 /* Make sure the ptrtab has enough space for at least one more type.
32
33 We start with 4KiB of ptrtab, enough for a thousand types, then grow it 25%
34 at a time. */
35
36 static int
37 ctf_grow_ptrtab (ctf_file_t *fp)
38 {
39 size_t new_ptrtab_len = fp->ctf_ptrtab_len;
40
41 /* We allocate one more ptrtab entry than we need, for the initial zero,
42 plus one because the caller will probably allocate a new type. */
43
44 if (fp->ctf_ptrtab == NULL)
45 new_ptrtab_len = 1024;
46 else if ((fp->ctf_typemax + 2) > fp->ctf_ptrtab_len)
47 new_ptrtab_len = fp->ctf_ptrtab_len * 1.25;
48
49 if (new_ptrtab_len != fp->ctf_ptrtab_len)
50 {
51 uint32_t *new_ptrtab;
52
53 if ((new_ptrtab = realloc (fp->ctf_ptrtab,
54 new_ptrtab_len * sizeof (uint32_t))) == NULL)
55 return (ctf_set_errno (fp, ENOMEM));
56
57 fp->ctf_ptrtab = new_ptrtab;
58 memset (fp->ctf_ptrtab + fp->ctf_ptrtab_len, 0,
59 (new_ptrtab_len - fp->ctf_ptrtab_len) * sizeof (uint32_t));
60 fp->ctf_ptrtab_len = new_ptrtab_len;
61 }
62 return 0;
63 }
64
65 /* To create an empty CTF container, we just declare a zeroed header and call
66 ctf_bufopen() on it. If ctf_bufopen succeeds, we mark the new container r/w
67 and initialize the dynamic members. We start assigning type IDs at 1 because
68 type ID 0 is used as a sentinel and a not-found indicator. */
69
70 ctf_file_t *
71 ctf_create (int *errp)
72 {
73 static const ctf_header_t hdr = { .cth_preamble = { CTF_MAGIC, CTF_VERSION, 0 } };
74
75 ctf_dynhash_t *dthash;
76 ctf_dynhash_t *dvhash;
77 ctf_dynhash_t *structs = NULL, *unions = NULL, *enums = NULL, *names = NULL;
78 ctf_sect_t cts;
79 ctf_file_t *fp;
80
81 libctf_init_debug();
82 dthash = ctf_dynhash_create (ctf_hash_integer, ctf_hash_eq_integer,
83 NULL, NULL);
84 if (dthash == NULL)
85 {
86 ctf_set_open_errno (errp, EAGAIN);
87 goto err;
88 }
89
90 dvhash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
91 NULL, NULL);
92 if (dvhash == NULL)
93 {
94 ctf_set_open_errno (errp, EAGAIN);
95 goto err_dt;
96 }
97
98 structs = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
99 NULL, NULL);
100 unions = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
101 NULL, NULL);
102 enums = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
103 NULL, NULL);
104 names = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
105 NULL, NULL);
106 if (!structs || !unions || !enums || !names)
107 {
108 ctf_set_open_errno (errp, EAGAIN);
109 goto err_dv;
110 }
111
112 cts.cts_name = _CTF_SECTION;
113 cts.cts_data = &hdr;
114 cts.cts_size = sizeof (hdr);
115 cts.cts_entsize = 1;
116
117 if ((fp = ctf_bufopen_internal (&cts, NULL, NULL, NULL, 1, errp)) == NULL)
118 goto err_dv;
119
120 fp->ctf_structs.ctn_writable = structs;
121 fp->ctf_unions.ctn_writable = unions;
122 fp->ctf_enums.ctn_writable = enums;
123 fp->ctf_names.ctn_writable = names;
124 fp->ctf_dthash = dthash;
125 fp->ctf_dvhash = dvhash;
126 fp->ctf_dtoldid = 0;
127 fp->ctf_snapshots = 1;
128 fp->ctf_snapshot_lu = 0;
129 fp->ctf_flags |= LCTF_DIRTY;
130
131 ctf_set_ctl_hashes (fp);
132 ctf_setmodel (fp, CTF_MODEL_NATIVE);
133 if (ctf_grow_ptrtab (fp) < 0)
134 {
135 ctf_set_open_errno (errp, ctf_errno (fp));
136 ctf_file_close (fp);
137 return NULL;
138 }
139
140 return fp;
141
142 err_dv:
143 ctf_dynhash_destroy (structs);
144 ctf_dynhash_destroy (unions);
145 ctf_dynhash_destroy (enums);
146 ctf_dynhash_destroy (names);
147 ctf_dynhash_destroy (dvhash);
148 err_dt:
149 ctf_dynhash_destroy (dthash);
150 err:
151 return NULL;
152 }
153
154 static unsigned char *
155 ctf_copy_smembers (ctf_file_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
156 {
157 ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
158 ctf_member_t ctm;
159
160 for (; dmd != NULL; dmd = ctf_list_next (dmd))
161 {
162 ctf_member_t *copied;
163
164 ctm.ctm_name = 0;
165 ctm.ctm_type = (uint32_t) dmd->dmd_type;
166 ctm.ctm_offset = (uint32_t) dmd->dmd_offset;
167
168 memcpy (t, &ctm, sizeof (ctm));
169 copied = (ctf_member_t *) t;
170 if (dmd->dmd_name)
171 ctf_str_add_ref (fp, dmd->dmd_name, &copied->ctm_name);
172
173 t += sizeof (ctm);
174 }
175
176 return t;
177 }
178
179 static unsigned char *
180 ctf_copy_lmembers (ctf_file_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
181 {
182 ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
183 ctf_lmember_t ctlm;
184
185 for (; dmd != NULL; dmd = ctf_list_next (dmd))
186 {
187 ctf_lmember_t *copied;
188
189 ctlm.ctlm_name = 0;
190 ctlm.ctlm_type = (uint32_t) dmd->dmd_type;
191 ctlm.ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (dmd->dmd_offset);
192 ctlm.ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (dmd->dmd_offset);
193
194 memcpy (t, &ctlm, sizeof (ctlm));
195 copied = (ctf_lmember_t *) t;
196 if (dmd->dmd_name)
197 ctf_str_add_ref (fp, dmd->dmd_name, &copied->ctlm_name);
198
199 t += sizeof (ctlm);
200 }
201
202 return t;
203 }
204
205 static unsigned char *
206 ctf_copy_emembers (ctf_file_t *fp, ctf_dtdef_t *dtd, unsigned char *t)
207 {
208 ctf_dmdef_t *dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
209 ctf_enum_t cte;
210
211 for (; dmd != NULL; dmd = ctf_list_next (dmd))
212 {
213 ctf_enum_t *copied;
214
215 cte.cte_value = dmd->dmd_value;
216 memcpy (t, &cte, sizeof (cte));
217 copied = (ctf_enum_t *) t;
218 ctf_str_add_ref (fp, dmd->dmd_name, &copied->cte_name);
219 t += sizeof (cte);
220 }
221
222 return t;
223 }
224
225 /* Sort a newly-constructed static variable array. */
226
227 typedef struct ctf_sort_var_arg_cb
228 {
229 ctf_file_t *fp;
230 ctf_strs_t *strtab;
231 } ctf_sort_var_arg_cb_t;
232
233 static int
234 ctf_sort_var (const void *one_, const void *two_, void *arg_)
235 {
236 const ctf_varent_t *one = one_;
237 const ctf_varent_t *two = two_;
238 ctf_sort_var_arg_cb_t *arg = arg_;
239
240 return (strcmp (ctf_strraw_explicit (arg->fp, one->ctv_name, arg->strtab),
241 ctf_strraw_explicit (arg->fp, two->ctv_name, arg->strtab)));
242 }
243
244 /* Compatibility: just update the threshold for ctf_discard. */
245 int
246 ctf_update (ctf_file_t *fp)
247 {
248 if (!(fp->ctf_flags & LCTF_RDWR))
249 return (ctf_set_errno (fp, ECTF_RDONLY));
250
251 fp->ctf_dtoldid = fp->ctf_typemax;
252 return 0;
253 }
254
255 /* If the specified CTF container is writable and has been modified, reload this
256 container with the updated type definitions, ready for serialization. In
257 order to make this code and the rest of libctf as simple as possible, we
258 perform updates by taking the dynamic type definitions and creating an
259 in-memory CTF file containing the definitions, and then call
260 ctf_simple_open_internal() on it. We perform one extra trick here for the
261 benefit of callers and to keep our code simple: ctf_simple_open_internal()
262 will return a new ctf_file_t, but we want to keep the fp constant for the
263 caller, so after ctf_simple_open_internal() returns, we use memcpy to swap
264 the interior of the old and new ctf_file_t's, and then free the old. */
265 int
266 ctf_serialize (ctf_file_t *fp)
267 {
268 ctf_file_t ofp, *nfp;
269 ctf_header_t hdr, *hdrp;
270 ctf_dtdef_t *dtd;
271 ctf_dvdef_t *dvd;
272 ctf_varent_t *dvarents;
273 ctf_strs_writable_t strtab;
274
275 unsigned char *t;
276 unsigned long i;
277 size_t buf_size, type_size, nvars;
278 unsigned char *buf, *newbuf;
279 int err;
280
281 if (!(fp->ctf_flags & LCTF_RDWR))
282 return (ctf_set_errno (fp, ECTF_RDONLY));
283
284 /* Update required? */
285 if (!(fp->ctf_flags & LCTF_DIRTY))
286 return 0;
287
288 /* Fill in an initial CTF header. We will leave the label, object,
289 and function sections empty and only output a header, type section,
290 and string table. The type section begins at a 4-byte aligned
291 boundary past the CTF header itself (at relative offset zero). */
292
293 memset (&hdr, 0, sizeof (hdr));
294 hdr.cth_magic = CTF_MAGIC;
295 hdr.cth_version = CTF_VERSION;
296
297 /* Iterate through the dynamic type definition list and compute the
298 size of the CTF type section we will need to generate. */
299
300 for (type_size = 0, dtd = ctf_list_next (&fp->ctf_dtdefs);
301 dtd != NULL; dtd = ctf_list_next (dtd))
302 {
303 uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
304 uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
305
306 if (dtd->dtd_data.ctt_size != CTF_LSIZE_SENT)
307 type_size += sizeof (ctf_stype_t);
308 else
309 type_size += sizeof (ctf_type_t);
310
311 switch (kind)
312 {
313 case CTF_K_INTEGER:
314 case CTF_K_FLOAT:
315 type_size += sizeof (uint32_t);
316 break;
317 case CTF_K_ARRAY:
318 type_size += sizeof (ctf_array_t);
319 break;
320 case CTF_K_SLICE:
321 type_size += sizeof (ctf_slice_t);
322 break;
323 case CTF_K_FUNCTION:
324 type_size += sizeof (uint32_t) * (vlen + (vlen & 1));
325 break;
326 case CTF_K_STRUCT:
327 case CTF_K_UNION:
328 if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH)
329 type_size += sizeof (ctf_member_t) * vlen;
330 else
331 type_size += sizeof (ctf_lmember_t) * vlen;
332 break;
333 case CTF_K_ENUM:
334 type_size += sizeof (ctf_enum_t) * vlen;
335 break;
336 }
337 }
338
339 /* Computing the number of entries in the CTF variable section is much
340 simpler. */
341
342 for (nvars = 0, dvd = ctf_list_next (&fp->ctf_dvdefs);
343 dvd != NULL; dvd = ctf_list_next (dvd), nvars++);
344
345 /* Compute the size of the CTF buffer we need, sans only the string table,
346 then allocate a new buffer and memcpy the finished header to the start of
347 the buffer. (We will adjust this later with strtab length info.) */
348
349 hdr.cth_typeoff = hdr.cth_varoff + (nvars * sizeof (ctf_varent_t));
350 hdr.cth_stroff = hdr.cth_typeoff + type_size;
351 hdr.cth_strlen = 0;
352
353 buf_size = sizeof (ctf_header_t) + hdr.cth_stroff + hdr.cth_strlen;
354
355 if ((buf = malloc (buf_size)) == NULL)
356 return (ctf_set_errno (fp, EAGAIN));
357
358 memcpy (buf, &hdr, sizeof (ctf_header_t));
359 t = (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_varoff;
360
361 hdrp = (ctf_header_t *) buf;
362 if ((fp->ctf_flags & LCTF_CHILD) && (fp->ctf_parname != NULL))
363 ctf_str_add_ref (fp, fp->ctf_parname, &hdrp->cth_parname);
364 if (fp->ctf_cuname != NULL)
365 ctf_str_add_ref (fp, fp->ctf_cuname, &hdrp->cth_cuname);
366
367 /* Work over the variable list, translating everything into ctf_varent_t's and
368 prepping the string table. */
369
370 dvarents = (ctf_varent_t *) t;
371 for (i = 0, dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL;
372 dvd = ctf_list_next (dvd), i++)
373 {
374 ctf_varent_t *var = &dvarents[i];
375
376 ctf_str_add_ref (fp, dvd->dvd_name, &var->ctv_name);
377 var->ctv_type = (uint32_t) dvd->dvd_type;
378 }
379 assert (i == nvars);
380
381 t += sizeof (ctf_varent_t) * nvars;
382
383 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_typeoff);
384
385 /* We now take a final lap through the dynamic type definition list and copy
386 the appropriate type records to the output buffer, noting down the
387 strings as we go. */
388
389 for (dtd = ctf_list_next (&fp->ctf_dtdefs);
390 dtd != NULL; dtd = ctf_list_next (dtd))
391 {
392 uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
393 uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
394
395 ctf_array_t cta;
396 uint32_t encoding;
397 size_t len;
398 ctf_stype_t *copied;
399 const char *name;
400
401 if (dtd->dtd_data.ctt_size != CTF_LSIZE_SENT)
402 len = sizeof (ctf_stype_t);
403 else
404 len = sizeof (ctf_type_t);
405
406 memcpy (t, &dtd->dtd_data, len);
407 copied = (ctf_stype_t *) t; /* name is at the start: constant offset. */
408 if (copied->ctt_name
409 && (name = ctf_strraw (fp, copied->ctt_name)) != NULL)
410 ctf_str_add_ref (fp, name, &copied->ctt_name);
411 t += len;
412
413 switch (kind)
414 {
415 case CTF_K_INTEGER:
416 case CTF_K_FLOAT:
417 if (kind == CTF_K_INTEGER)
418 {
419 encoding = CTF_INT_DATA (dtd->dtd_u.dtu_enc.cte_format,
420 dtd->dtd_u.dtu_enc.cte_offset,
421 dtd->dtd_u.dtu_enc.cte_bits);
422 }
423 else
424 {
425 encoding = CTF_FP_DATA (dtd->dtd_u.dtu_enc.cte_format,
426 dtd->dtd_u.dtu_enc.cte_offset,
427 dtd->dtd_u.dtu_enc.cte_bits);
428 }
429 memcpy (t, &encoding, sizeof (encoding));
430 t += sizeof (encoding);
431 break;
432
433 case CTF_K_SLICE:
434 memcpy (t, &dtd->dtd_u.dtu_slice, sizeof (struct ctf_slice));
435 t += sizeof (struct ctf_slice);
436 break;
437
438 case CTF_K_ARRAY:
439 cta.cta_contents = (uint32_t) dtd->dtd_u.dtu_arr.ctr_contents;
440 cta.cta_index = (uint32_t) dtd->dtd_u.dtu_arr.ctr_index;
441 cta.cta_nelems = dtd->dtd_u.dtu_arr.ctr_nelems;
442 memcpy (t, &cta, sizeof (cta));
443 t += sizeof (cta);
444 break;
445
446 case CTF_K_FUNCTION:
447 {
448 uint32_t *argv = (uint32_t *) (uintptr_t) t;
449 uint32_t argc;
450
451 for (argc = 0; argc < vlen; argc++)
452 *argv++ = dtd->dtd_u.dtu_argv[argc];
453
454 if (vlen & 1)
455 *argv++ = 0; /* Pad to 4-byte boundary. */
456
457 t = (unsigned char *) argv;
458 break;
459 }
460
461 case CTF_K_STRUCT:
462 case CTF_K_UNION:
463 if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH)
464 t = ctf_copy_smembers (fp, dtd, t);
465 else
466 t = ctf_copy_lmembers (fp, dtd, t);
467 break;
468
469 case CTF_K_ENUM:
470 t = ctf_copy_emembers (fp, dtd, t);
471 break;
472 }
473 }
474 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_stroff);
475
476 /* Construct the final string table and fill out all the string refs with the
477 final offsets. Then purge the refs list, because we're about to move this
478 strtab onto the end of the buf, invalidating all the offsets. */
479 strtab = ctf_str_write_strtab (fp);
480 ctf_str_purge_refs (fp);
481
482 if (strtab.cts_strs == NULL)
483 {
484 free (buf);
485 return (ctf_set_errno (fp, EAGAIN));
486 }
487
488 /* Now the string table is constructed, we can sort the buffer of
489 ctf_varent_t's. */
490 ctf_sort_var_arg_cb_t sort_var_arg = { fp, (ctf_strs_t *) &strtab };
491 ctf_qsort_r (dvarents, nvars, sizeof (ctf_varent_t), ctf_sort_var,
492 &sort_var_arg);
493
494 if ((newbuf = ctf_realloc (fp, buf, buf_size + strtab.cts_len)) == NULL)
495 {
496 free (buf);
497 free (strtab.cts_strs);
498 return (ctf_set_errno (fp, EAGAIN));
499 }
500 buf = newbuf;
501 memcpy (buf + buf_size, strtab.cts_strs, strtab.cts_len);
502 hdrp = (ctf_header_t *) buf;
503 hdrp->cth_strlen = strtab.cts_len;
504 buf_size += hdrp->cth_strlen;
505 free (strtab.cts_strs);
506
507 /* Finally, we are ready to ctf_simple_open() the new container. If this
508 is successful, we then switch nfp and fp and free the old container. */
509
510 if ((nfp = ctf_simple_open_internal ((char *) buf, buf_size, NULL, 0,
511 0, NULL, 0, fp->ctf_syn_ext_strtab,
512 1, &err)) == NULL)
513 {
514 free (buf);
515 return (ctf_set_errno (fp, err));
516 }
517
518 (void) ctf_setmodel (nfp, ctf_getmodel (fp));
519
520 nfp->ctf_parent = fp->ctf_parent;
521 nfp->ctf_parent_unreffed = fp->ctf_parent_unreffed;
522 nfp->ctf_refcnt = fp->ctf_refcnt;
523 nfp->ctf_flags |= fp->ctf_flags & ~LCTF_DIRTY;
524 if (nfp->ctf_dynbase == NULL)
525 nfp->ctf_dynbase = buf; /* Make sure buf is freed on close. */
526 nfp->ctf_dthash = fp->ctf_dthash;
527 nfp->ctf_dtdefs = fp->ctf_dtdefs;
528 nfp->ctf_dvhash = fp->ctf_dvhash;
529 nfp->ctf_dvdefs = fp->ctf_dvdefs;
530 nfp->ctf_dtoldid = fp->ctf_dtoldid;
531 nfp->ctf_add_processing = fp->ctf_add_processing;
532 nfp->ctf_snapshots = fp->ctf_snapshots + 1;
533 nfp->ctf_specific = fp->ctf_specific;
534 nfp->ctf_ptrtab = fp->ctf_ptrtab;
535 nfp->ctf_ptrtab_len = fp->ctf_ptrtab_len;
536 nfp->ctf_link_inputs = fp->ctf_link_inputs;
537 nfp->ctf_link_outputs = fp->ctf_link_outputs;
538 nfp->ctf_errs_warnings = fp->ctf_errs_warnings;
539 nfp->ctf_str_prov_offset = fp->ctf_str_prov_offset;
540 nfp->ctf_syn_ext_strtab = fp->ctf_syn_ext_strtab;
541 nfp->ctf_link_in_cu_mapping = fp->ctf_link_in_cu_mapping;
542 nfp->ctf_link_out_cu_mapping = fp->ctf_link_out_cu_mapping;
543 nfp->ctf_link_type_mapping = fp->ctf_link_type_mapping;
544 nfp->ctf_link_memb_name_changer = fp->ctf_link_memb_name_changer;
545 nfp->ctf_link_memb_name_changer_arg = fp->ctf_link_memb_name_changer_arg;
546 nfp->ctf_link_variable_filter = fp->ctf_link_variable_filter;
547 nfp->ctf_link_variable_filter_arg = fp->ctf_link_variable_filter_arg;
548 nfp->ctf_link_flags = fp->ctf_link_flags;
549
550 nfp->ctf_snapshot_lu = fp->ctf_snapshots;
551
552 memcpy (&nfp->ctf_lookups, fp->ctf_lookups, sizeof (fp->ctf_lookups));
553 nfp->ctf_structs = fp->ctf_structs;
554 nfp->ctf_unions = fp->ctf_unions;
555 nfp->ctf_enums = fp->ctf_enums;
556 nfp->ctf_names = fp->ctf_names;
557
558 fp->ctf_dthash = NULL;
559 ctf_str_free_atoms (nfp);
560 nfp->ctf_str_atoms = fp->ctf_str_atoms;
561 nfp->ctf_prov_strtab = fp->ctf_prov_strtab;
562 fp->ctf_str_atoms = NULL;
563 fp->ctf_prov_strtab = NULL;
564 memset (&fp->ctf_dtdefs, 0, sizeof (ctf_list_t));
565 memset (&fp->ctf_errs_warnings, 0, sizeof (ctf_list_t));
566 fp->ctf_add_processing = NULL;
567 fp->ctf_ptrtab = NULL;
568 fp->ctf_link_inputs = NULL;
569 fp->ctf_link_outputs = NULL;
570 fp->ctf_syn_ext_strtab = NULL;
571 fp->ctf_link_in_cu_mapping = NULL;
572 fp->ctf_link_out_cu_mapping = NULL;
573 fp->ctf_link_type_mapping = NULL;
574 fp->ctf_parent_unreffed = 1;
575
576 fp->ctf_dvhash = NULL;
577 memset (&fp->ctf_dvdefs, 0, sizeof (ctf_list_t));
578 memset (fp->ctf_lookups, 0, sizeof (fp->ctf_lookups));
579 fp->ctf_structs.ctn_writable = NULL;
580 fp->ctf_unions.ctn_writable = NULL;
581 fp->ctf_enums.ctn_writable = NULL;
582 fp->ctf_names.ctn_writable = NULL;
583
584 memcpy (&ofp, fp, sizeof (ctf_file_t));
585 memcpy (fp, nfp, sizeof (ctf_file_t));
586 memcpy (nfp, &ofp, sizeof (ctf_file_t));
587
588 nfp->ctf_refcnt = 1; /* Force nfp to be freed. */
589 ctf_file_close (nfp);
590
591 return 0;
592 }
593
594 ctf_names_t *
595 ctf_name_table (ctf_file_t *fp, int kind)
596 {
597 switch (kind)
598 {
599 case CTF_K_STRUCT:
600 return &fp->ctf_structs;
601 case CTF_K_UNION:
602 return &fp->ctf_unions;
603 case CTF_K_ENUM:
604 return &fp->ctf_enums;
605 default:
606 return &fp->ctf_names;
607 }
608 }
609
610 int
611 ctf_dtd_insert (ctf_file_t *fp, ctf_dtdef_t *dtd, int flag, int kind)
612 {
613 const char *name;
614 if (ctf_dynhash_insert (fp->ctf_dthash, (void *) dtd->dtd_type, dtd) < 0)
615 return -1;
616
617 if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name
618 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL)
619 {
620 if (ctf_dynhash_insert (ctf_name_table (fp, kind)->ctn_writable,
621 (char *) name, (void *) dtd->dtd_type) < 0)
622 {
623 ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type);
624 return -1;
625 }
626 }
627 ctf_list_append (&fp->ctf_dtdefs, dtd);
628 return 0;
629 }
630
631 void
632 ctf_dtd_delete (ctf_file_t *fp, ctf_dtdef_t *dtd)
633 {
634 ctf_dmdef_t *dmd, *nmd;
635 int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
636 int name_kind = kind;
637 const char *name;
638
639 ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type);
640
641 switch (kind)
642 {
643 case CTF_K_STRUCT:
644 case CTF_K_UNION:
645 case CTF_K_ENUM:
646 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
647 dmd != NULL; dmd = nmd)
648 {
649 if (dmd->dmd_name != NULL)
650 free (dmd->dmd_name);
651 nmd = ctf_list_next (dmd);
652 free (dmd);
653 }
654 break;
655 case CTF_K_FUNCTION:
656 free (dtd->dtd_u.dtu_argv);
657 break;
658 case CTF_K_FORWARD:
659 name_kind = dtd->dtd_data.ctt_type;
660 break;
661 }
662
663 if (dtd->dtd_data.ctt_name
664 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
665 && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
666 {
667 ctf_dynhash_remove (ctf_name_table (fp, name_kind)->ctn_writable,
668 name);
669 ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
670 }
671
672 ctf_list_delete (&fp->ctf_dtdefs, dtd);
673 free (dtd);
674 }
675
676 ctf_dtdef_t *
677 ctf_dtd_lookup (const ctf_file_t *fp, ctf_id_t type)
678 {
679 return (ctf_dtdef_t *) ctf_dynhash_lookup (fp->ctf_dthash, (void *) type);
680 }
681
682 ctf_dtdef_t *
683 ctf_dynamic_type (const ctf_file_t *fp, ctf_id_t id)
684 {
685 ctf_id_t idx;
686
687 if (!(fp->ctf_flags & LCTF_RDWR))
688 return NULL;
689
690 if ((fp->ctf_flags & LCTF_CHILD) && LCTF_TYPE_ISPARENT (fp, id))
691 fp = fp->ctf_parent;
692
693 idx = LCTF_TYPE_TO_INDEX(fp, id);
694
695 if ((unsigned long) idx <= fp->ctf_typemax)
696 return ctf_dtd_lookup (fp, id);
697 return NULL;
698 }
699
700 int
701 ctf_dvd_insert (ctf_file_t *fp, ctf_dvdef_t *dvd)
702 {
703 if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0)
704 return -1;
705 ctf_list_append (&fp->ctf_dvdefs, dvd);
706 return 0;
707 }
708
709 void
710 ctf_dvd_delete (ctf_file_t *fp, ctf_dvdef_t *dvd)
711 {
712 ctf_dynhash_remove (fp->ctf_dvhash, dvd->dvd_name);
713 free (dvd->dvd_name);
714
715 ctf_list_delete (&fp->ctf_dvdefs, dvd);
716 free (dvd);
717 }
718
719 ctf_dvdef_t *
720 ctf_dvd_lookup (const ctf_file_t *fp, const char *name)
721 {
722 return (ctf_dvdef_t *) ctf_dynhash_lookup (fp->ctf_dvhash, name);
723 }
724
725 /* Discard all of the dynamic type definitions and variable definitions that
726 have been added to the container since the last call to ctf_update(). We
727 locate such types by scanning the dtd list and deleting elements that have
728 type IDs greater than ctf_dtoldid, which is set by ctf_update(), above, and
729 by scanning the variable list and deleting elements that have update IDs
730 equal to the current value of the last-update snapshot count (indicating that
731 they were added after the most recent call to ctf_update()). */
732 int
733 ctf_discard (ctf_file_t *fp)
734 {
735 ctf_snapshot_id_t last_update =
736 { fp->ctf_dtoldid,
737 fp->ctf_snapshot_lu + 1 };
738
739 /* Update required? */
740 if (!(fp->ctf_flags & LCTF_DIRTY))
741 return 0;
742
743 return (ctf_rollback (fp, last_update));
744 }
745
746 ctf_snapshot_id_t
747 ctf_snapshot (ctf_file_t *fp)
748 {
749 ctf_snapshot_id_t snapid;
750 snapid.dtd_id = fp->ctf_typemax;
751 snapid.snapshot_id = fp->ctf_snapshots++;
752 return snapid;
753 }
754
755 /* Like ctf_discard(), only discards everything after a particular ID. */
756 int
757 ctf_rollback (ctf_file_t *fp, ctf_snapshot_id_t id)
758 {
759 ctf_dtdef_t *dtd, *ntd;
760 ctf_dvdef_t *dvd, *nvd;
761
762 if (!(fp->ctf_flags & LCTF_RDWR))
763 return (ctf_set_errno (fp, ECTF_RDONLY));
764
765 if (fp->ctf_snapshot_lu >= id.snapshot_id)
766 return (ctf_set_errno (fp, ECTF_OVERROLLBACK));
767
768 for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
769 {
770 int kind;
771 const char *name;
772
773 ntd = ctf_list_next (dtd);
774
775 if (LCTF_TYPE_TO_INDEX (fp, dtd->dtd_type) <= id.dtd_id)
776 continue;
777
778 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
779 if (kind == CTF_K_FORWARD)
780 kind = dtd->dtd_data.ctt_type;
781
782 if (dtd->dtd_data.ctt_name
783 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
784 && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
785 {
786 ctf_dynhash_remove (ctf_name_table (fp, kind)->ctn_writable,
787 name);
788 ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
789 }
790
791 ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type);
792 ctf_dtd_delete (fp, dtd);
793 }
794
795 for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
796 {
797 nvd = ctf_list_next (dvd);
798
799 if (dvd->dvd_snapshots <= id.snapshot_id)
800 continue;
801
802 ctf_dvd_delete (fp, dvd);
803 }
804
805 fp->ctf_typemax = id.dtd_id;
806 fp->ctf_snapshots = id.snapshot_id;
807
808 if (fp->ctf_snapshots == fp->ctf_snapshot_lu)
809 fp->ctf_flags &= ~LCTF_DIRTY;
810
811 return 0;
812 }
813
814 static ctf_id_t
815 ctf_add_generic (ctf_file_t *fp, uint32_t flag, const char *name, int kind,
816 ctf_dtdef_t **rp)
817 {
818 ctf_dtdef_t *dtd;
819 ctf_id_t type;
820
821 if (flag != CTF_ADD_NONROOT && flag != CTF_ADD_ROOT)
822 return (ctf_set_errno (fp, EINVAL));
823
824 if (!(fp->ctf_flags & LCTF_RDWR))
825 return (ctf_set_errno (fp, ECTF_RDONLY));
826
827 if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) >= CTF_MAX_TYPE)
828 return (ctf_set_errno (fp, ECTF_FULL));
829
830 if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) == (CTF_MAX_PTYPE - 1))
831 return (ctf_set_errno (fp, ECTF_FULL));
832
833 /* Make sure ptrtab always grows to be big enough for all types. */
834 if (ctf_grow_ptrtab (fp) < 0)
835 return CTF_ERR; /* errno is set for us. */
836
837 if ((dtd = malloc (sizeof (ctf_dtdef_t))) == NULL)
838 return (ctf_set_errno (fp, EAGAIN));
839
840 type = ++fp->ctf_typemax;
841 type = LCTF_INDEX_TO_TYPE (fp, type, (fp->ctf_flags & LCTF_CHILD));
842
843 memset (dtd, 0, sizeof (ctf_dtdef_t));
844 dtd->dtd_data.ctt_name = ctf_str_add_ref (fp, name, &dtd->dtd_data.ctt_name);
845 dtd->dtd_type = type;
846
847 if (dtd->dtd_data.ctt_name == 0 && name != NULL && name[0] != '\0')
848 {
849 free (dtd);
850 return (ctf_set_errno (fp, EAGAIN));
851 }
852
853 if (ctf_dtd_insert (fp, dtd, flag, kind) < 0)
854 {
855 free (dtd);
856 return CTF_ERR; /* errno is set for us. */
857 }
858 fp->ctf_flags |= LCTF_DIRTY;
859
860 *rp = dtd;
861 return type;
862 }
863
864 /* When encoding integer sizes, we want to convert a byte count in the range
865 1-8 to the closest power of 2 (e.g. 3->4, 5->8, etc). The clp2() function
866 is a clever implementation from "Hacker's Delight" by Henry Warren, Jr. */
867 static size_t
868 clp2 (size_t x)
869 {
870 x--;
871
872 x |= (x >> 1);
873 x |= (x >> 2);
874 x |= (x >> 4);
875 x |= (x >> 8);
876 x |= (x >> 16);
877
878 return (x + 1);
879 }
880
881 static ctf_id_t
882 ctf_add_encoded (ctf_file_t *fp, uint32_t flag,
883 const char *name, const ctf_encoding_t *ep, uint32_t kind)
884 {
885 ctf_dtdef_t *dtd;
886 ctf_id_t type;
887
888 if (ep == NULL)
889 return (ctf_set_errno (fp, EINVAL));
890
891 if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
892 return CTF_ERR; /* errno is set for us. */
893
894 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
895 dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
896 / CHAR_BIT);
897 dtd->dtd_u.dtu_enc = *ep;
898
899 return type;
900 }
901
902 static ctf_id_t
903 ctf_add_reftype (ctf_file_t *fp, uint32_t flag, ctf_id_t ref, uint32_t kind)
904 {
905 ctf_dtdef_t *dtd;
906 ctf_id_t type;
907 ctf_file_t *tmp = fp;
908 int child = fp->ctf_flags & LCTF_CHILD;
909
910 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
911 return (ctf_set_errno (fp, EINVAL));
912
913 if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
914 return CTF_ERR; /* errno is set for us. */
915
916 if ((type = ctf_add_generic (fp, flag, NULL, kind, &dtd)) == CTF_ERR)
917 return CTF_ERR; /* errno is set for us. */
918
919 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
920 dtd->dtd_data.ctt_type = (uint32_t) ref;
921
922 if (kind != CTF_K_POINTER)
923 return type;
924
925 /* If we are adding a pointer, update the ptrtab, both the directly pointed-to
926 type and (if an anonymous typedef node is being pointed at) the type that
927 points at too. Note that ctf_typemax is at this point one higher than we
928 want to check against, because it's just been incremented for the addition
929 of this type. */
930
931 uint32_t type_idx = LCTF_TYPE_TO_INDEX (fp, type);
932 uint32_t ref_idx = LCTF_TYPE_TO_INDEX (fp, ref);
933
934 if (LCTF_TYPE_ISCHILD (fp, ref) == child
935 && ref_idx < fp->ctf_typemax)
936 {
937 fp->ctf_ptrtab[ref_idx] = type_idx;
938
939 ctf_id_t refref_idx = LCTF_TYPE_TO_INDEX (fp, dtd->dtd_data.ctt_type);
940
941 if (tmp == fp
942 && (LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) == CTF_K_TYPEDEF)
943 && strcmp (ctf_strptr (fp, dtd->dtd_data.ctt_name), "") == 0
944 && refref_idx < fp->ctf_typemax)
945 fp->ctf_ptrtab[refref_idx] = type_idx;
946 }
947
948 return type;
949 }
950
951 ctf_id_t
952 ctf_add_slice (ctf_file_t *fp, uint32_t flag, ctf_id_t ref,
953 const ctf_encoding_t *ep)
954 {
955 ctf_dtdef_t *dtd;
956 ctf_id_t resolved_ref = ref;
957 ctf_id_t type;
958 int kind;
959 const ctf_type_t *tp;
960 ctf_file_t *tmp = fp;
961
962 if (ep == NULL)
963 return (ctf_set_errno (fp, EINVAL));
964
965 if ((ep->cte_bits > 255) || (ep->cte_offset > 255))
966 return (ctf_set_errno (fp, ECTF_SLICEOVERFLOW));
967
968 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
969 return (ctf_set_errno (fp, EINVAL));
970
971 if (ref != 0 && ((tp = ctf_lookup_by_id (&tmp, ref)) == NULL))
972 return CTF_ERR; /* errno is set for us. */
973
974 /* Make sure we ultimately point to an integral type. We also allow slices to
975 point to the unimplemented type, for now, because the compiler can emit
976 such slices, though they're not very much use. */
977
978 resolved_ref = ctf_type_resolve_unsliced (tmp, ref);
979 kind = ctf_type_kind_unsliced (tmp, resolved_ref);
980
981 if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) &&
982 (kind != CTF_K_ENUM)
983 && (ref != 0))
984 return (ctf_set_errno (fp, ECTF_NOTINTFP));
985
986 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_SLICE, &dtd)) == CTF_ERR)
987 return CTF_ERR; /* errno is set for us. */
988
989 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_SLICE, flag, 0);
990 dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
991 / CHAR_BIT);
992 dtd->dtd_u.dtu_slice.cts_type = (uint32_t) ref;
993 dtd->dtd_u.dtu_slice.cts_bits = ep->cte_bits;
994 dtd->dtd_u.dtu_slice.cts_offset = ep->cte_offset;
995
996 return type;
997 }
998
999 ctf_id_t
1000 ctf_add_integer (ctf_file_t *fp, uint32_t flag,
1001 const char *name, const ctf_encoding_t *ep)
1002 {
1003 return (ctf_add_encoded (fp, flag, name, ep, CTF_K_INTEGER));
1004 }
1005
1006 ctf_id_t
1007 ctf_add_float (ctf_file_t *fp, uint32_t flag,
1008 const char *name, const ctf_encoding_t *ep)
1009 {
1010 return (ctf_add_encoded (fp, flag, name, ep, CTF_K_FLOAT));
1011 }
1012
1013 ctf_id_t
1014 ctf_add_pointer (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
1015 {
1016 return (ctf_add_reftype (fp, flag, ref, CTF_K_POINTER));
1017 }
1018
1019 ctf_id_t
1020 ctf_add_array (ctf_file_t *fp, uint32_t flag, const ctf_arinfo_t *arp)
1021 {
1022 ctf_dtdef_t *dtd;
1023 ctf_id_t type;
1024 ctf_file_t *tmp = fp;
1025
1026 if (arp == NULL)
1027 return (ctf_set_errno (fp, EINVAL));
1028
1029 if (arp->ctr_contents != 0
1030 && ctf_lookup_by_id (&tmp, arp->ctr_contents) == NULL)
1031 return CTF_ERR; /* errno is set for us. */
1032
1033 tmp = fp;
1034 if (ctf_lookup_by_id (&tmp, arp->ctr_index) == NULL)
1035 return CTF_ERR; /* errno is set for us. */
1036
1037 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_ARRAY, &dtd)) == CTF_ERR)
1038 return CTF_ERR; /* errno is set for us. */
1039
1040 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ARRAY, flag, 0);
1041 dtd->dtd_data.ctt_size = 0;
1042 dtd->dtd_u.dtu_arr = *arp;
1043
1044 return type;
1045 }
1046
1047 int
1048 ctf_set_array (ctf_file_t *fp, ctf_id_t type, const ctf_arinfo_t *arp)
1049 {
1050 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
1051
1052 if (!(fp->ctf_flags & LCTF_RDWR))
1053 return (ctf_set_errno (fp, ECTF_RDONLY));
1054
1055 if (dtd == NULL
1056 || LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) != CTF_K_ARRAY)
1057 return (ctf_set_errno (fp, ECTF_BADID));
1058
1059 fp->ctf_flags |= LCTF_DIRTY;
1060 dtd->dtd_u.dtu_arr = *arp;
1061
1062 return 0;
1063 }
1064
1065 ctf_id_t
1066 ctf_add_function (ctf_file_t *fp, uint32_t flag,
1067 const ctf_funcinfo_t *ctc, const ctf_id_t *argv)
1068 {
1069 ctf_dtdef_t *dtd;
1070 ctf_id_t type;
1071 uint32_t vlen;
1072 uint32_t *vdat = NULL;
1073 ctf_file_t *tmp = fp;
1074 size_t i;
1075
1076 if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0
1077 || (ctc->ctc_argc != 0 && argv == NULL))
1078 return (ctf_set_errno (fp, EINVAL));
1079
1080 vlen = ctc->ctc_argc;
1081 if (ctc->ctc_flags & CTF_FUNC_VARARG)
1082 vlen++; /* Add trailing zero to indicate varargs (see below). */
1083
1084 if (ctc->ctc_return != 0
1085 && ctf_lookup_by_id (&tmp, ctc->ctc_return) == NULL)
1086 return CTF_ERR; /* errno is set for us. */
1087
1088 if (vlen > CTF_MAX_VLEN)
1089 return (ctf_set_errno (fp, EOVERFLOW));
1090
1091 if (vlen != 0 && (vdat = malloc (sizeof (ctf_id_t) * vlen)) == NULL)
1092 return (ctf_set_errno (fp, EAGAIN));
1093
1094 for (i = 0; i < ctc->ctc_argc; i++)
1095 {
1096 tmp = fp;
1097 if (argv[i] != 0 && ctf_lookup_by_id (&tmp, argv[i]) == NULL)
1098 {
1099 free (vdat);
1100 return CTF_ERR; /* errno is set for us. */
1101 }
1102 vdat[i] = (uint32_t) argv[i];
1103 }
1104
1105 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_FUNCTION,
1106 &dtd)) == CTF_ERR)
1107 {
1108 free (vdat);
1109 return CTF_ERR; /* errno is set for us. */
1110 }
1111
1112 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
1113 dtd->dtd_data.ctt_type = (uint32_t) ctc->ctc_return;
1114
1115 if (ctc->ctc_flags & CTF_FUNC_VARARG)
1116 vdat[vlen - 1] = 0; /* Add trailing zero to indicate varargs. */
1117 dtd->dtd_u.dtu_argv = vdat;
1118
1119 return type;
1120 }
1121
1122 ctf_id_t
1123 ctf_add_struct_sized (ctf_file_t *fp, uint32_t flag, const char *name,
1124 size_t size)
1125 {
1126 ctf_dtdef_t *dtd;
1127 ctf_id_t type = 0;
1128
1129 /* Promote root-visible forwards to structs. */
1130 if (name != NULL)
1131 type = ctf_lookup_by_rawname (fp, CTF_K_STRUCT, name);
1132
1133 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1134 dtd = ctf_dtd_lookup (fp, type);
1135 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_STRUCT,
1136 &dtd)) == CTF_ERR)
1137 return CTF_ERR; /* errno is set for us. */
1138
1139 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_STRUCT, flag, 0);
1140
1141 if (size > CTF_MAX_SIZE)
1142 {
1143 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1144 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1145 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1146 }
1147 else
1148 dtd->dtd_data.ctt_size = (uint32_t) size;
1149
1150 return type;
1151 }
1152
1153 ctf_id_t
1154 ctf_add_struct (ctf_file_t *fp, uint32_t flag, const char *name)
1155 {
1156 return (ctf_add_struct_sized (fp, flag, name, 0));
1157 }
1158
1159 ctf_id_t
1160 ctf_add_union_sized (ctf_file_t *fp, uint32_t flag, const char *name,
1161 size_t size)
1162 {
1163 ctf_dtdef_t *dtd;
1164 ctf_id_t type = 0;
1165
1166 /* Promote root-visible forwards to unions. */
1167 if (name != NULL)
1168 type = ctf_lookup_by_rawname (fp, CTF_K_UNION, name);
1169
1170 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1171 dtd = ctf_dtd_lookup (fp, type);
1172 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_UNION,
1173 &dtd)) == CTF_ERR)
1174 return CTF_ERR; /* errno is set for us */
1175
1176 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_UNION, flag, 0);
1177
1178 if (size > CTF_MAX_SIZE)
1179 {
1180 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1181 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1182 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1183 }
1184 else
1185 dtd->dtd_data.ctt_size = (uint32_t) size;
1186
1187 return type;
1188 }
1189
1190 ctf_id_t
1191 ctf_add_union (ctf_file_t *fp, uint32_t flag, const char *name)
1192 {
1193 return (ctf_add_union_sized (fp, flag, name, 0));
1194 }
1195
1196 ctf_id_t
1197 ctf_add_enum (ctf_file_t *fp, uint32_t flag, const char *name)
1198 {
1199 ctf_dtdef_t *dtd;
1200 ctf_id_t type = 0;
1201
1202 /* Promote root-visible forwards to enums. */
1203 if (name != NULL)
1204 type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1205
1206 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1207 dtd = ctf_dtd_lookup (fp, type);
1208 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_ENUM,
1209 &dtd)) == CTF_ERR)
1210 return CTF_ERR; /* errno is set for us. */
1211
1212 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ENUM, flag, 0);
1213 dtd->dtd_data.ctt_size = fp->ctf_dmodel->ctd_int;
1214
1215 return type;
1216 }
1217
1218 ctf_id_t
1219 ctf_add_enum_encoded (ctf_file_t *fp, uint32_t flag, const char *name,
1220 const ctf_encoding_t *ep)
1221 {
1222 ctf_id_t type = 0;
1223
1224 /* First, create the enum if need be, using most of the same machinery as
1225 ctf_add_enum(), to ensure that we do not allow things past that are not
1226 enums or forwards to them. (This includes other slices: you cannot slice a
1227 slice, which would be a useless thing to do anyway.) */
1228
1229 if (name != NULL)
1230 type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1231
1232 if (type != 0)
1233 {
1234 if ((ctf_type_kind (fp, type) != CTF_K_FORWARD) &&
1235 (ctf_type_kind_unsliced (fp, type) != CTF_K_ENUM))
1236 return (ctf_set_errno (fp, ECTF_NOTINTFP));
1237 }
1238 else if ((type = ctf_add_enum (fp, flag, name)) == CTF_ERR)
1239 return CTF_ERR; /* errno is set for us. */
1240
1241 /* Now attach a suitable slice to it. */
1242
1243 return ctf_add_slice (fp, flag, type, ep);
1244 }
1245
1246 ctf_id_t
1247 ctf_add_forward (ctf_file_t *fp, uint32_t flag, const char *name,
1248 uint32_t kind)
1249 {
1250 ctf_dtdef_t *dtd;
1251 ctf_id_t type = 0;
1252
1253 if (!ctf_forwardable_kind (kind))
1254 return (ctf_set_errno (fp, ECTF_NOTSUE));
1255
1256 /* If the type is already defined or exists as a forward tag, just
1257 return the ctf_id_t of the existing definition. */
1258
1259 if (name != NULL)
1260 type = ctf_lookup_by_rawname (fp, kind, name);
1261
1262 if (type)
1263 return type;
1264
1265 if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
1266 return CTF_ERR; /* errno is set for us. */
1267
1268 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FORWARD, flag, 0);
1269 dtd->dtd_data.ctt_type = kind;
1270
1271 return type;
1272 }
1273
1274 ctf_id_t
1275 ctf_add_typedef (ctf_file_t *fp, uint32_t flag, const char *name,
1276 ctf_id_t ref)
1277 {
1278 ctf_dtdef_t *dtd;
1279 ctf_id_t type;
1280 ctf_file_t *tmp = fp;
1281
1282 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1283 return (ctf_set_errno (fp, EINVAL));
1284
1285 if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
1286 return CTF_ERR; /* errno is set for us. */
1287
1288 if ((type = ctf_add_generic (fp, flag, name, CTF_K_TYPEDEF,
1289 &dtd)) == CTF_ERR)
1290 return CTF_ERR; /* errno is set for us. */
1291
1292 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_TYPEDEF, flag, 0);
1293 dtd->dtd_data.ctt_type = (uint32_t) ref;
1294
1295 return type;
1296 }
1297
1298 ctf_id_t
1299 ctf_add_volatile (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
1300 {
1301 return (ctf_add_reftype (fp, flag, ref, CTF_K_VOLATILE));
1302 }
1303
1304 ctf_id_t
1305 ctf_add_const (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
1306 {
1307 return (ctf_add_reftype (fp, flag, ref, CTF_K_CONST));
1308 }
1309
1310 ctf_id_t
1311 ctf_add_restrict (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
1312 {
1313 return (ctf_add_reftype (fp, flag, ref, CTF_K_RESTRICT));
1314 }
1315
1316 int
1317 ctf_add_enumerator (ctf_file_t *fp, ctf_id_t enid, const char *name,
1318 int value)
1319 {
1320 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, enid);
1321 ctf_dmdef_t *dmd;
1322
1323 uint32_t kind, vlen, root;
1324 char *s;
1325
1326 if (name == NULL)
1327 return (ctf_set_errno (fp, EINVAL));
1328
1329 if (!(fp->ctf_flags & LCTF_RDWR))
1330 return (ctf_set_errno (fp, ECTF_RDONLY));
1331
1332 if (dtd == NULL)
1333 return (ctf_set_errno (fp, ECTF_BADID));
1334
1335 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1336 root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
1337 vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
1338
1339 if (kind != CTF_K_ENUM)
1340 return (ctf_set_errno (fp, ECTF_NOTENUM));
1341
1342 if (vlen == CTF_MAX_VLEN)
1343 return (ctf_set_errno (fp, ECTF_DTFULL));
1344
1345 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
1346 dmd != NULL; dmd = ctf_list_next (dmd))
1347 {
1348 if (strcmp (dmd->dmd_name, name) == 0)
1349 return (ctf_set_errno (fp, ECTF_DUPLICATE));
1350 }
1351
1352 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
1353 return (ctf_set_errno (fp, EAGAIN));
1354
1355 if ((s = strdup (name)) == NULL)
1356 {
1357 free (dmd);
1358 return (ctf_set_errno (fp, EAGAIN));
1359 }
1360
1361 dmd->dmd_name = s;
1362 dmd->dmd_type = CTF_ERR;
1363 dmd->dmd_offset = 0;
1364 dmd->dmd_value = value;
1365
1366 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
1367 ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
1368
1369 fp->ctf_flags |= LCTF_DIRTY;
1370
1371 return 0;
1372 }
1373
1374 int
1375 ctf_add_member_offset (ctf_file_t *fp, ctf_id_t souid, const char *name,
1376 ctf_id_t type, unsigned long bit_offset)
1377 {
1378 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, souid);
1379 ctf_dmdef_t *dmd;
1380
1381 ssize_t msize, malign, ssize;
1382 uint32_t kind, vlen, root;
1383 char *s = NULL;
1384
1385 if (!(fp->ctf_flags & LCTF_RDWR))
1386 return (ctf_set_errno (fp, ECTF_RDONLY));
1387
1388 if (dtd == NULL)
1389 return (ctf_set_errno (fp, ECTF_BADID));
1390
1391 if (name != NULL && name[0] == '\0')
1392 name = NULL;
1393
1394 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1395 root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
1396 vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
1397
1398 if (kind != CTF_K_STRUCT && kind != CTF_K_UNION)
1399 return (ctf_set_errno (fp, ECTF_NOTSOU));
1400
1401 if (vlen == CTF_MAX_VLEN)
1402 return (ctf_set_errno (fp, ECTF_DTFULL));
1403
1404 if (name != NULL)
1405 {
1406 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
1407 dmd != NULL; dmd = ctf_list_next (dmd))
1408 {
1409 if (dmd->dmd_name != NULL && strcmp (dmd->dmd_name, name) == 0)
1410 return (ctf_set_errno (fp, ECTF_DUPLICATE));
1411 }
1412 }
1413
1414 if ((msize = ctf_type_size (fp, type)) < 0 ||
1415 (malign = ctf_type_align (fp, type)) < 0)
1416 {
1417 /* The unimplemented type, and any type that resolves to it, has no size
1418 and no alignment: it can correspond to any number of compiler-inserted
1419 types. */
1420
1421 if (ctf_errno (fp) == ECTF_NONREPRESENTABLE)
1422 {
1423 msize = 0;
1424 malign = 0;
1425 ctf_set_errno (fp, 0);
1426 }
1427 else
1428 return -1; /* errno is set for us. */
1429 }
1430
1431 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
1432 return (ctf_set_errno (fp, EAGAIN));
1433
1434 if (name != NULL && (s = strdup (name)) == NULL)
1435 {
1436 free (dmd);
1437 return (ctf_set_errno (fp, EAGAIN));
1438 }
1439
1440 dmd->dmd_name = s;
1441 dmd->dmd_type = type;
1442 dmd->dmd_value = -1;
1443
1444 if (kind == CTF_K_STRUCT && vlen != 0)
1445 {
1446 if (bit_offset == (unsigned long) - 1)
1447 {
1448 /* Natural alignment. */
1449
1450 ctf_dmdef_t *lmd = ctf_list_prev (&dtd->dtd_u.dtu_members);
1451 ctf_id_t ltype = ctf_type_resolve (fp, lmd->dmd_type);
1452 size_t off = lmd->dmd_offset;
1453
1454 ctf_encoding_t linfo;
1455 ssize_t lsize;
1456
1457 /* Propagate any error from ctf_type_resolve. If the last member was
1458 of unimplemented type, this may be -ECTF_NONREPRESENTABLE: we
1459 cannot insert right after such a member without explicit offset
1460 specification, because its alignment and size is not known. */
1461 if (ltype == CTF_ERR)
1462 {
1463 free (dmd);
1464 return -1; /* errno is set for us. */
1465 }
1466
1467 if (ctf_type_encoding (fp, ltype, &linfo) == 0)
1468 off += linfo.cte_bits;
1469 else if ((lsize = ctf_type_size (fp, ltype)) > 0)
1470 off += lsize * CHAR_BIT;
1471
1472 /* Round up the offset of the end of the last member to
1473 the next byte boundary, convert 'off' to bytes, and
1474 then round it up again to the next multiple of the
1475 alignment required by the new member. Finally,
1476 convert back to bits and store the result in
1477 dmd_offset. Technically we could do more efficient
1478 packing if the new member is a bit-field, but we're
1479 the "compiler" and ANSI says we can do as we choose. */
1480
1481 off = roundup (off, CHAR_BIT) / CHAR_BIT;
1482 off = roundup (off, MAX (malign, 1));
1483 dmd->dmd_offset = off * CHAR_BIT;
1484 ssize = off + msize;
1485 }
1486 else
1487 {
1488 /* Specified offset in bits. */
1489
1490 dmd->dmd_offset = bit_offset;
1491 ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
1492 ssize = MAX (ssize, ((signed) bit_offset / CHAR_BIT) + msize);
1493 }
1494 }
1495 else
1496 {
1497 dmd->dmd_offset = 0;
1498 ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
1499 ssize = MAX (ssize, msize);
1500 }
1501
1502 if ((size_t) ssize > CTF_MAX_SIZE)
1503 {
1504 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1505 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (ssize);
1506 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (ssize);
1507 }
1508 else
1509 dtd->dtd_data.ctt_size = (uint32_t) ssize;
1510
1511 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
1512 ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
1513
1514 fp->ctf_flags |= LCTF_DIRTY;
1515 return 0;
1516 }
1517
1518 int
1519 ctf_add_member_encoded (ctf_file_t *fp, ctf_id_t souid, const char *name,
1520 ctf_id_t type, unsigned long bit_offset,
1521 const ctf_encoding_t encoding)
1522 {
1523 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
1524 int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1525 int otype = type;
1526
1527 if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) && (kind != CTF_K_ENUM))
1528 return (ctf_set_errno (fp, ECTF_NOTINTFP));
1529
1530 if ((type = ctf_add_slice (fp, CTF_ADD_NONROOT, otype, &encoding)) == CTF_ERR)
1531 return -1; /* errno is set for us. */
1532
1533 return ctf_add_member_offset (fp, souid, name, type, bit_offset);
1534 }
1535
1536 int
1537 ctf_add_member (ctf_file_t *fp, ctf_id_t souid, const char *name,
1538 ctf_id_t type)
1539 {
1540 return ctf_add_member_offset (fp, souid, name, type, (unsigned long) - 1);
1541 }
1542
1543 int
1544 ctf_add_variable (ctf_file_t *fp, const char *name, ctf_id_t ref)
1545 {
1546 ctf_dvdef_t *dvd;
1547 ctf_file_t *tmp = fp;
1548
1549 if (!(fp->ctf_flags & LCTF_RDWR))
1550 return (ctf_set_errno (fp, ECTF_RDONLY));
1551
1552 if (ctf_dvd_lookup (fp, name) != NULL)
1553 return (ctf_set_errno (fp, ECTF_DUPLICATE));
1554
1555 if (ctf_lookup_by_id (&tmp, ref) == NULL)
1556 return -1; /* errno is set for us. */
1557
1558 /* Make sure this type is representable. */
1559 if ((ctf_type_resolve (fp, ref) == CTF_ERR)
1560 && (ctf_errno (fp) == ECTF_NONREPRESENTABLE))
1561 return -1;
1562
1563 if ((dvd = malloc (sizeof (ctf_dvdef_t))) == NULL)
1564 return (ctf_set_errno (fp, EAGAIN));
1565
1566 if (name != NULL && (dvd->dvd_name = strdup (name)) == NULL)
1567 {
1568 free (dvd);
1569 return (ctf_set_errno (fp, EAGAIN));
1570 }
1571 dvd->dvd_type = ref;
1572 dvd->dvd_snapshots = fp->ctf_snapshots;
1573
1574 if (ctf_dvd_insert (fp, dvd) < 0)
1575 {
1576 free (dvd->dvd_name);
1577 free (dvd);
1578 return -1; /* errno is set for us. */
1579 }
1580
1581 fp->ctf_flags |= LCTF_DIRTY;
1582 return 0;
1583 }
1584
1585 static int
1586 enumcmp (const char *name, int value, void *arg)
1587 {
1588 ctf_bundle_t *ctb = arg;
1589 int bvalue;
1590
1591 if (ctf_enum_value (ctb->ctb_file, ctb->ctb_type, name, &bvalue) < 0)
1592 {
1593 ctf_dprintf ("Conflict due to member %s iteration error: %s.\n", name,
1594 ctf_errmsg (ctf_errno (ctb->ctb_file)));
1595 return 1;
1596 }
1597 if (value != bvalue)
1598 {
1599 ctf_dprintf ("Conflict due to value change: %i versus %i\n",
1600 value, bvalue);
1601 return 1;
1602 }
1603 return 0;
1604 }
1605
1606 static int
1607 enumadd (const char *name, int value, void *arg)
1608 {
1609 ctf_bundle_t *ctb = arg;
1610
1611 return (ctf_add_enumerator (ctb->ctb_file, ctb->ctb_type,
1612 name, value) < 0);
1613 }
1614
1615 static int
1616 membcmp (const char *name, ctf_id_t type _libctf_unused_, unsigned long offset,
1617 void *arg)
1618 {
1619 ctf_bundle_t *ctb = arg;
1620 ctf_membinfo_t ctm;
1621
1622 /* Don't check nameless members (e.g. anonymous structs/unions) against each
1623 other. */
1624 if (name[0] == 0)
1625 return 0;
1626
1627 if (ctf_member_info (ctb->ctb_file, ctb->ctb_type, name, &ctm) < 0)
1628 {
1629 ctf_dprintf ("Conflict due to member %s iteration error: %s.\n", name,
1630 ctf_errmsg (ctf_errno (ctb->ctb_file)));
1631 return 1;
1632 }
1633 if (ctm.ctm_offset != offset)
1634 {
1635 ctf_dprintf ("Conflict due to member %s offset change: "
1636 "%lx versus %lx\n", name, ctm.ctm_offset, offset);
1637 return 1;
1638 }
1639 return 0;
1640 }
1641
1642 static int
1643 membadd (const char *name, ctf_id_t type, unsigned long offset, void *arg)
1644 {
1645 ctf_bundle_t *ctb = arg;
1646 ctf_dmdef_t *dmd;
1647 char *s = NULL;
1648
1649 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
1650 return (ctf_set_errno (ctb->ctb_file, EAGAIN));
1651
1652 if (name != NULL && (s = strdup (name)) == NULL)
1653 {
1654 free (dmd);
1655 return (ctf_set_errno (ctb->ctb_file, EAGAIN));
1656 }
1657
1658 /* For now, dmd_type is copied as the src_fp's type; it is reset to an
1659 equivalent dst_fp type by a final loop in ctf_add_type(), below. */
1660 dmd->dmd_name = s;
1661 dmd->dmd_type = type;
1662 dmd->dmd_offset = offset;
1663 dmd->dmd_value = -1;
1664
1665 ctf_list_append (&ctb->ctb_dtd->dtd_u.dtu_members, dmd);
1666
1667 ctb->ctb_file->ctf_flags |= LCTF_DIRTY;
1668 return 0;
1669 }
1670
1671 /* The ctf_add_type routine is used to copy a type from a source CTF container
1672 to a dynamic destination container. This routine operates recursively by
1673 following the source type's links and embedded member types. If the
1674 destination container already contains a named type which has the same
1675 attributes, then we succeed and return this type but no changes occur. */
1676 static ctf_id_t
1677 ctf_add_type_internal (ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type,
1678 ctf_file_t *proc_tracking_fp)
1679 {
1680 ctf_id_t dst_type = CTF_ERR;
1681 uint32_t dst_kind = CTF_K_UNKNOWN;
1682 ctf_file_t *tmp_fp = dst_fp;
1683 ctf_id_t tmp;
1684
1685 const char *name;
1686 uint32_t kind, forward_kind, flag, vlen;
1687
1688 const ctf_type_t *src_tp, *dst_tp;
1689 ctf_bundle_t src, dst;
1690 ctf_encoding_t src_en, dst_en;
1691 ctf_arinfo_t src_ar, dst_ar;
1692
1693 ctf_funcinfo_t ctc;
1694
1695 ctf_id_t orig_src_type = src_type;
1696
1697 if (!(dst_fp->ctf_flags & LCTF_RDWR))
1698 return (ctf_set_errno (dst_fp, ECTF_RDONLY));
1699
1700 if ((src_tp = ctf_lookup_by_id (&src_fp, src_type)) == NULL)
1701 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
1702
1703 if ((ctf_type_resolve (src_fp, src_type) == CTF_ERR)
1704 && (ctf_errno (src_fp) == ECTF_NONREPRESENTABLE))
1705 return (ctf_set_errno (dst_fp, ECTF_NONREPRESENTABLE));
1706
1707 name = ctf_strptr (src_fp, src_tp->ctt_name);
1708 kind = LCTF_INFO_KIND (src_fp, src_tp->ctt_info);
1709 flag = LCTF_INFO_ISROOT (src_fp, src_tp->ctt_info);
1710 vlen = LCTF_INFO_VLEN (src_fp, src_tp->ctt_info);
1711
1712 /* If this is a type we are currently in the middle of adding, hand it
1713 straight back. (This lets us handle self-referential structures without
1714 considering forwards and empty structures the same as their completed
1715 forms.) */
1716
1717 tmp = ctf_type_mapping (src_fp, src_type, &tmp_fp);
1718
1719 if (tmp != 0)
1720 {
1721 if (ctf_dynhash_lookup (proc_tracking_fp->ctf_add_processing,
1722 (void *) (uintptr_t) src_type))
1723 return tmp;
1724
1725 /* If this type has already been added from this container, and is the same
1726 kind and (if a struct or union) has the same number of members, hand it
1727 straight back. */
1728
1729 if (ctf_type_kind_unsliced (tmp_fp, tmp) == (int) kind)
1730 {
1731 if (kind == CTF_K_STRUCT || kind == CTF_K_UNION
1732 || kind == CTF_K_ENUM)
1733 {
1734 if ((dst_tp = ctf_lookup_by_id (&tmp_fp, dst_type)) != NULL)
1735 if (vlen == LCTF_INFO_VLEN (tmp_fp, dst_tp->ctt_info))
1736 return tmp;
1737 }
1738 else
1739 return tmp;
1740 }
1741 }
1742
1743 forward_kind = kind;
1744 if (kind == CTF_K_FORWARD)
1745 forward_kind = src_tp->ctt_type;
1746
1747 /* If the source type has a name and is a root type (visible at the
1748 top-level scope), lookup the name in the destination container and
1749 verify that it is of the same kind before we do anything else. */
1750
1751 if ((flag & CTF_ADD_ROOT) && name[0] != '\0'
1752 && (tmp = ctf_lookup_by_rawname (dst_fp, forward_kind, name)) != 0)
1753 {
1754 dst_type = tmp;
1755 dst_kind = ctf_type_kind_unsliced (dst_fp, dst_type);
1756 }
1757
1758 /* If an identically named dst_type exists, fail with ECTF_CONFLICT
1759 unless dst_type is a forward declaration and src_type is a struct,
1760 union, or enum (i.e. the definition of the previous forward decl).
1761
1762 We also allow addition in the opposite order (addition of a forward when a
1763 struct, union, or enum already exists), which is a NOP and returns the
1764 already-present struct, union, or enum. */
1765
1766 if (dst_type != CTF_ERR && dst_kind != kind)
1767 {
1768 if (kind == CTF_K_FORWARD
1769 && (dst_kind == CTF_K_ENUM || dst_kind == CTF_K_STRUCT
1770 || dst_kind == CTF_K_UNION))
1771 {
1772 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
1773 return dst_type;
1774 }
1775
1776 if (dst_kind != CTF_K_FORWARD
1777 || (kind != CTF_K_ENUM && kind != CTF_K_STRUCT
1778 && kind != CTF_K_UNION))
1779 {
1780 ctf_dprintf ("Conflict for type %s: kinds differ, new: %i; "
1781 "old (ID %lx): %i\n", name, kind, dst_type, dst_kind);
1782 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1783 }
1784 }
1785
1786 /* We take special action for an integer, float, or slice since it is
1787 described not only by its name but also its encoding. For integers,
1788 bit-fields exploit this degeneracy. */
1789
1790 if (kind == CTF_K_INTEGER || kind == CTF_K_FLOAT || kind == CTF_K_SLICE)
1791 {
1792 if (ctf_type_encoding (src_fp, src_type, &src_en) != 0)
1793 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
1794
1795 if (dst_type != CTF_ERR)
1796 {
1797 ctf_file_t *fp = dst_fp;
1798
1799 if ((dst_tp = ctf_lookup_by_id (&fp, dst_type)) == NULL)
1800 return CTF_ERR;
1801
1802 if (ctf_type_encoding (dst_fp, dst_type, &dst_en) != 0)
1803 return CTF_ERR; /* errno set for us. */
1804
1805 if (LCTF_INFO_ISROOT (fp, dst_tp->ctt_info) & CTF_ADD_ROOT)
1806 {
1807 /* The type that we found in the hash is also root-visible. If
1808 the two types match then use the existing one; otherwise,
1809 declare a conflict. Note: slices are not certain to match
1810 even if there is no conflict: we must check the contained type
1811 too. */
1812
1813 if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
1814 {
1815 if (kind != CTF_K_SLICE)
1816 {
1817 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
1818 return dst_type;
1819 }
1820 }
1821 else
1822 {
1823 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1824 }
1825 }
1826 else
1827 {
1828 /* We found a non-root-visible type in the hash. If its encoding
1829 is the same, we can reuse it, unless it is a slice. */
1830
1831 if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
1832 {
1833 if (kind != CTF_K_SLICE)
1834 {
1835 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
1836 return dst_type;
1837 }
1838 }
1839 }
1840 }
1841 }
1842
1843 src.ctb_file = src_fp;
1844 src.ctb_type = src_type;
1845 src.ctb_dtd = NULL;
1846
1847 dst.ctb_file = dst_fp;
1848 dst.ctb_type = dst_type;
1849 dst.ctb_dtd = NULL;
1850
1851 /* Now perform kind-specific processing. If dst_type is CTF_ERR, then we add
1852 a new type with the same properties as src_type to dst_fp. If dst_type is
1853 not CTF_ERR, then we verify that dst_type has the same attributes as
1854 src_type. We recurse for embedded references. Before we start, we note
1855 that we are processing this type, to prevent infinite recursion: we do not
1856 re-process any type that appears in this list. The list is emptied
1857 wholesale at the end of processing everything in this recursive stack. */
1858
1859 if (ctf_dynhash_insert (proc_tracking_fp->ctf_add_processing,
1860 (void *) (uintptr_t) src_type, (void *) 1) < 0)
1861 return ctf_set_errno (dst_fp, ENOMEM);
1862
1863 switch (kind)
1864 {
1865 case CTF_K_INTEGER:
1866 /* If we found a match we will have either returned it or declared a
1867 conflict. */
1868 dst_type = ctf_add_integer (dst_fp, flag, name, &src_en);
1869 break;
1870
1871 case CTF_K_FLOAT:
1872 /* If we found a match we will have either returned it or declared a
1873 conflict. */
1874 dst_type = ctf_add_float (dst_fp, flag, name, &src_en);
1875 break;
1876
1877 case CTF_K_SLICE:
1878 /* We have checked for conflicting encodings: now try to add the
1879 contained type. */
1880 src_type = ctf_type_reference (src_fp, src_type);
1881 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
1882 proc_tracking_fp);
1883
1884 if (src_type == CTF_ERR)
1885 return CTF_ERR; /* errno is set for us. */
1886
1887 dst_type = ctf_add_slice (dst_fp, flag, src_type, &src_en);
1888 break;
1889
1890 case CTF_K_POINTER:
1891 case CTF_K_VOLATILE:
1892 case CTF_K_CONST:
1893 case CTF_K_RESTRICT:
1894 src_type = ctf_type_reference (src_fp, src_type);
1895 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
1896 proc_tracking_fp);
1897
1898 if (src_type == CTF_ERR)
1899 return CTF_ERR; /* errno is set for us. */
1900
1901 dst_type = ctf_add_reftype (dst_fp, flag, src_type, kind);
1902 break;
1903
1904 case CTF_K_ARRAY:
1905 if (ctf_array_info (src_fp, src_type, &src_ar) != 0)
1906 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
1907
1908 src_ar.ctr_contents =
1909 ctf_add_type_internal (dst_fp, src_fp, src_ar.ctr_contents,
1910 proc_tracking_fp);
1911 src_ar.ctr_index = ctf_add_type_internal (dst_fp, src_fp,
1912 src_ar.ctr_index,
1913 proc_tracking_fp);
1914 src_ar.ctr_nelems = src_ar.ctr_nelems;
1915
1916 if (src_ar.ctr_contents == CTF_ERR || src_ar.ctr_index == CTF_ERR)
1917 return CTF_ERR; /* errno is set for us. */
1918
1919 if (dst_type != CTF_ERR)
1920 {
1921 if (ctf_array_info (dst_fp, dst_type, &dst_ar) != 0)
1922 return CTF_ERR; /* errno is set for us. */
1923
1924 if (memcmp (&src_ar, &dst_ar, sizeof (ctf_arinfo_t)))
1925 {
1926 ctf_dprintf ("Conflict for type %s against ID %lx: "
1927 "array info differs, old %lx/%lx/%x; "
1928 "new: %lx/%lx/%x\n", name, dst_type,
1929 src_ar.ctr_contents, src_ar.ctr_index,
1930 src_ar.ctr_nelems, dst_ar.ctr_contents,
1931 dst_ar.ctr_index, dst_ar.ctr_nelems);
1932 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1933 }
1934 }
1935 else
1936 dst_type = ctf_add_array (dst_fp, flag, &src_ar);
1937 break;
1938
1939 case CTF_K_FUNCTION:
1940 ctc.ctc_return = ctf_add_type_internal (dst_fp, src_fp,
1941 src_tp->ctt_type,
1942 proc_tracking_fp);
1943 ctc.ctc_argc = 0;
1944 ctc.ctc_flags = 0;
1945
1946 if (ctc.ctc_return == CTF_ERR)
1947 return CTF_ERR; /* errno is set for us. */
1948
1949 dst_type = ctf_add_function (dst_fp, flag, &ctc, NULL);
1950 break;
1951
1952 case CTF_K_STRUCT:
1953 case CTF_K_UNION:
1954 {
1955 ctf_dmdef_t *dmd;
1956 int errs = 0;
1957 size_t size;
1958 ssize_t ssize;
1959 ctf_dtdef_t *dtd;
1960
1961 /* Technically to match a struct or union we need to check both
1962 ways (src members vs. dst, dst members vs. src) but we make
1963 this more optimal by only checking src vs. dst and comparing
1964 the total size of the structure (which we must do anyway)
1965 which covers the possibility of dst members not in src.
1966 This optimization can be defeated for unions, but is so
1967 pathological as to render it irrelevant for our purposes. */
1968
1969 if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
1970 && dst_kind != CTF_K_FORWARD)
1971 {
1972 if (ctf_type_size (src_fp, src_type) !=
1973 ctf_type_size (dst_fp, dst_type))
1974 {
1975 ctf_dprintf ("Conflict for type %s against ID %lx: "
1976 "union size differs, old %li, new %li\n",
1977 name, dst_type,
1978 (long) ctf_type_size (src_fp, src_type),
1979 (long) ctf_type_size (dst_fp, dst_type));
1980 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1981 }
1982
1983 if (ctf_member_iter (src_fp, src_type, membcmp, &dst))
1984 {
1985 ctf_dprintf ("Conflict for type %s against ID %lx: "
1986 "members differ, see above\n", name, dst_type);
1987 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1988 }
1989
1990 break;
1991 }
1992
1993 /* Unlike the other cases, copying structs and unions is done
1994 manually so as to avoid repeated lookups in ctf_add_member
1995 and to ensure the exact same member offsets as in src_type. */
1996
1997 dst_type = ctf_add_generic (dst_fp, flag, name, kind, &dtd);
1998 if (dst_type == CTF_ERR)
1999 return CTF_ERR; /* errno is set for us. */
2000
2001 dst.ctb_type = dst_type;
2002 dst.ctb_dtd = dtd;
2003
2004 /* Pre-emptively add this struct to the type mapping so that
2005 structures that refer to themselves work. */
2006 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2007
2008 if (ctf_member_iter (src_fp, src_type, membadd, &dst) != 0)
2009 errs++; /* Increment errs and fail at bottom of case. */
2010
2011 if ((ssize = ctf_type_size (src_fp, src_type)) < 0)
2012 return CTF_ERR; /* errno is set for us. */
2013
2014 size = (size_t) ssize;
2015 if (size > CTF_MAX_SIZE)
2016 {
2017 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
2018 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
2019 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
2020 }
2021 else
2022 dtd->dtd_data.ctt_size = (uint32_t) size;
2023
2024 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, vlen);
2025
2026 /* Make a final pass through the members changing each dmd_type (a
2027 src_fp type) to an equivalent type in dst_fp. We pass through all
2028 members, leaving any that fail set to CTF_ERR, unless they fail
2029 because they are marking a member of type not representable in this
2030 version of CTF, in which case we just want to silently omit them:
2031 no consumer can do anything with them anyway. */
2032 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
2033 dmd != NULL; dmd = ctf_list_next (dmd))
2034 {
2035 ctf_file_t *dst = dst_fp;
2036 ctf_id_t memb_type;
2037
2038 memb_type = ctf_type_mapping (src_fp, dmd->dmd_type, &dst);
2039 if (memb_type == 0)
2040 {
2041 if ((dmd->dmd_type =
2042 ctf_add_type_internal (dst_fp, src_fp, dmd->dmd_type,
2043 proc_tracking_fp)) == CTF_ERR)
2044 {
2045 if (ctf_errno (dst_fp) != ECTF_NONREPRESENTABLE)
2046 errs++;
2047 }
2048 }
2049 else
2050 dmd->dmd_type = memb_type;
2051 }
2052
2053 if (errs)
2054 return CTF_ERR; /* errno is set for us. */
2055 break;
2056 }
2057
2058 case CTF_K_ENUM:
2059 if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
2060 && dst_kind != CTF_K_FORWARD)
2061 {
2062 if (ctf_enum_iter (src_fp, src_type, enumcmp, &dst)
2063 || ctf_enum_iter (dst_fp, dst_type, enumcmp, &src))
2064 {
2065 ctf_dprintf ("Conflict for enum %s against ID %lx: "
2066 "members differ, see above\n", name, dst_type);
2067 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2068 }
2069 }
2070 else
2071 {
2072 dst_type = ctf_add_enum (dst_fp, flag, name);
2073 if ((dst.ctb_type = dst_type) == CTF_ERR
2074 || ctf_enum_iter (src_fp, src_type, enumadd, &dst))
2075 return CTF_ERR; /* errno is set for us */
2076 }
2077 break;
2078
2079 case CTF_K_FORWARD:
2080 if (dst_type == CTF_ERR)
2081 dst_type = ctf_add_forward (dst_fp, flag, name, forward_kind);
2082 break;
2083
2084 case CTF_K_TYPEDEF:
2085 src_type = ctf_type_reference (src_fp, src_type);
2086 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2087 proc_tracking_fp);
2088
2089 if (src_type == CTF_ERR)
2090 return CTF_ERR; /* errno is set for us. */
2091
2092 /* If dst_type is not CTF_ERR at this point, we should check if
2093 ctf_type_reference(dst_fp, dst_type) != src_type and if so fail with
2094 ECTF_CONFLICT. However, this causes problems with bitness typedefs
2095 that vary based on things like if 32-bit then pid_t is int otherwise
2096 long. We therefore omit this check and assume that if the identically
2097 named typedef already exists in dst_fp, it is correct or
2098 equivalent. */
2099
2100 if (dst_type == CTF_ERR)
2101 dst_type = ctf_add_typedef (dst_fp, flag, name, src_type);
2102
2103 break;
2104
2105 default:
2106 return (ctf_set_errno (dst_fp, ECTF_CORRUPT));
2107 }
2108
2109 if (dst_type != CTF_ERR)
2110 ctf_add_type_mapping (src_fp, orig_src_type, dst_fp, dst_type);
2111 return dst_type;
2112 }
2113
2114 ctf_id_t
2115 ctf_add_type (ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type)
2116 {
2117 ctf_id_t id;
2118
2119 if (!src_fp->ctf_add_processing)
2120 src_fp->ctf_add_processing = ctf_dynhash_create (ctf_hash_integer,
2121 ctf_hash_eq_integer,
2122 NULL, NULL);
2123
2124 /* We store the hash on the source, because it contains only source type IDs:
2125 but callers will invariably expect errors to appear on the dest. */
2126 if (!src_fp->ctf_add_processing)
2127 return (ctf_set_errno (dst_fp, ENOMEM));
2128
2129 id = ctf_add_type_internal (dst_fp, src_fp, src_type, src_fp);
2130 ctf_dynhash_empty (src_fp->ctf_add_processing);
2131
2132 return id;
2133 }
2134
2135 /* Write the compressed CTF data stream to the specified gzFile descriptor. */
2136 int
2137 ctf_gzwrite (ctf_file_t *fp, gzFile fd)
2138 {
2139 const unsigned char *buf;
2140 ssize_t resid;
2141 ssize_t len;
2142
2143 resid = sizeof (ctf_header_t);
2144 buf = (unsigned char *) fp->ctf_header;
2145 while (resid != 0)
2146 {
2147 if ((len = gzwrite (fd, buf, resid)) <= 0)
2148 return (ctf_set_errno (fp, errno));
2149 resid -= len;
2150 buf += len;
2151 }
2152
2153 resid = fp->ctf_size;
2154 buf = fp->ctf_buf;
2155 while (resid != 0)
2156 {
2157 if ((len = gzwrite (fd, buf, resid)) <= 0)
2158 return (ctf_set_errno (fp, errno));
2159 resid -= len;
2160 buf += len;
2161 }
2162
2163 return 0;
2164 }
2165
2166 /* Compress the specified CTF data stream and write it to the specified file
2167 descriptor. */
2168 int
2169 ctf_compress_write (ctf_file_t *fp, int fd)
2170 {
2171 unsigned char *buf;
2172 unsigned char *bp;
2173 ctf_header_t h;
2174 ctf_header_t *hp = &h;
2175 ssize_t header_len = sizeof (ctf_header_t);
2176 ssize_t compress_len;
2177 ssize_t len;
2178 int rc;
2179 int err = 0;
2180
2181 if (ctf_serialize (fp) < 0)
2182 return -1; /* errno is set for us. */
2183
2184 memcpy (hp, fp->ctf_header, header_len);
2185 hp->cth_flags |= CTF_F_COMPRESS;
2186 compress_len = compressBound (fp->ctf_size);
2187
2188 if ((buf = malloc (compress_len)) == NULL)
2189 return (ctf_set_errno (fp, ECTF_ZALLOC));
2190
2191 if ((rc = compress (buf, (uLongf *) &compress_len,
2192 fp->ctf_buf, fp->ctf_size)) != Z_OK)
2193 {
2194 ctf_dprintf ("zlib deflate err: %s\n", zError (rc));
2195 err = ctf_set_errno (fp, ECTF_COMPRESS);
2196 goto ret;
2197 }
2198
2199 while (header_len > 0)
2200 {
2201 if ((len = write (fd, hp, header_len)) < 0)
2202 {
2203 err = ctf_set_errno (fp, errno);
2204 goto ret;
2205 }
2206 header_len -= len;
2207 hp += len;
2208 }
2209
2210 bp = buf;
2211 while (compress_len > 0)
2212 {
2213 if ((len = write (fd, bp, compress_len)) < 0)
2214 {
2215 err = ctf_set_errno (fp, errno);
2216 goto ret;
2217 }
2218 compress_len -= len;
2219 bp += len;
2220 }
2221
2222 ret:
2223 free (buf);
2224 return err;
2225 }
2226
2227 /* Optionally compress the specified CTF data stream and return it as a new
2228 dynamically-allocated string. */
2229 unsigned char *
2230 ctf_write_mem (ctf_file_t *fp, size_t *size, size_t threshold)
2231 {
2232 unsigned char *buf;
2233 unsigned char *bp;
2234 ctf_header_t *hp;
2235 ssize_t header_len = sizeof (ctf_header_t);
2236 ssize_t compress_len;
2237 int rc;
2238
2239 if (ctf_serialize (fp) < 0)
2240 return NULL; /* errno is set for us. */
2241
2242 compress_len = compressBound (fp->ctf_size);
2243 if (fp->ctf_size < threshold)
2244 compress_len = fp->ctf_size;
2245 if ((buf = malloc (compress_len
2246 + sizeof (struct ctf_header))) == NULL)
2247 {
2248 ctf_set_errno (fp, ENOMEM);
2249 return NULL;
2250 }
2251
2252 hp = (ctf_header_t *) buf;
2253 memcpy (hp, fp->ctf_header, header_len);
2254 bp = buf + sizeof (struct ctf_header);
2255 *size = sizeof (struct ctf_header);
2256
2257 if (fp->ctf_size < threshold)
2258 {
2259 hp->cth_flags &= ~CTF_F_COMPRESS;
2260 memcpy (bp, fp->ctf_buf, fp->ctf_size);
2261 *size += fp->ctf_size;
2262 }
2263 else
2264 {
2265 hp->cth_flags |= CTF_F_COMPRESS;
2266 if ((rc = compress (bp, (uLongf *) &compress_len,
2267 fp->ctf_buf, fp->ctf_size)) != Z_OK)
2268 {
2269 ctf_dprintf ("zlib deflate err: %s\n", zError (rc));
2270 ctf_set_errno (fp, ECTF_COMPRESS);
2271 free (buf);
2272 return NULL;
2273 }
2274 *size += compress_len;
2275 }
2276 return buf;
2277 }
2278
2279 /* Write the uncompressed CTF data stream to the specified file descriptor. */
2280 int
2281 ctf_write (ctf_file_t *fp, int fd)
2282 {
2283 const unsigned char *buf;
2284 ssize_t resid;
2285 ssize_t len;
2286
2287 if (ctf_serialize (fp) < 0)
2288 return -1; /* errno is set for us. */
2289
2290 resid = sizeof (ctf_header_t);
2291 buf = (unsigned char *) fp->ctf_header;
2292 while (resid != 0)
2293 {
2294 if ((len = write (fd, buf, resid)) <= 0)
2295 return (ctf_set_errno (fp, errno));
2296 resid -= len;
2297 buf += len;
2298 }
2299
2300 resid = fp->ctf_size;
2301 buf = fp->ctf_buf;
2302 while (resid != 0)
2303 {
2304 if ((len = write (fd, buf, resid)) <= 0)
2305 return (ctf_set_errno (fp, errno));
2306 resid -= len;
2307 buf += len;
2308 }
2309
2310 return 0;
2311 }