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