libctf, archive: fix bad error message
[deliverable/binutils-gdb.git] / libctf / ctf-create.c
1 /* CTF file creation.
2 Copyright (C) 2019-2020 Free Software Foundation, Inc.
3
4 This file is part of libctf.
5
6 libctf is free software; you can redistribute it and/or modify it under
7 the terms of the GNU General Public License as published by the Free
8 Software Foundation; either version 3, or (at your option) any later
9 version.
10
11 This program is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 See the GNU General Public License for more details.
15
16 You should have received a copy of the GNU General Public License
17 along with this program; see the file COPYING. If not see
18 <http://www.gnu.org/licenses/>. */
19
20 #include <ctf-impl.h>
21 #include <sys/param.h>
22 #include <assert.h>
23 #include <string.h>
24 #include <unistd.h>
25 #include <zlib.h>
26
27 #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 (void) ctf_import (nfp, fp->ctf_parent);
520
521 nfp->ctf_refcnt = fp->ctf_refcnt;
522 nfp->ctf_flags |= fp->ctf_flags & ~LCTF_DIRTY;
523 if (nfp->ctf_dynbase == NULL)
524 nfp->ctf_dynbase = buf; /* Make sure buf is freed on close. */
525 nfp->ctf_dthash = fp->ctf_dthash;
526 nfp->ctf_dtdefs = fp->ctf_dtdefs;
527 nfp->ctf_dvhash = fp->ctf_dvhash;
528 nfp->ctf_dvdefs = fp->ctf_dvdefs;
529 nfp->ctf_dtoldid = fp->ctf_dtoldid;
530 nfp->ctf_add_processing = fp->ctf_add_processing;
531 nfp->ctf_snapshots = fp->ctf_snapshots + 1;
532 nfp->ctf_specific = fp->ctf_specific;
533 nfp->ctf_ptrtab = fp->ctf_ptrtab;
534 nfp->ctf_ptrtab_len = fp->ctf_ptrtab_len;
535 nfp->ctf_link_inputs = fp->ctf_link_inputs;
536 nfp->ctf_link_outputs = fp->ctf_link_outputs;
537 nfp->ctf_errs_warnings = fp->ctf_errs_warnings;
538 nfp->ctf_str_prov_offset = fp->ctf_str_prov_offset;
539 nfp->ctf_syn_ext_strtab = fp->ctf_syn_ext_strtab;
540 nfp->ctf_link_cu_mapping = fp->ctf_link_cu_mapping;
541 nfp->ctf_link_type_mapping = fp->ctf_link_type_mapping;
542 nfp->ctf_link_memb_name_changer = fp->ctf_link_memb_name_changer;
543 nfp->ctf_link_memb_name_changer_arg = fp->ctf_link_memb_name_changer_arg;
544
545 nfp->ctf_snapshot_lu = fp->ctf_snapshots;
546
547 memcpy (&nfp->ctf_lookups, fp->ctf_lookups, sizeof (fp->ctf_lookups));
548 nfp->ctf_structs = fp->ctf_structs;
549 nfp->ctf_unions = fp->ctf_unions;
550 nfp->ctf_enums = fp->ctf_enums;
551 nfp->ctf_names = fp->ctf_names;
552
553 fp->ctf_dthash = NULL;
554 ctf_str_free_atoms (nfp);
555 nfp->ctf_str_atoms = fp->ctf_str_atoms;
556 nfp->ctf_prov_strtab = fp->ctf_prov_strtab;
557 fp->ctf_str_atoms = NULL;
558 fp->ctf_prov_strtab = NULL;
559 memset (&fp->ctf_dtdefs, 0, sizeof (ctf_list_t));
560 memset (&fp->ctf_errs_warnings, 0, sizeof (ctf_list_t));
561 fp->ctf_add_processing = NULL;
562 fp->ctf_ptrtab = NULL;
563 fp->ctf_link_inputs = NULL;
564 fp->ctf_link_outputs = NULL;
565 fp->ctf_syn_ext_strtab = NULL;
566 fp->ctf_link_cu_mapping = NULL;
567 fp->ctf_link_type_mapping = NULL;
568
569 fp->ctf_dvhash = NULL;
570 memset (&fp->ctf_dvdefs, 0, sizeof (ctf_list_t));
571 memset (fp->ctf_lookups, 0, sizeof (fp->ctf_lookups));
572 fp->ctf_structs.ctn_writable = NULL;
573 fp->ctf_unions.ctn_writable = NULL;
574 fp->ctf_enums.ctn_writable = NULL;
575 fp->ctf_names.ctn_writable = NULL;
576
577 memcpy (&ofp, fp, sizeof (ctf_file_t));
578 memcpy (fp, nfp, sizeof (ctf_file_t));
579 memcpy (nfp, &ofp, sizeof (ctf_file_t));
580
581 nfp->ctf_refcnt = 1; /* Force nfp to be freed. */
582 ctf_file_close (nfp);
583
584 return 0;
585 }
586
587 ctf_names_t *
588 ctf_name_table (ctf_file_t *fp, int kind)
589 {
590 switch (kind)
591 {
592 case CTF_K_STRUCT:
593 return &fp->ctf_structs;
594 case CTF_K_UNION:
595 return &fp->ctf_unions;
596 case CTF_K_ENUM:
597 return &fp->ctf_enums;
598 default:
599 return &fp->ctf_names;
600 }
601 }
602
603 int
604 ctf_dtd_insert (ctf_file_t *fp, ctf_dtdef_t *dtd, int flag, int kind)
605 {
606 const char *name;
607 if (ctf_dynhash_insert (fp->ctf_dthash, (void *) dtd->dtd_type, dtd) < 0)
608 return -1;
609
610 if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name
611 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL)
612 {
613 if (ctf_dynhash_insert (ctf_name_table (fp, kind)->ctn_writable,
614 (char *) name, (void *) dtd->dtd_type) < 0)
615 {
616 ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type);
617 return -1;
618 }
619 }
620 ctf_list_append (&fp->ctf_dtdefs, dtd);
621 return 0;
622 }
623
624 void
625 ctf_dtd_delete (ctf_file_t *fp, ctf_dtdef_t *dtd)
626 {
627 ctf_dmdef_t *dmd, *nmd;
628 int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
629 int name_kind = kind;
630 const char *name;
631
632 ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type);
633
634 switch (kind)
635 {
636 case CTF_K_STRUCT:
637 case CTF_K_UNION:
638 case CTF_K_ENUM:
639 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
640 dmd != NULL; dmd = nmd)
641 {
642 if (dmd->dmd_name != NULL)
643 free (dmd->dmd_name);
644 nmd = ctf_list_next (dmd);
645 free (dmd);
646 }
647 break;
648 case CTF_K_FUNCTION:
649 free (dtd->dtd_u.dtu_argv);
650 break;
651 case CTF_K_FORWARD:
652 name_kind = dtd->dtd_data.ctt_type;
653 break;
654 }
655
656 if (dtd->dtd_data.ctt_name
657 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
658 && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
659 {
660 ctf_dynhash_remove (ctf_name_table (fp, name_kind)->ctn_writable,
661 name);
662 ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
663 }
664
665 ctf_list_delete (&fp->ctf_dtdefs, dtd);
666 free (dtd);
667 }
668
669 ctf_dtdef_t *
670 ctf_dtd_lookup (const ctf_file_t *fp, ctf_id_t type)
671 {
672 return (ctf_dtdef_t *) ctf_dynhash_lookup (fp->ctf_dthash, (void *) type);
673 }
674
675 ctf_dtdef_t *
676 ctf_dynamic_type (const ctf_file_t *fp, ctf_id_t id)
677 {
678 ctf_id_t idx;
679
680 if (!(fp->ctf_flags & LCTF_RDWR))
681 return NULL;
682
683 if ((fp->ctf_flags & LCTF_CHILD) && LCTF_TYPE_ISPARENT (fp, id))
684 fp = fp->ctf_parent;
685
686 idx = LCTF_TYPE_TO_INDEX(fp, id);
687
688 if ((unsigned long) idx <= fp->ctf_typemax)
689 return ctf_dtd_lookup (fp, id);
690 return NULL;
691 }
692
693 int
694 ctf_dvd_insert (ctf_file_t *fp, ctf_dvdef_t *dvd)
695 {
696 if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0)
697 return -1;
698 ctf_list_append (&fp->ctf_dvdefs, dvd);
699 return 0;
700 }
701
702 void
703 ctf_dvd_delete (ctf_file_t *fp, ctf_dvdef_t *dvd)
704 {
705 ctf_dynhash_remove (fp->ctf_dvhash, dvd->dvd_name);
706 free (dvd->dvd_name);
707
708 ctf_list_delete (&fp->ctf_dvdefs, dvd);
709 free (dvd);
710 }
711
712 ctf_dvdef_t *
713 ctf_dvd_lookup (const ctf_file_t *fp, const char *name)
714 {
715 return (ctf_dvdef_t *) ctf_dynhash_lookup (fp->ctf_dvhash, name);
716 }
717
718 /* Discard all of the dynamic type definitions and variable definitions that
719 have been added to the container since the last call to ctf_update(). We
720 locate such types by scanning the dtd list and deleting elements that have
721 type IDs greater than ctf_dtoldid, which is set by ctf_update(), above, and
722 by scanning the variable list and deleting elements that have update IDs
723 equal to the current value of the last-update snapshot count (indicating that
724 they were added after the most recent call to ctf_update()). */
725 int
726 ctf_discard (ctf_file_t *fp)
727 {
728 ctf_snapshot_id_t last_update =
729 { fp->ctf_dtoldid,
730 fp->ctf_snapshot_lu + 1 };
731
732 /* Update required? */
733 if (!(fp->ctf_flags & LCTF_DIRTY))
734 return 0;
735
736 return (ctf_rollback (fp, last_update));
737 }
738
739 ctf_snapshot_id_t
740 ctf_snapshot (ctf_file_t *fp)
741 {
742 ctf_snapshot_id_t snapid;
743 snapid.dtd_id = fp->ctf_typemax;
744 snapid.snapshot_id = fp->ctf_snapshots++;
745 return snapid;
746 }
747
748 /* Like ctf_discard(), only discards everything after a particular ID. */
749 int
750 ctf_rollback (ctf_file_t *fp, ctf_snapshot_id_t id)
751 {
752 ctf_dtdef_t *dtd, *ntd;
753 ctf_dvdef_t *dvd, *nvd;
754
755 if (!(fp->ctf_flags & LCTF_RDWR))
756 return (ctf_set_errno (fp, ECTF_RDONLY));
757
758 if (fp->ctf_snapshot_lu >= id.snapshot_id)
759 return (ctf_set_errno (fp, ECTF_OVERROLLBACK));
760
761 for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
762 {
763 int kind;
764 const char *name;
765
766 ntd = ctf_list_next (dtd);
767
768 if (LCTF_TYPE_TO_INDEX (fp, dtd->dtd_type) <= id.dtd_id)
769 continue;
770
771 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
772 if (kind == CTF_K_FORWARD)
773 kind = dtd->dtd_data.ctt_type;
774
775 if (dtd->dtd_data.ctt_name
776 && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
777 && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
778 {
779 ctf_dynhash_remove (ctf_name_table (fp, kind)->ctn_writable,
780 name);
781 ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
782 }
783
784 ctf_dynhash_remove (fp->ctf_dthash, (void *) dtd->dtd_type);
785 ctf_dtd_delete (fp, dtd);
786 }
787
788 for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
789 {
790 nvd = ctf_list_next (dvd);
791
792 if (dvd->dvd_snapshots <= id.snapshot_id)
793 continue;
794
795 ctf_dvd_delete (fp, dvd);
796 }
797
798 fp->ctf_typemax = id.dtd_id;
799 fp->ctf_snapshots = id.snapshot_id;
800
801 if (fp->ctf_snapshots == fp->ctf_snapshot_lu)
802 fp->ctf_flags &= ~LCTF_DIRTY;
803
804 return 0;
805 }
806
807 static ctf_id_t
808 ctf_add_generic (ctf_file_t *fp, uint32_t flag, const char *name, int kind,
809 ctf_dtdef_t **rp)
810 {
811 ctf_dtdef_t *dtd;
812 ctf_id_t type;
813
814 if (flag != CTF_ADD_NONROOT && flag != CTF_ADD_ROOT)
815 return (ctf_set_errno (fp, EINVAL));
816
817 if (!(fp->ctf_flags & LCTF_RDWR))
818 return (ctf_set_errno (fp, ECTF_RDONLY));
819
820 if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) >= CTF_MAX_TYPE)
821 return (ctf_set_errno (fp, ECTF_FULL));
822
823 if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) == (CTF_MAX_PTYPE - 1))
824 return (ctf_set_errno (fp, ECTF_FULL));
825
826 /* Make sure ptrtab always grows to be big enough for all types. */
827 if (ctf_grow_ptrtab (fp) < 0)
828 return CTF_ERR; /* errno is set for us. */
829
830 if ((dtd = malloc (sizeof (ctf_dtdef_t))) == NULL)
831 return (ctf_set_errno (fp, EAGAIN));
832
833 type = ++fp->ctf_typemax;
834 type = LCTF_INDEX_TO_TYPE (fp, type, (fp->ctf_flags & LCTF_CHILD));
835
836 memset (dtd, 0, sizeof (ctf_dtdef_t));
837 dtd->dtd_data.ctt_name = ctf_str_add_ref (fp, name, &dtd->dtd_data.ctt_name);
838 dtd->dtd_type = type;
839
840 if (dtd->dtd_data.ctt_name == 0 && name != NULL && name[0] != '\0')
841 {
842 free (dtd);
843 return (ctf_set_errno (fp, EAGAIN));
844 }
845
846 if (ctf_dtd_insert (fp, dtd, flag, kind) < 0)
847 {
848 free (dtd);
849 return CTF_ERR; /* errno is set for us. */
850 }
851 fp->ctf_flags |= LCTF_DIRTY;
852
853 *rp = dtd;
854 return type;
855 }
856
857 /* When encoding integer sizes, we want to convert a byte count in the range
858 1-8 to the closest power of 2 (e.g. 3->4, 5->8, etc). The clp2() function
859 is a clever implementation from "Hacker's Delight" by Henry Warren, Jr. */
860 static size_t
861 clp2 (size_t x)
862 {
863 x--;
864
865 x |= (x >> 1);
866 x |= (x >> 2);
867 x |= (x >> 4);
868 x |= (x >> 8);
869 x |= (x >> 16);
870
871 return (x + 1);
872 }
873
874 static ctf_id_t
875 ctf_add_encoded (ctf_file_t *fp, uint32_t flag,
876 const char *name, const ctf_encoding_t *ep, uint32_t kind)
877 {
878 ctf_dtdef_t *dtd;
879 ctf_id_t type;
880
881 if (ep == NULL)
882 return (ctf_set_errno (fp, EINVAL));
883
884 if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
885 return CTF_ERR; /* errno is set for us. */
886
887 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
888 dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
889 / CHAR_BIT);
890 dtd->dtd_u.dtu_enc = *ep;
891
892 return type;
893 }
894
895 static ctf_id_t
896 ctf_add_reftype (ctf_file_t *fp, uint32_t flag, ctf_id_t ref, uint32_t kind)
897 {
898 ctf_dtdef_t *dtd;
899 ctf_id_t type;
900 ctf_file_t *tmp = fp;
901 int child = fp->ctf_flags & LCTF_CHILD;
902
903 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
904 return (ctf_set_errno (fp, EINVAL));
905
906 if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
907 return CTF_ERR; /* errno is set for us. */
908
909 if ((type = ctf_add_generic (fp, flag, NULL, kind, &dtd)) == CTF_ERR)
910 return CTF_ERR; /* errno is set for us. */
911
912 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
913 dtd->dtd_data.ctt_type = (uint32_t) ref;
914
915 if (kind != CTF_K_POINTER)
916 return type;
917
918 /* If we are adding a pointer, update the ptrtab, both the directly pointed-to
919 type and (if an anonymous typedef node is being pointed at) the type that
920 points at too. Note that ctf_typemax is at this point one higher than we
921 want to check against, because it's just been incremented for the addition
922 of this type. */
923
924 uint32_t type_idx = LCTF_TYPE_TO_INDEX (fp, type);
925 uint32_t ref_idx = LCTF_TYPE_TO_INDEX (fp, ref);
926
927 if (LCTF_TYPE_ISCHILD (fp, ref) == child
928 && ref_idx < fp->ctf_typemax)
929 {
930 fp->ctf_ptrtab[ref_idx] = type_idx;
931
932 ctf_id_t refref_idx = LCTF_TYPE_TO_INDEX (fp, dtd->dtd_data.ctt_type);
933
934 if (tmp == fp
935 && (LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) == CTF_K_TYPEDEF)
936 && strcmp (ctf_strptr (fp, dtd->dtd_data.ctt_name), "") == 0
937 && refref_idx < fp->ctf_typemax)
938 fp->ctf_ptrtab[refref_idx] = type_idx;
939 }
940
941 return type;
942 }
943
944 ctf_id_t
945 ctf_add_slice (ctf_file_t *fp, uint32_t flag, ctf_id_t ref,
946 const ctf_encoding_t *ep)
947 {
948 ctf_dtdef_t *dtd;
949 ctf_id_t resolved_ref = ref;
950 ctf_id_t type;
951 int kind;
952 const ctf_type_t *tp;
953 ctf_file_t *tmp = fp;
954
955 if (ep == NULL)
956 return (ctf_set_errno (fp, EINVAL));
957
958 if ((ep->cte_bits > 255) || (ep->cte_offset > 255))
959 return (ctf_set_errno (fp, ECTF_SLICEOVERFLOW));
960
961 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
962 return (ctf_set_errno (fp, EINVAL));
963
964 if (ref != 0 && ((tp = ctf_lookup_by_id (&tmp, ref)) == NULL))
965 return CTF_ERR; /* errno is set for us. */
966
967 /* Make sure we ultimately point to an integral type. We also allow slices to
968 point to the unimplemented type, for now, because the compiler can emit
969 such slices, though they're not very much use. */
970
971 resolved_ref = ctf_type_resolve_unsliced (tmp, ref);
972 kind = ctf_type_kind_unsliced (tmp, resolved_ref);
973
974 if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) &&
975 (kind != CTF_K_ENUM)
976 && (ref != 0))
977 return (ctf_set_errno (fp, ECTF_NOTINTFP));
978
979 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_SLICE, &dtd)) == CTF_ERR)
980 return CTF_ERR; /* errno is set for us. */
981
982 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_SLICE, flag, 0);
983 dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
984 / CHAR_BIT);
985 dtd->dtd_u.dtu_slice.cts_type = (uint32_t) ref;
986 dtd->dtd_u.dtu_slice.cts_bits = ep->cte_bits;
987 dtd->dtd_u.dtu_slice.cts_offset = ep->cte_offset;
988
989 return type;
990 }
991
992 ctf_id_t
993 ctf_add_integer (ctf_file_t *fp, uint32_t flag,
994 const char *name, const ctf_encoding_t *ep)
995 {
996 return (ctf_add_encoded (fp, flag, name, ep, CTF_K_INTEGER));
997 }
998
999 ctf_id_t
1000 ctf_add_float (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_FLOAT));
1004 }
1005
1006 ctf_id_t
1007 ctf_add_pointer (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
1008 {
1009 return (ctf_add_reftype (fp, flag, ref, CTF_K_POINTER));
1010 }
1011
1012 ctf_id_t
1013 ctf_add_array (ctf_file_t *fp, uint32_t flag, const ctf_arinfo_t *arp)
1014 {
1015 ctf_dtdef_t *dtd;
1016 ctf_id_t type;
1017 ctf_file_t *tmp = fp;
1018
1019 if (arp == NULL)
1020 return (ctf_set_errno (fp, EINVAL));
1021
1022 if (arp->ctr_contents != 0
1023 && ctf_lookup_by_id (&tmp, arp->ctr_contents) == NULL)
1024 return CTF_ERR; /* errno is set for us. */
1025
1026 tmp = fp;
1027 if (ctf_lookup_by_id (&tmp, arp->ctr_index) == NULL)
1028 return CTF_ERR; /* errno is set for us. */
1029
1030 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_ARRAY, &dtd)) == CTF_ERR)
1031 return CTF_ERR; /* errno is set for us. */
1032
1033 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ARRAY, flag, 0);
1034 dtd->dtd_data.ctt_size = 0;
1035 dtd->dtd_u.dtu_arr = *arp;
1036
1037 return type;
1038 }
1039
1040 int
1041 ctf_set_array (ctf_file_t *fp, ctf_id_t type, const ctf_arinfo_t *arp)
1042 {
1043 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
1044
1045 if (!(fp->ctf_flags & LCTF_RDWR))
1046 return (ctf_set_errno (fp, ECTF_RDONLY));
1047
1048 if (dtd == NULL
1049 || LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) != CTF_K_ARRAY)
1050 return (ctf_set_errno (fp, ECTF_BADID));
1051
1052 fp->ctf_flags |= LCTF_DIRTY;
1053 dtd->dtd_u.dtu_arr = *arp;
1054
1055 return 0;
1056 }
1057
1058 ctf_id_t
1059 ctf_add_function (ctf_file_t *fp, uint32_t flag,
1060 const ctf_funcinfo_t *ctc, const ctf_id_t *argv)
1061 {
1062 ctf_dtdef_t *dtd;
1063 ctf_id_t type;
1064 uint32_t vlen;
1065 uint32_t *vdat = NULL;
1066 ctf_file_t *tmp = fp;
1067 size_t i;
1068
1069 if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0
1070 || (ctc->ctc_argc != 0 && argv == NULL))
1071 return (ctf_set_errno (fp, EINVAL));
1072
1073 vlen = ctc->ctc_argc;
1074 if (ctc->ctc_flags & CTF_FUNC_VARARG)
1075 vlen++; /* Add trailing zero to indicate varargs (see below). */
1076
1077 if (ctc->ctc_return != 0
1078 && ctf_lookup_by_id (&tmp, ctc->ctc_return) == NULL)
1079 return CTF_ERR; /* errno is set for us. */
1080
1081 if (vlen > CTF_MAX_VLEN)
1082 return (ctf_set_errno (fp, EOVERFLOW));
1083
1084 if (vlen != 0 && (vdat = malloc (sizeof (ctf_id_t) * vlen)) == NULL)
1085 return (ctf_set_errno (fp, EAGAIN));
1086
1087 for (i = 0; i < ctc->ctc_argc; i++)
1088 {
1089 tmp = fp;
1090 if (argv[i] != 0 && ctf_lookup_by_id (&tmp, argv[i]) == NULL)
1091 {
1092 free (vdat);
1093 return CTF_ERR; /* errno is set for us. */
1094 }
1095 vdat[i] = (uint32_t) argv[i];
1096 }
1097
1098 if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_FUNCTION,
1099 &dtd)) == CTF_ERR)
1100 {
1101 free (vdat);
1102 return CTF_ERR; /* errno is set for us. */
1103 }
1104
1105 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
1106 dtd->dtd_data.ctt_type = (uint32_t) ctc->ctc_return;
1107
1108 if (ctc->ctc_flags & CTF_FUNC_VARARG)
1109 vdat[vlen - 1] = 0; /* Add trailing zero to indicate varargs. */
1110 dtd->dtd_u.dtu_argv = vdat;
1111
1112 return type;
1113 }
1114
1115 ctf_id_t
1116 ctf_add_struct_sized (ctf_file_t *fp, uint32_t flag, const char *name,
1117 size_t size)
1118 {
1119 ctf_dtdef_t *dtd;
1120 ctf_id_t type = 0;
1121
1122 /* Promote root-visible forwards to structs. */
1123 if (name != NULL)
1124 type = ctf_lookup_by_rawname (fp, CTF_K_STRUCT, name);
1125
1126 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1127 dtd = ctf_dtd_lookup (fp, type);
1128 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_STRUCT,
1129 &dtd)) == CTF_ERR)
1130 return CTF_ERR; /* errno is set for us. */
1131
1132 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_STRUCT, flag, 0);
1133
1134 if (size > CTF_MAX_SIZE)
1135 {
1136 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1137 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1138 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1139 }
1140 else
1141 dtd->dtd_data.ctt_size = (uint32_t) size;
1142
1143 return type;
1144 }
1145
1146 ctf_id_t
1147 ctf_add_struct (ctf_file_t *fp, uint32_t flag, const char *name)
1148 {
1149 return (ctf_add_struct_sized (fp, flag, name, 0));
1150 }
1151
1152 ctf_id_t
1153 ctf_add_union_sized (ctf_file_t *fp, uint32_t flag, const char *name,
1154 size_t size)
1155 {
1156 ctf_dtdef_t *dtd;
1157 ctf_id_t type = 0;
1158
1159 /* Promote root-visible forwards to unions. */
1160 if (name != NULL)
1161 type = ctf_lookup_by_rawname (fp, CTF_K_UNION, name);
1162
1163 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1164 dtd = ctf_dtd_lookup (fp, type);
1165 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_UNION,
1166 &dtd)) == CTF_ERR)
1167 return CTF_ERR; /* errno is set for us */
1168
1169 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_UNION, flag, 0);
1170
1171 if (size > CTF_MAX_SIZE)
1172 {
1173 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1174 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
1175 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
1176 }
1177 else
1178 dtd->dtd_data.ctt_size = (uint32_t) size;
1179
1180 return type;
1181 }
1182
1183 ctf_id_t
1184 ctf_add_union (ctf_file_t *fp, uint32_t flag, const char *name)
1185 {
1186 return (ctf_add_union_sized (fp, flag, name, 0));
1187 }
1188
1189 ctf_id_t
1190 ctf_add_enum (ctf_file_t *fp, uint32_t flag, const char *name)
1191 {
1192 ctf_dtdef_t *dtd;
1193 ctf_id_t type = 0;
1194
1195 /* Promote root-visible forwards to enums. */
1196 if (name != NULL)
1197 type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1198
1199 if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
1200 dtd = ctf_dtd_lookup (fp, type);
1201 else if ((type = ctf_add_generic (fp, flag, name, CTF_K_ENUM,
1202 &dtd)) == CTF_ERR)
1203 return CTF_ERR; /* errno is set for us. */
1204
1205 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ENUM, flag, 0);
1206 dtd->dtd_data.ctt_size = fp->ctf_dmodel->ctd_int;
1207
1208 return type;
1209 }
1210
1211 ctf_id_t
1212 ctf_add_enum_encoded (ctf_file_t *fp, uint32_t flag, const char *name,
1213 const ctf_encoding_t *ep)
1214 {
1215 ctf_id_t type = 0;
1216
1217 /* First, create the enum if need be, using most of the same machinery as
1218 ctf_add_enum(), to ensure that we do not allow things past that are not
1219 enums or forwards to them. (This includes other slices: you cannot slice a
1220 slice, which would be a useless thing to do anyway.) */
1221
1222 if (name != NULL)
1223 type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
1224
1225 if (type != 0)
1226 {
1227 if ((ctf_type_kind (fp, type) != CTF_K_FORWARD) &&
1228 (ctf_type_kind_unsliced (fp, type) != CTF_K_ENUM))
1229 return (ctf_set_errno (fp, ECTF_NOTINTFP));
1230 }
1231 else if ((type = ctf_add_enum (fp, flag, name)) == CTF_ERR)
1232 return CTF_ERR; /* errno is set for us. */
1233
1234 /* Now attach a suitable slice to it. */
1235
1236 return ctf_add_slice (fp, flag, type, ep);
1237 }
1238
1239 ctf_id_t
1240 ctf_add_forward (ctf_file_t *fp, uint32_t flag, const char *name,
1241 uint32_t kind)
1242 {
1243 ctf_dtdef_t *dtd;
1244 ctf_id_t type = 0;
1245
1246 if (!ctf_forwardable_kind (kind))
1247 return (ctf_set_errno (fp, ECTF_NOTSUE));
1248
1249 /* If the type is already defined or exists as a forward tag, just
1250 return the ctf_id_t of the existing definition. */
1251
1252 if (name != NULL)
1253 type = ctf_lookup_by_rawname (fp, kind, name);
1254
1255 if (type)
1256 return type;
1257
1258 if ((type = ctf_add_generic (fp, flag, name, kind, &dtd)) == CTF_ERR)
1259 return CTF_ERR; /* errno is set for us. */
1260
1261 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FORWARD, flag, 0);
1262 dtd->dtd_data.ctt_type = kind;
1263
1264 return type;
1265 }
1266
1267 ctf_id_t
1268 ctf_add_typedef (ctf_file_t *fp, uint32_t flag, const char *name,
1269 ctf_id_t ref)
1270 {
1271 ctf_dtdef_t *dtd;
1272 ctf_id_t type;
1273 ctf_file_t *tmp = fp;
1274
1275 if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
1276 return (ctf_set_errno (fp, EINVAL));
1277
1278 if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
1279 return CTF_ERR; /* errno is set for us. */
1280
1281 if ((type = ctf_add_generic (fp, flag, name, CTF_K_TYPEDEF,
1282 &dtd)) == CTF_ERR)
1283 return CTF_ERR; /* errno is set for us. */
1284
1285 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_TYPEDEF, flag, 0);
1286 dtd->dtd_data.ctt_type = (uint32_t) ref;
1287
1288 return type;
1289 }
1290
1291 ctf_id_t
1292 ctf_add_volatile (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
1293 {
1294 return (ctf_add_reftype (fp, flag, ref, CTF_K_VOLATILE));
1295 }
1296
1297 ctf_id_t
1298 ctf_add_const (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
1299 {
1300 return (ctf_add_reftype (fp, flag, ref, CTF_K_CONST));
1301 }
1302
1303 ctf_id_t
1304 ctf_add_restrict (ctf_file_t *fp, uint32_t flag, ctf_id_t ref)
1305 {
1306 return (ctf_add_reftype (fp, flag, ref, CTF_K_RESTRICT));
1307 }
1308
1309 int
1310 ctf_add_enumerator (ctf_file_t *fp, ctf_id_t enid, const char *name,
1311 int value)
1312 {
1313 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, enid);
1314 ctf_dmdef_t *dmd;
1315
1316 uint32_t kind, vlen, root;
1317 char *s;
1318
1319 if (name == NULL)
1320 return (ctf_set_errno (fp, EINVAL));
1321
1322 if (!(fp->ctf_flags & LCTF_RDWR))
1323 return (ctf_set_errno (fp, ECTF_RDONLY));
1324
1325 if (dtd == NULL)
1326 return (ctf_set_errno (fp, ECTF_BADID));
1327
1328 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1329 root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
1330 vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
1331
1332 if (kind != CTF_K_ENUM)
1333 return (ctf_set_errno (fp, ECTF_NOTENUM));
1334
1335 if (vlen == CTF_MAX_VLEN)
1336 return (ctf_set_errno (fp, ECTF_DTFULL));
1337
1338 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
1339 dmd != NULL; dmd = ctf_list_next (dmd))
1340 {
1341 if (strcmp (dmd->dmd_name, name) == 0)
1342 return (ctf_set_errno (fp, ECTF_DUPLICATE));
1343 }
1344
1345 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
1346 return (ctf_set_errno (fp, EAGAIN));
1347
1348 if ((s = strdup (name)) == NULL)
1349 {
1350 free (dmd);
1351 return (ctf_set_errno (fp, EAGAIN));
1352 }
1353
1354 dmd->dmd_name = s;
1355 dmd->dmd_type = CTF_ERR;
1356 dmd->dmd_offset = 0;
1357 dmd->dmd_value = value;
1358
1359 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
1360 ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
1361
1362 fp->ctf_flags |= LCTF_DIRTY;
1363
1364 return 0;
1365 }
1366
1367 int
1368 ctf_add_member_offset (ctf_file_t *fp, ctf_id_t souid, const char *name,
1369 ctf_id_t type, unsigned long bit_offset)
1370 {
1371 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, souid);
1372 ctf_dmdef_t *dmd;
1373
1374 ssize_t msize, malign, ssize;
1375 uint32_t kind, vlen, root;
1376 char *s = NULL;
1377
1378 if (!(fp->ctf_flags & LCTF_RDWR))
1379 return (ctf_set_errno (fp, ECTF_RDONLY));
1380
1381 if (dtd == NULL)
1382 return (ctf_set_errno (fp, ECTF_BADID));
1383
1384 if (name != NULL && name[0] == '\0')
1385 name = NULL;
1386
1387 kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1388 root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
1389 vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
1390
1391 if (kind != CTF_K_STRUCT && kind != CTF_K_UNION)
1392 return (ctf_set_errno (fp, ECTF_NOTSOU));
1393
1394 if (vlen == CTF_MAX_VLEN)
1395 return (ctf_set_errno (fp, ECTF_DTFULL));
1396
1397 if (name != NULL)
1398 {
1399 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
1400 dmd != NULL; dmd = ctf_list_next (dmd))
1401 {
1402 if (dmd->dmd_name != NULL && strcmp (dmd->dmd_name, name) == 0)
1403 return (ctf_set_errno (fp, ECTF_DUPLICATE));
1404 }
1405 }
1406
1407 if ((msize = ctf_type_size (fp, type)) < 0 ||
1408 (malign = ctf_type_align (fp, type)) < 0)
1409 {
1410 /* The unimplemented type, and any type that resolves to it, has no size
1411 and no alignment: it can correspond to any number of compiler-inserted
1412 types. */
1413
1414 if (ctf_errno (fp) == ECTF_NONREPRESENTABLE)
1415 {
1416 msize = 0;
1417 malign = 0;
1418 ctf_set_errno (fp, 0);
1419 }
1420 else
1421 return -1; /* errno is set for us. */
1422 }
1423
1424 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
1425 return (ctf_set_errno (fp, EAGAIN));
1426
1427 if (name != NULL && (s = strdup (name)) == NULL)
1428 {
1429 free (dmd);
1430 return (ctf_set_errno (fp, EAGAIN));
1431 }
1432
1433 dmd->dmd_name = s;
1434 dmd->dmd_type = type;
1435 dmd->dmd_value = -1;
1436
1437 if (kind == CTF_K_STRUCT && vlen != 0)
1438 {
1439 if (bit_offset == (unsigned long) - 1)
1440 {
1441 /* Natural alignment. */
1442
1443 ctf_dmdef_t *lmd = ctf_list_prev (&dtd->dtd_u.dtu_members);
1444 ctf_id_t ltype = ctf_type_resolve (fp, lmd->dmd_type);
1445 size_t off = lmd->dmd_offset;
1446
1447 ctf_encoding_t linfo;
1448 ssize_t lsize;
1449
1450 /* Propagate any error from ctf_type_resolve. If the last member was
1451 of unimplemented type, this may be -ECTF_NONREPRESENTABLE: we
1452 cannot insert right after such a member without explicit offset
1453 specification, because its alignment and size is not known. */
1454 if (ltype == CTF_ERR)
1455 {
1456 free (dmd);
1457 return -1; /* errno is set for us. */
1458 }
1459
1460 if (ctf_type_encoding (fp, ltype, &linfo) == 0)
1461 off += linfo.cte_bits;
1462 else if ((lsize = ctf_type_size (fp, ltype)) > 0)
1463 off += lsize * CHAR_BIT;
1464
1465 /* Round up the offset of the end of the last member to
1466 the next byte boundary, convert 'off' to bytes, and
1467 then round it up again to the next multiple of the
1468 alignment required by the new member. Finally,
1469 convert back to bits and store the result in
1470 dmd_offset. Technically we could do more efficient
1471 packing if the new member is a bit-field, but we're
1472 the "compiler" and ANSI says we can do as we choose. */
1473
1474 off = roundup (off, CHAR_BIT) / CHAR_BIT;
1475 off = roundup (off, MAX (malign, 1));
1476 dmd->dmd_offset = off * CHAR_BIT;
1477 ssize = off + msize;
1478 }
1479 else
1480 {
1481 /* Specified offset in bits. */
1482
1483 dmd->dmd_offset = bit_offset;
1484 ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
1485 ssize = MAX (ssize, ((signed) bit_offset / CHAR_BIT) + msize);
1486 }
1487 }
1488 else
1489 {
1490 dmd->dmd_offset = 0;
1491 ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
1492 ssize = MAX (ssize, msize);
1493 }
1494
1495 if ((size_t) ssize > CTF_MAX_SIZE)
1496 {
1497 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
1498 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (ssize);
1499 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (ssize);
1500 }
1501 else
1502 dtd->dtd_data.ctt_size = (uint32_t) ssize;
1503
1504 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
1505 ctf_list_append (&dtd->dtd_u.dtu_members, dmd);
1506
1507 fp->ctf_flags |= LCTF_DIRTY;
1508 return 0;
1509 }
1510
1511 int
1512 ctf_add_member_encoded (ctf_file_t *fp, ctf_id_t souid, const char *name,
1513 ctf_id_t type, unsigned long bit_offset,
1514 const ctf_encoding_t encoding)
1515 {
1516 ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
1517 int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
1518 int otype = type;
1519
1520 if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) && (kind != CTF_K_ENUM))
1521 return (ctf_set_errno (fp, ECTF_NOTINTFP));
1522
1523 if ((type = ctf_add_slice (fp, CTF_ADD_NONROOT, otype, &encoding)) == CTF_ERR)
1524 return -1; /* errno is set for us. */
1525
1526 return ctf_add_member_offset (fp, souid, name, type, bit_offset);
1527 }
1528
1529 int
1530 ctf_add_member (ctf_file_t *fp, ctf_id_t souid, const char *name,
1531 ctf_id_t type)
1532 {
1533 return ctf_add_member_offset (fp, souid, name, type, (unsigned long) - 1);
1534 }
1535
1536 int
1537 ctf_add_variable (ctf_file_t *fp, const char *name, ctf_id_t ref)
1538 {
1539 ctf_dvdef_t *dvd;
1540 ctf_file_t *tmp = fp;
1541
1542 if (!(fp->ctf_flags & LCTF_RDWR))
1543 return (ctf_set_errno (fp, ECTF_RDONLY));
1544
1545 if (ctf_dvd_lookup (fp, name) != NULL)
1546 return (ctf_set_errno (fp, ECTF_DUPLICATE));
1547
1548 if (ctf_lookup_by_id (&tmp, ref) == NULL)
1549 return -1; /* errno is set for us. */
1550
1551 /* Make sure this type is representable. */
1552 if ((ctf_type_resolve (fp, ref) == CTF_ERR)
1553 && (ctf_errno (fp) == ECTF_NONREPRESENTABLE))
1554 return -1;
1555
1556 if ((dvd = malloc (sizeof (ctf_dvdef_t))) == NULL)
1557 return (ctf_set_errno (fp, EAGAIN));
1558
1559 if (name != NULL && (dvd->dvd_name = strdup (name)) == NULL)
1560 {
1561 free (dvd);
1562 return (ctf_set_errno (fp, EAGAIN));
1563 }
1564 dvd->dvd_type = ref;
1565 dvd->dvd_snapshots = fp->ctf_snapshots;
1566
1567 if (ctf_dvd_insert (fp, dvd) < 0)
1568 {
1569 free (dvd->dvd_name);
1570 free (dvd);
1571 return -1; /* errno is set for us. */
1572 }
1573
1574 fp->ctf_flags |= LCTF_DIRTY;
1575 return 0;
1576 }
1577
1578 static int
1579 enumcmp (const char *name, int value, void *arg)
1580 {
1581 ctf_bundle_t *ctb = arg;
1582 int bvalue;
1583
1584 if (ctf_enum_value (ctb->ctb_file, ctb->ctb_type, name, &bvalue) < 0)
1585 {
1586 ctf_dprintf ("Conflict due to member %s iteration error: %s.\n", name,
1587 ctf_errmsg (ctf_errno (ctb->ctb_file)));
1588 return 1;
1589 }
1590 if (value != bvalue)
1591 {
1592 ctf_dprintf ("Conflict due to value change: %i versus %i\n",
1593 value, bvalue);
1594 return 1;
1595 }
1596 return 0;
1597 }
1598
1599 static int
1600 enumadd (const char *name, int value, void *arg)
1601 {
1602 ctf_bundle_t *ctb = arg;
1603
1604 return (ctf_add_enumerator (ctb->ctb_file, ctb->ctb_type,
1605 name, value) < 0);
1606 }
1607
1608 static int
1609 membcmp (const char *name, ctf_id_t type _libctf_unused_, unsigned long offset,
1610 void *arg)
1611 {
1612 ctf_bundle_t *ctb = arg;
1613 ctf_membinfo_t ctm;
1614
1615 /* Don't check nameless members (e.g. anonymous structs/unions) against each
1616 other. */
1617 if (name[0] == 0)
1618 return 0;
1619
1620 if (ctf_member_info (ctb->ctb_file, ctb->ctb_type, name, &ctm) < 0)
1621 {
1622 ctf_dprintf ("Conflict due to member %s iteration error: %s.\n", name,
1623 ctf_errmsg (ctf_errno (ctb->ctb_file)));
1624 return 1;
1625 }
1626 if (ctm.ctm_offset != offset)
1627 {
1628 ctf_dprintf ("Conflict due to member %s offset change: "
1629 "%lx versus %lx\n", name, ctm.ctm_offset, offset);
1630 return 1;
1631 }
1632 return 0;
1633 }
1634
1635 static int
1636 membadd (const char *name, ctf_id_t type, unsigned long offset, void *arg)
1637 {
1638 ctf_bundle_t *ctb = arg;
1639 ctf_dmdef_t *dmd;
1640 char *s = NULL;
1641
1642 if ((dmd = malloc (sizeof (ctf_dmdef_t))) == NULL)
1643 return (ctf_set_errno (ctb->ctb_file, EAGAIN));
1644
1645 if (name != NULL && (s = strdup (name)) == NULL)
1646 {
1647 free (dmd);
1648 return (ctf_set_errno (ctb->ctb_file, EAGAIN));
1649 }
1650
1651 /* For now, dmd_type is copied as the src_fp's type; it is reset to an
1652 equivalent dst_fp type by a final loop in ctf_add_type(), below. */
1653 dmd->dmd_name = s;
1654 dmd->dmd_type = type;
1655 dmd->dmd_offset = offset;
1656 dmd->dmd_value = -1;
1657
1658 ctf_list_append (&ctb->ctb_dtd->dtd_u.dtu_members, dmd);
1659
1660 ctb->ctb_file->ctf_flags |= LCTF_DIRTY;
1661 return 0;
1662 }
1663
1664 /* The ctf_add_type routine is used to copy a type from a source CTF container
1665 to a dynamic destination container. This routine operates recursively by
1666 following the source type's links and embedded member types. If the
1667 destination container already contains a named type which has the same
1668 attributes, then we succeed and return this type but no changes occur. */
1669 static ctf_id_t
1670 ctf_add_type_internal (ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type,
1671 ctf_file_t *proc_tracking_fp)
1672 {
1673 ctf_id_t dst_type = CTF_ERR;
1674 uint32_t dst_kind = CTF_K_UNKNOWN;
1675 ctf_file_t *tmp_fp = dst_fp;
1676 ctf_id_t tmp;
1677
1678 const char *name;
1679 uint32_t kind, forward_kind, flag, vlen;
1680
1681 const ctf_type_t *src_tp, *dst_tp;
1682 ctf_bundle_t src, dst;
1683 ctf_encoding_t src_en, dst_en;
1684 ctf_arinfo_t src_ar, dst_ar;
1685
1686 ctf_funcinfo_t ctc;
1687
1688 ctf_id_t orig_src_type = src_type;
1689
1690 if (!(dst_fp->ctf_flags & LCTF_RDWR))
1691 return (ctf_set_errno (dst_fp, ECTF_RDONLY));
1692
1693 if ((src_tp = ctf_lookup_by_id (&src_fp, src_type)) == NULL)
1694 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
1695
1696 if ((ctf_type_resolve (src_fp, src_type) == CTF_ERR)
1697 && (ctf_errno (src_fp) == ECTF_NONREPRESENTABLE))
1698 return (ctf_set_errno (dst_fp, ECTF_NONREPRESENTABLE));
1699
1700 name = ctf_strptr (src_fp, src_tp->ctt_name);
1701 kind = LCTF_INFO_KIND (src_fp, src_tp->ctt_info);
1702 flag = LCTF_INFO_ISROOT (src_fp, src_tp->ctt_info);
1703 vlen = LCTF_INFO_VLEN (src_fp, src_tp->ctt_info);
1704
1705 /* If this is a type we are currently in the middle of adding, hand it
1706 straight back. (This lets us handle self-referential structures without
1707 considering forwards and empty structures the same as their completed
1708 forms.) */
1709
1710 tmp = ctf_type_mapping (src_fp, src_type, &tmp_fp);
1711
1712 if (tmp != 0)
1713 {
1714 if (ctf_dynhash_lookup (proc_tracking_fp->ctf_add_processing,
1715 (void *) (uintptr_t) src_type))
1716 return tmp;
1717
1718 /* If this type has already been added from this container, and is the same
1719 kind and (if a struct or union) has the same number of members, hand it
1720 straight back. */
1721
1722 if (ctf_type_kind_unsliced (tmp_fp, tmp) == (int) kind)
1723 {
1724 if (kind == CTF_K_STRUCT || kind == CTF_K_UNION
1725 || kind == CTF_K_ENUM)
1726 {
1727 if ((dst_tp = ctf_lookup_by_id (&tmp_fp, dst_type)) != NULL)
1728 if (vlen == LCTF_INFO_VLEN (tmp_fp, dst_tp->ctt_info))
1729 return tmp;
1730 }
1731 else
1732 return tmp;
1733 }
1734 }
1735
1736 forward_kind = kind;
1737 if (kind == CTF_K_FORWARD)
1738 forward_kind = src_tp->ctt_type;
1739
1740 /* If the source type has a name and is a root type (visible at the
1741 top-level scope), lookup the name in the destination container and
1742 verify that it is of the same kind before we do anything else. */
1743
1744 if ((flag & CTF_ADD_ROOT) && name[0] != '\0'
1745 && (tmp = ctf_lookup_by_rawname (dst_fp, forward_kind, name)) != 0)
1746 {
1747 dst_type = tmp;
1748 dst_kind = ctf_type_kind_unsliced (dst_fp, dst_type);
1749 }
1750
1751 /* If an identically named dst_type exists, fail with ECTF_CONFLICT
1752 unless dst_type is a forward declaration and src_type is a struct,
1753 union, or enum (i.e. the definition of the previous forward decl).
1754
1755 We also allow addition in the opposite order (addition of a forward when a
1756 struct, union, or enum already exists), which is a NOP and returns the
1757 already-present struct, union, or enum. */
1758
1759 if (dst_type != CTF_ERR && dst_kind != kind)
1760 {
1761 if (kind == CTF_K_FORWARD
1762 && (dst_kind == CTF_K_ENUM || dst_kind == CTF_K_STRUCT
1763 || dst_kind == CTF_K_UNION))
1764 {
1765 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
1766 return dst_type;
1767 }
1768
1769 if (dst_kind != CTF_K_FORWARD
1770 || (kind != CTF_K_ENUM && kind != CTF_K_STRUCT
1771 && kind != CTF_K_UNION))
1772 {
1773 ctf_dprintf ("Conflict for type %s: kinds differ, new: %i; "
1774 "old (ID %lx): %i\n", name, kind, dst_type, dst_kind);
1775 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1776 }
1777 }
1778
1779 /* We take special action for an integer, float, or slice since it is
1780 described not only by its name but also its encoding. For integers,
1781 bit-fields exploit this degeneracy. */
1782
1783 if (kind == CTF_K_INTEGER || kind == CTF_K_FLOAT || kind == CTF_K_SLICE)
1784 {
1785 if (ctf_type_encoding (src_fp, src_type, &src_en) != 0)
1786 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
1787
1788 if (dst_type != CTF_ERR)
1789 {
1790 ctf_file_t *fp = dst_fp;
1791
1792 if ((dst_tp = ctf_lookup_by_id (&fp, dst_type)) == NULL)
1793 return CTF_ERR;
1794
1795 if (ctf_type_encoding (dst_fp, dst_type, &dst_en) != 0)
1796 return CTF_ERR; /* errno set for us. */
1797
1798 if (LCTF_INFO_ISROOT (fp, dst_tp->ctt_info) & CTF_ADD_ROOT)
1799 {
1800 /* The type that we found in the hash is also root-visible. If
1801 the two types match then use the existing one; otherwise,
1802 declare a conflict. Note: slices are not certain to match
1803 even if there is no conflict: we must check the contained type
1804 too. */
1805
1806 if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
1807 {
1808 if (kind != CTF_K_SLICE)
1809 {
1810 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
1811 return dst_type;
1812 }
1813 }
1814 else
1815 {
1816 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1817 }
1818 }
1819 else
1820 {
1821 /* We found a non-root-visible type in the hash. If its encoding
1822 is the same, we can reuse it, unless it is a slice. */
1823
1824 if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
1825 {
1826 if (kind != CTF_K_SLICE)
1827 {
1828 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
1829 return dst_type;
1830 }
1831 }
1832 }
1833 }
1834 }
1835
1836 src.ctb_file = src_fp;
1837 src.ctb_type = src_type;
1838 src.ctb_dtd = NULL;
1839
1840 dst.ctb_file = dst_fp;
1841 dst.ctb_type = dst_type;
1842 dst.ctb_dtd = NULL;
1843
1844 /* Now perform kind-specific processing. If dst_type is CTF_ERR, then we add
1845 a new type with the same properties as src_type to dst_fp. If dst_type is
1846 not CTF_ERR, then we verify that dst_type has the same attributes as
1847 src_type. We recurse for embedded references. Before we start, we note
1848 that we are processing this type, to prevent infinite recursion: we do not
1849 re-process any type that appears in this list. The list is emptied
1850 wholesale at the end of processing everything in this recursive stack. */
1851
1852 if (ctf_dynhash_insert (proc_tracking_fp->ctf_add_processing,
1853 (void *) (uintptr_t) src_type, (void *) 1) < 0)
1854 return ctf_set_errno (dst_fp, ENOMEM);
1855
1856 switch (kind)
1857 {
1858 case CTF_K_INTEGER:
1859 /* If we found a match we will have either returned it or declared a
1860 conflict. */
1861 dst_type = ctf_add_integer (dst_fp, flag, name, &src_en);
1862 break;
1863
1864 case CTF_K_FLOAT:
1865 /* If we found a match we will have either returned it or declared a
1866 conflict. */
1867 dst_type = ctf_add_float (dst_fp, flag, name, &src_en);
1868 break;
1869
1870 case CTF_K_SLICE:
1871 /* We have checked for conflicting encodings: now try to add the
1872 contained type. */
1873 src_type = ctf_type_reference (src_fp, src_type);
1874 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
1875 proc_tracking_fp);
1876
1877 if (src_type == CTF_ERR)
1878 return CTF_ERR; /* errno is set for us. */
1879
1880 dst_type = ctf_add_slice (dst_fp, flag, src_type, &src_en);
1881 break;
1882
1883 case CTF_K_POINTER:
1884 case CTF_K_VOLATILE:
1885 case CTF_K_CONST:
1886 case CTF_K_RESTRICT:
1887 src_type = ctf_type_reference (src_fp, src_type);
1888 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
1889 proc_tracking_fp);
1890
1891 if (src_type == CTF_ERR)
1892 return CTF_ERR; /* errno is set for us. */
1893
1894 dst_type = ctf_add_reftype (dst_fp, flag, src_type, kind);
1895 break;
1896
1897 case CTF_K_ARRAY:
1898 if (ctf_array_info (src_fp, src_type, &src_ar) != 0)
1899 return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
1900
1901 src_ar.ctr_contents =
1902 ctf_add_type_internal (dst_fp, src_fp, src_ar.ctr_contents,
1903 proc_tracking_fp);
1904 src_ar.ctr_index = ctf_add_type_internal (dst_fp, src_fp,
1905 src_ar.ctr_index,
1906 proc_tracking_fp);
1907 src_ar.ctr_nelems = src_ar.ctr_nelems;
1908
1909 if (src_ar.ctr_contents == CTF_ERR || src_ar.ctr_index == CTF_ERR)
1910 return CTF_ERR; /* errno is set for us. */
1911
1912 if (dst_type != CTF_ERR)
1913 {
1914 if (ctf_array_info (dst_fp, dst_type, &dst_ar) != 0)
1915 return CTF_ERR; /* errno is set for us. */
1916
1917 if (memcmp (&src_ar, &dst_ar, sizeof (ctf_arinfo_t)))
1918 {
1919 ctf_dprintf ("Conflict for type %s against ID %lx: "
1920 "array info differs, old %lx/%lx/%x; "
1921 "new: %lx/%lx/%x\n", name, dst_type,
1922 src_ar.ctr_contents, src_ar.ctr_index,
1923 src_ar.ctr_nelems, dst_ar.ctr_contents,
1924 dst_ar.ctr_index, dst_ar.ctr_nelems);
1925 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1926 }
1927 }
1928 else
1929 dst_type = ctf_add_array (dst_fp, flag, &src_ar);
1930 break;
1931
1932 case CTF_K_FUNCTION:
1933 ctc.ctc_return = ctf_add_type_internal (dst_fp, src_fp,
1934 src_tp->ctt_type,
1935 proc_tracking_fp);
1936 ctc.ctc_argc = 0;
1937 ctc.ctc_flags = 0;
1938
1939 if (ctc.ctc_return == CTF_ERR)
1940 return CTF_ERR; /* errno is set for us. */
1941
1942 dst_type = ctf_add_function (dst_fp, flag, &ctc, NULL);
1943 break;
1944
1945 case CTF_K_STRUCT:
1946 case CTF_K_UNION:
1947 {
1948 ctf_dmdef_t *dmd;
1949 int errs = 0;
1950 size_t size;
1951 ssize_t ssize;
1952 ctf_dtdef_t *dtd;
1953
1954 /* Technically to match a struct or union we need to check both
1955 ways (src members vs. dst, dst members vs. src) but we make
1956 this more optimal by only checking src vs. dst and comparing
1957 the total size of the structure (which we must do anyway)
1958 which covers the possibility of dst members not in src.
1959 This optimization can be defeated for unions, but is so
1960 pathological as to render it irrelevant for our purposes. */
1961
1962 if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
1963 && dst_kind != CTF_K_FORWARD)
1964 {
1965 if (ctf_type_size (src_fp, src_type) !=
1966 ctf_type_size (dst_fp, dst_type))
1967 {
1968 ctf_dprintf ("Conflict for type %s against ID %lx: "
1969 "union size differs, old %li, new %li\n",
1970 name, dst_type,
1971 (long) ctf_type_size (src_fp, src_type),
1972 (long) ctf_type_size (dst_fp, dst_type));
1973 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1974 }
1975
1976 if (ctf_member_iter (src_fp, src_type, membcmp, &dst))
1977 {
1978 ctf_dprintf ("Conflict for type %s against ID %lx: "
1979 "members differ, see above\n", name, dst_type);
1980 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
1981 }
1982
1983 break;
1984 }
1985
1986 /* Unlike the other cases, copying structs and unions is done
1987 manually so as to avoid repeated lookups in ctf_add_member
1988 and to ensure the exact same member offsets as in src_type. */
1989
1990 dst_type = ctf_add_generic (dst_fp, flag, name, kind, &dtd);
1991 if (dst_type == CTF_ERR)
1992 return CTF_ERR; /* errno is set for us. */
1993
1994 dst.ctb_type = dst_type;
1995 dst.ctb_dtd = dtd;
1996
1997 /* Pre-emptively add this struct to the type mapping so that
1998 structures that refer to themselves work. */
1999 ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
2000
2001 if (ctf_member_iter (src_fp, src_type, membadd, &dst) != 0)
2002 errs++; /* Increment errs and fail at bottom of case. */
2003
2004 if ((ssize = ctf_type_size (src_fp, src_type)) < 0)
2005 return CTF_ERR; /* errno is set for us. */
2006
2007 size = (size_t) ssize;
2008 if (size > CTF_MAX_SIZE)
2009 {
2010 dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
2011 dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
2012 dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
2013 }
2014 else
2015 dtd->dtd_data.ctt_size = (uint32_t) size;
2016
2017 dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, vlen);
2018
2019 /* Make a final pass through the members changing each dmd_type (a
2020 src_fp type) to an equivalent type in dst_fp. We pass through all
2021 members, leaving any that fail set to CTF_ERR, unless they fail
2022 because they are marking a member of type not representable in this
2023 version of CTF, in which case we just want to silently omit them:
2024 no consumer can do anything with them anyway. */
2025 for (dmd = ctf_list_next (&dtd->dtd_u.dtu_members);
2026 dmd != NULL; dmd = ctf_list_next (dmd))
2027 {
2028 ctf_file_t *dst = dst_fp;
2029 ctf_id_t memb_type;
2030
2031 memb_type = ctf_type_mapping (src_fp, dmd->dmd_type, &dst);
2032 if (memb_type == 0)
2033 {
2034 if ((dmd->dmd_type =
2035 ctf_add_type_internal (dst_fp, src_fp, dmd->dmd_type,
2036 proc_tracking_fp)) == CTF_ERR)
2037 {
2038 if (ctf_errno (dst_fp) != ECTF_NONREPRESENTABLE)
2039 errs++;
2040 }
2041 }
2042 else
2043 dmd->dmd_type = memb_type;
2044 }
2045
2046 if (errs)
2047 return CTF_ERR; /* errno is set for us. */
2048 break;
2049 }
2050
2051 case CTF_K_ENUM:
2052 if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
2053 && dst_kind != CTF_K_FORWARD)
2054 {
2055 if (ctf_enum_iter (src_fp, src_type, enumcmp, &dst)
2056 || ctf_enum_iter (dst_fp, dst_type, enumcmp, &src))
2057 {
2058 ctf_dprintf ("Conflict for enum %s against ID %lx: "
2059 "members differ, see above\n", name, dst_type);
2060 return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
2061 }
2062 }
2063 else
2064 {
2065 dst_type = ctf_add_enum (dst_fp, flag, name);
2066 if ((dst.ctb_type = dst_type) == CTF_ERR
2067 || ctf_enum_iter (src_fp, src_type, enumadd, &dst))
2068 return CTF_ERR; /* errno is set for us */
2069 }
2070 break;
2071
2072 case CTF_K_FORWARD:
2073 if (dst_type == CTF_ERR)
2074 dst_type = ctf_add_forward (dst_fp, flag, name, forward_kind);
2075 break;
2076
2077 case CTF_K_TYPEDEF:
2078 src_type = ctf_type_reference (src_fp, src_type);
2079 src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
2080 proc_tracking_fp);
2081
2082 if (src_type == CTF_ERR)
2083 return CTF_ERR; /* errno is set for us. */
2084
2085 /* If dst_type is not CTF_ERR at this point, we should check if
2086 ctf_type_reference(dst_fp, dst_type) != src_type and if so fail with
2087 ECTF_CONFLICT. However, this causes problems with bitness typedefs
2088 that vary based on things like if 32-bit then pid_t is int otherwise
2089 long. We therefore omit this check and assume that if the identically
2090 named typedef already exists in dst_fp, it is correct or
2091 equivalent. */
2092
2093 if (dst_type == CTF_ERR)
2094 dst_type = ctf_add_typedef (dst_fp, flag, name, src_type);
2095
2096 break;
2097
2098 default:
2099 return (ctf_set_errno (dst_fp, ECTF_CORRUPT));
2100 }
2101
2102 if (dst_type != CTF_ERR)
2103 ctf_add_type_mapping (src_fp, orig_src_type, dst_fp, dst_type);
2104 return dst_type;
2105 }
2106
2107 ctf_id_t
2108 ctf_add_type (ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type)
2109 {
2110 ctf_id_t id;
2111
2112 if (!src_fp->ctf_add_processing)
2113 src_fp->ctf_add_processing = ctf_dynhash_create (ctf_hash_integer,
2114 ctf_hash_eq_integer,
2115 NULL, NULL);
2116
2117 /* We store the hash on the source, because it contains only source type IDs:
2118 but callers will invariably expect errors to appear on the dest. */
2119 if (!src_fp->ctf_add_processing)
2120 return (ctf_set_errno (dst_fp, ENOMEM));
2121
2122 id = ctf_add_type_internal (dst_fp, src_fp, src_type, src_fp);
2123 ctf_dynhash_empty (src_fp->ctf_add_processing);
2124
2125 return id;
2126 }
2127
2128 /* Write the compressed CTF data stream to the specified gzFile descriptor. */
2129 int
2130 ctf_gzwrite (ctf_file_t *fp, gzFile fd)
2131 {
2132 const unsigned char *buf;
2133 ssize_t resid;
2134 ssize_t len;
2135
2136 resid = sizeof (ctf_header_t);
2137 buf = (unsigned char *) fp->ctf_header;
2138 while (resid != 0)
2139 {
2140 if ((len = gzwrite (fd, buf, resid)) <= 0)
2141 return (ctf_set_errno (fp, errno));
2142 resid -= len;
2143 buf += len;
2144 }
2145
2146 resid = fp->ctf_size;
2147 buf = fp->ctf_buf;
2148 while (resid != 0)
2149 {
2150 if ((len = gzwrite (fd, buf, resid)) <= 0)
2151 return (ctf_set_errno (fp, errno));
2152 resid -= len;
2153 buf += len;
2154 }
2155
2156 return 0;
2157 }
2158
2159 /* Compress the specified CTF data stream and write it to the specified file
2160 descriptor. */
2161 int
2162 ctf_compress_write (ctf_file_t *fp, int fd)
2163 {
2164 unsigned char *buf;
2165 unsigned char *bp;
2166 ctf_header_t h;
2167 ctf_header_t *hp = &h;
2168 ssize_t header_len = sizeof (ctf_header_t);
2169 ssize_t compress_len;
2170 ssize_t len;
2171 int rc;
2172 int err = 0;
2173
2174 if (ctf_serialize (fp) < 0)
2175 return -1; /* errno is set for us. */
2176
2177 memcpy (hp, fp->ctf_header, header_len);
2178 hp->cth_flags |= CTF_F_COMPRESS;
2179 compress_len = compressBound (fp->ctf_size);
2180
2181 if ((buf = malloc (compress_len)) == NULL)
2182 return (ctf_set_errno (fp, ECTF_ZALLOC));
2183
2184 if ((rc = compress (buf, (uLongf *) &compress_len,
2185 fp->ctf_buf, fp->ctf_size)) != Z_OK)
2186 {
2187 ctf_dprintf ("zlib deflate err: %s\n", zError (rc));
2188 err = ctf_set_errno (fp, ECTF_COMPRESS);
2189 goto ret;
2190 }
2191
2192 while (header_len > 0)
2193 {
2194 if ((len = write (fd, hp, header_len)) < 0)
2195 {
2196 err = ctf_set_errno (fp, errno);
2197 goto ret;
2198 }
2199 header_len -= len;
2200 hp += len;
2201 }
2202
2203 bp = buf;
2204 while (compress_len > 0)
2205 {
2206 if ((len = write (fd, bp, compress_len)) < 0)
2207 {
2208 err = ctf_set_errno (fp, errno);
2209 goto ret;
2210 }
2211 compress_len -= len;
2212 bp += len;
2213 }
2214
2215 ret:
2216 free (buf);
2217 return err;
2218 }
2219
2220 /* Optionally compress the specified CTF data stream and return it as a new
2221 dynamically-allocated string. */
2222 unsigned char *
2223 ctf_write_mem (ctf_file_t *fp, size_t *size, size_t threshold)
2224 {
2225 unsigned char *buf;
2226 unsigned char *bp;
2227 ctf_header_t *hp;
2228 ssize_t header_len = sizeof (ctf_header_t);
2229 ssize_t compress_len;
2230 int rc;
2231
2232 if (ctf_serialize (fp) < 0)
2233 return NULL; /* errno is set for us. */
2234
2235 compress_len = compressBound (fp->ctf_size);
2236 if (fp->ctf_size < threshold)
2237 compress_len = fp->ctf_size;
2238 if ((buf = malloc (compress_len
2239 + sizeof (struct ctf_header))) == NULL)
2240 {
2241 ctf_set_errno (fp, ENOMEM);
2242 return NULL;
2243 }
2244
2245 hp = (ctf_header_t *) buf;
2246 memcpy (hp, fp->ctf_header, header_len);
2247 bp = buf + sizeof (struct ctf_header);
2248 *size = sizeof (struct ctf_header);
2249
2250 if (fp->ctf_size < threshold)
2251 {
2252 hp->cth_flags &= ~CTF_F_COMPRESS;
2253 memcpy (bp, fp->ctf_buf, fp->ctf_size);
2254 *size += fp->ctf_size;
2255 }
2256 else
2257 {
2258 hp->cth_flags |= CTF_F_COMPRESS;
2259 if ((rc = compress (bp, (uLongf *) &compress_len,
2260 fp->ctf_buf, fp->ctf_size)) != Z_OK)
2261 {
2262 ctf_dprintf ("zlib deflate err: %s\n", zError (rc));
2263 ctf_set_errno (fp, ECTF_COMPRESS);
2264 free (buf);
2265 return NULL;
2266 }
2267 *size += compress_len;
2268 }
2269 return buf;
2270 }
2271
2272 /* Write the uncompressed CTF data stream to the specified file descriptor. */
2273 int
2274 ctf_write (ctf_file_t *fp, int fd)
2275 {
2276 const unsigned char *buf;
2277 ssize_t resid;
2278 ssize_t len;
2279
2280 if (ctf_serialize (fp) < 0)
2281 return -1; /* errno is set for us. */
2282
2283 resid = sizeof (ctf_header_t);
2284 buf = (unsigned char *) fp->ctf_header;
2285 while (resid != 0)
2286 {
2287 if ((len = write (fd, buf, resid)) <= 0)
2288 return (ctf_set_errno (fp, errno));
2289 resid -= len;
2290 buf += len;
2291 }
2292
2293 resid = fp->ctf_size;
2294 buf = fp->ctf_buf;
2295 while (resid != 0)
2296 {
2297 if ((len = write (fd, buf, resid)) <= 0)
2298 return (ctf_set_errno (fp, errno));
2299 resid -= len;
2300 buf += len;
2301 }
2302
2303 return 0;
2304 }
This page took 0.09959 seconds and 4 git commands to generate.