[gdb/testsuite] Fix gdb.base/reggroups.exp with check-read1
[binutils-gdb.git] / libctf / ctf-serialize.c
blob9efdb16e0d616e2ec344e5aa792598401a9c3e74
1 /* CTF dict creation.
2 Copyright (C) 2019-2024 Free Software Foundation, Inc.
4 This file is part of libctf.
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.
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.
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/>. */
20 #include <ctf-impl.h>
21 #include <assert.h>
22 #include <string.h>
23 #include <unistd.h>
24 #include <zlib.h>
26 #include <elf.h>
27 #include "elf-bfd.h"
29 /* Symtypetab sections. */
31 /* Symtypetab emission flags. */
33 #define CTF_SYMTYPETAB_EMIT_FUNCTION 0x1
34 #define CTF_SYMTYPETAB_EMIT_PAD 0x2
35 #define CTF_SYMTYPETAB_FORCE_INDEXED 0x4
37 /* Properties of symtypetab emission, shared by symtypetab section
38 sizing and symtypetab emission itself. */
40 typedef struct emit_symtypetab_state
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;
47 /* True if symbols are being sorted. */
48 int sort_syms;
50 /* Flags for symtypetab emission. */
51 int symflags;
53 /* The dict to which the linker has reported symbols. */
54 ctf_dict_t *symfp;
56 /* The maximum number of objects seen. */
57 size_t maxobjt;
59 /* The maximum number of func info entris seen. */
60 size_t maxfunc;
61 } emit_symtypetab_state_t;
63 /* Determine if a symbol is "skippable" and should never appear in the
64 symtypetab sections. */
66 int
67 ctf_symtab_skippable (ctf_link_sym_t *sym)
69 /* Never skip symbols whose name is not yet known. */
70 if (sym->st_nameidx_set)
71 return 0;
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));
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.
88 Also figure out if any symbols need to be moved to the variable section, and
89 add them (if not already present). */
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)
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;
104 *count = 0;
105 *max = 0;
106 *unpadsize = 0;
107 *idxsize = 0;
108 *padsize = 0;
110 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
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).
119 If there are none, this symtypetab will be empty: just report that. */
121 if (!symfp->ctf_dynsyms)
122 return 0;
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));
128 while ((err = ctf_dynhash_cnext (symfp->ctf_dynsyms, &i,
129 &name, &ctf_sym)) == 0)
131 ctf_link_sym_t *sym = (ctf_link_sym_t *) ctf_sym;
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;
139 if (ctf_symtab_skippable (sym))
140 continue;
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. */
147 if (ctf_dynhash_cinsert (linker_known, name, ctf_sym) < 0)
149 ctf_dynhash_destroy (linker_known);
150 return (ctf_set_errno (fp, ENOMEM));
153 if (err != ECTF_NEXT_END)
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));
162 while ((err = ctf_dynhash_cnext (symhash, &i, &name, NULL)) == 0)
164 ctf_link_sym_t *sym;
166 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
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)
172 ctf_dynhash_remove (symhash, name);
173 continue;
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;
181 if ((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
182 && sym->st_type != STT_FUNC)
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;
192 else if (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
193 && sym->st_type != STT_OBJECT)
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;
204 ctf_dynhash_remove (linker_known, name);
206 if (*max < sym->st_symidx)
207 *max = sym->st_symidx;
209 else
210 (*max)++;
212 *unpadsize += sizeof (uint32_t);
213 (*count)++;
215 if (err != ECTF_NEXT_END)
217 ctf_err_warn (fp, 0, err, _("iterating over CTF symtypetab during "
218 "serialization"));
219 ctf_dynhash_destroy (linker_known);
220 return (ctf_set_errno (fp, err));
223 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
225 while ((err = ctf_dynhash_cnext (linker_known, &i, NULL, &ctf_sym)) == 0)
227 ctf_link_sym_t *sym = (ctf_link_sym_t *) ctf_sym;
229 if (sym->st_symidx > *max)
230 beyond_max++;
232 if (err != ECTF_NEXT_END)
234 ctf_err_warn (fp, 0, err, _("iterating over linker-known symbols "
235 "during CTF serialization"));
236 ctf_dynhash_destroy (linker_known);
237 return (ctf_set_errno (fp, err));
241 *idxsize = *count * sizeof (uint32_t);
242 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
243 *padsize = (ctf_dynhash_elements (linker_known) - beyond_max) * sizeof (uint32_t);
245 ctf_dynhash_destroy (linker_known);
246 return 0;
249 /* Emit an objt or func symtypetab into DP in a particular order defined by an
250 array of ctf_link_sym_t or symbol names passed in. The index has NIDX
251 elements in it: unindexed output would terminate at symbol OUTMAX and is in
252 any case no larger than SIZE bytes. Some index elements are expected to be
253 skipped: see symtypetab_density. The linker-reported set of symbols (if any)
254 is found in SYMFP. */
255 static int
256 emit_symtypetab (ctf_dict_t *fp, ctf_dict_t *symfp, uint32_t *dp,
257 ctf_link_sym_t **idx, const char **nameidx, uint32_t nidx,
258 uint32_t outmax, int size, int flags)
260 uint32_t i;
261 uint32_t *dpp = dp;
262 ctf_dynhash_t *symhash;
264 ctf_dprintf ("Emitting table of size %i, outmax %u, %u symtypetab entries, "
265 "flags %i\n", size, outmax, nidx, flags);
267 /* Empty table? Nothing to do. */
268 if (size == 0)
269 return 0;
271 if (flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
272 symhash = fp->ctf_funchash;
273 else
274 symhash = fp->ctf_objthash;
276 for (i = 0; i < nidx; i++)
278 const char *sym_name;
279 void *type;
281 /* If we have a linker-reported set of symbols, we may be given that set
282 to work from, or a set of symbol names. In both cases we want to look
283 at the corresponding linker-reported symbol (if any). */
284 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
286 ctf_link_sym_t *this_link_sym;
288 if (idx)
289 this_link_sym = idx[i];
290 else
291 this_link_sym = ctf_dynhash_lookup (symfp->ctf_dynsyms, nameidx[i]);
293 /* Unreported symbol number. No pad, no nothing. */
294 if (!this_link_sym)
295 continue;
297 /* Symbol of the wrong type, or skippable? This symbol is not in this
298 table. */
299 if (((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
300 && this_link_sym->st_type != STT_FUNC)
301 || (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
302 && this_link_sym->st_type != STT_OBJECT))
303 continue;
305 if (ctf_symtab_skippable (this_link_sym))
306 continue;
308 sym_name = this_link_sym->st_name;
310 /* Linker reports symbol of a different type to the symbol we actually
311 added? Skip the symbol. No pad, since the symbol doesn't actually
312 belong in this table at all. (Warned about in
313 symtypetab_density.) */
314 if ((this_link_sym->st_type == STT_FUNC)
315 && (ctf_dynhash_lookup (fp->ctf_objthash, sym_name)))
316 continue;
318 if ((this_link_sym->st_type == STT_OBJECT)
319 && (ctf_dynhash_lookup (fp->ctf_funchash, sym_name)))
320 continue;
322 else
323 sym_name = nameidx[i];
325 /* Symbol in index but no type set? Silently skip and (optionally)
326 pad. (In force-indexed mode, this is also where we track symbols of
327 the wrong type for this round of insertion.) */
328 if ((type = ctf_dynhash_lookup (symhash, sym_name)) == NULL)
330 if (flags & CTF_SYMTYPETAB_EMIT_PAD)
331 *dpp++ = 0;
332 continue;
335 if (!ctf_assert (fp, (((char *) dpp) - (char *) dp) < size))
336 return -1; /* errno is set for us. */
338 *dpp++ = (ctf_id_t) (uintptr_t) type;
340 /* When emitting unindexed output, all later symbols are pads: stop
341 early. */
342 if ((flags & CTF_SYMTYPETAB_EMIT_PAD) && idx[i]->st_symidx == outmax)
343 break;
346 return 0;
349 /* Emit an objt or func symtypetab index into DP in a paticular order defined by
350 an array of symbol names passed in. Stop at NIDX. The linker-reported set
351 of symbols (if any) is found in SYMFP. */
352 static int
353 emit_symtypetab_index (ctf_dict_t *fp, ctf_dict_t *symfp, uint32_t *dp,
354 const char **idx, uint32_t nidx, int size, int flags)
356 uint32_t i;
357 uint32_t *dpp = dp;
358 ctf_dynhash_t *symhash;
360 ctf_dprintf ("Emitting index of size %i, %u entries reported by linker, "
361 "flags %i\n", size, nidx, flags);
363 /* Empty table? Nothing to do. */
364 if (size == 0)
365 return 0;
367 if (flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
368 symhash = fp->ctf_funchash;
369 else
370 symhash = fp->ctf_objthash;
372 /* Indexes should always be unpadded. */
373 if (!ctf_assert (fp, !(flags & CTF_SYMTYPETAB_EMIT_PAD)))
374 return -1; /* errno is set for us. */
376 for (i = 0; i < nidx; i++)
378 const char *sym_name;
379 void *type;
381 if (!(flags & CTF_SYMTYPETAB_FORCE_INDEXED))
383 ctf_link_sym_t *this_link_sym;
385 this_link_sym = ctf_dynhash_lookup (symfp->ctf_dynsyms, idx[i]);
387 /* This is an index: unreported symbols should never appear in it. */
388 if (!ctf_assert (fp, this_link_sym != NULL))
389 return -1; /* errno is set for us. */
391 /* Symbol of the wrong type, or skippable? This symbol is not in this
392 table. */
393 if (((flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
394 && this_link_sym->st_type != STT_FUNC)
395 || (!(flags & CTF_SYMTYPETAB_EMIT_FUNCTION)
396 && this_link_sym->st_type != STT_OBJECT))
397 continue;
399 if (ctf_symtab_skippable (this_link_sym))
400 continue;
402 sym_name = this_link_sym->st_name;
404 /* Linker reports symbol of a different type to the symbol we actually
405 added? Skip the symbol. */
406 if ((this_link_sym->st_type == STT_FUNC)
407 && (ctf_dynhash_lookup (fp->ctf_objthash, sym_name)))
408 continue;
410 if ((this_link_sym->st_type == STT_OBJECT)
411 && (ctf_dynhash_lookup (fp->ctf_funchash, sym_name)))
412 continue;
414 else
415 sym_name = idx[i];
417 /* Symbol in index and reported by linker, but no type set? Silently skip
418 and (optionally) pad. (In force-indexed mode, this is also where we
419 track symbols of the wrong type for this round of insertion.) */
420 if ((type = ctf_dynhash_lookup (symhash, sym_name)) == NULL)
421 continue;
423 ctf_str_add_ref (fp, sym_name, dpp++);
425 if (!ctf_assert (fp, (((char *) dpp) - (char *) dp) <= size))
426 return -1; /* errno is set for us. */
429 return 0;
432 /* Delete symbols that have been assigned names from the variable section. Must
433 be called from within ctf_serialize, because that is the only place you can
434 safely delete variables without messing up ctf_rollback. */
436 static int
437 symtypetab_delete_nonstatics (ctf_dict_t *fp, ctf_dict_t *symfp)
439 ctf_dvdef_t *dvd, *nvd;
440 ctf_id_t type;
442 for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
444 nvd = ctf_list_next (dvd);
446 if ((((type = (ctf_id_t) (uintptr_t)
447 ctf_dynhash_lookup (fp->ctf_objthash, dvd->dvd_name)) > 0)
448 || (type = (ctf_id_t) (uintptr_t)
449 ctf_dynhash_lookup (fp->ctf_funchash, dvd->dvd_name)) > 0)
450 && ctf_dynhash_lookup (symfp->ctf_dynsyms, dvd->dvd_name) != NULL
451 && type == dvd->dvd_type)
452 ctf_dvd_delete (fp, dvd);
455 return 0;
458 /* Figure out the sizes of the symtypetab sections, their indexed state,
459 etc. */
460 static int
461 ctf_symtypetab_sect_sizes (ctf_dict_t *fp, emit_symtypetab_state_t *s,
462 ctf_header_t *hdr, size_t *objt_size,
463 size_t *func_size, size_t *objtidx_size,
464 size_t *funcidx_size)
466 size_t nfuncs, nobjts;
467 size_t objt_unpadsize, func_unpadsize, objt_padsize, func_padsize;
469 /* If doing a writeout as part of linking, and the link flags request it,
470 filter out reported symbols from the variable section, and filter out all
471 other symbols from the symtypetab sections. (If we are not linking, the
472 symbols are sorted; if we are linking, don't bother sorting if we are not
473 filtering out reported symbols: this is almost certainly an ld -r and only
474 the linker is likely to consume these symtypetabs again. The linker
475 doesn't care what order the symtypetab entries are in, since it only
476 iterates over symbols and does not use the ctf_lookup_by_symbol* API.) */
478 s->sort_syms = 1;
479 if (fp->ctf_flags & LCTF_LINKING)
481 s->filter_syms = !(fp->ctf_link_flags & CTF_LINK_NO_FILTER_REPORTED_SYMS);
482 if (!s->filter_syms)
483 s->sort_syms = 0;
486 /* Find the dict to which the linker has reported symbols, if any. */
488 if (s->filter_syms)
490 if (!fp->ctf_dynsyms && fp->ctf_parent && fp->ctf_parent->ctf_dynsyms)
491 s->symfp = fp->ctf_parent;
492 else
493 s->symfp = fp;
496 /* If not filtering, keep all potential symbols in an unsorted, indexed
497 dict. */
498 if (!s->filter_syms)
499 s->symflags = CTF_SYMTYPETAB_FORCE_INDEXED;
500 else
501 hdr->cth_flags |= CTF_F_IDXSORTED;
503 if (!ctf_assert (fp, (s->filter_syms && s->symfp)
504 || (!s->filter_syms && !s->symfp
505 && ((s->symflags & CTF_SYMTYPETAB_FORCE_INDEXED) != 0))))
506 return -1;
508 /* Work out the sizes of the object and function sections, and work out the
509 number of pad (unassigned) symbols in each, and the overall size of the
510 sections. */
512 if (symtypetab_density (fp, s->symfp, fp->ctf_objthash, &nobjts, &s->maxobjt,
513 &objt_unpadsize, &objt_padsize, objtidx_size,
514 s->symflags) < 0)
515 return -1; /* errno is set for us. */
517 ctf_dprintf ("Object symtypetab: %i objects, max %i, unpadded size %i, "
518 "%i bytes of pads, index size %i\n", (int) nobjts,
519 (int) s->maxobjt, (int) objt_unpadsize, (int) objt_padsize,
520 (int) *objtidx_size);
522 if (symtypetab_density (fp, s->symfp, fp->ctf_funchash, &nfuncs, &s->maxfunc,
523 &func_unpadsize, &func_padsize, funcidx_size,
524 s->symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
525 return -1; /* errno is set for us. */
527 ctf_dprintf ("Function symtypetab: %i functions, max %i, unpadded size %i, "
528 "%i bytes of pads, index size %i\n", (int) nfuncs,
529 (int) s->maxfunc, (int) func_unpadsize, (int) func_padsize,
530 (int) *funcidx_size);
532 /* It is worth indexing each section if it would save space to do so, due to
533 reducing the number of pads sufficiently. A pad is the same size as a
534 single index entry: but index sections compress relatively poorly compared
535 to constant pads, so it takes a lot of contiguous padding to equal one
536 index section entry. It would be nice to be able to *verify* whether we
537 would save space after compression rather than guessing, but this seems
538 difficult, since it would require complete reserialization. Regardless, if
539 the linker has not reported any symbols (e.g. if this is not a final link
540 but just an ld -r), we must emit things in indexed fashion just as the
541 compiler does. */
543 *objt_size = objt_unpadsize;
544 if (!(s->symflags & CTF_SYMTYPETAB_FORCE_INDEXED)
545 && ((objt_padsize + objt_unpadsize) * CTF_INDEX_PAD_THRESHOLD
546 > objt_padsize))
548 *objt_size += objt_padsize;
549 *objtidx_size = 0;
552 *func_size = func_unpadsize;
553 if (!(s->symflags & CTF_SYMTYPETAB_FORCE_INDEXED)
554 && ((func_padsize + func_unpadsize) * CTF_INDEX_PAD_THRESHOLD
555 > func_padsize))
557 *func_size += func_padsize;
558 *funcidx_size = 0;
561 /* If we are filtering symbols out, those symbols that the linker has not
562 reported have now been removed from the ctf_objthash and ctf_funchash.
563 Delete entries from the variable section that duplicate newly-added
564 symbols. There's no need to migrate new ones in: we do that (if necessary)
565 in ctf_link_deduplicating_variables. */
567 if (s->filter_syms && s->symfp->ctf_dynsyms &&
568 symtypetab_delete_nonstatics (fp, s->symfp) < 0)
569 return -1;
571 return 0;
574 static int
575 ctf_emit_symtypetab_sects (ctf_dict_t *fp, emit_symtypetab_state_t *s,
576 unsigned char **tptr, size_t objt_size,
577 size_t func_size, size_t objtidx_size,
578 size_t funcidx_size)
580 unsigned char *t = *tptr;
581 size_t nsymtypes = 0;
582 const char **sym_name_order = NULL;
583 int err;
585 /* Sort the linker's symbols into name order if need be. */
587 if ((objtidx_size != 0) || (funcidx_size != 0))
589 ctf_next_t *i = NULL;
590 void *symname;
591 const char **walk;
593 if (s->filter_syms)
595 if (s->symfp->ctf_dynsyms)
596 nsymtypes = ctf_dynhash_elements (s->symfp->ctf_dynsyms);
597 else
598 nsymtypes = 0;
600 else
601 nsymtypes = ctf_dynhash_elements (fp->ctf_objthash)
602 + ctf_dynhash_elements (fp->ctf_funchash);
604 if ((sym_name_order = calloc (nsymtypes, sizeof (const char *))) == NULL)
605 goto oom;
607 walk = sym_name_order;
609 if (s->filter_syms)
611 if (s->symfp->ctf_dynsyms)
613 while ((err = ctf_dynhash_next_sorted (s->symfp->ctf_dynsyms, &i,
614 &symname, NULL,
615 ctf_dynhash_sort_by_name,
616 NULL)) == 0)
617 *walk++ = (const char *) symname;
618 if (err != ECTF_NEXT_END)
619 goto symerr;
622 else
624 ctf_hash_sort_f sort_fun = NULL;
626 /* Since we partition the set of symbols back into objt and func,
627 we can sort the two independently without harm. */
628 if (s->sort_syms)
629 sort_fun = ctf_dynhash_sort_by_name;
631 while ((err = ctf_dynhash_next_sorted (fp->ctf_objthash, &i, &symname,
632 NULL, sort_fun, NULL)) == 0)
633 *walk++ = (const char *) symname;
634 if (err != ECTF_NEXT_END)
635 goto symerr;
637 while ((err = ctf_dynhash_next_sorted (fp->ctf_funchash, &i, &symname,
638 NULL, sort_fun, NULL)) == 0)
639 *walk++ = (const char *) symname;
640 if (err != ECTF_NEXT_END)
641 goto symerr;
645 /* Emit the object and function sections, and if necessary their indexes.
646 Emission is done in symtab order if there is no index, and in index
647 (name) order otherwise. */
649 if ((objtidx_size == 0) && s->symfp && s->symfp->ctf_dynsymidx)
651 ctf_dprintf ("Emitting unindexed objt symtypetab\n");
652 if (emit_symtypetab (fp, s->symfp, (uint32_t *) t,
653 s->symfp->ctf_dynsymidx, NULL,
654 s->symfp->ctf_dynsymmax + 1, s->maxobjt,
655 objt_size, s->symflags | CTF_SYMTYPETAB_EMIT_PAD) < 0)
656 goto err; /* errno is set for us. */
658 else
660 ctf_dprintf ("Emitting indexed objt symtypetab\n");
661 if (emit_symtypetab (fp, s->symfp, (uint32_t *) t, NULL,
662 sym_name_order, nsymtypes, s->maxobjt,
663 objt_size, s->symflags) < 0)
664 goto err; /* errno is set for us. */
667 t += objt_size;
669 if ((funcidx_size == 0) && s->symfp && s->symfp->ctf_dynsymidx)
671 ctf_dprintf ("Emitting unindexed func symtypetab\n");
672 if (emit_symtypetab (fp, s->symfp, (uint32_t *) t,
673 s->symfp->ctf_dynsymidx, NULL,
674 s->symfp->ctf_dynsymmax + 1, s->maxfunc,
675 func_size, s->symflags | CTF_SYMTYPETAB_EMIT_FUNCTION
676 | CTF_SYMTYPETAB_EMIT_PAD) < 0)
677 goto err; /* errno is set for us. */
679 else
681 ctf_dprintf ("Emitting indexed func symtypetab\n");
682 if (emit_symtypetab (fp, s->symfp, (uint32_t *) t, NULL, sym_name_order,
683 nsymtypes, s->maxfunc, func_size,
684 s->symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
685 goto err; /* errno is set for us. */
688 t += func_size;
690 if (objtidx_size > 0)
691 if (emit_symtypetab_index (fp, s->symfp, (uint32_t *) t, sym_name_order,
692 nsymtypes, objtidx_size, s->symflags) < 0)
693 goto err;
695 t += objtidx_size;
697 if (funcidx_size > 0)
698 if (emit_symtypetab_index (fp, s->symfp, (uint32_t *) t, sym_name_order,
699 nsymtypes, funcidx_size,
700 s->symflags | CTF_SYMTYPETAB_EMIT_FUNCTION) < 0)
701 goto err;
703 t += funcidx_size;
704 free (sym_name_order);
705 *tptr = t;
707 return 0;
709 oom:
710 ctf_set_errno (fp, EAGAIN);
711 goto err;
712 symerr:
713 ctf_err_warn (fp, 0, err, _("error serializing symtypetabs"));
714 err:
715 free (sym_name_order);
716 return -1;
719 /* Type section. */
721 /* Iterate through the static types and the dynamic type definition list and
722 compute the size of the CTF type section. */
724 static size_t
725 ctf_type_sect_size (ctf_dict_t *fp)
727 ctf_dtdef_t *dtd;
728 size_t type_size;
730 for (type_size = 0, dtd = ctf_list_next (&fp->ctf_dtdefs);
731 dtd != NULL; dtd = ctf_list_next (dtd))
733 uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
734 uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
735 size_t type_ctt_size = dtd->dtd_data.ctt_size;
737 /* Shrink ctf_type_t-using types from a ctf_type_t to a ctf_stype_t
738 if possible. */
740 if (kind == CTF_K_STRUCT || kind == CTF_K_UNION)
742 size_t lsize = CTF_TYPE_LSIZE (&dtd->dtd_data);
744 if (lsize <= CTF_MAX_SIZE)
745 type_ctt_size = lsize;
748 if (type_ctt_size != CTF_LSIZE_SENT)
749 type_size += sizeof (ctf_stype_t);
750 else
751 type_size += sizeof (ctf_type_t);
753 switch (kind)
755 case CTF_K_INTEGER:
756 case CTF_K_FLOAT:
757 type_size += sizeof (uint32_t);
758 break;
759 case CTF_K_ARRAY:
760 type_size += sizeof (ctf_array_t);
761 break;
762 case CTF_K_SLICE:
763 type_size += sizeof (ctf_slice_t);
764 break;
765 case CTF_K_FUNCTION:
766 type_size += sizeof (uint32_t) * (vlen + (vlen & 1));
767 break;
768 case CTF_K_STRUCT:
769 case CTF_K_UNION:
770 if (type_ctt_size < CTF_LSTRUCT_THRESH)
771 type_size += sizeof (ctf_member_t) * vlen;
772 else
773 type_size += sizeof (ctf_lmember_t) * vlen;
774 break;
775 case CTF_K_ENUM:
776 type_size += sizeof (ctf_enum_t) * vlen;
777 break;
781 return type_size + fp->ctf_header->cth_stroff - fp->ctf_header->cth_typeoff;
784 /* Take a final lap through the dynamic type definition list and copy the
785 appropriate type records to the output buffer, noting down the strings as
786 we go. */
788 static void
789 ctf_emit_type_sect (ctf_dict_t *fp, unsigned char **tptr)
791 unsigned char *t = *tptr;
792 ctf_dtdef_t *dtd;
794 for (dtd = ctf_list_next (&fp->ctf_dtdefs);
795 dtd != NULL; dtd = ctf_list_next (dtd))
797 uint32_t kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
798 uint32_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
799 size_t type_ctt_size = dtd->dtd_data.ctt_size;
800 size_t len;
801 ctf_stype_t *copied;
802 const char *name;
803 size_t i;
805 /* Shrink ctf_type_t-using types from a ctf_type_t to a ctf_stype_t
806 if possible. */
808 if (kind == CTF_K_STRUCT || kind == CTF_K_UNION)
810 size_t lsize = CTF_TYPE_LSIZE (&dtd->dtd_data);
812 if (lsize <= CTF_MAX_SIZE)
813 type_ctt_size = lsize;
816 if (type_ctt_size != CTF_LSIZE_SENT)
817 len = sizeof (ctf_stype_t);
818 else
819 len = sizeof (ctf_type_t);
821 memcpy (t, &dtd->dtd_data, len);
822 copied = (ctf_stype_t *) t; /* name is at the start: constant offset. */
823 if (copied->ctt_name
824 && (name = ctf_strraw (fp, copied->ctt_name)) != NULL)
825 ctf_str_add_ref (fp, name, &copied->ctt_name);
826 copied->ctt_size = type_ctt_size;
827 t += len;
829 switch (kind)
831 case CTF_K_INTEGER:
832 case CTF_K_FLOAT:
833 memcpy (t, dtd->dtd_vlen, sizeof (uint32_t));
834 t += sizeof (uint32_t);
835 break;
837 case CTF_K_SLICE:
838 memcpy (t, dtd->dtd_vlen, sizeof (struct ctf_slice));
839 t += sizeof (struct ctf_slice);
840 break;
842 case CTF_K_ARRAY:
843 memcpy (t, dtd->dtd_vlen, sizeof (struct ctf_array));
844 t += sizeof (struct ctf_array);
845 break;
847 case CTF_K_FUNCTION:
848 /* Functions with no args also have no vlen. */
849 if (dtd->dtd_vlen)
850 memcpy (t, dtd->dtd_vlen, sizeof (uint32_t) * (vlen + (vlen & 1)));
851 t += sizeof (uint32_t) * (vlen + (vlen & 1));
852 break;
854 /* These need to be copied across element by element, depending on
855 their ctt_size. */
856 case CTF_K_STRUCT:
857 case CTF_K_UNION:
859 ctf_lmember_t *dtd_vlen = (ctf_lmember_t *) dtd->dtd_vlen;
860 ctf_lmember_t *t_lvlen = (ctf_lmember_t *) t;
861 ctf_member_t *t_vlen = (ctf_member_t *) t;
863 for (i = 0; i < vlen; i++)
865 const char *name = ctf_strraw (fp, dtd_vlen[i].ctlm_name);
867 ctf_str_add_ref (fp, name, &dtd_vlen[i].ctlm_name);
869 if (type_ctt_size < CTF_LSTRUCT_THRESH)
871 t_vlen[i].ctm_name = dtd_vlen[i].ctlm_name;
872 t_vlen[i].ctm_type = dtd_vlen[i].ctlm_type;
873 t_vlen[i].ctm_offset = CTF_LMEM_OFFSET (&dtd_vlen[i]);
874 ctf_str_add_ref (fp, name, &t_vlen[i].ctm_name);
876 else
878 t_lvlen[i] = dtd_vlen[i];
879 ctf_str_add_ref (fp, name, &t_lvlen[i].ctlm_name);
884 if (type_ctt_size < CTF_LSTRUCT_THRESH)
885 t += sizeof (ctf_member_t) * vlen;
886 else
887 t += sizeof (ctf_lmember_t) * vlen;
888 break;
890 case CTF_K_ENUM:
892 ctf_enum_t *dtd_vlen = (struct ctf_enum *) dtd->dtd_vlen;
893 ctf_enum_t *t_vlen = (struct ctf_enum *) t;
895 memcpy (t, dtd->dtd_vlen, sizeof (struct ctf_enum) * vlen);
896 for (i = 0; i < vlen; i++)
898 const char *name = ctf_strraw (fp, dtd_vlen[i].cte_name);
900 ctf_str_add_ref (fp, name, &t_vlen[i].cte_name);
901 ctf_str_add_ref (fp, name, &dtd_vlen[i].cte_name);
903 t += sizeof (struct ctf_enum) * vlen;
905 break;
910 *tptr = t;
913 /* Variable section. */
915 /* Sort a newly-constructed static variable array. */
917 typedef struct ctf_sort_var_arg_cb
919 ctf_dict_t *fp;
920 ctf_strs_t *strtab;
921 } ctf_sort_var_arg_cb_t;
923 static int
924 ctf_sort_var (const void *one_, const void *two_, void *arg_)
926 const ctf_varent_t *one = one_;
927 const ctf_varent_t *two = two_;
928 ctf_sort_var_arg_cb_t *arg = arg_;
930 return (strcmp (ctf_strraw_explicit (arg->fp, one->ctv_name, arg->strtab),
931 ctf_strraw_explicit (arg->fp, two->ctv_name, arg->strtab)));
934 /* Overall serialization. */
936 /* Emit a new CTF dict which is a serialized copy of this one: also reify
937 the string table and update all offsets in the current dict suitably.
938 (This simplifies ctf-string.c a little, at the cost of storing a second
939 copy of the strtab if this dict was originally read in via ctf_open.)
941 Other aspects of the existing dict are unchanged, although some
942 static entries may be duplicated in the dynamic state (which should
943 have no effect on visible operation). */
945 static unsigned char *
946 ctf_serialize (ctf_dict_t *fp, size_t *bufsiz)
948 ctf_header_t hdr, *hdrp;
949 ctf_dvdef_t *dvd;
950 ctf_varent_t *dvarents;
951 const ctf_strs_writable_t *strtab;
952 int sym_functions = 0;
954 unsigned char *t;
955 unsigned long i;
956 size_t buf_size, type_size, objt_size, func_size;
957 size_t funcidx_size, objtidx_size;
958 size_t nvars;
959 unsigned char *buf = NULL, *newbuf;
961 emit_symtypetab_state_t symstate;
962 memset (&symstate, 0, sizeof (emit_symtypetab_state_t));
964 /* Fill in an initial CTF header. We will leave the label, object,
965 and function sections empty and only output a header, type section,
966 and string table. The type section begins at a 4-byte aligned
967 boundary past the CTF header itself (at relative offset zero). The flag
968 indicating a new-style function info section (an array of CTF_K_FUNCTION
969 type IDs in the types section) is flipped on. */
971 memset (&hdr, 0, sizeof (hdr));
972 hdr.cth_magic = CTF_MAGIC;
973 hdr.cth_version = CTF_VERSION;
975 /* This is a new-format func info section, and the symtab and strtab come out
976 of the dynsym and dynstr these days. */
977 hdr.cth_flags = (CTF_F_NEWFUNCINFO | CTF_F_DYNSTR);
979 /* Propagate all symbols in the symtypetabs into the dynamic state, so that
980 we can put them back in the right order. Symbols already in the dynamic
981 state, likely due to repeated serialization, are left unchanged. */
984 ctf_next_t *it = NULL;
985 const char *sym_name;
986 ctf_id_t sym;
988 while ((sym = ctf_symbol_next_static (fp, &it, &sym_name,
989 sym_functions)) != CTF_ERR)
990 if ((ctf_add_funcobjt_sym_forced (fp, sym_functions, sym_name, sym)) < 0)
991 if (ctf_errno (fp) != ECTF_DUPLICATE)
992 return NULL; /* errno is set for us. */
994 if (ctf_errno (fp) != ECTF_NEXT_END)
995 return NULL; /* errno is set for us. */
996 } while (sym_functions++ < 1);
998 /* Figure out how big the symtypetabs are now. */
1000 if (ctf_symtypetab_sect_sizes (fp, &symstate, &hdr, &objt_size, &func_size,
1001 &objtidx_size, &funcidx_size) < 0)
1002 return NULL; /* errno is set for us. */
1004 /* Propagate all vars into the dynamic state, so we can put them back later.
1005 Variables already in the dynamic state, likely due to repeated
1006 serialization, are left unchanged. */
1008 for (i = 0; i < fp->ctf_nvars; i++)
1010 const char *name = ctf_strptr (fp, fp->ctf_vars[i].ctv_name);
1012 if (name != NULL && !ctf_dvd_lookup (fp, name))
1013 if (ctf_add_variable_forced (fp, name, fp->ctf_vars[i].ctv_type) < 0)
1014 return NULL; /* errno is set for us. */
1017 for (nvars = 0, dvd = ctf_list_next (&fp->ctf_dvdefs);
1018 dvd != NULL; dvd = ctf_list_next (dvd), nvars++);
1020 type_size = ctf_type_sect_size (fp);
1022 /* Compute the size of the CTF buffer we need, sans only the string table,
1023 then allocate a new buffer and memcpy the finished header to the start of
1024 the buffer. (We will adjust this later with strtab length info.) */
1026 hdr.cth_lbloff = hdr.cth_objtoff = 0;
1027 hdr.cth_funcoff = hdr.cth_objtoff + objt_size;
1028 hdr.cth_objtidxoff = hdr.cth_funcoff + func_size;
1029 hdr.cth_funcidxoff = hdr.cth_objtidxoff + objtidx_size;
1030 hdr.cth_varoff = hdr.cth_funcidxoff + funcidx_size;
1031 hdr.cth_typeoff = hdr.cth_varoff + (nvars * sizeof (ctf_varent_t));
1032 hdr.cth_stroff = hdr.cth_typeoff + type_size;
1033 hdr.cth_strlen = 0;
1035 buf_size = sizeof (ctf_header_t) + hdr.cth_stroff + hdr.cth_strlen;
1037 if ((buf = malloc (buf_size)) == NULL)
1039 ctf_set_errno (fp, EAGAIN);
1040 return NULL;
1043 memcpy (buf, &hdr, sizeof (ctf_header_t));
1044 t = (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_objtoff;
1046 hdrp = (ctf_header_t *) buf;
1047 if ((fp->ctf_flags & LCTF_CHILD) && (fp->ctf_parname != NULL))
1048 ctf_str_add_ref (fp, fp->ctf_parname, &hdrp->cth_parname);
1049 if (fp->ctf_cuname != NULL)
1050 ctf_str_add_ref (fp, fp->ctf_cuname, &hdrp->cth_cuname);
1052 if (ctf_emit_symtypetab_sects (fp, &symstate, &t, objt_size, func_size,
1053 objtidx_size, funcidx_size) < 0)
1054 goto err;
1056 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_varoff);
1058 /* Work over the variable list, translating everything into ctf_varent_t's and
1059 prepping the string table. */
1061 dvarents = (ctf_varent_t *) t;
1062 for (i = 0, dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL;
1063 dvd = ctf_list_next (dvd), i++)
1065 ctf_varent_t *var = &dvarents[i];
1067 ctf_str_add_ref (fp, dvd->dvd_name, &var->ctv_name);
1068 var->ctv_type = (uint32_t) dvd->dvd_type;
1070 assert (i == nvars);
1072 t += sizeof (ctf_varent_t) * nvars;
1074 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_typeoff);
1076 /* Copy in existing static types, then emit new dynamic types. */
1078 memcpy (t, fp->ctf_buf + fp->ctf_header->cth_typeoff,
1079 fp->ctf_header->cth_stroff - fp->ctf_header->cth_typeoff);
1080 t += fp->ctf_header->cth_stroff - fp->ctf_header->cth_typeoff;
1081 ctf_emit_type_sect (fp, &t);
1083 assert (t == (unsigned char *) buf + sizeof (ctf_header_t) + hdr.cth_stroff);
1085 /* Construct the final string table and fill out all the string refs with the
1086 final offsets. */
1088 strtab = ctf_str_write_strtab (fp);
1090 if (strtab == NULL)
1091 goto oom;
1093 /* Now the string table is constructed, we can sort the buffer of
1094 ctf_varent_t's. */
1095 ctf_sort_var_arg_cb_t sort_var_arg = { fp, (ctf_strs_t *) strtab };
1096 ctf_qsort_r (dvarents, nvars, sizeof (ctf_varent_t), ctf_sort_var,
1097 &sort_var_arg);
1099 if ((newbuf = realloc (buf, buf_size + strtab->cts_len)) == NULL)
1100 goto oom;
1102 buf = newbuf;
1103 memcpy (buf + buf_size, strtab->cts_strs, strtab->cts_len);
1104 hdrp = (ctf_header_t *) buf;
1105 hdrp->cth_strlen = strtab->cts_len;
1106 buf_size += hdrp->cth_strlen;
1107 *bufsiz = buf_size;
1109 return buf;
1111 oom:
1112 ctf_set_errno (fp, EAGAIN);
1113 err:
1114 free (buf);
1115 return NULL; /* errno is set for us. */
1118 /* File writing. */
1120 /* Write the compressed CTF data stream to the specified gzFile descriptor. The
1121 whole stream is compressed, and cannot be read by CTF opening functions in
1122 this library until it is decompressed. (The functions below this one leave
1123 the header uncompressed, and the CTF opening functions work on them without
1124 manual decompression.)
1126 No support for (testing-only) endian-flipping. */
1128 ctf_gzwrite (ctf_dict_t *fp, gzFile fd)
1130 unsigned char *buf;
1131 unsigned char *p;
1132 size_t bufsiz;
1133 size_t len, written = 0;
1135 if ((buf = ctf_serialize (fp, &bufsiz)) == NULL)
1136 return -1; /* errno is set for us. */
1138 p = buf;
1139 while (written < bufsiz)
1141 if ((len = gzwrite (fd, p, bufsiz - written)) <= 0)
1143 free (buf);
1144 return (ctf_set_errno (fp, errno));
1146 written += len;
1147 p += len;
1150 free (buf);
1151 return 0;
1154 /* Optionally compress the specified CTF data stream and return it as a new
1155 dynamically-allocated string. Possibly write it with reversed
1156 endianness. */
1157 unsigned char *
1158 ctf_write_mem (ctf_dict_t *fp, size_t *size, size_t threshold)
1160 unsigned char *rawbuf;
1161 unsigned char *buf = NULL;
1162 unsigned char *bp;
1163 ctf_header_t *rawhp, *hp;
1164 unsigned char *src;
1165 size_t rawbufsiz;
1166 size_t alloc_len = 0;
1167 int uncompressed = 0;
1168 int flip_endian;
1169 int rc;
1171 flip_endian = getenv ("LIBCTF_WRITE_FOREIGN_ENDIAN") != NULL;
1173 if ((rawbuf = ctf_serialize (fp, &rawbufsiz)) == NULL)
1174 return NULL; /* errno is set for us. */
1176 if (!ctf_assert (fp, rawbufsiz >= sizeof (ctf_header_t)))
1177 goto err;
1179 if (rawbufsiz >= threshold)
1180 alloc_len = compressBound (rawbufsiz - sizeof (ctf_header_t))
1181 + sizeof (ctf_header_t);
1183 /* Trivial operation if the buffer is too small to bother compressing, and
1184 we're not doing a forced write-time flip. */
1186 if (rawbufsiz < threshold)
1188 alloc_len = rawbufsiz;
1189 uncompressed = 1;
1192 if (!flip_endian && uncompressed)
1194 *size = rawbufsiz;
1195 return rawbuf;
1198 if ((buf = malloc (alloc_len)) == NULL)
1200 ctf_set_errno (fp, ENOMEM);
1201 ctf_err_warn (fp, 0, 0, _("ctf_write_mem: cannot allocate %li bytes"),
1202 (unsigned long) (alloc_len));
1203 goto err;
1206 rawhp = (ctf_header_t *) rawbuf;
1207 hp = (ctf_header_t *) buf;
1208 memcpy (hp, rawbuf, sizeof (ctf_header_t));
1209 bp = buf + sizeof (ctf_header_t);
1210 *size = sizeof (ctf_header_t);
1212 if (!uncompressed)
1213 hp->cth_flags |= CTF_F_COMPRESS;
1215 src = rawbuf + sizeof (ctf_header_t);
1217 if (flip_endian)
1219 ctf_flip_header (hp);
1220 if (ctf_flip (fp, rawhp, src, 1) < 0)
1221 goto err; /* errno is set for us. */
1224 if (!uncompressed)
1226 size_t compress_len = alloc_len - sizeof (ctf_header_t);
1228 if ((rc = compress (bp, (uLongf *) &compress_len,
1229 src, rawbufsiz - sizeof (ctf_header_t))) != Z_OK)
1231 ctf_set_errno (fp, ECTF_COMPRESS);
1232 ctf_err_warn (fp, 0, 0, _("zlib deflate err: %s"), zError (rc));
1233 goto err;
1235 *size += compress_len;
1237 else
1239 memcpy (bp, src, rawbufsiz - sizeof (ctf_header_t));
1240 *size += rawbufsiz - sizeof (ctf_header_t);
1243 free (rawbuf);
1244 return buf;
1245 err:
1246 free (buf);
1247 free (rawbuf);
1248 return NULL;
1251 /* Write the compressed CTF data stream to the specified file descriptor,
1252 possibly compressed. Internal only (for now). */
1254 ctf_write_thresholded (ctf_dict_t *fp, int fd, size_t threshold)
1256 unsigned char *buf;
1257 unsigned char *bp;
1258 size_t tmp;
1259 ssize_t buf_len;
1260 ssize_t len;
1261 int err = 0;
1263 if ((buf = ctf_write_mem (fp, &tmp, threshold)) == NULL)
1264 return -1; /* errno is set for us. */
1266 buf_len = tmp;
1267 bp = buf;
1269 while (buf_len > 0)
1271 if ((len = write (fd, bp, buf_len)) < 0)
1273 err = ctf_set_errno (fp, errno);
1274 ctf_err_warn (fp, 0, 0, _("ctf_compress_write: error writing"));
1275 goto ret;
1277 buf_len -= len;
1278 bp += len;
1281 ret:
1282 free (buf);
1283 return err;
1286 /* Compress the specified CTF data stream and write it to the specified file
1287 descriptor. */
1289 ctf_compress_write (ctf_dict_t *fp, int fd)
1291 return ctf_write_thresholded (fp, fd, 0);
1294 /* Write the uncompressed CTF data stream to the specified file descriptor. */
1296 ctf_write (ctf_dict_t *fp, int fd)
1298 return ctf_write_thresholded (fp, fd, (size_t) -1);