Remove path name from test case
[binutils-gdb.git] / libctf / ctf-serialize.c
1 /* CTF dict creation.
2 Copyright (C) 2019-2023 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 <assert.h>
22 #include <string.h>
23 #include <unistd.h>
24 #include <zlib.h>
25
26 #include <elf.h>
27 #include "elf-bfd.h"
28
29 /* Symtypetab sections. */
30
31 /* Symtypetab emission flags. */
32
33 #define CTF_SYMTYPETAB_EMIT_FUNCTION 0x1
34 #define CTF_SYMTYPETAB_EMIT_PAD 0x2
35 #define CTF_SYMTYPETAB_FORCE_INDEXED 0x4
36
37 /* Properties of symtypetab emission, shared by symtypetab section
38 sizing and symtypetab emission itself. */
39
40 typedef struct emit_symtypetab_state
41 {
42 /* True if linker-reported symbols are being filtered out. symfp is set if
43 this is true: otherwise, indexing is forced and the symflags indicate as
44 much. */
45 int filter_syms;
46
47 /* True if symbols are being sorted. */
48 int sort_syms;
49
50 /* Flags for symtypetab emission. */
51 int symflags;
52
53 /* The dict to which the linker has reported symbols. */
54 ctf_dict_t *symfp;
55
56 /* The maximum number of objects seen. */
57 size_t maxobjt;
58
59 /* The maximum number of func info entris seen. */
60 size_t maxfunc;
61 } emit_symtypetab_state_t;
62
63 /* Determine if a symbol is "skippable" and should never appear in the
64 symtypetab sections. */
65
66 int
67 ctf_symtab_skippable (ctf_link_sym_t *sym)
68 {
69 /* Never skip symbols whose name is not yet known. */
70 if (sym->st_nameidx_set)
71 return 0;
72
73 return (sym->st_name == NULL || sym->st_name[0] == 0
74 || sym->st_shndx == SHN_UNDEF
75 || strcmp (sym->st_name, "_START_") == 0
76 || strcmp (sym->st_name, "_END_") == 0
77 || (sym->st_type == STT_OBJECT && sym->st_shndx == SHN_EXTABS
78 && sym->st_value == 0));
79 }
80
81 /* Get the number of symbols in a symbol hash, the count of symbols, the maximum
82 seen, the eventual size, without any padding elements, of the func/data and
83 (if generated) index sections, and the size of accumulated padding elements.
84 The linker-reported set of symbols is found in SYMFP: it may be NULL if
85 symbol filtering is not desired, in which case CTF_SYMTYPETAB_FORCE_INDEXED
86 will always be set in the flags.
87
88 Also figure out if any symbols need to be moved to the variable section, and
89 add them (if not already present). */
90
91 _libctf_nonnull_ ((1,3,4,5,6,7,8))
92 static int
93 symtypetab_density (ctf_dict_t *fp, ctf_dict_t *symfp, ctf_dynhash_t *symhash,
94 size_t *count, size_t *max, size_t *unpadsize,
95 size_t *padsize, size_t *idxsize, int flags)
96 {
97 ctf_next_t *i = NULL;
98 const void *name;
99 const void *ctf_sym;
100 ctf_dynhash_t *linker_known = NULL;
101 int err;
102 int beyond_max = 0;
103
104 *count = 0;
105 *max = 0;
106 *unpadsize = 0;
107 *idxsize = 0;
108 *padsize = 0;
109
110 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
111 {
112 /* Make a dynhash citing only symbols reported by the linker of the
113 appropriate type, then traverse all potential-symbols we know the types
114 of, removing them from linker_known as we go. Once this is done, the
115 only symbols remaining in linker_known are symbols we don't know the
116 types of: we must emit pads for those symbols that are below the
117 maximum symbol we will emit (any beyond that are simply skipped).
118
119 If there are none, this symtypetab will be empty: just report that. */
120
121 if (!symfp->ctf_dynsyms)
122 return 0;
123
124 if ((linker_known = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
125 NULL, NULL)) == NULL)
126 return (ctf_set_errno (fp, ENOMEM));
127
128 while ((err = ctf_dynhash_cnext (symfp->ctf_dynsyms, &i,
129 &name, &ctf_sym)) == 0)
130 {
131 ctf_link_sym_t *sym = (ctf_link_sym_t *) ctf_sym;
132
133 if (((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
134 && sym->st_type != STT_FUNC)
135 || (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
136 && sym->st_type != STT_OBJECT))
137 continue;
138
139 if (ctf_symtab_skippable (sym))
140 continue;
141
142 /* This should only be true briefly before all the names are
143 finalized, long before we get this far. */
144 if (!ctf_assert (fp, !sym->st_nameidx_set))
145 return -1; /* errno is set for us. */
146
147 if (ctf_dynhash_cinsert (linker_known, name, ctf_sym) < 0)
148 {
149 ctf_dynhash_destroy (linker_known);
150 return (ctf_set_errno (fp, ENOMEM));
151 }
152 }
153 if (err != ECTF_NEXT_END)
154 {
155 ctf_err_warn (fp, 0, err, _("iterating over linker-known symbols during "
156 "serialization"));
157 ctf_dynhash_destroy (linker_known);
158 return (ctf_set_errno (fp, err));
159 }
160 }
161
162 while ((err = ctf_dynhash_cnext (symhash, &i, &name, NULL)) == 0)
163 {
164 ctf_link_sym_t *sym;
165
166 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
167 {
168 /* Linker did not report symbol in symtab. Remove it from the
169 set of known data symbols and continue. */
170 if ((sym = ctf_dynhash_lookup (symfp->ctf_dynsyms, name)) == NULL)
171 {
172 ctf_dynhash_remove (symhash, name);
173 continue;
174 }
175
176 /* We don't remove skippable symbols from the symhash because we don't
177 want them to be migrated into variables. */
178 if (ctf_symtab_skippable (sym))
179 continue;
180
181 if ((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
182 && sym->st_type != STT_FUNC)
183 {
184 ctf_err_warn (fp, 1, 0, _("symbol %s (%x) added to CTF as a "
185 "function but is of type %x. "
186 "The symbol type lookup tables "
187 "are probably corrupted"),
188 sym->st_name, sym->st_symidx, sym->st_type);
189 ctf_dynhash_remove (symhash, name);
190 continue;
191 }
192 else if (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
193 && sym->st_type != STT_OBJECT)
194 {
195 ctf_err_warn (fp, 1, 0, _("symbol %s (%x) added to CTF as a "
196 "data object but is of type %x. "
197 "The symbol type lookup tables "
198 "are probably corrupted"),
199 sym->st_name, sym->st_symidx, sym->st_type);
200 ctf_dynhash_remove (symhash, name);
201 continue;
202 }
203
204 ctf_dynhash_remove (linker_known, name);
205 }
206 *unpadsize += sizeof (uint32_t);
207 (*count)++;
208
209 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
210 {
211 if (*max < sym->st_symidx)
212 *max = sym->st_symidx;
213 }
214 else
215 (*max)++;
216 }
217 if (err != ECTF_NEXT_END)
218 {
219 ctf_err_warn (fp, 0, err, _("iterating over CTF symtypetab during "
220 "serialization"));
221 ctf_dynhash_destroy (linker_known);
222 return (ctf_set_errno (fp, err));
223 }
224
225 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
226 {
227 while ((err = ctf_dynhash_cnext (linker_known, &i, NULL, &ctf_sym)) == 0)
228 {
229 ctf_link_sym_t *sym = (ctf_link_sym_t *) ctf_sym;
230
231 if (sym->st_symidx > *max)
232 beyond_max++;
233 }
234 if (err != ECTF_NEXT_END)
235 {
236 ctf_err_warn (fp, 0, err, _("iterating over linker-known symbols "
237 "during CTF serialization"));
238 ctf_dynhash_destroy (linker_known);
239 return (ctf_set_errno (fp, err));
240 }
241 }
242
243 *idxsize = *count * sizeof (uint32_t);
244 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
245 *padsize = (ctf_dynhash_elements (linker_known) - beyond_max) * sizeof (uint32_t);
246
247 ctf_dynhash_destroy (linker_known);
248 return 0;
249 }
250
251 /* Emit an objt or func symtypetab into DP in a particular order defined by an
252 array of ctf_link_sym_t or symbol names passed in. The index has NIDX
253 elements in it: unindexed output would terminate at symbol OUTMAX and is in
254 any case no larger than SIZE bytes. Some index elements are expected to be
255 skipped: see symtypetab_density. The linker-reported set of symbols (if any)
256 is found in SYMFP. */
257 static int
258 emit_symtypetab (ctf_dict_t *fp, ctf_dict_t *symfp, uint32_t *dp,
259 ctf_link_sym_t **idx, const char **nameidx, uint32_t nidx,
260 uint32_t outmax, int size, int flags)
261 {
262 uint32_t i;
263 uint32_t *dpp = dp;
264 ctf_dynhash_t *symhash;
265
266 ctf_dprintf ("Emitting table of size %i, outmax %u, %u symtypetab entries, "
267 "flags %i\n", size, outmax, nidx, flags);
268
269 /* Empty table? Nothing to do. */
270 if (size == 0)
271 return 0;
272
273 if (flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
274 symhash = fp->ctf_funchash;
275 else
276 symhash = fp->ctf_objthash;
277
278 for (i = 0; i < nidx; i++)
279 {
280 const char *sym_name;
281 void *type;
282
283 /* If we have a linker-reported set of symbols, we may be given that set
284 to work from, or a set of symbol names. In both cases we want to look
285 at the corresponding linker-reported symbol (if any). */
286 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
287 {
288 ctf_link_sym_t *this_link_sym;
289
290 if (idx)
291 this_link_sym = idx[i];
292 else
293 this_link_sym = ctf_dynhash_lookup (symfp->ctf_dynsyms, nameidx[i]);
294
295 /* Unreported symbol number. No pad, no nothing. */
296 if (!this_link_sym)
297 continue;
298
299 /* Symbol of the wrong type, or skippable? This symbol is not in this
300 table. */
301 if (((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
302 && this_link_sym->st_type != STT_FUNC)
303 || (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
304 && this_link_sym->st_type != STT_OBJECT))
305 continue;
306
307 if (ctf_symtab_skippable (this_link_sym))
308 continue;
309
310 sym_name = this_link_sym->st_name;
311
312 /* Linker reports symbol of a different type to the symbol we actually
313 added? Skip the symbol. No pad, since the symbol doesn't actually
314 belong in this table at all. (Warned about in
315 symtypetab_density.) */
316 if ((this_link_sym->st_type == STT_FUNC)
317 && (ctf_dynhash_lookup (fp->ctf_objthash, sym_name)))
318 continue;
319
320 if ((this_link_sym->st_type == STT_OBJECT)
321 && (ctf_dynhash_lookup (fp->ctf_funchash, sym_name)))
322 continue;
323 }
324 else
325 sym_name = nameidx[i];
326
327 /* Symbol in index but no type set? Silently skip and (optionally)
328 pad. (In force-indexed mode, this is also where we track symbols of
329 the wrong type for this round of insertion.) */
330 if ((type = ctf_dynhash_lookup (symhash, sym_name)) == NULL)
331 {
332 if (flags & CTF_SYMTYPETAB_EMIT_PAD)
333 *dpp++ = 0;
334 continue;
335 }
336
337 if (!ctf_assert (fp, (((char *) dpp) - (char *) dp) < size))
338 return -1; /* errno is set for us. */
339
340 *dpp++ = (ctf_id_t) (uintptr_t) type;
341
342 /* When emitting unindexed output, all later symbols are pads: stop
343 early. */
344 if ((flags & CTF_SYMTYPETAB_EMIT_PAD) && idx[i]->st_symidx == outmax)
345 break;
346 }
347
348 return 0;
349 }
350
351 /* Emit an objt or func symtypetab index into DP in a paticular order defined by
352 an array of symbol names passed in. Stop at NIDX. The linker-reported set
353 of symbols (if any) is found in SYMFP. */
354 static int
355 emit_symtypetab_index (ctf_dict_t *fp, ctf_dict_t *symfp, uint32_t *dp,
356 const char **idx, uint32_t nidx, int size, int flags)
357 {
358 uint32_t i;
359 uint32_t *dpp = dp;
360 ctf_dynhash_t *symhash;
361
362 ctf_dprintf ("Emitting index of size %i, %u entries reported by linker, "
363 "flags %i\n", size, nidx, flags);
364
365 /* Empty table? Nothing to do. */
366 if (size == 0)
367 return 0;
368
369 if (flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
370 symhash = fp->ctf_funchash;
371 else
372 symhash = fp->ctf_objthash;
373
374 /* Indexes should always be unpadded. */
375 if (!ctf_assert (fp, !(flags & CTF_SYMTYPETAB_EMIT_PAD)))
376 return -1; /* errno is set for us. */
377
378 for (i = 0; i < nidx; i++)
379 {
380 const char *sym_name;
381 void *type;
382
383 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
384 {
385 ctf_link_sym_t *this_link_sym;
386
387 this_link_sym = ctf_dynhash_lookup (symfp->ctf_dynsyms, idx[i]);
388
389 /* This is an index: unreported symbols should never appear in it. */
390 if (!ctf_assert (fp, this_link_sym != NULL))
391 return -1; /* errno is set for us. */
392
393 /* Symbol of the wrong type, or skippable? This symbol is not in this
394 table. */
395 if (((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
396 && this_link_sym->st_type != STT_FUNC)
397 || (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
398 && this_link_sym->st_type != STT_OBJECT))
399 continue;
400
401 if (ctf_symtab_skippable (this_link_sym))
402 continue;
403
404 sym_name = this_link_sym->st_name;
405
406 /* Linker reports symbol of a different type to the symbol we actually
407 added? Skip the symbol. */
408 if ((this_link_sym->st_type == STT_FUNC)
409 && (ctf_dynhash_lookup (fp->ctf_objthash, sym_name)))
410 continue;
411
412 if ((this_link_sym->st_type == STT_OBJECT)
413 && (ctf_dynhash_lookup (fp->ctf_funchash, sym_name)))
414 continue;
415 }
416 else
417 sym_name = idx[i];
418
419 /* Symbol in index and reported by linker, but no type set? Silently skip
420 and (optionally) pad. (In force-indexed mode, this is also where we
421 track symbols of the wrong type for this round of insertion.) */
422 if ((type = ctf_dynhash_lookup (symhash, sym_name)) == NULL)
423 continue;
424
425 ctf_str_add_ref (fp, sym_name, dpp++);
426
427 if (!ctf_assert (fp, (((char *) dpp) - (char *) dp) <= size))
428 return -1; /* errno is set for us. */
429 }
430
431 return 0;
432 }
433
434 /* Delete symbols that have been assigned names from the variable section. Must
435 be called from within ctf_serialize, because that is the only place you can
436 safely delete variables without messing up ctf_rollback. */
437
438 static int
439 symtypetab_delete_nonstatics (ctf_dict_t *fp, ctf_dict_t *symfp)
440 {
441 ctf_dvdef_t *dvd, *nvd;
442 ctf_id_t type;
443
444 for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
445 {
446 nvd = ctf_list_next (dvd);
447
448 if ((((type = (ctf_id_t) (uintptr_t)
449 ctf_dynhash_lookup (fp->ctf_objthash, dvd->dvd_name)) > 0)
450 || (type = (ctf_id_t) (uintptr_t)
451 ctf_dynhash_lookup (fp->ctf_funchash, dvd->dvd_name)) > 0)
452 && ctf_dynhash_lookup (symfp->ctf_dynsyms, dvd->dvd_name) != NULL
453 && type == dvd->dvd_type)
454 ctf_dvd_delete (fp, dvd);
455 }
456
457 return 0;
458 }
459
460 /* Figure out the sizes of the symtypetab sections, their indexed state,
461 etc. */
462 static int
463 ctf_symtypetab_sect_sizes (ctf_dict_t *fp, emit_symtypetab_state_t *s,
464 ctf_header_t *hdr, size_t *objt_size,
465 size_t *func_size, size_t *objtidx_size,
466 size_t *funcidx_size)
467 {
468 size_t nfuncs, nobjts;
469 size_t objt_unpadsize, func_unpadsize, objt_padsize, func_padsize;
470
471 /* If doing a writeout as part of linking, and the link flags request it,
472 filter out reported symbols from the variable section, and filter out all
473 other symbols from the symtypetab sections. (If we are not linking, the
474 symbols are sorted; if we are linking, don't bother sorting if we are not
475 filtering out reported symbols: this is almost certaily an ld -r and only
476 the linker is likely to consume these symtypetabs again. The linker
477 doesn't care what order the symtypetab entries is in, since it only
478 iterates over symbols and does not use the ctf_lookup_by_symbol* API.) */
479
480 s->sort_syms = 1;
481 if (fp->ctf_flags & LCTF_LINKING)
482 {
483 s->filter_syms = !(fp->ctf_link_flags & CTF_LINK_NO_FILTER_REPORTED_SYMS);
484 if (!s->filter_syms)
485 s->sort_syms = 0;
486 }
487
488 /* Find the dict to which the linker has reported symbols, if any. */
489
490 if (s->filter_syms)
491 {
492 if (!fp->ctf_dynsyms && fp->ctf_parent && fp->ctf_parent->ctf_dynsyms)
493 s->symfp = fp->ctf_parent;
494 else
495 s->symfp = fp;
496 }
497
498 /* If not filtering, keep all potential symbols in an unsorted, indexed
499 dict. */
500 if (!s->filter_syms)
501 s->symflags = CTF_SYMTYPETAB_FORCE_INDEXED;
502 else
503 hdr->cth_flags |= CTF_F_IDXSORTED;
504
505 if (!ctf_assert (fp, (s->filter_syms && s->symfp)
506 || (!s->filter_syms && !s->symfp
507 && ((s->symflags & CTF_SYMTYPETAB_FORCE_INDEXED) != 0))))
508 return -1;
509
510 /* Work out the sizes of the object and function sections, and work out the
511 number of pad (unassigned) symbols in each, and the overall size of the
512 sections. */
513
514 if (symtypetab_density (fp, s->symfp, fp->ctf_objthash, &nobjts, &s->maxobjt,
515 &objt_unpadsize, &objt_padsize, objtidx_size,
516 s->symflags) < 0)
517 return -1; /* errno is set for us. */
518
519 ctf_dprintf ("Object symtypetab: %i objects, max %i, unpadded size %i, "
520 "%i bytes of pads, index size %i\n", (int) nobjts,
521 (int) s->maxobjt, (int) objt_unpadsize, (int) objt_padsize,
522 (int) *objtidx_size);
523
524 if (symtypetab_density (fp, s->symfp, fp->ctf_funchash, &nfuncs, &s->maxfunc,
525 &func_unpadsize, &func_padsize, funcidx_size,
526 s->symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
527 return -1; /* errno is set for us. */
528
529 ctf_dprintf ("Function symtypetab: %i functions, max %i, unpadded size %i, "
530 "%i bytes of pads, index size %i\n", (int) nfuncs,
531 (int) s->maxfunc, (int) func_unpadsize, (int) func_padsize,
532 (int) *funcidx_size);
533
534 /* It is worth indexing each section if it would save space to do so, due to
535 reducing the number of pads sufficiently. A pad is the same size as a
536 single index entry: but index sections compress relatively poorly compared
537 to constant pads, so it takes a lot of contiguous padding to equal one
538 index section entry. It would be nice to be able to *verify* whether we
539 would save space after compression rather than guessing, but this seems
540 difficult, since it would require complete reserialization. Regardless, if
541 the linker has not reported any symbols (e.g. if this is not a final link
542 but just an ld -r), we must emit things in indexed fashion just as the
543 compiler does. */
544
545 *objt_size = objt_unpadsize;
546 if (!(s->symflags & CTF_SYMTYPETAB_FORCE_INDEXED)
547 && ((objt_padsize + objt_unpadsize) * CTF_INDEX_PAD_THRESHOLD
548 > objt_padsize))
549 {
550 *objt_size += objt_padsize;
551 *objtidx_size = 0;
552 }
553
554 *func_size = func_unpadsize;
555 if (!(s->symflags & CTF_SYMTYPETAB_FORCE_INDEXED)
556 && ((func_padsize + func_unpadsize) * CTF_INDEX_PAD_THRESHOLD
557 > func_padsize))
558 {
559 *func_size += func_padsize;
560 *funcidx_size = 0;
561 }
562
563 /* If we are filtering symbols out, those symbols that the linker has not
564 reported have now been removed from the ctf_objthash and ctf_funchash.
565 Delete entries from the variable section that duplicate newly-added
566 symbols. There's no need to migrate new ones in: we do that (if necessary)
567 in ctf_link_deduplicating_variables. */
568
569 if (s->filter_syms && s->symfp->ctf_dynsyms &&
570 symtypetab_delete_nonstatics (fp, s->symfp) < 0)
571 return -1;
572
573 return 0;
574 }
575
576 static int
577 ctf_emit_symtypetab_sects (ctf_dict_t *fp, emit_symtypetab_state_t *s,
578 unsigned char **tptr, size_t objt_size,
579 size_t func_size, size_t objtidx_size,
580 size_t funcidx_size)
581 {
582 unsigned char *t = *tptr;
583 size_t nsymtypes = 0;
584 const char **sym_name_order = NULL;
585 int err;
586
587 /* Sort the linker's symbols into name order if need be. */
588
589 if ((objtidx_size != 0) || (funcidx_size != 0))
590 {
591 ctf_next_t *i = NULL;
592 void *symname;
593 const char **walk;
594
595 if (s->filter_syms)
596 {
597 if (s->symfp->ctf_dynsyms)
598 nsymtypes = ctf_dynhash_elements (s->symfp->ctf_dynsyms);
599 else
600 nsymtypes = 0;
601 }
602 else
603 nsymtypes = ctf_dynhash_elements (fp->ctf_objthash)
604 + ctf_dynhash_elements (fp->ctf_funchash);
605
606 if ((sym_name_order = calloc (nsymtypes, sizeof (const char *))) == NULL)
607 goto oom;
608
609 walk = sym_name_order;
610
611 if (s->filter_syms)
612 {
613 if (s->symfp->ctf_dynsyms)
614 {
615 while ((err = ctf_dynhash_next_sorted (s->symfp->ctf_dynsyms, &i,
616 &symname, NULL,
617 ctf_dynhash_sort_by_name,
618 NULL)) == 0)
619 *walk++ = (const char *) symname;
620 if (err != ECTF_NEXT_END)
621 goto symerr;
622 }
623 }
624 else
625 {
626 ctf_hash_sort_f sort_fun = NULL;
627
628 /* Since we partition the set of symbols back into objt and func,
629 we can sort the two independently without harm. */
630 if (s->sort_syms)
631 sort_fun = ctf_dynhash_sort_by_name;
632
633 while ((err = ctf_dynhash_next_sorted (fp->ctf_objthash, &i, &symname,
634 NULL, sort_fun, NULL)) == 0)
635 *walk++ = (const char *) symname;
636 if (err != ECTF_NEXT_END)
637 goto symerr;
638
639 while ((err = ctf_dynhash_next_sorted (fp->ctf_funchash, &i, &symname,
640 NULL, sort_fun, NULL)) == 0)
641 *walk++ = (const char *) symname;
642 if (err != ECTF_NEXT_END)
643 goto symerr;
644 }
645 }
646
647 /* Emit the object and function sections, and if necessary their indexes.
648 Emission is done in symtab order if there is no index, and in index
649 (name) order otherwise. */
650
651 if ((objtidx_size == 0) && s->symfp && s->symfp->ctf_dynsymidx)
652 {
653 ctf_dprintf ("Emitting unindexed objt symtypetab\n");
654 if (emit_symtypetab (fp, s->symfp, (uint32_t *) t,
655 s->symfp->ctf_dynsymidx, NULL,
656 s->symfp->ctf_dynsymmax + 1, s->maxobjt,
657 objt_size, s->symflags | CTF_SYMTYPETAB_EMIT_PAD) < 0)
658 goto err; /* errno is set for us. */
659 }
660 else
661 {
662 ctf_dprintf ("Emitting indexed objt symtypetab\n");
663 if (emit_symtypetab (fp, s->symfp, (uint32_t *) t, NULL,
664 sym_name_order, nsymtypes, s->maxobjt,
665 objt_size, s->symflags) < 0)
666 goto err; /* errno is set for us. */
667 }
668
669 t += objt_size;
670
671 if ((funcidx_size == 0) && s->symfp && s->symfp->ctf_dynsymidx)
672 {
673 ctf_dprintf ("Emitting unindexed func symtypetab\n");
674 if (emit_symtypetab (fp, s->symfp, (uint32_t *) t,
675 s->symfp->ctf_dynsymidx, NULL,
676 s->symfp->ctf_dynsymmax + 1, s->maxfunc,
677 func_size, s->symflags | CTF_SYMTYPETAB_EMIT_FUNCTION
678 | CTF_SYMTYPETAB_EMIT_PAD) < 0)
679 goto err; /* errno is set for us. */
680 }
681 else
682 {
683 ctf_dprintf ("Emitting indexed func symtypetab\n");
684 if (emit_symtypetab (fp, s->symfp, (uint32_t *) t, NULL, sym_name_order,
685 nsymtypes, s->maxfunc, func_size,
686 s->symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
687 goto err; /* errno is set for us. */
688 }
689
690 t += func_size;
691
692 if (objtidx_size > 0)
693 if (emit_symtypetab_index (fp, s->symfp, (uint32_t *) t, sym_name_order,
694 nsymtypes, objtidx_size, s->symflags) < 0)
695 goto err;
696
697 t += objtidx_size;
698
699 if (funcidx_size > 0)
700 if (emit_symtypetab_index (fp, s->symfp, (uint32_t *) t, sym_name_order,
701 nsymtypes, funcidx_size,
702 s->symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
703 goto err;
704
705 t += funcidx_size;
706 free (sym_name_order);
707 *tptr = t;
708
709 return 0;
710
711 oom:
712 ctf_set_errno (fp, EAGAIN);
713 goto err;
714 symerr:
715 ctf_err_warn (fp, 0, err, _("error serializing symtypetabs"));
716 err:
717 free (sym_name_order);
718 return -1;
719 }
720
721 /* Type section. */
722
723 /* Iterate through the dynamic type definition list and compute the
724 size of the CTF type section. */
725
726 static size_t
727 ctf_type_sect_size (ctf_dict_t *fp)
728 {
729 ctf_dtdef_t *dtd;
730 size_t type_size;
731
732 for (type_size = 0, dtd = ctf_list_next (&fp->ctf_dtdefs);
733 dtd != NULL; dtd = ctf_list_next (dtd))
734 {
735 uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
736 uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
737 size_t type_ctt_size = dtd->dtd_data.ctt_size;
738
739 /* Shrink ctf_type_t-using types from a ctf_type_t to a ctf_stype_t
740 if possible. */
741
742 if (kind == CTF_K_STRUCT || kind == CTF_K_UNION)
743 {
744 size_t lsize = CTF_TYPE_LSIZE (&dtd->dtd_data);
745
746 if (lsize <= CTF_MAX_SIZE)
747 type_ctt_size = lsize;
748 }
749
750 if (type_ctt_size != CTF_LSIZE_SENT)
751 type_size += sizeof (ctf_stype_t);
752 else
753 type_size += sizeof (ctf_type_t);
754
755 switch (kind)
756 {
757 case CTF_K_INTEGER:
758 case CTF_K_FLOAT:
759 type_size += sizeof (uint32_t);
760 break;
761 case CTF_K_ARRAY:
762 type_size += sizeof (ctf_array_t);
763 break;
764 case CTF_K_SLICE:
765 type_size += sizeof (ctf_slice_t);
766 break;
767 case CTF_K_FUNCTION:
768 type_size += sizeof (uint32_t) * (vlen + (vlen & 1));
769 break;
770 case CTF_K_STRUCT:
771 case CTF_K_UNION:
772 if (type_ctt_size < CTF_LSTRUCT_THRESH)
773 type_size += sizeof (ctf_member_t) * vlen;
774 else
775 type_size += sizeof (ctf_lmember_t) * vlen;
776 break;
777 case CTF_K_ENUM:
778 type_size += sizeof (ctf_enum_t) * vlen;
779 break;
780 }
781 }
782
783 return type_size;
784 }
785
786 /* Take a final lap through the dynamic type definition list and copy the
787 appropriate type records to the output buffer, noting down the strings as
788 we go. */
789
790 static void
791 ctf_emit_type_sect (ctf_dict_t *fp, unsigned char **tptr)
792 {
793 unsigned char *t = *tptr;
794 ctf_dtdef_t *dtd;
795
796 for (dtd = ctf_list_next (&fp->ctf_dtdefs);
797 dtd != NULL; dtd = ctf_list_next (dtd))
798 {
799 uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
800 uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
801 size_t type_ctt_size = dtd->dtd_data.ctt_size;
802 size_t len;
803 ctf_stype_t *copied;
804 const char *name;
805 size_t i;
806
807 /* Shrink ctf_type_t-using types from a ctf_type_t to a ctf_stype_t
808 if possible. */
809
810 if (kind == CTF_K_STRUCT || kind == CTF_K_UNION)
811 {
812 size_t lsize = CTF_TYPE_LSIZE (&dtd->dtd_data);
813
814 if (lsize <= CTF_MAX_SIZE)
815 type_ctt_size = lsize;
816 }
817
818 if (type_ctt_size != CTF_LSIZE_SENT)
819 len = sizeof (ctf_stype_t);
820 else
821 len = sizeof (ctf_type_t);
822
823 memcpy (t, &dtd->dtd_data, len);
824 copied = (ctf_stype_t *) t; /* name is at the start: constant offset. */
825 if (copied->ctt_name
826 && (name = ctf_strraw (fp, copied->ctt_name)) != NULL)
827 {
828 ctf_str_add_ref (fp, name, &copied->ctt_name);
829 ctf_str_add_ref (fp, name, &dtd->dtd_data.ctt_name);
830 }
831 copied->ctt_size = type_ctt_size;
832 t += len;
833
834 switch (kind)
835 {
836 case CTF_K_INTEGER:
837 case CTF_K_FLOAT:
838 memcpy (t, dtd->dtd_vlen, sizeof (uint32_t));
839 t += sizeof (uint32_t);
840 break;
841
842 case CTF_K_SLICE:
843 memcpy (t, dtd->dtd_vlen, sizeof (struct ctf_slice));
844 t += sizeof (struct ctf_slice);
845 break;
846
847 case CTF_K_ARRAY:
848 memcpy (t, dtd->dtd_vlen, sizeof (struct ctf_array));
849 t += sizeof (struct ctf_array);
850 break;
851
852 case CTF_K_FUNCTION:
853 /* Functions with no args also have no vlen. */
854 if (dtd->dtd_vlen)
855 memcpy (t, dtd->dtd_vlen, sizeof (uint32_t) * (vlen + (vlen & 1)));
856 t += sizeof (uint32_t) * (vlen + (vlen & 1));
857 break;
858
859 /* These need to be copied across element by element, depending on
860 their ctt_size. */
861 case CTF_K_STRUCT:
862 case CTF_K_UNION:
863 {
864 ctf_lmember_t *dtd_vlen = (ctf_lmember_t *) dtd->dtd_vlen;
865 ctf_lmember_t *t_lvlen = (ctf_lmember_t *) t;
866 ctf_member_t *t_vlen = (ctf_member_t *) t;
867
868 for (i = 0; i < vlen; i++)
869 {
870 const char *name = ctf_strraw (fp, dtd_vlen[i].ctlm_name);
871
872 ctf_str_add_ref (fp, name, &dtd_vlen[i].ctlm_name);
873
874 if (type_ctt_size < CTF_LSTRUCT_THRESH)
875 {
876 t_vlen[i].ctm_name = dtd_vlen[i].ctlm_name;
877 t_vlen[i].ctm_type = dtd_vlen[i].ctlm_type;
878 t_vlen[i].ctm_offset = CTF_LMEM_OFFSET (&dtd_vlen[i]);
879 ctf_str_add_ref (fp, name, &t_vlen[i].ctm_name);
880 }
881 else
882 {
883 t_lvlen[i] = dtd_vlen[i];
884 ctf_str_add_ref (fp, name, &t_lvlen[i].ctlm_name);
885 }
886 }
887 }
888
889 if (type_ctt_size < CTF_LSTRUCT_THRESH)
890 t += sizeof (ctf_member_t) * vlen;
891 else
892 t += sizeof (ctf_lmember_t) * vlen;
893 break;
894
895 case CTF_K_ENUM:
896 {
897 ctf_enum_t *dtd_vlen = (struct ctf_enum *) dtd->dtd_vlen;
898 ctf_enum_t *t_vlen = (struct ctf_enum *) t;
899
900 memcpy (t, dtd->dtd_vlen, sizeof (struct ctf_enum) * vlen);
901 for (i = 0; i < vlen; i++)
902 {
903 const char *name = ctf_strraw (fp, dtd_vlen[i].cte_name);
904
905 ctf_str_add_ref (fp, name, &t_vlen[i].cte_name);
906 ctf_str_add_ref (fp, name, &dtd_vlen[i].cte_name);
907 }
908 t += sizeof (struct ctf_enum) * vlen;
909
910 break;
911 }
912 }
913 }
914
915 *tptr = t;
916 }
917
918 /* Variable section. */
919
920 /* Sort a newly-constructed static variable array. */
921
922 typedef struct ctf_sort_var_arg_cb
923 {
924 ctf_dict_t *fp;
925 ctf_strs_t *strtab;
926 } ctf_sort_var_arg_cb_t;
927
928 static int
929 ctf_sort_var (const void *one_, const void *two_, void *arg_)
930 {
931 const ctf_varent_t *one = one_;
932 const ctf_varent_t *two = two_;
933 ctf_sort_var_arg_cb_t *arg = arg_;
934
935 return (strcmp (ctf_strraw_explicit (arg->fp, one->ctv_name, arg->strtab),
936 ctf_strraw_explicit (arg->fp, two->ctv_name, arg->strtab)));
937 }
938
939 /* Overall serialization. */
940
941 /* If the specified CTF dict is writable and has been modified, reload this dict
942 with the updated type definitions, ready for serialization. In order to make
943 this code and the rest of libctf as simple as possible, we perform updates by
944 taking the dynamic type definitions and creating an in-memory CTF dict
945 containing the definitions, and then call ctf_simple_open_internal() on it.
946 We perform one extra trick here for the benefit of callers and to keep our
947 code simple: ctf_simple_open_internal() will return a new ctf_dict_t, but we
948 want to keep the fp constant for the caller, so after
949 ctf_simple_open_internal() returns, we use memcpy to swap the interior of the
950 old and new ctf_dict_t's, and then free the old. */
951 int
952 ctf_serialize (ctf_dict_t *fp)
953 {
954 ctf_dict_t ofp, *nfp;
955 ctf_header_t hdr, *hdrp;
956 ctf_dvdef_t *dvd;
957 ctf_varent_t *dvarents;
958 ctf_strs_writable_t strtab;
959 int err;
960 int num_missed_str_refs;
961
962 unsigned char *t;
963 unsigned long i;
964 size_t buf_size, type_size, objt_size, func_size;
965 size_t funcidx_size, objtidx_size;
966 size_t nvars;
967 unsigned char *buf = NULL, *newbuf;
968
969 emit_symtypetab_state_t symstate;
970 memset (&symstate, 0, sizeof (emit_symtypetab_state_t));
971
972 if (!(fp->ctf_flags & LCTF_RDWR))
973 return (ctf_set_errno (fp, ECTF_RDONLY));
974
975 /* Update required? */
976 if (!(fp->ctf_flags & LCTF_DIRTY))
977 return 0;
978
979 /* The strtab refs table must be empty at this stage. Any refs already added
980 will be corrupted by any modifications, including reserialization, after
981 strtab finalization is complete. Only this function, and functions it
982 calls, may add refs, and all memory locations (including in the dtds)
983 containing strtab offsets must be traversed as part of serialization, and
984 refs added. */
985
986 if (!ctf_assert (fp, fp->ctf_str_num_refs == 0))
987 return -1; /* errno is set for us. */
988
989 /* Fill in an initial CTF header. We will leave the label, object,
990 and function sections empty and only output a header, type section,
991 and string table. The type section begins at a 4-byte aligned
992 boundary past the CTF header itself (at relative offset zero). The flag
993 indicating a new-style function info section (an array of CTF_K_FUNCTION
994 type IDs in the types section) is flipped on. */
995
996 memset (&hdr, 0, sizeof (hdr));
997 hdr.cth_magic = CTF_MAGIC;
998 hdr.cth_version = CTF_VERSION;
999
1000 /* This is a new-format func info section, and the symtab and strtab come out
1001 of the dynsym and dynstr these days. */
1002 hdr.cth_flags = (CTF_F_NEWFUNCINFO | CTF_F_DYNSTR);
1003
1004 if (ctf_symtypetab_sect_sizes (fp, &symstate, &hdr, &objt_size, &func_size,
1005 &objtidx_size, &funcidx_size) < 0)
1006 return -1; /* errno is set for us. */
1007
1008 for (nvars = 0, dvd = ctf_list_next (&fp->ctf_dvdefs);
1009 dvd != NULL; dvd = ctf_list_next (dvd), nvars++);
1010
1011 type_size = ctf_type_sect_size (fp);
1012
1013 /* Compute the size of the CTF buffer we need, sans only the string table,
1014 then allocate a new buffer and memcpy the finished header to the start of
1015 the buffer. (We will adjust this later with strtab length info.) */
1016
1017 hdr.cth_lbloff = hdr.cth_objtoff = 0;
1018 hdr.cth_funcoff = hdr.cth_objtoff + objt_size;
1019 hdr.cth_objtidxoff = hdr.cth_funcoff + func_size;
1020 hdr.cth_funcidxoff = hdr.cth_objtidxoff + objtidx_size;
1021 hdr.cth_varoff = hdr.cth_funcidxoff + funcidx_size;
1022 hdr.cth_typeoff = hdr.cth_varoff + (nvars * sizeof (ctf_varent_t));
1023 hdr.cth_stroff = hdr.cth_typeoff + type_size;
1024 hdr.cth_strlen = 0;
1025
1026 buf_size = sizeof (ctf_header_t) + hdr.cth_stroff + hdr.cth_strlen;
1027
1028 if ((buf = malloc (buf_size)) == NULL)
1029 return (ctf_set_errno (fp, EAGAIN));
1030
1031 memcpy (buf, &hdr, sizeof (ctf_header_t));
1032 t = (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_objtoff;
1033
1034 hdrp = (ctf_header_t *) buf;
1035 if ((fp->ctf_flags & LCTF_CHILD) && (fp->ctf_parname != NULL))
1036 ctf_str_add_ref (fp, fp->ctf_parname, &hdrp->cth_parname);
1037 if (fp->ctf_cuname != NULL)
1038 ctf_str_add_ref (fp, fp->ctf_cuname, &hdrp->cth_cuname);
1039
1040 if (ctf_emit_symtypetab_sects (fp, &symstate, &t, objt_size, func_size,
1041 objtidx_size, funcidx_size) < 0)
1042 goto err;
1043
1044 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_varoff);
1045
1046 /* Work over the variable list, translating everything into ctf_varent_t's and
1047 prepping the string table. */
1048
1049 dvarents = (ctf_varent_t *) t;
1050 for (i = 0, dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL;
1051 dvd = ctf_list_next (dvd), i++)
1052 {
1053 ctf_varent_t *var = &dvarents[i];
1054
1055 ctf_str_add_ref (fp, dvd->dvd_name, &var->ctv_name);
1056 var->ctv_type = (uint32_t) dvd->dvd_type;
1057 }
1058 assert (i == nvars);
1059
1060 t += sizeof (ctf_varent_t) * nvars;
1061
1062 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_typeoff);
1063
1064 ctf_emit_type_sect (fp, &t);
1065
1066 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_stroff);
1067
1068 /* Every string added outside serialization by ctf_str_add_pending should
1069 now have been added by ctf_add_ref. */
1070 num_missed_str_refs = ctf_dynset_elements (fp->ctf_str_pending_ref);
1071 if (!ctf_assert (fp, num_missed_str_refs == 0))
1072 goto err; /* errno is set for us. */
1073
1074 /* Construct the final string table and fill out all the string refs with the
1075 final offsets. Then purge the refs list, because we're about to move this
1076 strtab onto the end of the buf, invalidating all the offsets. */
1077 strtab = ctf_str_write_strtab (fp);
1078 ctf_str_purge_refs (fp);
1079
1080 if (strtab.cts_strs == NULL)
1081 goto oom;
1082
1083 /* Now the string table is constructed, we can sort the buffer of
1084 ctf_varent_t's. */
1085 ctf_sort_var_arg_cb_t sort_var_arg = { fp, (ctf_strs_t *) &strtab };
1086 ctf_qsort_r (dvarents, nvars, sizeof (ctf_varent_t), ctf_sort_var,
1087 &sort_var_arg);
1088
1089 if ((newbuf = ctf_realloc (fp, buf, buf_size + strtab.cts_len)) == NULL)
1090 {
1091 free (strtab.cts_strs);
1092 goto oom;
1093 }
1094 buf = newbuf;
1095 memcpy (buf + buf_size, strtab.cts_strs, strtab.cts_len);
1096 hdrp = (ctf_header_t *) buf;
1097 hdrp->cth_strlen = strtab.cts_len;
1098 buf_size += hdrp->cth_strlen;
1099 free (strtab.cts_strs);
1100
1101 /* Finally, we are ready to ctf_simple_open() the new dict. If this is
1102 successful, we then switch nfp and fp and free the old dict. */
1103
1104 if ((nfp = ctf_simple_open_internal ((char *) buf, buf_size, NULL, 0,
1105 0, NULL, 0, fp->ctf_syn_ext_strtab,
1106 1, &err)) == NULL)
1107 {
1108 free (buf);
1109 return (ctf_set_errno (fp, err));
1110 }
1111
1112 (void) ctf_setmodel (nfp, ctf_getmodel (fp));
1113
1114 nfp->ctf_parent = fp->ctf_parent;
1115 nfp->ctf_parent_unreffed = fp->ctf_parent_unreffed;
1116 nfp->ctf_refcnt = fp->ctf_refcnt;
1117 nfp->ctf_flags |= fp->ctf_flags & ~LCTF_DIRTY;
1118 if (nfp->ctf_dynbase == NULL)
1119 nfp->ctf_dynbase = buf; /* Make sure buf is freed on close. */
1120 nfp->ctf_dthash = fp->ctf_dthash;
1121 nfp->ctf_dtdefs = fp->ctf_dtdefs;
1122 nfp->ctf_dvhash = fp->ctf_dvhash;
1123 nfp->ctf_dvdefs = fp->ctf_dvdefs;
1124 nfp->ctf_dtoldid = fp->ctf_dtoldid;
1125 nfp->ctf_add_processing = fp->ctf_add_processing;
1126 nfp->ctf_snapshots = fp->ctf_snapshots + 1;
1127 nfp->ctf_specific = fp->ctf_specific;
1128 nfp->ctf_nfuncidx = fp->ctf_nfuncidx;
1129 nfp->ctf_nobjtidx = fp->ctf_nobjtidx;
1130 nfp->ctf_objthash = fp->ctf_objthash;
1131 nfp->ctf_funchash = fp->ctf_funchash;
1132 nfp->ctf_dynsyms = fp->ctf_dynsyms;
1133 nfp->ctf_ptrtab = fp->ctf_ptrtab;
1134 nfp->ctf_pptrtab = fp->ctf_pptrtab;
1135 nfp->ctf_typemax = fp->ctf_typemax;
1136 nfp->ctf_dynsymidx = fp->ctf_dynsymidx;
1137 nfp->ctf_dynsymmax = fp->ctf_dynsymmax;
1138 nfp->ctf_ptrtab_len = fp->ctf_ptrtab_len;
1139 nfp->ctf_pptrtab_len = fp->ctf_pptrtab_len;
1140 nfp->ctf_link_inputs = fp->ctf_link_inputs;
1141 nfp->ctf_link_outputs = fp->ctf_link_outputs;
1142 nfp->ctf_errs_warnings = fp->ctf_errs_warnings;
1143 nfp->ctf_funcidx_names = fp->ctf_funcidx_names;
1144 nfp->ctf_objtidx_names = fp->ctf_objtidx_names;
1145 nfp->ctf_funcidx_sxlate = fp->ctf_funcidx_sxlate;
1146 nfp->ctf_objtidx_sxlate = fp->ctf_objtidx_sxlate;
1147 nfp->ctf_str_prov_offset = fp->ctf_str_prov_offset;
1148 nfp->ctf_syn_ext_strtab = fp->ctf_syn_ext_strtab;
1149 nfp->ctf_pptrtab_typemax = fp->ctf_pptrtab_typemax;
1150 nfp->ctf_in_flight_dynsyms = fp->ctf_in_flight_dynsyms;
1151 nfp->ctf_link_in_cu_mapping = fp->ctf_link_in_cu_mapping;
1152 nfp->ctf_link_out_cu_mapping = fp->ctf_link_out_cu_mapping;
1153 nfp->ctf_link_type_mapping = fp->ctf_link_type_mapping;
1154 nfp->ctf_link_memb_name_changer = fp->ctf_link_memb_name_changer;
1155 nfp->ctf_link_memb_name_changer_arg = fp->ctf_link_memb_name_changer_arg;
1156 nfp->ctf_link_variable_filter = fp->ctf_link_variable_filter;
1157 nfp->ctf_link_variable_filter_arg = fp->ctf_link_variable_filter_arg;
1158 nfp->ctf_symsect_little_endian = fp->ctf_symsect_little_endian;
1159 nfp->ctf_link_flags = fp->ctf_link_flags;
1160 nfp->ctf_dedup_atoms = fp->ctf_dedup_atoms;
1161 nfp->ctf_dedup_atoms_alloc = fp->ctf_dedup_atoms_alloc;
1162 memcpy (&nfp->ctf_dedup, &fp->ctf_dedup, sizeof (fp->ctf_dedup));
1163
1164 nfp->ctf_snapshot_lu = fp->ctf_snapshots;
1165
1166 memcpy (&nfp->ctf_lookups, fp->ctf_lookups, sizeof (fp->ctf_lookups));
1167 nfp->ctf_structs = fp->ctf_structs;
1168 nfp->ctf_unions = fp->ctf_unions;
1169 nfp->ctf_enums = fp->ctf_enums;
1170 nfp->ctf_names = fp->ctf_names;
1171
1172 fp->ctf_dthash = NULL;
1173 ctf_str_free_atoms (nfp);
1174 nfp->ctf_str_atoms = fp->ctf_str_atoms;
1175 nfp->ctf_prov_strtab = fp->ctf_prov_strtab;
1176 nfp->ctf_str_pending_ref = fp->ctf_str_pending_ref;
1177 fp->ctf_str_atoms = NULL;
1178 fp->ctf_prov_strtab = NULL;
1179 fp->ctf_str_pending_ref = NULL;
1180 memset (&fp->ctf_dtdefs, 0, sizeof (ctf_list_t));
1181 memset (&fp->ctf_errs_warnings, 0, sizeof (ctf_list_t));
1182 fp->ctf_add_processing = NULL;
1183 fp->ctf_ptrtab = NULL;
1184 fp->ctf_pptrtab = NULL;
1185 fp->ctf_funcidx_names = NULL;
1186 fp->ctf_objtidx_names = NULL;
1187 fp->ctf_funcidx_sxlate = NULL;
1188 fp->ctf_objtidx_sxlate = NULL;
1189 fp->ctf_objthash = NULL;
1190 fp->ctf_funchash = NULL;
1191 fp->ctf_dynsyms = NULL;
1192 fp->ctf_dynsymidx = NULL;
1193 fp->ctf_link_inputs = NULL;
1194 fp->ctf_link_outputs = NULL;
1195 fp->ctf_syn_ext_strtab = NULL;
1196 fp->ctf_link_in_cu_mapping = NULL;
1197 fp->ctf_link_out_cu_mapping = NULL;
1198 fp->ctf_link_type_mapping = NULL;
1199 fp->ctf_dedup_atoms = NULL;
1200 fp->ctf_dedup_atoms_alloc = NULL;
1201 fp->ctf_parent_unreffed = 1;
1202
1203 fp->ctf_dvhash = NULL;
1204 memset (&fp->ctf_dvdefs, 0, sizeof (ctf_list_t));
1205 memset (fp->ctf_lookups, 0, sizeof (fp->ctf_lookups));
1206 memset (&fp->ctf_in_flight_dynsyms, 0, sizeof (fp->ctf_in_flight_dynsyms));
1207 memset (&fp->ctf_dedup, 0, sizeof (fp->ctf_dedup));
1208 fp->ctf_structs.ctn_writable = NULL;
1209 fp->ctf_unions.ctn_writable = NULL;
1210 fp->ctf_enums.ctn_writable = NULL;
1211 fp->ctf_names.ctn_writable = NULL;
1212
1213 memcpy (&ofp, fp, sizeof (ctf_dict_t));
1214 memcpy (fp, nfp, sizeof (ctf_dict_t));
1215 memcpy (nfp, &ofp, sizeof (ctf_dict_t));
1216
1217 nfp->ctf_refcnt = 1; /* Force nfp to be freed. */
1218 ctf_dict_close (nfp);
1219
1220 return 0;
1221
1222 oom:
1223 free (buf);
1224 return (ctf_set_errno (fp, EAGAIN));
1225 err:
1226 free (buf);
1227 return -1; /* errno is set for us. */
1228 }
1229
1230 /* File writing. */
1231
1232 /* Write the compressed CTF data stream to the specified gzFile descriptor. The
1233 whole stream is compressed, and cannot be read by CTF opening functions in
1234 this library until it is decompressed. (The functions below this one leave
1235 the header uncompressed, and the CTF opening functions work on them without
1236 manual decompression.)
1237
1238 No support for (testing-only) endian-flipping. */
1239 int
1240 ctf_gzwrite (ctf_dict_t *fp, gzFile fd)
1241 {
1242 const unsigned char *buf;
1243 ssize_t resid;
1244 ssize_t len;
1245
1246 resid = sizeof (ctf_header_t);
1247 buf = (unsigned char *) fp->ctf_header;
1248 while (resid != 0)
1249 {
1250 if ((len = gzwrite (fd, buf, resid)) <= 0)
1251 return (ctf_set_errno (fp, errno));
1252 resid -= len;
1253 buf += len;
1254 }
1255
1256 resid = fp->ctf_size;
1257 buf = fp->ctf_buf;
1258 while (resid != 0)
1259 {
1260 if ((len = gzwrite (fd, buf, resid)) <= 0)
1261 return (ctf_set_errno (fp, errno));
1262 resid -= len;
1263 buf += len;
1264 }
1265
1266 return 0;
1267 }
1268
1269 /* Optionally compress the specified CTF data stream and return it as a new
1270 dynamically-allocated string. Possibly write it with reversed
1271 endianness. */
1272 unsigned char *
1273 ctf_write_mem (ctf_dict_t *fp, size_t *size, size_t threshold)
1274 {
1275 unsigned char *buf;
1276 unsigned char *bp;
1277 ctf_header_t *hp;
1278 unsigned char *flipped, *src;
1279 ssize_t header_len = sizeof (ctf_header_t);
1280 ssize_t compress_len;
1281 int flip_endian;
1282 int uncompressed;
1283 int rc;
1284
1285 flip_endian = getenv ("LIBCTF_WRITE_FOREIGN_ENDIAN") != NULL;
1286 uncompressed = (fp->ctf_size < threshold);
1287
1288 if (ctf_serialize (fp) < 0)
1289 return NULL; /* errno is set for us. */
1290
1291 compress_len = compressBound (fp->ctf_size);
1292 if (fp->ctf_size < threshold)
1293 compress_len = fp->ctf_size;
1294 if ((buf = malloc (compress_len
1295 + sizeof (struct ctf_header))) == NULL)
1296 {
1297 ctf_set_errno (fp, ENOMEM);
1298 ctf_err_warn (fp, 0, 0, _("ctf_write_mem: cannot allocate %li bytes"),
1299 (unsigned long) (compress_len + sizeof (struct ctf_header)));
1300 return NULL;
1301 }
1302
1303 hp = (ctf_header_t *) buf;
1304 memcpy (hp, fp->ctf_header, header_len);
1305 bp = buf + sizeof (struct ctf_header);
1306 *size = sizeof (struct ctf_header);
1307
1308 if (uncompressed)
1309 hp->cth_flags &= ~CTF_F_COMPRESS;
1310 else
1311 hp->cth_flags |= CTF_F_COMPRESS;
1312
1313 src = fp->ctf_buf;
1314 flipped = NULL;
1315
1316 if (flip_endian)
1317 {
1318 if ((flipped = malloc (fp->ctf_size)) == NULL)
1319 {
1320 ctf_set_errno (fp, ENOMEM);
1321 ctf_err_warn (fp, 0, 0, _("ctf_write_mem: cannot allocate %li bytes"),
1322 (unsigned long) (fp->ctf_size + sizeof (struct ctf_header)));
1323 return NULL;
1324 }
1325 ctf_flip_header (hp);
1326 memcpy (flipped, fp->ctf_buf, fp->ctf_size);
1327 if (ctf_flip (fp, fp->ctf_header, flipped, 1) < 0)
1328 {
1329 free (buf);
1330 free (flipped);
1331 return NULL; /* errno is set for us. */
1332 }
1333 src = flipped;
1334 }
1335
1336 if (uncompressed)
1337 {
1338 memcpy (bp, src, fp->ctf_size);
1339 *size += fp->ctf_size;
1340 }
1341 else
1342 {
1343 if ((rc = compress (bp, (uLongf *) &compress_len,
1344 src, fp->ctf_size)) != Z_OK)
1345 {
1346 ctf_set_errno (fp, ECTF_COMPRESS);
1347 ctf_err_warn (fp, 0, 0, _("zlib deflate err: %s"), zError (rc));
1348 free (buf);
1349 return NULL;
1350 }
1351 *size += compress_len;
1352 }
1353
1354 free (flipped);
1355
1356 return buf;
1357 }
1358
1359 /* Compress the specified CTF data stream and write it to the specified file
1360 descriptor. */
1361 int
1362 ctf_compress_write (ctf_dict_t *fp, int fd)
1363 {
1364 unsigned char *buf;
1365 unsigned char *bp;
1366 size_t tmp;
1367 ssize_t buf_len;
1368 ssize_t len;
1369 int err = 0;
1370
1371 if ((buf = ctf_write_mem (fp, &tmp, 0)) == NULL)
1372 return -1; /* errno is set for us. */
1373
1374 buf_len = tmp;
1375 bp = buf;
1376
1377 while (buf_len > 0)
1378 {
1379 if ((len = write (fd, bp, buf_len)) < 0)
1380 {
1381 err = ctf_set_errno (fp, errno);
1382 ctf_err_warn (fp, 0, 0, _("ctf_compress_write: error writing"));
1383 goto ret;
1384 }
1385 buf_len -= len;
1386 bp += len;
1387 }
1388
1389 ret:
1390 free (buf);
1391 return err;
1392 }
1393
1394 /* Write the uncompressed CTF data stream to the specified file descriptor. */
1395 int
1396 ctf_write (ctf_dict_t *fp, int fd)
1397 {
1398 unsigned char *buf;
1399 unsigned char *bp;
1400 size_t tmp;
1401 ssize_t buf_len;
1402 ssize_t len;
1403 int err = 0;
1404
1405 if ((buf = ctf_write_mem (fp, &tmp, (size_t) -1)) == NULL)
1406 return -1; /* errno is set for us. */
1407
1408 buf_len = tmp;
1409 bp = buf;
1410
1411 while (buf_len > 0)
1412 {
1413 if ((len = write (fd, bp, buf_len)) < 0)
1414 {
1415 err = ctf_set_errno (fp, errno);
1416 ctf_err_warn (fp, 0, 0, _("ctf_compress_write: error writing"));
1417 goto ret;
1418 }
1419 buf_len -= len;
1420 bp += len;
1421 }
1422
1423 ret:
1424 free (buf);
1425 return err;
1426 }