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