ctf-open.c revision 1.1 1 1.1 christos /* Opening CTF files.
2 1.1 christos Copyright (C) 2019-2020 Free Software Foundation, Inc.
3 1.1 christos
4 1.1 christos This file is part of libctf.
5 1.1 christos
6 1.1 christos libctf is free software; you can redistribute it and/or modify it under
7 1.1 christos the terms of the GNU General Public License as published by the Free
8 1.1 christos Software Foundation; either version 3, or (at your option) any later
9 1.1 christos version.
10 1.1 christos
11 1.1 christos This program is distributed in the hope that it will be useful, but
12 1.1 christos WITHOUT ANY WARRANTY; without even the implied warranty of
13 1.1 christos MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
14 1.1 christos See the GNU General Public License for more details.
15 1.1 christos
16 1.1 christos You should have received a copy of the GNU General Public License
17 1.1 christos along with this program; see the file COPYING. If not see
18 1.1 christos <http://www.gnu.org/licenses/>. */
19 1.1 christos
20 1.1 christos #include <ctf-impl.h>
21 1.1 christos #include <stddef.h>
22 1.1 christos #include <string.h>
23 1.1 christos #include <sys/types.h>
24 1.1 christos #include <elf.h>
25 1.1 christos #include <assert.h>
26 1.1 christos #include "swap.h"
27 1.1 christos #include <bfd.h>
28 1.1 christos #include <zlib.h>
29 1.1 christos
30 1.1 christos #include "elf-bfd.h"
31 1.1 christos
32 1.1 christos static const ctf_dmodel_t _libctf_models[] = {
33 1.1 christos {"ILP32", CTF_MODEL_ILP32, 4, 1, 2, 4, 4},
34 1.1 christos {"LP64", CTF_MODEL_LP64, 8, 1, 2, 4, 8},
35 1.1 christos {NULL, 0, 0, 0, 0, 0, 0}
36 1.1 christos };
37 1.1 christos
38 1.1 christos const char _CTF_SECTION[] = ".ctf";
39 1.1 christos const char _CTF_NULLSTR[] = "";
40 1.1 christos
41 1.1 christos /* Version-sensitive accessors. */
42 1.1 christos
43 1.1 christos static uint32_t
44 1.1 christos get_kind_v1 (uint32_t info)
45 1.1 christos {
46 1.1 christos return (CTF_V1_INFO_KIND (info));
47 1.1 christos }
48 1.1 christos
49 1.1 christos static uint32_t
50 1.1 christos get_root_v1 (uint32_t info)
51 1.1 christos {
52 1.1 christos return (CTF_V1_INFO_ISROOT (info));
53 1.1 christos }
54 1.1 christos
55 1.1 christos static uint32_t
56 1.1 christos get_vlen_v1 (uint32_t info)
57 1.1 christos {
58 1.1 christos return (CTF_V1_INFO_VLEN (info));
59 1.1 christos }
60 1.1 christos
61 1.1 christos static uint32_t
62 1.1 christos get_kind_v2 (uint32_t info)
63 1.1 christos {
64 1.1 christos return (CTF_V2_INFO_KIND (info));
65 1.1 christos }
66 1.1 christos
67 1.1 christos static uint32_t
68 1.1 christos get_root_v2 (uint32_t info)
69 1.1 christos {
70 1.1 christos return (CTF_V2_INFO_ISROOT (info));
71 1.1 christos }
72 1.1 christos
73 1.1 christos static uint32_t
74 1.1 christos get_vlen_v2 (uint32_t info)
75 1.1 christos {
76 1.1 christos return (CTF_V2_INFO_VLEN (info));
77 1.1 christos }
78 1.1 christos
79 1.1 christos static inline ssize_t
80 1.1 christos get_ctt_size_common (const ctf_file_t *fp _libctf_unused_,
81 1.1 christos const ctf_type_t *tp _libctf_unused_,
82 1.1 christos ssize_t *sizep, ssize_t *incrementp, size_t lsize,
83 1.1 christos size_t csize, size_t ctf_type_size,
84 1.1 christos size_t ctf_stype_size, size_t ctf_lsize_sent)
85 1.1 christos {
86 1.1 christos ssize_t size, increment;
87 1.1 christos
88 1.1 christos if (csize == ctf_lsize_sent)
89 1.1 christos {
90 1.1 christos size = lsize;
91 1.1 christos increment = ctf_type_size;
92 1.1 christos }
93 1.1 christos else
94 1.1 christos {
95 1.1 christos size = csize;
96 1.1 christos increment = ctf_stype_size;
97 1.1 christos }
98 1.1 christos
99 1.1 christos if (sizep)
100 1.1 christos *sizep = size;
101 1.1 christos if (incrementp)
102 1.1 christos *incrementp = increment;
103 1.1 christos
104 1.1 christos return size;
105 1.1 christos }
106 1.1 christos
107 1.1 christos static ssize_t
108 1.1 christos get_ctt_size_v1 (const ctf_file_t *fp, const ctf_type_t *tp,
109 1.1 christos ssize_t *sizep, ssize_t *incrementp)
110 1.1 christos {
111 1.1 christos ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
112 1.1 christos
113 1.1 christos return (get_ctt_size_common (fp, tp, sizep, incrementp,
114 1.1 christos CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
115 1.1 christos sizeof (ctf_type_v1_t), sizeof (ctf_stype_v1_t),
116 1.1 christos CTF_LSIZE_SENT_V1));
117 1.1 christos }
118 1.1 christos
119 1.1 christos /* Return the size that a v1 will be once it is converted to v2. */
120 1.1 christos
121 1.1 christos static ssize_t
122 1.1 christos get_ctt_size_v2_unconverted (const ctf_file_t *fp, const ctf_type_t *tp,
123 1.1 christos ssize_t *sizep, ssize_t *incrementp)
124 1.1 christos {
125 1.1 christos ctf_type_v1_t *t1p = (ctf_type_v1_t *) tp;
126 1.1 christos
127 1.1 christos return (get_ctt_size_common (fp, tp, sizep, incrementp,
128 1.1 christos CTF_TYPE_LSIZE (t1p), t1p->ctt_size,
129 1.1 christos sizeof (ctf_type_t), sizeof (ctf_stype_t),
130 1.1 christos CTF_LSIZE_SENT));
131 1.1 christos }
132 1.1 christos
133 1.1 christos static ssize_t
134 1.1 christos get_ctt_size_v2 (const ctf_file_t *fp, const ctf_type_t *tp,
135 1.1 christos ssize_t *sizep, ssize_t *incrementp)
136 1.1 christos {
137 1.1 christos return (get_ctt_size_common (fp, tp, sizep, incrementp,
138 1.1 christos CTF_TYPE_LSIZE (tp), tp->ctt_size,
139 1.1 christos sizeof (ctf_type_t), sizeof (ctf_stype_t),
140 1.1 christos CTF_LSIZE_SENT));
141 1.1 christos }
142 1.1 christos
143 1.1 christos static ssize_t
144 1.1 christos get_vbytes_common (ctf_file_t *fp, unsigned short kind,
145 1.1 christos ssize_t size _libctf_unused_, size_t vlen)
146 1.1 christos {
147 1.1 christos switch (kind)
148 1.1 christos {
149 1.1 christos case CTF_K_INTEGER:
150 1.1 christos case CTF_K_FLOAT:
151 1.1 christos return (sizeof (uint32_t));
152 1.1 christos case CTF_K_SLICE:
153 1.1 christos return (sizeof (ctf_slice_t));
154 1.1 christos case CTF_K_ENUM:
155 1.1 christos return (sizeof (ctf_enum_t) * vlen);
156 1.1 christos case CTF_K_FORWARD:
157 1.1 christos case CTF_K_UNKNOWN:
158 1.1 christos case CTF_K_POINTER:
159 1.1 christos case CTF_K_TYPEDEF:
160 1.1 christos case CTF_K_VOLATILE:
161 1.1 christos case CTF_K_CONST:
162 1.1 christos case CTF_K_RESTRICT:
163 1.1 christos return 0;
164 1.1 christos default:
165 1.1 christos ctf_set_errno (fp, ECTF_CORRUPT);
166 1.1 christos ctf_err_warn (fp, 0, 0, _("detected invalid CTF kind: %x"), kind);
167 1.1 christos return -1;
168 1.1 christos }
169 1.1 christos }
170 1.1 christos
171 1.1 christos static ssize_t
172 1.1 christos get_vbytes_v1 (ctf_file_t *fp, unsigned short kind, ssize_t size, size_t vlen)
173 1.1 christos {
174 1.1 christos switch (kind)
175 1.1 christos {
176 1.1 christos case CTF_K_ARRAY:
177 1.1 christos return (sizeof (ctf_array_v1_t));
178 1.1 christos case CTF_K_FUNCTION:
179 1.1 christos return (sizeof (unsigned short) * (vlen + (vlen & 1)));
180 1.1 christos case CTF_K_STRUCT:
181 1.1 christos case CTF_K_UNION:
182 1.1 christos if (size < CTF_LSTRUCT_THRESH_V1)
183 1.1 christos return (sizeof (ctf_member_v1_t) * vlen);
184 1.1 christos else
185 1.1 christos return (sizeof (ctf_lmember_v1_t) * vlen);
186 1.1 christos }
187 1.1 christos
188 1.1 christos return (get_vbytes_common (fp, kind, size, vlen));
189 1.1 christos }
190 1.1 christos
191 1.1 christos static ssize_t
192 1.1 christos get_vbytes_v2 (ctf_file_t *fp, unsigned short kind, ssize_t size, size_t vlen)
193 1.1 christos {
194 1.1 christos switch (kind)
195 1.1 christos {
196 1.1 christos case CTF_K_ARRAY:
197 1.1 christos return (sizeof (ctf_array_t));
198 1.1 christos case CTF_K_FUNCTION:
199 1.1 christos return (sizeof (uint32_t) * (vlen + (vlen & 1)));
200 1.1 christos case CTF_K_STRUCT:
201 1.1 christos case CTF_K_UNION:
202 1.1 christos if (size < CTF_LSTRUCT_THRESH)
203 1.1 christos return (sizeof (ctf_member_t) * vlen);
204 1.1 christos else
205 1.1 christos return (sizeof (ctf_lmember_t) * vlen);
206 1.1 christos }
207 1.1 christos
208 1.1 christos return (get_vbytes_common (fp, kind, size, vlen));
209 1.1 christos }
210 1.1 christos
211 1.1 christos static const ctf_fileops_t ctf_fileops[] = {
212 1.1 christos {NULL, NULL, NULL, NULL, NULL},
213 1.1 christos /* CTF_VERSION_1 */
214 1.1 christos {get_kind_v1, get_root_v1, get_vlen_v1, get_ctt_size_v1, get_vbytes_v1},
215 1.1 christos /* CTF_VERSION_1_UPGRADED_3 */
216 1.1 christos {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
217 1.1 christos /* CTF_VERSION_2 */
218 1.1 christos {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
219 1.1 christos /* CTF_VERSION_3, identical to 2: only new type kinds */
220 1.1 christos {get_kind_v2, get_root_v2, get_vlen_v2, get_ctt_size_v2, get_vbytes_v2},
221 1.1 christos };
222 1.1 christos
223 1.1 christos /* Initialize the symtab translation table by filling each entry with the
224 1.1 christos offset of the CTF type or function data corresponding to each STT_FUNC or
225 1.1 christos STT_OBJECT entry in the symbol table. */
226 1.1 christos
227 1.1 christos static int
228 1.1 christos init_symtab (ctf_file_t *fp, const ctf_header_t *hp,
229 1.1 christos const ctf_sect_t *sp, const ctf_sect_t *strp)
230 1.1 christos {
231 1.1 christos const unsigned char *symp = sp->cts_data;
232 1.1 christos uint32_t *xp = fp->ctf_sxlate;
233 1.1 christos uint32_t *xend = xp + fp->ctf_nsyms;
234 1.1 christos
235 1.1 christos uint32_t objtoff = hp->cth_objtoff;
236 1.1 christos uint32_t funcoff = hp->cth_funcoff;
237 1.1 christos
238 1.1 christos uint32_t info, vlen;
239 1.1 christos Elf64_Sym sym, *gsp;
240 1.1 christos const char *name;
241 1.1 christos
242 1.1 christos /* The CTF data object and function type sections are ordered to match
243 1.1 christos the relative order of the respective symbol types in the symtab.
244 1.1 christos If no type information is available for a symbol table entry, a
245 1.1 christos pad is inserted in the CTF section. As a further optimization,
246 1.1 christos anonymous or undefined symbols are omitted from the CTF data. */
247 1.1 christos
248 1.1 christos for (; xp < xend; xp++, symp += sp->cts_entsize)
249 1.1 christos {
250 1.1 christos if (sp->cts_entsize == sizeof (Elf32_Sym))
251 1.1 christos gsp = ctf_sym_to_elf64 ((Elf32_Sym *) (uintptr_t) symp, &sym);
252 1.1 christos else
253 1.1 christos gsp = (Elf64_Sym *) (uintptr_t) symp;
254 1.1 christos
255 1.1 christos if (gsp->st_name < strp->cts_size)
256 1.1 christos name = (const char *) strp->cts_data + gsp->st_name;
257 1.1 christos else
258 1.1 christos name = _CTF_NULLSTR;
259 1.1 christos
260 1.1 christos if (gsp->st_name == 0 || gsp->st_shndx == SHN_UNDEF
261 1.1 christos || strcmp (name, "_START_") == 0 || strcmp (name, "_END_") == 0)
262 1.1 christos {
263 1.1 christos *xp = -1u;
264 1.1 christos continue;
265 1.1 christos }
266 1.1 christos
267 1.1 christos switch (ELF64_ST_TYPE (gsp->st_info))
268 1.1 christos {
269 1.1 christos case STT_OBJECT:
270 1.1 christos if (objtoff >= hp->cth_funcoff
271 1.1 christos || (gsp->st_shndx == SHN_EXTABS && gsp->st_value == 0))
272 1.1 christos {
273 1.1 christos *xp = -1u;
274 1.1 christos break;
275 1.1 christos }
276 1.1 christos
277 1.1 christos *xp = objtoff;
278 1.1 christos objtoff += sizeof (uint32_t);
279 1.1 christos break;
280 1.1 christos
281 1.1 christos case STT_FUNC:
282 1.1 christos if (funcoff >= hp->cth_objtidxoff)
283 1.1 christos {
284 1.1 christos *xp = -1u;
285 1.1 christos break;
286 1.1 christos }
287 1.1 christos
288 1.1 christos *xp = funcoff;
289 1.1 christos
290 1.1 christos info = *(uint32_t *) ((uintptr_t) fp->ctf_buf + funcoff);
291 1.1 christos vlen = LCTF_INFO_VLEN (fp, info);
292 1.1 christos
293 1.1 christos /* If we encounter a zero pad at the end, just skip it. Otherwise
294 1.1 christos skip over the function and its return type (+2) and the argument
295 1.1 christos list (vlen).
296 1.1 christos */
297 1.1 christos if (LCTF_INFO_KIND (fp, info) == CTF_K_UNKNOWN && vlen == 0)
298 1.1 christos funcoff += sizeof (uint32_t); /* Skip pad. */
299 1.1 christos else
300 1.1 christos funcoff += sizeof (uint32_t) * (vlen + 2);
301 1.1 christos break;
302 1.1 christos
303 1.1 christos default:
304 1.1 christos *xp = -1u;
305 1.1 christos break;
306 1.1 christos }
307 1.1 christos }
308 1.1 christos
309 1.1 christos ctf_dprintf ("loaded %lu symtab entries\n", fp->ctf_nsyms);
310 1.1 christos return 0;
311 1.1 christos }
312 1.1 christos
313 1.1 christos /* Reset the CTF base pointer and derive the buf pointer from it, initializing
314 1.1 christos everything in the ctf_file that depends on the base or buf pointers.
315 1.1 christos
316 1.1 christos The original gap between the buf and base pointers, if any -- the original,
317 1.1 christos unconverted CTF header -- is kept, but its contents are not specified and are
318 1.1 christos never used. */
319 1.1 christos
320 1.1 christos static void
321 1.1 christos ctf_set_base (ctf_file_t *fp, const ctf_header_t *hp, unsigned char *base)
322 1.1 christos {
323 1.1 christos fp->ctf_buf = base + (fp->ctf_buf - fp->ctf_base);
324 1.1 christos fp->ctf_base = base;
325 1.1 christos fp->ctf_vars = (ctf_varent_t *) ((const char *) fp->ctf_buf +
326 1.1 christos hp->cth_varoff);
327 1.1 christos fp->ctf_nvars = (hp->cth_typeoff - hp->cth_varoff) / sizeof (ctf_varent_t);
328 1.1 christos
329 1.1 christos fp->ctf_str[CTF_STRTAB_0].cts_strs = (const char *) fp->ctf_buf
330 1.1 christos + hp->cth_stroff;
331 1.1 christos fp->ctf_str[CTF_STRTAB_0].cts_len = hp->cth_strlen;
332 1.1 christos
333 1.1 christos /* If we have a parent container name and label, store the relocated
334 1.1 christos string pointers in the CTF container for easy access later. */
335 1.1 christos
336 1.1 christos /* Note: before conversion, these will be set to values that will be
337 1.1 christos immediately invalidated by the conversion process, but the conversion
338 1.1 christos process will call ctf_set_base() again to fix things up. */
339 1.1 christos
340 1.1 christos if (hp->cth_parlabel != 0)
341 1.1 christos fp->ctf_parlabel = ctf_strptr (fp, hp->cth_parlabel);
342 1.1 christos if (hp->cth_parname != 0)
343 1.1 christos fp->ctf_parname = ctf_strptr (fp, hp->cth_parname);
344 1.1 christos if (hp->cth_cuname != 0)
345 1.1 christos fp->ctf_cuname = ctf_strptr (fp, hp->cth_cuname);
346 1.1 christos
347 1.1 christos if (fp->ctf_cuname)
348 1.1 christos ctf_dprintf ("ctf_set_base: CU name %s\n", fp->ctf_cuname);
349 1.1 christos if (fp->ctf_parname)
350 1.1 christos ctf_dprintf ("ctf_set_base: parent name %s (label %s)\n",
351 1.1 christos fp->ctf_parname,
352 1.1 christos fp->ctf_parlabel ? fp->ctf_parlabel : "<NULL>");
353 1.1 christos }
354 1.1 christos
355 1.1 christos /* Set the version of the CTF file. */
356 1.1 christos
357 1.1 christos /* When this is reset, LCTF_* changes behaviour, but there is no guarantee that
358 1.1 christos the variable data list associated with each type has been upgraded: the
359 1.1 christos caller must ensure this has been done in advance. */
360 1.1 christos
361 1.1 christos static void
362 1.1 christos ctf_set_version (ctf_file_t *fp, ctf_header_t *cth, int ctf_version)
363 1.1 christos {
364 1.1 christos fp->ctf_version = ctf_version;
365 1.1 christos cth->cth_version = ctf_version;
366 1.1 christos fp->ctf_fileops = &ctf_fileops[ctf_version];
367 1.1 christos }
368 1.1 christos
369 1.1 christos
370 1.1 christos /* Upgrade the header to CTF_VERSION_3. The upgrade is done in-place. */
371 1.1 christos static void
372 1.1 christos upgrade_header (ctf_header_t *hp)
373 1.1 christos {
374 1.1 christos ctf_header_v2_t *oldhp = (ctf_header_v2_t *) hp;
375 1.1 christos
376 1.1 christos hp->cth_strlen = oldhp->cth_strlen;
377 1.1 christos hp->cth_stroff = oldhp->cth_stroff;
378 1.1 christos hp->cth_typeoff = oldhp->cth_typeoff;
379 1.1 christos hp->cth_varoff = oldhp->cth_varoff;
380 1.1 christos hp->cth_funcidxoff = hp->cth_varoff; /* No index sections. */
381 1.1 christos hp->cth_objtidxoff = hp->cth_funcidxoff;
382 1.1 christos hp->cth_funcoff = oldhp->cth_funcoff;
383 1.1 christos hp->cth_objtoff = oldhp->cth_objtoff;
384 1.1 christos hp->cth_lbloff = oldhp->cth_lbloff;
385 1.1 christos hp->cth_cuname = 0; /* No CU name. */
386 1.1 christos }
387 1.1 christos
388 1.1 christos /* Upgrade the type table to CTF_VERSION_3 (really CTF_VERSION_1_UPGRADED_3)
389 1.1 christos from CTF_VERSION_1.
390 1.1 christos
391 1.1 christos The upgrade is not done in-place: the ctf_base is moved. ctf_strptr() must
392 1.1 christos not be called before reallocation is complete.
393 1.1 christos
394 1.1 christos Sections not checked here due to nonexistence or nonpopulated state in older
395 1.1 christos formats: objtidx, funcidx.
396 1.1 christos
397 1.1 christos Type kinds not checked here due to nonexistence in older formats:
398 1.1 christos CTF_K_SLICE. */
399 1.1 christos static int
400 1.1 christos upgrade_types_v1 (ctf_file_t *fp, ctf_header_t *cth)
401 1.1 christos {
402 1.1 christos const ctf_type_v1_t *tbuf;
403 1.1 christos const ctf_type_v1_t *tend;
404 1.1 christos unsigned char *ctf_base, *old_ctf_base = (unsigned char *) fp->ctf_dynbase;
405 1.1 christos ctf_type_t *t2buf;
406 1.1 christos
407 1.1 christos ssize_t increase = 0, size, increment, v2increment, vbytes, v2bytes;
408 1.1 christos const ctf_type_v1_t *tp;
409 1.1 christos ctf_type_t *t2p;
410 1.1 christos
411 1.1 christos tbuf = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_typeoff);
412 1.1 christos tend = (ctf_type_v1_t *) (fp->ctf_buf + cth->cth_stroff);
413 1.1 christos
414 1.1 christos /* Much like init_types(), this is a two-pass process.
415 1.1 christos
416 1.1 christos First, figure out the new type-section size needed. (It is possible,
417 1.1 christos in theory, for it to be less than the old size, but this is very
418 1.1 christos unlikely. It cannot be so small that cth_typeoff ends up of negative
419 1.1 christos size. We validate this with an assertion below.)
420 1.1 christos
421 1.1 christos We must cater not only for changes in vlen and types sizes but also
422 1.1 christos for changes in 'increment', which happen because v2 places some types
423 1.1 christos into ctf_stype_t where v1 would be forced to use the larger non-stype. */
424 1.1 christos
425 1.1 christos for (tp = tbuf; tp < tend;
426 1.1 christos tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes))
427 1.1 christos {
428 1.1 christos unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
429 1.1 christos unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
430 1.1 christos
431 1.1 christos size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
432 1.1 christos vbytes = get_vbytes_v1 (fp, kind, size, vlen);
433 1.1 christos
434 1.1 christos get_ctt_size_v2_unconverted (fp, (const ctf_type_t *) tp, NULL,
435 1.1 christos &v2increment);
436 1.1 christos v2bytes = get_vbytes_v2 (fp, kind, size, vlen);
437 1.1 christos
438 1.1 christos if ((vbytes < 0) || (size < 0))
439 1.1 christos return ECTF_CORRUPT;
440 1.1 christos
441 1.1 christos increase += v2increment - increment; /* May be negative. */
442 1.1 christos increase += v2bytes - vbytes;
443 1.1 christos }
444 1.1 christos
445 1.1 christos /* Allocate enough room for the new buffer, then copy everything but the type
446 1.1 christos section into place, and reset the base accordingly. Leave the version
447 1.1 christos number unchanged, so that LCTF_INFO_* still works on the
448 1.1 christos as-yet-untranslated type info. */
449 1.1 christos
450 1.1 christos if ((ctf_base = malloc (fp->ctf_size + increase)) == NULL)
451 1.1 christos return ECTF_ZALLOC;
452 1.1 christos
453 1.1 christos /* Start at ctf_buf, not ctf_base, to squeeze out the original header: we
454 1.1 christos never use it and it is unconverted. */
455 1.1 christos
456 1.1 christos memcpy (ctf_base, fp->ctf_buf, cth->cth_typeoff);
457 1.1 christos memcpy (ctf_base + cth->cth_stroff + increase,
458 1.1 christos fp->ctf_buf + cth->cth_stroff, cth->cth_strlen);
459 1.1 christos
460 1.1 christos memset (ctf_base + cth->cth_typeoff, 0, cth->cth_stroff - cth->cth_typeoff
461 1.1 christos + increase);
462 1.1 christos
463 1.1 christos cth->cth_stroff += increase;
464 1.1 christos fp->ctf_size += increase;
465 1.1 christos assert (cth->cth_stroff >= cth->cth_typeoff);
466 1.1 christos fp->ctf_base = ctf_base;
467 1.1 christos fp->ctf_buf = ctf_base;
468 1.1 christos fp->ctf_dynbase = ctf_base;
469 1.1 christos ctf_set_base (fp, cth, ctf_base);
470 1.1 christos
471 1.1 christos t2buf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
472 1.1 christos
473 1.1 christos /* Iterate through all the types again, upgrading them.
474 1.1 christos
475 1.1 christos Everything that hasn't changed can just be outright memcpy()ed.
476 1.1 christos Things that have changed need field-by-field consideration. */
477 1.1 christos
478 1.1 christos for (tp = tbuf, t2p = t2buf; tp < tend;
479 1.1 christos tp = (ctf_type_v1_t *) ((uintptr_t) tp + increment + vbytes),
480 1.1 christos t2p = (ctf_type_t *) ((uintptr_t) t2p + v2increment + v2bytes))
481 1.1 christos {
482 1.1 christos unsigned short kind = CTF_V1_INFO_KIND (tp->ctt_info);
483 1.1 christos int isroot = CTF_V1_INFO_ISROOT (tp->ctt_info);
484 1.1 christos unsigned long vlen = CTF_V1_INFO_VLEN (tp->ctt_info);
485 1.1 christos ssize_t v2size;
486 1.1 christos void *vdata, *v2data;
487 1.1 christos
488 1.1 christos size = get_ctt_size_v1 (fp, (const ctf_type_t *) tp, NULL, &increment);
489 1.1 christos vbytes = get_vbytes_v1 (fp, kind, size, vlen);
490 1.1 christos
491 1.1 christos t2p->ctt_name = tp->ctt_name;
492 1.1 christos t2p->ctt_info = CTF_TYPE_INFO (kind, isroot, vlen);
493 1.1 christos
494 1.1 christos switch (kind)
495 1.1 christos {
496 1.1 christos case CTF_K_FUNCTION:
497 1.1 christos case CTF_K_FORWARD:
498 1.1 christos case CTF_K_TYPEDEF:
499 1.1 christos case CTF_K_POINTER:
500 1.1 christos case CTF_K_VOLATILE:
501 1.1 christos case CTF_K_CONST:
502 1.1 christos case CTF_K_RESTRICT:
503 1.1 christos t2p->ctt_type = tp->ctt_type;
504 1.1 christos break;
505 1.1 christos case CTF_K_INTEGER:
506 1.1 christos case CTF_K_FLOAT:
507 1.1 christos case CTF_K_ARRAY:
508 1.1 christos case CTF_K_STRUCT:
509 1.1 christos case CTF_K_UNION:
510 1.1 christos case CTF_K_ENUM:
511 1.1 christos case CTF_K_UNKNOWN:
512 1.1 christos if ((size_t) size <= CTF_MAX_SIZE)
513 1.1 christos t2p->ctt_size = size;
514 1.1 christos else
515 1.1 christos {
516 1.1 christos t2p->ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
517 1.1 christos t2p->ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
518 1.1 christos }
519 1.1 christos break;
520 1.1 christos }
521 1.1 christos
522 1.1 christos v2size = get_ctt_size_v2 (fp, t2p, NULL, &v2increment);
523 1.1 christos v2bytes = get_vbytes_v2 (fp, kind, v2size, vlen);
524 1.1 christos
525 1.1 christos /* Catch out-of-sync get_ctt_size_*(). The count goes wrong if
526 1.1 christos these are not identical (and having them different makes no
527 1.1 christos sense semantically). */
528 1.1 christos
529 1.1 christos assert (size == v2size);
530 1.1 christos
531 1.1 christos /* Now the varlen info. */
532 1.1 christos
533 1.1 christos vdata = (void *) ((uintptr_t) tp + increment);
534 1.1 christos v2data = (void *) ((uintptr_t) t2p + v2increment);
535 1.1 christos
536 1.1 christos switch (kind)
537 1.1 christos {
538 1.1 christos case CTF_K_ARRAY:
539 1.1 christos {
540 1.1 christos const ctf_array_v1_t *ap = (const ctf_array_v1_t *) vdata;
541 1.1 christos ctf_array_t *a2p = (ctf_array_t *) v2data;
542 1.1 christos
543 1.1 christos a2p->cta_contents = ap->cta_contents;
544 1.1 christos a2p->cta_index = ap->cta_index;
545 1.1 christos a2p->cta_nelems = ap->cta_nelems;
546 1.1 christos break;
547 1.1 christos }
548 1.1 christos case CTF_K_STRUCT:
549 1.1 christos case CTF_K_UNION:
550 1.1 christos {
551 1.1 christos ctf_member_t tmp;
552 1.1 christos const ctf_member_v1_t *m1 = (const ctf_member_v1_t *) vdata;
553 1.1 christos const ctf_lmember_v1_t *lm1 = (const ctf_lmember_v1_t *) m1;
554 1.1 christos ctf_member_t *m2 = (ctf_member_t *) v2data;
555 1.1 christos ctf_lmember_t *lm2 = (ctf_lmember_t *) m2;
556 1.1 christos unsigned long i;
557 1.1 christos
558 1.1 christos /* We walk all four pointers forward, but only reference the two
559 1.1 christos that are valid for the given size, to avoid quadruplicating all
560 1.1 christos the code. */
561 1.1 christos
562 1.1 christos for (i = vlen; i != 0; i--, m1++, lm1++, m2++, lm2++)
563 1.1 christos {
564 1.1 christos size_t offset;
565 1.1 christos if (size < CTF_LSTRUCT_THRESH_V1)
566 1.1 christos {
567 1.1 christos offset = m1->ctm_offset;
568 1.1 christos tmp.ctm_name = m1->ctm_name;
569 1.1 christos tmp.ctm_type = m1->ctm_type;
570 1.1 christos }
571 1.1 christos else
572 1.1 christos {
573 1.1 christos offset = CTF_LMEM_OFFSET (lm1);
574 1.1 christos tmp.ctm_name = lm1->ctlm_name;
575 1.1 christos tmp.ctm_type = lm1->ctlm_type;
576 1.1 christos }
577 1.1 christos if (size < CTF_LSTRUCT_THRESH)
578 1.1 christos {
579 1.1 christos m2->ctm_name = tmp.ctm_name;
580 1.1 christos m2->ctm_type = tmp.ctm_type;
581 1.1 christos m2->ctm_offset = offset;
582 1.1 christos }
583 1.1 christos else
584 1.1 christos {
585 1.1 christos lm2->ctlm_name = tmp.ctm_name;
586 1.1 christos lm2->ctlm_type = tmp.ctm_type;
587 1.1 christos lm2->ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (offset);
588 1.1 christos lm2->ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (offset);
589 1.1 christos }
590 1.1 christos }
591 1.1 christos break;
592 1.1 christos }
593 1.1 christos case CTF_K_FUNCTION:
594 1.1 christos {
595 1.1 christos unsigned long i;
596 1.1 christos unsigned short *a1 = (unsigned short *) vdata;
597 1.1 christos uint32_t *a2 = (uint32_t *) v2data;
598 1.1 christos
599 1.1 christos for (i = vlen; i != 0; i--, a1++, a2++)
600 1.1 christos *a2 = *a1;
601 1.1 christos }
602 1.1 christos /* FALLTHRU */
603 1.1 christos default:
604 1.1 christos /* Catch out-of-sync get_vbytes_*(). */
605 1.1 christos assert (vbytes == v2bytes);
606 1.1 christos memcpy (v2data, vdata, vbytes);
607 1.1 christos }
608 1.1 christos }
609 1.1 christos
610 1.1 christos /* Verify that the entire region was converted. If not, we are either
611 1.1 christos converting too much, or too little (leading to a buffer overrun either here
612 1.1 christos or at read time, in init_types().) */
613 1.1 christos
614 1.1 christos assert ((size_t) t2p - (size_t) fp->ctf_buf == cth->cth_stroff);
615 1.1 christos
616 1.1 christos ctf_set_version (fp, cth, CTF_VERSION_1_UPGRADED_3);
617 1.1 christos free (old_ctf_base);
618 1.1 christos
619 1.1 christos return 0;
620 1.1 christos }
621 1.1 christos
622 1.1 christos /* Upgrade from any earlier version. */
623 1.1 christos static int
624 1.1 christos upgrade_types (ctf_file_t *fp, ctf_header_t *cth)
625 1.1 christos {
626 1.1 christos switch (cth->cth_version)
627 1.1 christos {
628 1.1 christos /* v1 requires a full pass and reformatting. */
629 1.1 christos case CTF_VERSION_1:
630 1.1 christos upgrade_types_v1 (fp, cth);
631 1.1 christos /* FALLTHRU */
632 1.1 christos /* Already-converted v1 is just like later versions except that its
633 1.1 christos parent/child boundary is unchanged (and much lower). */
634 1.1 christos
635 1.1 christos case CTF_VERSION_1_UPGRADED_3:
636 1.1 christos fp->ctf_parmax = CTF_MAX_PTYPE_V1;
637 1.1 christos
638 1.1 christos /* v2 is just the same as v3 except for new types and sections:
639 1.1 christos no upgrading required. */
640 1.1 christos case CTF_VERSION_2: ;
641 1.1 christos /* FALLTHRU */
642 1.1 christos }
643 1.1 christos return 0;
644 1.1 christos }
645 1.1 christos
646 1.1 christos /* Initialize the type ID translation table with the byte offset of each type,
647 1.1 christos and initialize the hash tables of each named type. Upgrade the type table to
648 1.1 christos the latest supported representation in the process, if needed, and if this
649 1.1 christos recension of libctf supports upgrading. */
650 1.1 christos
651 1.1 christos static int
652 1.1 christos init_types (ctf_file_t *fp, ctf_header_t *cth)
653 1.1 christos {
654 1.1 christos const ctf_type_t *tbuf;
655 1.1 christos const ctf_type_t *tend;
656 1.1 christos
657 1.1 christos unsigned long pop[CTF_K_MAX + 1] = { 0 };
658 1.1 christos const ctf_type_t *tp;
659 1.1 christos uint32_t id, dst;
660 1.1 christos uint32_t *xp;
661 1.1 christos
662 1.1 christos /* We determine whether the container is a child or a parent based on
663 1.1 christos the value of cth_parname. */
664 1.1 christos
665 1.1 christos int child = cth->cth_parname != 0;
666 1.1 christos int nlstructs = 0, nlunions = 0;
667 1.1 christos int err;
668 1.1 christos
669 1.1 christos assert (!(fp->ctf_flags & LCTF_RDWR));
670 1.1 christos
671 1.1 christos if (_libctf_unlikely_ (fp->ctf_version == CTF_VERSION_1))
672 1.1 christos {
673 1.1 christos int err;
674 1.1 christos if ((err = upgrade_types (fp, cth)) != 0)
675 1.1 christos return err; /* Upgrade failed. */
676 1.1 christos }
677 1.1 christos
678 1.1 christos tbuf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
679 1.1 christos tend = (ctf_type_t *) (fp->ctf_buf + cth->cth_stroff);
680 1.1 christos
681 1.1 christos /* We make two passes through the entire type section. In this first
682 1.1 christos pass, we count the number of each type and the total number of types. */
683 1.1 christos
684 1.1 christos for (tp = tbuf; tp < tend; fp->ctf_typemax++)
685 1.1 christos {
686 1.1 christos unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
687 1.1 christos unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
688 1.1 christos ssize_t size, increment, vbytes;
689 1.1 christos
690 1.1 christos (void) ctf_get_ctt_size (fp, tp, &size, &increment);
691 1.1 christos vbytes = LCTF_VBYTES (fp, kind, size, vlen);
692 1.1 christos
693 1.1 christos if (vbytes < 0)
694 1.1 christos return ECTF_CORRUPT;
695 1.1 christos
696 1.1 christos /* For forward declarations, ctt_type is the CTF_K_* kind for the tag,
697 1.1 christos so bump that population count too. */
698 1.1 christos if (kind == CTF_K_FORWARD)
699 1.1 christos pop[tp->ctt_type]++;
700 1.1 christos
701 1.1 christos tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
702 1.1 christos pop[kind]++;
703 1.1 christos }
704 1.1 christos
705 1.1 christos if (child)
706 1.1 christos {
707 1.1 christos ctf_dprintf ("CTF container %p is a child\n", (void *) fp);
708 1.1 christos fp->ctf_flags |= LCTF_CHILD;
709 1.1 christos }
710 1.1 christos else
711 1.1 christos ctf_dprintf ("CTF container %p is a parent\n", (void *) fp);
712 1.1 christos
713 1.1 christos /* Now that we've counted up the number of each type, we can allocate
714 1.1 christos the hash tables, type translation table, and pointer table. */
715 1.1 christos
716 1.1 christos if ((fp->ctf_structs.ctn_readonly
717 1.1 christos = ctf_hash_create (pop[CTF_K_STRUCT], ctf_hash_string,
718 1.1 christos ctf_hash_eq_string)) == NULL)
719 1.1 christos return ENOMEM;
720 1.1 christos
721 1.1 christos if ((fp->ctf_unions.ctn_readonly
722 1.1 christos = ctf_hash_create (pop[CTF_K_UNION], ctf_hash_string,
723 1.1 christos ctf_hash_eq_string)) == NULL)
724 1.1 christos return ENOMEM;
725 1.1 christos
726 1.1 christos if ((fp->ctf_enums.ctn_readonly
727 1.1 christos = ctf_hash_create (pop[CTF_K_ENUM], ctf_hash_string,
728 1.1 christos ctf_hash_eq_string)) == NULL)
729 1.1 christos return ENOMEM;
730 1.1 christos
731 1.1 christos if ((fp->ctf_names.ctn_readonly
732 1.1 christos = ctf_hash_create (pop[CTF_K_INTEGER] +
733 1.1 christos pop[CTF_K_FLOAT] +
734 1.1 christos pop[CTF_K_FUNCTION] +
735 1.1 christos pop[CTF_K_TYPEDEF] +
736 1.1 christos pop[CTF_K_POINTER] +
737 1.1 christos pop[CTF_K_VOLATILE] +
738 1.1 christos pop[CTF_K_CONST] +
739 1.1 christos pop[CTF_K_RESTRICT],
740 1.1 christos ctf_hash_string,
741 1.1 christos ctf_hash_eq_string)) == NULL)
742 1.1 christos return ENOMEM;
743 1.1 christos
744 1.1 christos fp->ctf_txlate = malloc (sizeof (uint32_t) * (fp->ctf_typemax + 1));
745 1.1 christos fp->ctf_ptrtab_len = fp->ctf_typemax + 1;
746 1.1 christos fp->ctf_ptrtab = malloc (sizeof (uint32_t) * fp->ctf_ptrtab_len);
747 1.1 christos
748 1.1 christos if (fp->ctf_txlate == NULL || fp->ctf_ptrtab == NULL)
749 1.1 christos return ENOMEM; /* Memory allocation failed. */
750 1.1 christos
751 1.1 christos xp = fp->ctf_txlate;
752 1.1 christos *xp++ = 0; /* Type id 0 is used as a sentinel value. */
753 1.1 christos
754 1.1 christos memset (fp->ctf_txlate, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
755 1.1 christos memset (fp->ctf_ptrtab, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
756 1.1 christos
757 1.1 christos /* In the second pass through the types, we fill in each entry of the
758 1.1 christos type and pointer tables and add names to the appropriate hashes. */
759 1.1 christos
760 1.1 christos for (id = 1, tp = tbuf; tp < tend; xp++, id++)
761 1.1 christos {
762 1.1 christos unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
763 1.1 christos unsigned short isroot = LCTF_INFO_ISROOT (fp, tp->ctt_info);
764 1.1 christos unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
765 1.1 christos ssize_t size, increment, vbytes;
766 1.1 christos
767 1.1 christos const char *name;
768 1.1 christos
769 1.1 christos (void) ctf_get_ctt_size (fp, tp, &size, &increment);
770 1.1 christos name = ctf_strptr (fp, tp->ctt_name);
771 1.1 christos /* Cannot fail: shielded by call in loop above. */
772 1.1 christos vbytes = LCTF_VBYTES (fp, kind, size, vlen);
773 1.1 christos
774 1.1 christos switch (kind)
775 1.1 christos {
776 1.1 christos case CTF_K_INTEGER:
777 1.1 christos case CTF_K_FLOAT:
778 1.1 christos /* Names are reused by bit-fields, which are differentiated by their
779 1.1 christos encodings, and so typically we'd record only the first instance of
780 1.1 christos a given intrinsic. However, we replace an existing type with a
781 1.1 christos root-visible version so that we can be sure to find it when
782 1.1 christos checking for conflicting definitions in ctf_add_type(). */
783 1.1 christos
784 1.1 christos if (((ctf_hash_lookup_type (fp->ctf_names.ctn_readonly,
785 1.1 christos fp, name)) == 0)
786 1.1 christos || isroot)
787 1.1 christos {
788 1.1 christos err = ctf_hash_define_type (fp->ctf_names.ctn_readonly, fp,
789 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
790 1.1 christos tp->ctt_name);
791 1.1 christos if (err != 0)
792 1.1 christos return err;
793 1.1 christos }
794 1.1 christos break;
795 1.1 christos
796 1.1 christos /* These kinds have no name, so do not need interning into any
797 1.1 christos hashtables. */
798 1.1 christos case CTF_K_ARRAY:
799 1.1 christos case CTF_K_SLICE:
800 1.1 christos break;
801 1.1 christos
802 1.1 christos case CTF_K_FUNCTION:
803 1.1 christos if (!isroot)
804 1.1 christos break;
805 1.1 christos
806 1.1 christos err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
807 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
808 1.1 christos tp->ctt_name);
809 1.1 christos if (err != 0)
810 1.1 christos return err;
811 1.1 christos break;
812 1.1 christos
813 1.1 christos case CTF_K_STRUCT:
814 1.1 christos if (size >= CTF_LSTRUCT_THRESH)
815 1.1 christos nlstructs++;
816 1.1 christos
817 1.1 christos if (!isroot)
818 1.1 christos break;
819 1.1 christos
820 1.1 christos err = ctf_hash_define_type (fp->ctf_structs.ctn_readonly, fp,
821 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
822 1.1 christos tp->ctt_name);
823 1.1 christos
824 1.1 christos if (err != 0)
825 1.1 christos return err;
826 1.1 christos
827 1.1 christos break;
828 1.1 christos
829 1.1 christos case CTF_K_UNION:
830 1.1 christos if (size >= CTF_LSTRUCT_THRESH)
831 1.1 christos nlunions++;
832 1.1 christos
833 1.1 christos if (!isroot)
834 1.1 christos break;
835 1.1 christos
836 1.1 christos err = ctf_hash_define_type (fp->ctf_unions.ctn_readonly, fp,
837 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
838 1.1 christos tp->ctt_name);
839 1.1 christos
840 1.1 christos if (err != 0)
841 1.1 christos return err;
842 1.1 christos break;
843 1.1 christos
844 1.1 christos case CTF_K_ENUM:
845 1.1 christos if (!isroot)
846 1.1 christos break;
847 1.1 christos
848 1.1 christos err = ctf_hash_define_type (fp->ctf_enums.ctn_readonly, fp,
849 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
850 1.1 christos tp->ctt_name);
851 1.1 christos
852 1.1 christos if (err != 0)
853 1.1 christos return err;
854 1.1 christos break;
855 1.1 christos
856 1.1 christos case CTF_K_TYPEDEF:
857 1.1 christos if (!isroot)
858 1.1 christos break;
859 1.1 christos
860 1.1 christos err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
861 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
862 1.1 christos tp->ctt_name);
863 1.1 christos if (err != 0)
864 1.1 christos return err;
865 1.1 christos break;
866 1.1 christos
867 1.1 christos case CTF_K_FORWARD:
868 1.1 christos {
869 1.1 christos ctf_names_t *np = ctf_name_table (fp, tp->ctt_type);
870 1.1 christos
871 1.1 christos if (!isroot)
872 1.1 christos break;
873 1.1 christos
874 1.1 christos /* Only insert forward tags into the given hash if the type or tag
875 1.1 christos name is not already present. */
876 1.1 christos if (ctf_hash_lookup_type (np->ctn_readonly, fp, name) == 0)
877 1.1 christos {
878 1.1 christos err = ctf_hash_insert_type (np->ctn_readonly, fp,
879 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
880 1.1 christos tp->ctt_name);
881 1.1 christos if (err != 0)
882 1.1 christos return err;
883 1.1 christos }
884 1.1 christos break;
885 1.1 christos }
886 1.1 christos
887 1.1 christos case CTF_K_POINTER:
888 1.1 christos /* If the type referenced by the pointer is in this CTF container,
889 1.1 christos then store the index of the pointer type in
890 1.1 christos fp->ctf_ptrtab[ index of referenced type ]. */
891 1.1 christos
892 1.1 christos if (LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
893 1.1 christos && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
894 1.1 christos fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = id;
895 1.1 christos /*FALLTHRU*/
896 1.1 christos
897 1.1 christos case CTF_K_VOLATILE:
898 1.1 christos case CTF_K_CONST:
899 1.1 christos case CTF_K_RESTRICT:
900 1.1 christos if (!isroot)
901 1.1 christos break;
902 1.1 christos
903 1.1 christos err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
904 1.1 christos LCTF_INDEX_TO_TYPE (fp, id, child),
905 1.1 christos tp->ctt_name);
906 1.1 christos if (err != 0)
907 1.1 christos return err;
908 1.1 christos break;
909 1.1 christos default:
910 1.1 christos ctf_err_warn (fp, 0, ECTF_CORRUPT,
911 1.1 christos _("init_types(): unhandled CTF kind: %x"), kind);
912 1.1 christos return ECTF_CORRUPT;
913 1.1 christos }
914 1.1 christos
915 1.1 christos *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
916 1.1 christos tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
917 1.1 christos }
918 1.1 christos
919 1.1 christos ctf_dprintf ("%lu total types processed\n", fp->ctf_typemax);
920 1.1 christos ctf_dprintf ("%u enum names hashed\n",
921 1.1 christos ctf_hash_size (fp->ctf_enums.ctn_readonly));
922 1.1 christos ctf_dprintf ("%u struct names hashed (%d long)\n",
923 1.1 christos ctf_hash_size (fp->ctf_structs.ctn_readonly), nlstructs);
924 1.1 christos ctf_dprintf ("%u union names hashed (%d long)\n",
925 1.1 christos ctf_hash_size (fp->ctf_unions.ctn_readonly), nlunions);
926 1.1 christos ctf_dprintf ("%u base type names hashed\n",
927 1.1 christos ctf_hash_size (fp->ctf_names.ctn_readonly));
928 1.1 christos
929 1.1 christos /* Make an additional pass through the pointer table to find pointers that
930 1.1 christos point to anonymous typedef nodes. If we find one, modify the pointer table
931 1.1 christos so that the pointer is also known to point to the node that is referenced
932 1.1 christos by the anonymous typedef node. */
933 1.1 christos
934 1.1 christos for (id = 1; id <= fp->ctf_typemax; id++)
935 1.1 christos {
936 1.1 christos if ((dst = fp->ctf_ptrtab[id]) != 0)
937 1.1 christos {
938 1.1 christos tp = LCTF_INDEX_TO_TYPEPTR (fp, id);
939 1.1 christos
940 1.1 christos if (LCTF_INFO_KIND (fp, tp->ctt_info) == CTF_K_TYPEDEF
941 1.1 christos && strcmp (ctf_strptr (fp, tp->ctt_name), "") == 0
942 1.1 christos && LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
943 1.1 christos && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
944 1.1 christos fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = dst;
945 1.1 christos }
946 1.1 christos }
947 1.1 christos
948 1.1 christos return 0;
949 1.1 christos }
950 1.1 christos
951 1.1 christos /* Endianness-flipping routines.
952 1.1 christos
953 1.1 christos We flip everything, mindlessly, even 1-byte entities, so that future
954 1.1 christos expansions do not require changes to this code. */
955 1.1 christos
956 1.1 christos /* < C11? define away static assertions. */
957 1.1 christos
958 1.1 christos #if !defined (__STDC_VERSION__) || __STDC_VERSION__ < 201112L
959 1.1 christos #define _Static_assert(cond, err)
960 1.1 christos #endif
961 1.1 christos
962 1.1 christos /* Swap the endianness of something. */
963 1.1 christos
964 1.1 christos #define swap_thing(x) \
965 1.1 christos do { \
966 1.1 christos _Static_assert (sizeof (x) == 1 || (sizeof (x) % 2 == 0 \
967 1.1 christos && sizeof (x) <= 8), \
968 1.1 christos "Invalid size, update endianness code"); \
969 1.1 christos switch (sizeof (x)) { \
970 1.1 christos case 2: x = bswap_16 (x); break; \
971 1.1 christos case 4: x = bswap_32 (x); break; \
972 1.1 christos case 8: x = bswap_64 (x); break; \
973 1.1 christos case 1: /* Nothing needs doing */ \
974 1.1 christos break; \
975 1.1 christos } \
976 1.1 christos } while (0);
977 1.1 christos
978 1.1 christos /* Flip the endianness of the CTF header. */
979 1.1 christos
980 1.1 christos static void
981 1.1 christos flip_header (ctf_header_t *cth)
982 1.1 christos {
983 1.1 christos swap_thing (cth->cth_preamble.ctp_magic);
984 1.1 christos swap_thing (cth->cth_preamble.ctp_version);
985 1.1 christos swap_thing (cth->cth_preamble.ctp_flags);
986 1.1 christos swap_thing (cth->cth_parlabel);
987 1.1 christos swap_thing (cth->cth_parname);
988 1.1 christos swap_thing (cth->cth_cuname);
989 1.1 christos swap_thing (cth->cth_objtoff);
990 1.1 christos swap_thing (cth->cth_funcoff);
991 1.1 christos swap_thing (cth->cth_objtidxoff);
992 1.1 christos swap_thing (cth->cth_funcidxoff);
993 1.1 christos swap_thing (cth->cth_varoff);
994 1.1 christos swap_thing (cth->cth_typeoff);
995 1.1 christos swap_thing (cth->cth_stroff);
996 1.1 christos swap_thing (cth->cth_strlen);
997 1.1 christos }
998 1.1 christos
999 1.1 christos /* Flip the endianness of the label section, an array of ctf_lblent_t. */
1000 1.1 christos
1001 1.1 christos static void
1002 1.1 christos flip_lbls (void *start, size_t len)
1003 1.1 christos {
1004 1.1 christos ctf_lblent_t *lbl = start;
1005 1.1 christos ssize_t i;
1006 1.1 christos
1007 1.1 christos for (i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
1008 1.1 christos {
1009 1.1 christos swap_thing (lbl->ctl_label);
1010 1.1 christos swap_thing (lbl->ctl_type);
1011 1.1 christos }
1012 1.1 christos }
1013 1.1 christos
1014 1.1 christos /* Flip the endianness of the data-object or function sections or their indexes,
1015 1.1 christos all arrays of uint32_t. (The function section has more internal structure,
1016 1.1 christos but that structure is an array of uint32_t, so can be treated as one big
1017 1.1 christos array for byte-swapping.) */
1018 1.1 christos
1019 1.1 christos static void
1020 1.1 christos flip_objts (void *start, size_t len)
1021 1.1 christos {
1022 1.1 christos uint32_t *obj = start;
1023 1.1 christos ssize_t i;
1024 1.1 christos
1025 1.1 christos for (i = len / sizeof (uint32_t); i > 0; obj++, i--)
1026 1.1 christos swap_thing (*obj);
1027 1.1 christos }
1028 1.1 christos
1029 1.1 christos /* Flip the endianness of the variable section, an array of ctf_varent_t. */
1030 1.1 christos
1031 1.1 christos static void
1032 1.1 christos flip_vars (void *start, size_t len)
1033 1.1 christos {
1034 1.1 christos ctf_varent_t *var = start;
1035 1.1 christos ssize_t i;
1036 1.1 christos
1037 1.1 christos for (i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
1038 1.1 christos {
1039 1.1 christos swap_thing (var->ctv_name);
1040 1.1 christos swap_thing (var->ctv_type);
1041 1.1 christos }
1042 1.1 christos }
1043 1.1 christos
1044 1.1 christos /* Flip the endianness of the type section, a tagged array of ctf_type or
1045 1.1 christos ctf_stype followed by variable data. */
1046 1.1 christos
1047 1.1 christos static int
1048 1.1 christos flip_types (ctf_file_t *fp, void *start, size_t len)
1049 1.1 christos {
1050 1.1 christos ctf_type_t *t = start;
1051 1.1 christos
1052 1.1 christos while ((uintptr_t) t < ((uintptr_t) start) + len)
1053 1.1 christos {
1054 1.1 christos swap_thing (t->ctt_name);
1055 1.1 christos swap_thing (t->ctt_info);
1056 1.1 christos swap_thing (t->ctt_size);
1057 1.1 christos
1058 1.1 christos uint32_t kind = CTF_V2_INFO_KIND (t->ctt_info);
1059 1.1 christos size_t size = t->ctt_size;
1060 1.1 christos uint32_t vlen = CTF_V2_INFO_VLEN (t->ctt_info);
1061 1.1 christos size_t vbytes = get_vbytes_v2 (fp, kind, size, vlen);
1062 1.1 christos
1063 1.1 christos if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
1064 1.1 christos {
1065 1.1 christos swap_thing (t->ctt_lsizehi);
1066 1.1 christos swap_thing (t->ctt_lsizelo);
1067 1.1 christos size = CTF_TYPE_LSIZE (t);
1068 1.1 christos t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
1069 1.1 christos }
1070 1.1 christos else
1071 1.1 christos t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
1072 1.1 christos
1073 1.1 christos switch (kind)
1074 1.1 christos {
1075 1.1 christos case CTF_K_FORWARD:
1076 1.1 christos case CTF_K_UNKNOWN:
1077 1.1 christos case CTF_K_POINTER:
1078 1.1 christos case CTF_K_TYPEDEF:
1079 1.1 christos case CTF_K_VOLATILE:
1080 1.1 christos case CTF_K_CONST:
1081 1.1 christos case CTF_K_RESTRICT:
1082 1.1 christos /* These types have no vlen data to swap. */
1083 1.1 christos assert (vbytes == 0);
1084 1.1 christos break;
1085 1.1 christos
1086 1.1 christos case CTF_K_INTEGER:
1087 1.1 christos case CTF_K_FLOAT:
1088 1.1 christos {
1089 1.1 christos /* These types have a single uint32_t. */
1090 1.1 christos
1091 1.1 christos uint32_t *item = (uint32_t *) t;
1092 1.1 christos
1093 1.1 christos swap_thing (*item);
1094 1.1 christos break;
1095 1.1 christos }
1096 1.1 christos
1097 1.1 christos case CTF_K_FUNCTION:
1098 1.1 christos {
1099 1.1 christos /* This type has a bunch of uint32_ts. */
1100 1.1 christos
1101 1.1 christos uint32_t *item = (uint32_t *) t;
1102 1.1 christos ssize_t i;
1103 1.1 christos
1104 1.1 christos for (i = vlen; i > 0; item++, i--)
1105 1.1 christos swap_thing (*item);
1106 1.1 christos break;
1107 1.1 christos }
1108 1.1 christos
1109 1.1 christos case CTF_K_ARRAY:
1110 1.1 christos {
1111 1.1 christos /* This has a single ctf_array_t. */
1112 1.1 christos
1113 1.1 christos ctf_array_t *a = (ctf_array_t *) t;
1114 1.1 christos
1115 1.1 christos assert (vbytes == sizeof (ctf_array_t));
1116 1.1 christos swap_thing (a->cta_contents);
1117 1.1 christos swap_thing (a->cta_index);
1118 1.1 christos swap_thing (a->cta_nelems);
1119 1.1 christos
1120 1.1 christos break;
1121 1.1 christos }
1122 1.1 christos
1123 1.1 christos case CTF_K_SLICE:
1124 1.1 christos {
1125 1.1 christos /* This has a single ctf_slice_t. */
1126 1.1 christos
1127 1.1 christos ctf_slice_t *s = (ctf_slice_t *) t;
1128 1.1 christos
1129 1.1 christos assert (vbytes == sizeof (ctf_slice_t));
1130 1.1 christos swap_thing (s->cts_type);
1131 1.1 christos swap_thing (s->cts_offset);
1132 1.1 christos swap_thing (s->cts_bits);
1133 1.1 christos
1134 1.1 christos break;
1135 1.1 christos }
1136 1.1 christos
1137 1.1 christos case CTF_K_STRUCT:
1138 1.1 christos case CTF_K_UNION:
1139 1.1 christos {
1140 1.1 christos /* This has an array of ctf_member or ctf_lmember, depending on
1141 1.1 christos size. We could consider it to be a simple array of uint32_t,
1142 1.1 christos but for safety's sake in case these structures ever acquire
1143 1.1 christos non-uint32_t members, do it member by member. */
1144 1.1 christos
1145 1.1 christos if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
1146 1.1 christos {
1147 1.1 christos ctf_lmember_t *lm = (ctf_lmember_t *) t;
1148 1.1 christos ssize_t i;
1149 1.1 christos for (i = vlen; i > 0; i--, lm++)
1150 1.1 christos {
1151 1.1 christos swap_thing (lm->ctlm_name);
1152 1.1 christos swap_thing (lm->ctlm_offsethi);
1153 1.1 christos swap_thing (lm->ctlm_type);
1154 1.1 christos swap_thing (lm->ctlm_offsetlo);
1155 1.1 christos }
1156 1.1 christos }
1157 1.1 christos else
1158 1.1 christos {
1159 1.1 christos ctf_member_t *m = (ctf_member_t *) t;
1160 1.1 christos ssize_t i;
1161 1.1 christos for (i = vlen; i > 0; i--, m++)
1162 1.1 christos {
1163 1.1 christos swap_thing (m->ctm_name);
1164 1.1 christos swap_thing (m->ctm_offset);
1165 1.1 christos swap_thing (m->ctm_type);
1166 1.1 christos }
1167 1.1 christos }
1168 1.1 christos break;
1169 1.1 christos }
1170 1.1 christos
1171 1.1 christos case CTF_K_ENUM:
1172 1.1 christos {
1173 1.1 christos /* This has an array of ctf_enum_t. */
1174 1.1 christos
1175 1.1 christos ctf_enum_t *item = (ctf_enum_t *) t;
1176 1.1 christos ssize_t i;
1177 1.1 christos
1178 1.1 christos for (i = vlen; i > 0; item++, i--)
1179 1.1 christos {
1180 1.1 christos swap_thing (item->cte_name);
1181 1.1 christos swap_thing (item->cte_value);
1182 1.1 christos }
1183 1.1 christos break;
1184 1.1 christos }
1185 1.1 christos default:
1186 1.1 christos ctf_err_warn (fp, 0, ECTF_CORRUPT,
1187 1.1 christos _("unhandled CTF kind in endianness conversion: %x"),
1188 1.1 christos kind);
1189 1.1 christos return ECTF_CORRUPT;
1190 1.1 christos }
1191 1.1 christos
1192 1.1 christos t = (ctf_type_t *) ((uintptr_t) t + vbytes);
1193 1.1 christos }
1194 1.1 christos
1195 1.1 christos return 0;
1196 1.1 christos }
1197 1.1 christos
1198 1.1 christos /* Flip the endianness of BUF, given the offsets in the (already endian-
1199 1.1 christos converted) CTH.
1200 1.1 christos
1201 1.1 christos All of this stuff happens before the header is fully initialized, so the
1202 1.1 christos LCTF_*() macros cannot be used yet. Since we do not try to endian-convert v1
1203 1.1 christos data, this is no real loss. */
1204 1.1 christos
1205 1.1 christos static int
1206 1.1 christos flip_ctf (ctf_file_t *fp, ctf_header_t *cth, unsigned char *buf)
1207 1.1 christos {
1208 1.1 christos flip_lbls (buf + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
1209 1.1 christos flip_objts (buf + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
1210 1.1 christos flip_objts (buf + cth->cth_funcoff, cth->cth_objtidxoff - cth->cth_funcoff);
1211 1.1 christos flip_objts (buf + cth->cth_objtidxoff, cth->cth_funcidxoff - cth->cth_objtidxoff);
1212 1.1 christos flip_objts (buf + cth->cth_funcidxoff, cth->cth_varoff - cth->cth_funcidxoff);
1213 1.1 christos flip_vars (buf + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
1214 1.1 christos return flip_types (fp, buf + cth->cth_typeoff, cth->cth_stroff - cth->cth_typeoff);
1215 1.1 christos }
1216 1.1 christos
1217 1.1 christos /* Set up the ctl hashes in a ctf_file_t. Called by both writable and
1218 1.1 christos non-writable dictionary initialization. */
1219 1.1 christos void ctf_set_ctl_hashes (ctf_file_t *fp)
1220 1.1 christos {
1221 1.1 christos /* Initialize the ctf_lookup_by_name top-level dictionary. We keep an
1222 1.1 christos array of type name prefixes and the corresponding ctf_hash to use. */
1223 1.1 christos fp->ctf_lookups[0].ctl_prefix = "struct";
1224 1.1 christos fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
1225 1.1 christos fp->ctf_lookups[0].ctl_hash = &fp->ctf_structs;
1226 1.1 christos fp->ctf_lookups[1].ctl_prefix = "union";
1227 1.1 christos fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
1228 1.1 christos fp->ctf_lookups[1].ctl_hash = &fp->ctf_unions;
1229 1.1 christos fp->ctf_lookups[2].ctl_prefix = "enum";
1230 1.1 christos fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
1231 1.1 christos fp->ctf_lookups[2].ctl_hash = &fp->ctf_enums;
1232 1.1 christos fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
1233 1.1 christos fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
1234 1.1 christos fp->ctf_lookups[3].ctl_hash = &fp->ctf_names;
1235 1.1 christos fp->ctf_lookups[4].ctl_prefix = NULL;
1236 1.1 christos fp->ctf_lookups[4].ctl_len = 0;
1237 1.1 christos fp->ctf_lookups[4].ctl_hash = NULL;
1238 1.1 christos }
1239 1.1 christos
1240 1.1 christos /* Open a CTF file, mocking up a suitable ctf_sect. */
1241 1.1 christos
1242 1.1 christos ctf_file_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
1243 1.1 christos const char *symsect, size_t symsect_size,
1244 1.1 christos size_t symsect_entsize,
1245 1.1 christos const char *strsect, size_t strsect_size,
1246 1.1 christos int *errp)
1247 1.1 christos {
1248 1.1 christos return ctf_simple_open_internal (ctfsect, ctfsect_size, symsect, symsect_size,
1249 1.1 christos symsect_entsize, strsect, strsect_size, NULL,
1250 1.1 christos 0, errp);
1251 1.1 christos }
1252 1.1 christos
1253 1.1 christos /* Open a CTF file, mocking up a suitable ctf_sect and overriding the external
1254 1.1 christos strtab with a synthetic one. */
1255 1.1 christos
1256 1.1 christos ctf_file_t *ctf_simple_open_internal (const char *ctfsect, size_t ctfsect_size,
1257 1.1 christos const char *symsect, size_t symsect_size,
1258 1.1 christos size_t symsect_entsize,
1259 1.1 christos const char *strsect, size_t strsect_size,
1260 1.1 christos ctf_dynhash_t *syn_strtab, int writable,
1261 1.1 christos int *errp)
1262 1.1 christos {
1263 1.1 christos ctf_sect_t skeleton;
1264 1.1 christos
1265 1.1 christos ctf_sect_t ctf_sect, sym_sect, str_sect;
1266 1.1 christos ctf_sect_t *ctfsectp = NULL;
1267 1.1 christos ctf_sect_t *symsectp = NULL;
1268 1.1 christos ctf_sect_t *strsectp = NULL;
1269 1.1 christos
1270 1.1 christos skeleton.cts_name = _CTF_SECTION;
1271 1.1 christos skeleton.cts_entsize = 1;
1272 1.1 christos
1273 1.1 christos if (ctfsect)
1274 1.1 christos {
1275 1.1 christos memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
1276 1.1 christos ctf_sect.cts_data = ctfsect;
1277 1.1 christos ctf_sect.cts_size = ctfsect_size;
1278 1.1 christos ctfsectp = &ctf_sect;
1279 1.1 christos }
1280 1.1 christos
1281 1.1 christos if (symsect)
1282 1.1 christos {
1283 1.1 christos memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
1284 1.1 christos sym_sect.cts_data = symsect;
1285 1.1 christos sym_sect.cts_size = symsect_size;
1286 1.1 christos sym_sect.cts_entsize = symsect_entsize;
1287 1.1 christos symsectp = &sym_sect;
1288 1.1 christos }
1289 1.1 christos
1290 1.1 christos if (strsect)
1291 1.1 christos {
1292 1.1 christos memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
1293 1.1 christos str_sect.cts_data = strsect;
1294 1.1 christos str_sect.cts_size = strsect_size;
1295 1.1 christos strsectp = &str_sect;
1296 1.1 christos }
1297 1.1 christos
1298 1.1 christos return ctf_bufopen_internal (ctfsectp, symsectp, strsectp, syn_strtab,
1299 1.1 christos writable, errp);
1300 1.1 christos }
1301 1.1 christos
1302 1.1 christos /* Decode the specified CTF buffer and optional symbol table, and create a new
1303 1.1 christos CTF container representing the symbolic debugging information. This code can
1304 1.1 christos be used directly by the debugger, or it can be used as the engine for
1305 1.1 christos ctf_fdopen() or ctf_open(), below. */
1306 1.1 christos
1307 1.1 christos ctf_file_t *
1308 1.1 christos ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1309 1.1 christos const ctf_sect_t *strsect, int *errp)
1310 1.1 christos {
1311 1.1 christos return ctf_bufopen_internal (ctfsect, symsect, strsect, NULL, 0, errp);
1312 1.1 christos }
1313 1.1 christos
1314 1.1 christos /* Like ctf_bufopen, but overriding the external strtab with a synthetic one. */
1315 1.1 christos
1316 1.1 christos ctf_file_t *
1317 1.1 christos ctf_bufopen_internal (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
1318 1.1 christos const ctf_sect_t *strsect, ctf_dynhash_t *syn_strtab,
1319 1.1 christos int writable, int *errp)
1320 1.1 christos {
1321 1.1 christos const ctf_preamble_t *pp;
1322 1.1 christos size_t hdrsz = sizeof (ctf_header_t);
1323 1.1 christos ctf_header_t *hp;
1324 1.1 christos ctf_file_t *fp;
1325 1.1 christos int foreign_endian = 0;
1326 1.1 christos int err;
1327 1.1 christos
1328 1.1 christos libctf_init_debug();
1329 1.1 christos
1330 1.1 christos if ((ctfsect == NULL) || ((symsect != NULL) &&
1331 1.1 christos ((strsect == NULL) && syn_strtab == NULL)))
1332 1.1 christos return (ctf_set_open_errno (errp, EINVAL));
1333 1.1 christos
1334 1.1 christos if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
1335 1.1 christos symsect->cts_entsize != sizeof (Elf64_Sym))
1336 1.1 christos return (ctf_set_open_errno (errp, ECTF_SYMTAB));
1337 1.1 christos
1338 1.1 christos if (symsect != NULL && symsect->cts_data == NULL)
1339 1.1 christos return (ctf_set_open_errno (errp, ECTF_SYMBAD));
1340 1.1 christos
1341 1.1 christos if (strsect != NULL && strsect->cts_data == NULL)
1342 1.1 christos return (ctf_set_open_errno (errp, ECTF_STRBAD));
1343 1.1 christos
1344 1.1 christos if (ctfsect->cts_size < sizeof (ctf_preamble_t))
1345 1.1 christos return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1346 1.1 christos
1347 1.1 christos pp = (const ctf_preamble_t *) ctfsect->cts_data;
1348 1.1 christos
1349 1.1 christos ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
1350 1.1 christos pp->ctp_magic, pp->ctp_version);
1351 1.1 christos
1352 1.1 christos /* Validate each part of the CTF header.
1353 1.1 christos
1354 1.1 christos First, we validate the preamble (common to all versions). At that point,
1355 1.1 christos we know the endianness and specific header version, and can validate the
1356 1.1 christos version-specific parts including section offsets and alignments.
1357 1.1 christos
1358 1.1 christos We specifically do not support foreign-endian old versions. */
1359 1.1 christos
1360 1.1 christos if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
1361 1.1 christos {
1362 1.1 christos if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
1363 1.1 christos {
1364 1.1 christos if (pp->ctp_version != CTF_VERSION_3)
1365 1.1 christos return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1366 1.1 christos foreign_endian = 1;
1367 1.1 christos }
1368 1.1 christos else
1369 1.1 christos return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1370 1.1 christos }
1371 1.1 christos
1372 1.1 christos if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
1373 1.1 christos || (pp->ctp_version > CTF_VERSION_3)))
1374 1.1 christos return (ctf_set_open_errno (errp, ECTF_CTFVERS));
1375 1.1 christos
1376 1.1 christos if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
1377 1.1 christos {
1378 1.1 christos /* The symtab can contain function entries which contain embedded ctf
1379 1.1 christos info. We do not support dynamically upgrading such entries (none
1380 1.1 christos should exist in any case, since dwarf2ctf does not create them). */
1381 1.1 christos
1382 1.1 christos ctf_err_warn (NULL, 0, 0, _("ctf_bufopen: CTF version %d symsect not "
1383 1.1 christos "supported"), pp->ctp_version);
1384 1.1 christos return (ctf_set_open_errno (errp, ECTF_NOTSUP));
1385 1.1 christos }
1386 1.1 christos
1387 1.1 christos if (pp->ctp_version < CTF_VERSION_3)
1388 1.1 christos hdrsz = sizeof (ctf_header_v2_t);
1389 1.1 christos
1390 1.1 christos if (_libctf_unlikely_ (pp->ctp_flags > CTF_F_MAX))
1391 1.1 christos return (ctf_set_open_errno (errp, ECTF_FLAGS));
1392 1.1 christos
1393 1.1 christos if (ctfsect->cts_size < hdrsz)
1394 1.1 christos return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
1395 1.1 christos
1396 1.1 christos if ((fp = malloc (sizeof (ctf_file_t))) == NULL)
1397 1.1 christos return (ctf_set_open_errno (errp, ENOMEM));
1398 1.1 christos
1399 1.1 christos memset (fp, 0, sizeof (ctf_file_t));
1400 1.1 christos
1401 1.1 christos if (writable)
1402 1.1 christos fp->ctf_flags |= LCTF_RDWR;
1403 1.1 christos
1404 1.1 christos if ((fp->ctf_header = malloc (sizeof (struct ctf_header))) == NULL)
1405 1.1 christos {
1406 1.1 christos free (fp);
1407 1.1 christos return (ctf_set_open_errno (errp, ENOMEM));
1408 1.1 christos }
1409 1.1 christos hp = fp->ctf_header;
1410 1.1 christos memcpy (hp, ctfsect->cts_data, hdrsz);
1411 1.1 christos if (pp->ctp_version < CTF_VERSION_3)
1412 1.1 christos upgrade_header (hp);
1413 1.1 christos
1414 1.1 christos if (foreign_endian)
1415 1.1 christos flip_header (hp);
1416 1.1 christos fp->ctf_openflags = hp->cth_flags;
1417 1.1 christos fp->ctf_size = hp->cth_stroff + hp->cth_strlen;
1418 1.1 christos
1419 1.1 christos ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
1420 1.1 christos (unsigned long) fp->ctf_size);
1421 1.1 christos
1422 1.1 christos if (hp->cth_lbloff > fp->ctf_size || hp->cth_objtoff > fp->ctf_size
1423 1.1 christos || hp->cth_funcoff > fp->ctf_size || hp->cth_objtidxoff > fp->ctf_size
1424 1.1 christos || hp->cth_funcidxoff > fp->ctf_size || hp->cth_typeoff > fp->ctf_size
1425 1.1 christos || hp->cth_stroff > fp->ctf_size)
1426 1.1 christos return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1427 1.1 christos
1428 1.1 christos if (hp->cth_lbloff > hp->cth_objtoff
1429 1.1 christos || hp->cth_objtoff > hp->cth_funcoff
1430 1.1 christos || hp->cth_funcoff > hp->cth_typeoff
1431 1.1 christos || hp->cth_funcoff > hp->cth_objtidxoff
1432 1.1 christos || hp->cth_objtidxoff > hp->cth_funcidxoff
1433 1.1 christos || hp->cth_funcidxoff > hp->cth_varoff
1434 1.1 christos || hp->cth_varoff > hp->cth_typeoff || hp->cth_typeoff > hp->cth_stroff)
1435 1.1 christos return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1436 1.1 christos
1437 1.1 christos if ((hp->cth_lbloff & 3) || (hp->cth_objtoff & 2)
1438 1.1 christos || (hp->cth_funcoff & 2) || (hp->cth_objtidxoff & 2)
1439 1.1 christos || (hp->cth_funcidxoff & 2) || (hp->cth_varoff & 3)
1440 1.1 christos || (hp->cth_typeoff & 3))
1441 1.1 christos return (ctf_set_open_errno (errp, ECTF_CORRUPT));
1442 1.1 christos
1443 1.1 christos /* Once everything is determined to be valid, attempt to decompress the CTF
1444 1.1 christos data buffer if it is compressed, or copy it into new storage if it is not
1445 1.1 christos compressed but needs endian-flipping. Otherwise we just put the data
1446 1.1 christos section's buffer pointer into ctf_buf, below. */
1447 1.1 christos
1448 1.1 christos /* Note: if this is a v1 buffer, it will be reallocated and expanded by
1449 1.1 christos init_types(). */
1450 1.1 christos
1451 1.1 christos if (hp->cth_flags & CTF_F_COMPRESS)
1452 1.1 christos {
1453 1.1 christos size_t srclen;
1454 1.1 christos uLongf dstlen;
1455 1.1 christos const void *src;
1456 1.1 christos int rc = Z_OK;
1457 1.1 christos
1458 1.1 christos /* We are allocating this ourselves, so we can drop the ctf header
1459 1.1 christos copy in favour of ctf->ctf_header. */
1460 1.1 christos
1461 1.1 christos if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1462 1.1 christos {
1463 1.1 christos err = ECTF_ZALLOC;
1464 1.1 christos goto bad;
1465 1.1 christos }
1466 1.1 christos fp->ctf_dynbase = fp->ctf_base;
1467 1.1 christos hp->cth_flags &= ~CTF_F_COMPRESS;
1468 1.1 christos
1469 1.1 christos src = (unsigned char *) ctfsect->cts_data + hdrsz;
1470 1.1 christos srclen = ctfsect->cts_size - hdrsz;
1471 1.1 christos dstlen = fp->ctf_size;
1472 1.1 christos fp->ctf_buf = fp->ctf_base;
1473 1.1 christos
1474 1.1 christos if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
1475 1.1 christos {
1476 1.1 christos ctf_err_warn (NULL, 0, ECTF_DECOMPRESS, _("zlib inflate err: %s"),
1477 1.1 christos zError (rc));
1478 1.1 christos err = ECTF_DECOMPRESS;
1479 1.1 christos goto bad;
1480 1.1 christos }
1481 1.1 christos
1482 1.1 christos if ((size_t) dstlen != fp->ctf_size)
1483 1.1 christos {
1484 1.1 christos ctf_err_warn (NULL, 0, ECTF_CORRUPT,
1485 1.1 christos _("zlib inflate short: got %lu of %lu bytes"),
1486 1.1 christos (unsigned long) dstlen, (unsigned long) fp->ctf_size);
1487 1.1 christos err = ECTF_CORRUPT;
1488 1.1 christos goto bad;
1489 1.1 christos }
1490 1.1 christos }
1491 1.1 christos else if (foreign_endian)
1492 1.1 christos {
1493 1.1 christos if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
1494 1.1 christos {
1495 1.1 christos err = ECTF_ZALLOC;
1496 1.1 christos goto bad;
1497 1.1 christos }
1498 1.1 christos fp->ctf_dynbase = fp->ctf_base;
1499 1.1 christos memcpy (fp->ctf_base, ((unsigned char *) ctfsect->cts_data) + hdrsz,
1500 1.1 christos fp->ctf_size);
1501 1.1 christos fp->ctf_buf = fp->ctf_base;
1502 1.1 christos }
1503 1.1 christos else
1504 1.1 christos {
1505 1.1 christos /* We are just using the section passed in -- but its header may be an old
1506 1.1 christos version. Point ctf_buf past the old header, and never touch it
1507 1.1 christos again. */
1508 1.1 christos fp->ctf_base = (unsigned char *) ctfsect->cts_data;
1509 1.1 christos fp->ctf_dynbase = NULL;
1510 1.1 christos fp->ctf_buf = fp->ctf_base + hdrsz;
1511 1.1 christos }
1512 1.1 christos
1513 1.1 christos /* Once we have uncompressed and validated the CTF data buffer, we can
1514 1.1 christos proceed with initializing the ctf_file_t we allocated above.
1515 1.1 christos
1516 1.1 christos Nothing that depends on buf or base should be set directly in this function
1517 1.1 christos before the init_types() call, because it may be reallocated during
1518 1.1 christos transparent upgrade if this recension of libctf is so configured: see
1519 1.1 christos ctf_set_base(). */
1520 1.1 christos
1521 1.1 christos ctf_set_version (fp, hp, hp->cth_version);
1522 1.1 christos ctf_str_create_atoms (fp);
1523 1.1 christos fp->ctf_parmax = CTF_MAX_PTYPE;
1524 1.1 christos memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
1525 1.1 christos
1526 1.1 christos if (symsect != NULL)
1527 1.1 christos {
1528 1.1 christos memcpy (&fp->ctf_symtab, symsect, sizeof (ctf_sect_t));
1529 1.1 christos memcpy (&fp->ctf_strtab, strsect, sizeof (ctf_sect_t));
1530 1.1 christos }
1531 1.1 christos
1532 1.1 christos if (fp->ctf_data.cts_name != NULL)
1533 1.1 christos if ((fp->ctf_data.cts_name = strdup (fp->ctf_data.cts_name)) == NULL)
1534 1.1 christos {
1535 1.1 christos err = ENOMEM;
1536 1.1 christos goto bad;
1537 1.1 christos }
1538 1.1 christos if (fp->ctf_symtab.cts_name != NULL)
1539 1.1 christos if ((fp->ctf_symtab.cts_name = strdup (fp->ctf_symtab.cts_name)) == NULL)
1540 1.1 christos {
1541 1.1 christos err = ENOMEM;
1542 1.1 christos goto bad;
1543 1.1 christos }
1544 1.1 christos if (fp->ctf_strtab.cts_name != NULL)
1545 1.1 christos if ((fp->ctf_strtab.cts_name = strdup (fp->ctf_strtab.cts_name)) == NULL)
1546 1.1 christos {
1547 1.1 christos err = ENOMEM;
1548 1.1 christos goto bad;
1549 1.1 christos }
1550 1.1 christos
1551 1.1 christos if (fp->ctf_data.cts_name == NULL)
1552 1.1 christos fp->ctf_data.cts_name = _CTF_NULLSTR;
1553 1.1 christos if (fp->ctf_symtab.cts_name == NULL)
1554 1.1 christos fp->ctf_symtab.cts_name = _CTF_NULLSTR;
1555 1.1 christos if (fp->ctf_strtab.cts_name == NULL)
1556 1.1 christos fp->ctf_strtab.cts_name = _CTF_NULLSTR;
1557 1.1 christos
1558 1.1 christos if (strsect != NULL)
1559 1.1 christos {
1560 1.1 christos fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
1561 1.1 christos fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
1562 1.1 christos }
1563 1.1 christos fp->ctf_syn_ext_strtab = syn_strtab;
1564 1.1 christos
1565 1.1 christos if (foreign_endian &&
1566 1.1 christos (err = flip_ctf (fp, hp, fp->ctf_buf)) != 0)
1567 1.1 christos {
1568 1.1 christos /* We can be certain that flip_ctf() will have endian-flipped everything
1569 1.1 christos other than the types table when we return. In particular the header
1570 1.1 christos is fine, so set it, to allow freeing to use the usual code path. */
1571 1.1 christos
1572 1.1 christos ctf_set_base (fp, hp, fp->ctf_base);
1573 1.1 christos goto bad;
1574 1.1 christos }
1575 1.1 christos
1576 1.1 christos ctf_set_base (fp, hp, fp->ctf_base);
1577 1.1 christos
1578 1.1 christos /* No need to do anything else for dynamic containers: they do not support
1579 1.1 christos symbol lookups, and the type table is maintained in the dthashes. */
1580 1.1 christos if (fp->ctf_flags & LCTF_RDWR)
1581 1.1 christos {
1582 1.1 christos fp->ctf_refcnt = 1;
1583 1.1 christos return fp;
1584 1.1 christos }
1585 1.1 christos
1586 1.1 christos if ((err = init_types (fp, hp)) != 0)
1587 1.1 christos goto bad;
1588 1.1 christos
1589 1.1 christos /* If we have a symbol table section, allocate and initialize
1590 1.1 christos the symtab translation table, pointed to by ctf_sxlate. This table may be
1591 1.1 christos too large for the actual size of the object and function info sections: if
1592 1.1 christos so, ctf_nsyms will be adjusted and the excess will never be used. */
1593 1.1 christos
1594 1.1 christos if (symsect != NULL)
1595 1.1 christos {
1596 1.1 christos fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
1597 1.1 christos fp->ctf_sxlate = malloc (fp->ctf_nsyms * sizeof (uint32_t));
1598 1.1 christos
1599 1.1 christos if (fp->ctf_sxlate == NULL)
1600 1.1 christos {
1601 1.1 christos err = ENOMEM;
1602 1.1 christos goto bad;
1603 1.1 christos }
1604 1.1 christos
1605 1.1 christos if ((err = init_symtab (fp, hp, symsect, strsect)) != 0)
1606 1.1 christos goto bad;
1607 1.1 christos }
1608 1.1 christos
1609 1.1 christos ctf_set_ctl_hashes (fp);
1610 1.1 christos
1611 1.1 christos if (symsect != NULL)
1612 1.1 christos {
1613 1.1 christos if (symsect->cts_entsize == sizeof (Elf64_Sym))
1614 1.1 christos (void) ctf_setmodel (fp, CTF_MODEL_LP64);
1615 1.1 christos else
1616 1.1 christos (void) ctf_setmodel (fp, CTF_MODEL_ILP32);
1617 1.1 christos }
1618 1.1 christos else
1619 1.1 christos (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
1620 1.1 christos
1621 1.1 christos fp->ctf_refcnt = 1;
1622 1.1 christos return fp;
1623 1.1 christos
1624 1.1 christos bad:
1625 1.1 christos ctf_set_open_errno (errp, err);
1626 1.1 christos ctf_err_warn_to_open (fp);
1627 1.1 christos ctf_file_close (fp);
1628 1.1 christos return NULL;
1629 1.1 christos }
1630 1.1 christos
1631 1.1 christos /* Bump the refcount on the specified CTF container, to allow export of
1632 1.1 christos ctf_file_t's from iterators that open and close the ctf_file_t around the
1633 1.1 christos loop. (This does not extend their lifetime beyond that of the ctf_archive_t
1634 1.1 christos in which they are contained.) */
1635 1.1 christos
1636 1.1 christos void
1637 1.1 christos ctf_ref (ctf_file_t *fp)
1638 1.1 christos {
1639 1.1 christos fp->ctf_refcnt++;
1640 1.1 christos }
1641 1.1 christos
1642 1.1 christos /* Close the specified CTF container and free associated data structures. Note
1643 1.1 christos that ctf_file_close() is a reference counted operation: if the specified file
1644 1.1 christos is the parent of other active containers, its reference count will be greater
1645 1.1 christos than one and it will be freed later when no active children exist. */
1646 1.1 christos
1647 1.1 christos void
1648 1.1 christos ctf_file_close (ctf_file_t *fp)
1649 1.1 christos {
1650 1.1 christos ctf_dtdef_t *dtd, *ntd;
1651 1.1 christos ctf_dvdef_t *dvd, *nvd;
1652 1.1 christos ctf_err_warning_t *err, *nerr;
1653 1.1 christos
1654 1.1 christos if (fp == NULL)
1655 1.1 christos return; /* Allow ctf_file_close(NULL) to simplify caller code. */
1656 1.1 christos
1657 1.1 christos ctf_dprintf ("ctf_file_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
1658 1.1 christos
1659 1.1 christos if (fp->ctf_refcnt > 1)
1660 1.1 christos {
1661 1.1 christos fp->ctf_refcnt--;
1662 1.1 christos return;
1663 1.1 christos }
1664 1.1 christos
1665 1.1 christos /* It is possible to recurse back in here, notably if dicts in the
1666 1.1 christos ctf_link_inputs or ctf_link_outputs cite this dict as a parent without
1667 1.1 christos using ctf_import_unref. Do nothing in that case. */
1668 1.1 christos if (fp->ctf_refcnt == 0)
1669 1.1 christos return;
1670 1.1 christos
1671 1.1 christos fp->ctf_refcnt--;
1672 1.1 christos free (fp->ctf_dyncuname);
1673 1.1 christos free (fp->ctf_dynparname);
1674 1.1 christos if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1675 1.1 christos ctf_file_close (fp->ctf_parent);
1676 1.1 christos
1677 1.1 christos for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
1678 1.1 christos {
1679 1.1 christos ntd = ctf_list_next (dtd);
1680 1.1 christos ctf_dtd_delete (fp, dtd);
1681 1.1 christos }
1682 1.1 christos ctf_dynhash_destroy (fp->ctf_dthash);
1683 1.1 christos if (fp->ctf_flags & LCTF_RDWR)
1684 1.1 christos {
1685 1.1 christos ctf_dynhash_destroy (fp->ctf_structs.ctn_writable);
1686 1.1 christos ctf_dynhash_destroy (fp->ctf_unions.ctn_writable);
1687 1.1 christos ctf_dynhash_destroy (fp->ctf_enums.ctn_writable);
1688 1.1 christos ctf_dynhash_destroy (fp->ctf_names.ctn_writable);
1689 1.1 christos }
1690 1.1 christos else
1691 1.1 christos {
1692 1.1 christos ctf_hash_destroy (fp->ctf_structs.ctn_readonly);
1693 1.1 christos ctf_hash_destroy (fp->ctf_unions.ctn_readonly);
1694 1.1 christos ctf_hash_destroy (fp->ctf_enums.ctn_readonly);
1695 1.1 christos ctf_hash_destroy (fp->ctf_names.ctn_readonly);
1696 1.1 christos }
1697 1.1 christos
1698 1.1 christos for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
1699 1.1 christos {
1700 1.1 christos nvd = ctf_list_next (dvd);
1701 1.1 christos ctf_dvd_delete (fp, dvd);
1702 1.1 christos }
1703 1.1 christos ctf_dynhash_destroy (fp->ctf_dvhash);
1704 1.1 christos ctf_str_free_atoms (fp);
1705 1.1 christos free (fp->ctf_tmp_typeslice);
1706 1.1 christos
1707 1.1 christos if (fp->ctf_data.cts_name != _CTF_NULLSTR)
1708 1.1 christos free ((char *) fp->ctf_data.cts_name);
1709 1.1 christos
1710 1.1 christos if (fp->ctf_symtab.cts_name != _CTF_NULLSTR)
1711 1.1 christos free ((char *) fp->ctf_symtab.cts_name);
1712 1.1 christos
1713 1.1 christos if (fp->ctf_strtab.cts_name != _CTF_NULLSTR)
1714 1.1 christos free ((char *) fp->ctf_strtab.cts_name);
1715 1.1 christos else if (fp->ctf_data_mmapped)
1716 1.1 christos ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
1717 1.1 christos
1718 1.1 christos free (fp->ctf_dynbase);
1719 1.1 christos
1720 1.1 christos ctf_dynhash_destroy (fp->ctf_syn_ext_strtab);
1721 1.1 christos ctf_dynhash_destroy (fp->ctf_link_inputs);
1722 1.1 christos ctf_dynhash_destroy (fp->ctf_link_outputs);
1723 1.1 christos ctf_dynhash_destroy (fp->ctf_link_type_mapping);
1724 1.1 christos ctf_dynhash_destroy (fp->ctf_link_in_cu_mapping);
1725 1.1 christos ctf_dynhash_destroy (fp->ctf_link_out_cu_mapping);
1726 1.1 christos ctf_dynhash_destroy (fp->ctf_add_processing);
1727 1.1 christos ctf_dedup_fini (fp, NULL, 0);
1728 1.1 christos ctf_dynset_destroy (fp->ctf_dedup_atoms_alloc);
1729 1.1 christos
1730 1.1 christos for (err = ctf_list_next (&fp->ctf_errs_warnings); err != NULL; err = nerr)
1731 1.1 christos {
1732 1.1 christos nerr = ctf_list_next (err);
1733 1.1 christos ctf_list_delete (&fp->ctf_errs_warnings, err);
1734 1.1 christos free (err->cew_text);
1735 1.1 christos free (err);
1736 1.1 christos }
1737 1.1 christos
1738 1.1 christos free (fp->ctf_sxlate);
1739 1.1 christos free (fp->ctf_txlate);
1740 1.1 christos free (fp->ctf_ptrtab);
1741 1.1 christos
1742 1.1 christos free (fp->ctf_header);
1743 1.1 christos free (fp);
1744 1.1 christos }
1745 1.1 christos
1746 1.1 christos /* The converse of ctf_open(). ctf_open() disguises whatever it opens as an
1747 1.1 christos archive, so closing one is just like closing an archive. */
1748 1.1 christos void
1749 1.1 christos ctf_close (ctf_archive_t *arc)
1750 1.1 christos {
1751 1.1 christos ctf_arc_close (arc);
1752 1.1 christos }
1753 1.1 christos
1754 1.1 christos /* Get the CTF archive from which this ctf_file_t is derived. */
1755 1.1 christos ctf_archive_t *
1756 1.1 christos ctf_get_arc (const ctf_file_t *fp)
1757 1.1 christos {
1758 1.1 christos return fp->ctf_archive;
1759 1.1 christos }
1760 1.1 christos
1761 1.1 christos /* Return the ctfsect out of the core ctf_impl. Useful for freeing the
1762 1.1 christos ctfsect's data * after ctf_file_close(), which is why we return the actual
1763 1.1 christos structure, not a pointer to it, since that is likely to become a pointer to
1764 1.1 christos freed data before the return value is used under the expected use case of
1765 1.1 christos ctf_getsect()/ ctf_file_close()/free(). */
1766 1.1 christos ctf_sect_t
1767 1.1 christos ctf_getdatasect (const ctf_file_t *fp)
1768 1.1 christos {
1769 1.1 christos return fp->ctf_data;
1770 1.1 christos }
1771 1.1 christos
1772 1.1 christos /* Return the CTF handle for the parent CTF container, if one exists.
1773 1.1 christos Otherwise return NULL to indicate this container has no imported parent. */
1774 1.1 christos ctf_file_t *
1775 1.1 christos ctf_parent_file (ctf_file_t *fp)
1776 1.1 christos {
1777 1.1 christos return fp->ctf_parent;
1778 1.1 christos }
1779 1.1 christos
1780 1.1 christos /* Return the name of the parent CTF container, if one exists. Otherwise
1781 1.1 christos return NULL to indicate this container is a root container. */
1782 1.1 christos const char *
1783 1.1 christos ctf_parent_name (ctf_file_t *fp)
1784 1.1 christos {
1785 1.1 christos return fp->ctf_parname;
1786 1.1 christos }
1787 1.1 christos
1788 1.1 christos /* Set the parent name. It is an error to call this routine without calling
1789 1.1 christos ctf_import() at some point. */
1790 1.1 christos int
1791 1.1 christos ctf_parent_name_set (ctf_file_t *fp, const char *name)
1792 1.1 christos {
1793 1.1 christos if (fp->ctf_dynparname != NULL)
1794 1.1 christos free (fp->ctf_dynparname);
1795 1.1 christos
1796 1.1 christos if ((fp->ctf_dynparname = strdup (name)) == NULL)
1797 1.1 christos return (ctf_set_errno (fp, ENOMEM));
1798 1.1 christos fp->ctf_parname = fp->ctf_dynparname;
1799 1.1 christos return 0;
1800 1.1 christos }
1801 1.1 christos
1802 1.1 christos /* Return the name of the compilation unit this CTF file applies to. Usually
1803 1.1 christos non-NULL only for non-parent containers. */
1804 1.1 christos const char *
1805 1.1 christos ctf_cuname (ctf_file_t *fp)
1806 1.1 christos {
1807 1.1 christos return fp->ctf_cuname;
1808 1.1 christos }
1809 1.1 christos
1810 1.1 christos /* Set the compilation unit name. */
1811 1.1 christos int
1812 1.1 christos ctf_cuname_set (ctf_file_t *fp, const char *name)
1813 1.1 christos {
1814 1.1 christos if (fp->ctf_dyncuname != NULL)
1815 1.1 christos free (fp->ctf_dyncuname);
1816 1.1 christos
1817 1.1 christos if ((fp->ctf_dyncuname = strdup (name)) == NULL)
1818 1.1 christos return (ctf_set_errno (fp, ENOMEM));
1819 1.1 christos fp->ctf_cuname = fp->ctf_dyncuname;
1820 1.1 christos return 0;
1821 1.1 christos }
1822 1.1 christos
1823 1.1 christos /* Import the types from the specified parent container by storing a pointer
1824 1.1 christos to it in ctf_parent and incrementing its reference count. Only one parent
1825 1.1 christos is allowed: if a parent already exists, it is replaced by the new parent. */
1826 1.1 christos int
1827 1.1 christos ctf_import (ctf_file_t *fp, ctf_file_t *pfp)
1828 1.1 christos {
1829 1.1 christos if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1830 1.1 christos return (ctf_set_errno (fp, EINVAL));
1831 1.1 christos
1832 1.1 christos if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1833 1.1 christos return (ctf_set_errno (fp, ECTF_DMODEL));
1834 1.1 christos
1835 1.1 christos if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1836 1.1 christos ctf_file_close (fp->ctf_parent);
1837 1.1 christos fp->ctf_parent = NULL;
1838 1.1 christos
1839 1.1 christos if (pfp != NULL)
1840 1.1 christos {
1841 1.1 christos int err;
1842 1.1 christos
1843 1.1 christos if (fp->ctf_parname == NULL)
1844 1.1 christos if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
1845 1.1 christos return err;
1846 1.1 christos
1847 1.1 christos fp->ctf_flags |= LCTF_CHILD;
1848 1.1 christos pfp->ctf_refcnt++;
1849 1.1 christos fp->ctf_parent_unreffed = 0;
1850 1.1 christos }
1851 1.1 christos
1852 1.1 christos fp->ctf_parent = pfp;
1853 1.1 christos return 0;
1854 1.1 christos }
1855 1.1 christos
1856 1.1 christos /* Like ctf_import, but does not increment the refcount on the imported parent
1857 1.1 christos or close it at any point: as a result it can go away at any time and the
1858 1.1 christos caller must do all freeing itself. Used internally to avoid refcount
1859 1.1 christos loops. */
1860 1.1 christos int
1861 1.1 christos ctf_import_unref (ctf_file_t *fp, ctf_file_t *pfp)
1862 1.1 christos {
1863 1.1 christos if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
1864 1.1 christos return (ctf_set_errno (fp, EINVAL));
1865 1.1 christos
1866 1.1 christos if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
1867 1.1 christos return (ctf_set_errno (fp, ECTF_DMODEL));
1868 1.1 christos
1869 1.1 christos if (fp->ctf_parent && !fp->ctf_parent_unreffed)
1870 1.1 christos ctf_file_close (fp->ctf_parent);
1871 1.1 christos fp->ctf_parent = NULL;
1872 1.1 christos
1873 1.1 christos if (pfp != NULL)
1874 1.1 christos {
1875 1.1 christos int err;
1876 1.1 christos
1877 1.1 christos if (fp->ctf_parname == NULL)
1878 1.1 christos if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
1879 1.1 christos return err;
1880 1.1 christos
1881 1.1 christos fp->ctf_flags |= LCTF_CHILD;
1882 1.1 christos fp->ctf_parent_unreffed = 1;
1883 1.1 christos }
1884 1.1 christos
1885 1.1 christos fp->ctf_parent = pfp;
1886 1.1 christos return 0;
1887 1.1 christos }
1888 1.1 christos
1889 1.1 christos /* Set the data model constant for the CTF container. */
1890 1.1 christos int
1891 1.1 christos ctf_setmodel (ctf_file_t *fp, int model)
1892 1.1 christos {
1893 1.1 christos const ctf_dmodel_t *dp;
1894 1.1 christos
1895 1.1 christos for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
1896 1.1 christos {
1897 1.1 christos if (dp->ctd_code == model)
1898 1.1 christos {
1899 1.1 christos fp->ctf_dmodel = dp;
1900 1.1 christos return 0;
1901 1.1 christos }
1902 1.1 christos }
1903 1.1 christos
1904 1.1 christos return (ctf_set_errno (fp, EINVAL));
1905 1.1 christos }
1906 1.1 christos
1907 1.1 christos /* Return the data model constant for the CTF container. */
1908 1.1 christos int
1909 1.1 christos ctf_getmodel (ctf_file_t *fp)
1910 1.1 christos {
1911 1.1 christos return fp->ctf_dmodel->ctd_code;
1912 1.1 christos }
1913 1.1 christos
1914 1.1 christos /* The caller can hang an arbitrary pointer off each ctf_file_t using this
1915 1.1 christos function. */
1916 1.1 christos void
1917 1.1 christos ctf_setspecific (ctf_file_t *fp, void *data)
1918 1.1 christos {
1919 1.1 christos fp->ctf_specific = data;
1920 1.1 christos }
1921 1.1 christos
1922 1.1 christos /* Retrieve the arbitrary pointer again. */
1923 1.1 christos void *
1924 1.1 christos ctf_getspecific (ctf_file_t *fp)
1925 1.1 christos {
1926 1.1 christos return fp->ctf_specific;
1927 1.1 christos }
1928