Home | History | Annotate | Line # | Download | only in libctf
ctf-open.c revision 1.1.1.2
      1      1.1  christos /* Opening CTF files.
      2  1.1.1.2  christos    Copyright (C) 2019-2022 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  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  christos       ctf_set_errno (fp, ECTF_CORRUPT);
    163      1.1  christos       ctf_err_warn (fp, 0, 0, _("detected invalid CTF kind: %x"), kind);
    164      1.1  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  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  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  christos   /* Much like init_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  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  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  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  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  christos      or at read time, in init_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  christos /* Initialize the type ID translation table with the byte offset of each type,
    674      1.1  christos    and initialize the hash tables of each named type.  Upgrade the type table to
    675      1.1  christos    the latest supported representation in the process, if needed, and if this
    676      1.1  christos    recension of libctf supports upgrading.  */
    677      1.1  christos 
    678      1.1  christos static int
    679  1.1.1.2  christos init_types (ctf_dict_t *fp, ctf_header_t *cth)
    680      1.1  christos {
    681      1.1  christos   const ctf_type_t *tbuf;
    682      1.1  christos   const ctf_type_t *tend;
    683      1.1  christos 
    684      1.1  christos   unsigned long pop[CTF_K_MAX + 1] = { 0 };
    685      1.1  christos   const ctf_type_t *tp;
    686  1.1.1.2  christos   uint32_t id;
    687      1.1  christos   uint32_t *xp;
    688      1.1  christos 
    689  1.1.1.2  christos   /* We determine whether the dict is a child or a parent based on the value of
    690  1.1.1.2  christos      cth_parname.  */
    691      1.1  christos 
    692      1.1  christos   int child = cth->cth_parname != 0;
    693      1.1  christos   int nlstructs = 0, nlunions = 0;
    694      1.1  christos   int err;
    695      1.1  christos 
    696      1.1  christos   assert (!(fp->ctf_flags & LCTF_RDWR));
    697      1.1  christos 
    698      1.1  christos   if (_libctf_unlikely_ (fp->ctf_version == CTF_VERSION_1))
    699      1.1  christos     {
    700      1.1  christos       int err;
    701      1.1  christos       if ((err = upgrade_types (fp, cth)) != 0)
    702      1.1  christos 	return err;				/* Upgrade failed.  */
    703      1.1  christos     }
    704      1.1  christos 
    705      1.1  christos   tbuf = (ctf_type_t *) (fp->ctf_buf + cth->cth_typeoff);
    706      1.1  christos   tend = (ctf_type_t *) (fp->ctf_buf + cth->cth_stroff);
    707      1.1  christos 
    708      1.1  christos   /* We make two passes through the entire type section.  In this first
    709      1.1  christos      pass, we count the number of each type and the total number of types.  */
    710      1.1  christos 
    711      1.1  christos   for (tp = tbuf; tp < tend; fp->ctf_typemax++)
    712      1.1  christos     {
    713      1.1  christos       unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
    714      1.1  christos       unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
    715      1.1  christos       ssize_t size, increment, vbytes;
    716      1.1  christos 
    717      1.1  christos       (void) ctf_get_ctt_size (fp, tp, &size, &increment);
    718      1.1  christos       vbytes = LCTF_VBYTES (fp, kind, size, vlen);
    719      1.1  christos 
    720      1.1  christos       if (vbytes < 0)
    721      1.1  christos 	return ECTF_CORRUPT;
    722      1.1  christos 
    723      1.1  christos       /* For forward declarations, ctt_type is the CTF_K_* kind for the tag,
    724      1.1  christos 	 so bump that population count too.  */
    725      1.1  christos       if (kind == CTF_K_FORWARD)
    726      1.1  christos 	pop[tp->ctt_type]++;
    727      1.1  christos 
    728      1.1  christos       tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
    729      1.1  christos       pop[kind]++;
    730      1.1  christos     }
    731      1.1  christos 
    732      1.1  christos   if (child)
    733      1.1  christos     {
    734  1.1.1.2  christos       ctf_dprintf ("CTF dict %p is a child\n", (void *) fp);
    735      1.1  christos       fp->ctf_flags |= LCTF_CHILD;
    736      1.1  christos     }
    737      1.1  christos   else
    738  1.1.1.2  christos     ctf_dprintf ("CTF dict %p is a parent\n", (void *) fp);
    739      1.1  christos 
    740      1.1  christos   /* Now that we've counted up the number of each type, we can allocate
    741      1.1  christos      the hash tables, type translation table, and pointer table.  */
    742      1.1  christos 
    743      1.1  christos   if ((fp->ctf_structs.ctn_readonly
    744      1.1  christos        = ctf_hash_create (pop[CTF_K_STRUCT], ctf_hash_string,
    745      1.1  christos 			  ctf_hash_eq_string)) == NULL)
    746      1.1  christos     return ENOMEM;
    747      1.1  christos 
    748      1.1  christos   if ((fp->ctf_unions.ctn_readonly
    749      1.1  christos        = ctf_hash_create (pop[CTF_K_UNION], ctf_hash_string,
    750      1.1  christos 			  ctf_hash_eq_string)) == NULL)
    751      1.1  christos     return ENOMEM;
    752      1.1  christos 
    753      1.1  christos   if ((fp->ctf_enums.ctn_readonly
    754      1.1  christos        = ctf_hash_create (pop[CTF_K_ENUM], ctf_hash_string,
    755      1.1  christos 			  ctf_hash_eq_string)) == NULL)
    756      1.1  christos     return ENOMEM;
    757      1.1  christos 
    758      1.1  christos   if ((fp->ctf_names.ctn_readonly
    759  1.1.1.2  christos        = ctf_hash_create (pop[CTF_K_UNKNOWN] +
    760  1.1.1.2  christos 			  pop[CTF_K_INTEGER] +
    761      1.1  christos 			  pop[CTF_K_FLOAT] +
    762      1.1  christos 			  pop[CTF_K_FUNCTION] +
    763      1.1  christos 			  pop[CTF_K_TYPEDEF] +
    764      1.1  christos 			  pop[CTF_K_POINTER] +
    765      1.1  christos 			  pop[CTF_K_VOLATILE] +
    766      1.1  christos 			  pop[CTF_K_CONST] +
    767      1.1  christos 			  pop[CTF_K_RESTRICT],
    768      1.1  christos 			  ctf_hash_string,
    769      1.1  christos 			  ctf_hash_eq_string)) == NULL)
    770      1.1  christos     return ENOMEM;
    771      1.1  christos 
    772      1.1  christos   fp->ctf_txlate = malloc (sizeof (uint32_t) * (fp->ctf_typemax + 1));
    773      1.1  christos   fp->ctf_ptrtab_len = fp->ctf_typemax + 1;
    774      1.1  christos   fp->ctf_ptrtab = malloc (sizeof (uint32_t) * fp->ctf_ptrtab_len);
    775      1.1  christos 
    776      1.1  christos   if (fp->ctf_txlate == NULL || fp->ctf_ptrtab == NULL)
    777      1.1  christos     return ENOMEM;		/* Memory allocation failed.  */
    778      1.1  christos 
    779      1.1  christos   xp = fp->ctf_txlate;
    780      1.1  christos   *xp++ = 0;			/* Type id 0 is used as a sentinel value.  */
    781      1.1  christos 
    782      1.1  christos   memset (fp->ctf_txlate, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
    783      1.1  christos   memset (fp->ctf_ptrtab, 0, sizeof (uint32_t) * (fp->ctf_typemax + 1));
    784      1.1  christos 
    785      1.1  christos   /* In the second pass through the types, we fill in each entry of the
    786      1.1  christos      type and pointer tables and add names to the appropriate hashes.  */
    787      1.1  christos 
    788      1.1  christos   for (id = 1, tp = tbuf; tp < tend; xp++, id++)
    789      1.1  christos     {
    790      1.1  christos       unsigned short kind = LCTF_INFO_KIND (fp, tp->ctt_info);
    791      1.1  christos       unsigned short isroot = LCTF_INFO_ISROOT (fp, tp->ctt_info);
    792      1.1  christos       unsigned long vlen = LCTF_INFO_VLEN (fp, tp->ctt_info);
    793      1.1  christos       ssize_t size, increment, vbytes;
    794      1.1  christos 
    795      1.1  christos       const char *name;
    796      1.1  christos 
    797      1.1  christos       (void) ctf_get_ctt_size (fp, tp, &size, &increment);
    798      1.1  christos       name = ctf_strptr (fp, tp->ctt_name);
    799      1.1  christos       /* Cannot fail: shielded by call in loop above.  */
    800      1.1  christos       vbytes = LCTF_VBYTES (fp, kind, size, vlen);
    801      1.1  christos 
    802      1.1  christos       switch (kind)
    803      1.1  christos 	{
    804  1.1.1.2  christos 	case CTF_K_UNKNOWN:
    805      1.1  christos 	case CTF_K_INTEGER:
    806      1.1  christos 	case CTF_K_FLOAT:
    807      1.1  christos 	  /* Names are reused by bit-fields, which are differentiated by their
    808      1.1  christos 	     encodings, and so typically we'd record only the first instance of
    809      1.1  christos 	     a given intrinsic.  However, we replace an existing type with a
    810      1.1  christos 	     root-visible version so that we can be sure to find it when
    811      1.1  christos 	     checking for conflicting definitions in ctf_add_type().  */
    812      1.1  christos 
    813      1.1  christos 	  if (((ctf_hash_lookup_type (fp->ctf_names.ctn_readonly,
    814      1.1  christos 				      fp, name)) == 0)
    815      1.1  christos 	      || isroot)
    816      1.1  christos 	    {
    817      1.1  christos 	      err = ctf_hash_define_type (fp->ctf_names.ctn_readonly, fp,
    818      1.1  christos 					  LCTF_INDEX_TO_TYPE (fp, id, child),
    819      1.1  christos 					  tp->ctt_name);
    820      1.1  christos 	      if (err != 0)
    821      1.1  christos 		return err;
    822      1.1  christos 	    }
    823      1.1  christos 	  break;
    824      1.1  christos 
    825      1.1  christos 	  /* These kinds have no name, so do not need interning into any
    826      1.1  christos 	     hashtables.  */
    827      1.1  christos 	case CTF_K_ARRAY:
    828      1.1  christos 	case CTF_K_SLICE:
    829      1.1  christos 	  break;
    830      1.1  christos 
    831      1.1  christos 	case CTF_K_FUNCTION:
    832      1.1  christos 	  if (!isroot)
    833      1.1  christos 	    break;
    834      1.1  christos 
    835      1.1  christos 	  err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
    836      1.1  christos 				      LCTF_INDEX_TO_TYPE (fp, id, child),
    837      1.1  christos 				      tp->ctt_name);
    838      1.1  christos 	  if (err != 0)
    839      1.1  christos 	    return err;
    840      1.1  christos 	  break;
    841      1.1  christos 
    842      1.1  christos 	case CTF_K_STRUCT:
    843      1.1  christos 	  if (size >= CTF_LSTRUCT_THRESH)
    844      1.1  christos 	    nlstructs++;
    845      1.1  christos 
    846      1.1  christos 	  if (!isroot)
    847      1.1  christos 	    break;
    848      1.1  christos 
    849      1.1  christos 	  err = ctf_hash_define_type (fp->ctf_structs.ctn_readonly, fp,
    850      1.1  christos 				      LCTF_INDEX_TO_TYPE (fp, id, child),
    851      1.1  christos 				      tp->ctt_name);
    852      1.1  christos 
    853      1.1  christos 	  if (err != 0)
    854      1.1  christos 	    return err;
    855      1.1  christos 
    856      1.1  christos 	  break;
    857      1.1  christos 
    858      1.1  christos 	case CTF_K_UNION:
    859      1.1  christos 	  if (size >= CTF_LSTRUCT_THRESH)
    860      1.1  christos 	    nlunions++;
    861      1.1  christos 
    862      1.1  christos 	  if (!isroot)
    863      1.1  christos 	    break;
    864      1.1  christos 
    865      1.1  christos 	  err = ctf_hash_define_type (fp->ctf_unions.ctn_readonly, fp,
    866      1.1  christos 				      LCTF_INDEX_TO_TYPE (fp, id, child),
    867      1.1  christos 				      tp->ctt_name);
    868      1.1  christos 
    869      1.1  christos 	  if (err != 0)
    870      1.1  christos 	    return err;
    871      1.1  christos 	  break;
    872      1.1  christos 
    873      1.1  christos 	case CTF_K_ENUM:
    874      1.1  christos 	  if (!isroot)
    875      1.1  christos 	    break;
    876      1.1  christos 
    877      1.1  christos 	  err = ctf_hash_define_type (fp->ctf_enums.ctn_readonly, fp,
    878      1.1  christos 				      LCTF_INDEX_TO_TYPE (fp, id, child),
    879      1.1  christos 				      tp->ctt_name);
    880      1.1  christos 
    881      1.1  christos 	  if (err != 0)
    882      1.1  christos 	    return err;
    883      1.1  christos 	  break;
    884      1.1  christos 
    885      1.1  christos 	case CTF_K_TYPEDEF:
    886      1.1  christos 	  if (!isroot)
    887      1.1  christos 	    break;
    888      1.1  christos 
    889      1.1  christos 	  err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
    890      1.1  christos 				      LCTF_INDEX_TO_TYPE (fp, id, child),
    891      1.1  christos 				      tp->ctt_name);
    892      1.1  christos 	  if (err != 0)
    893      1.1  christos 	    return err;
    894      1.1  christos 	  break;
    895      1.1  christos 
    896      1.1  christos 	case CTF_K_FORWARD:
    897      1.1  christos 	  {
    898      1.1  christos 	    ctf_names_t *np = ctf_name_table (fp, tp->ctt_type);
    899      1.1  christos 
    900      1.1  christos 	    if (!isroot)
    901      1.1  christos 	      break;
    902      1.1  christos 
    903      1.1  christos 	    /* Only insert forward tags into the given hash if the type or tag
    904      1.1  christos 	       name is not already present.  */
    905      1.1  christos 	    if (ctf_hash_lookup_type (np->ctn_readonly, fp, name) == 0)
    906      1.1  christos 	      {
    907      1.1  christos 		err = ctf_hash_insert_type (np->ctn_readonly, fp,
    908      1.1  christos 					    LCTF_INDEX_TO_TYPE (fp, id, child),
    909      1.1  christos 					    tp->ctt_name);
    910      1.1  christos 		if (err != 0)
    911      1.1  christos 		  return err;
    912      1.1  christos 	      }
    913      1.1  christos 	    break;
    914      1.1  christos 	  }
    915      1.1  christos 
    916      1.1  christos 	case CTF_K_POINTER:
    917  1.1.1.2  christos 	  /* If the type referenced by the pointer is in this CTF dict, then
    918  1.1.1.2  christos 	     store the index of the pointer type in fp->ctf_ptrtab[ index of
    919  1.1.1.2  christos 	     referenced type ].  */
    920      1.1  christos 
    921      1.1  christos 	  if (LCTF_TYPE_ISCHILD (fp, tp->ctt_type) == child
    922      1.1  christos 	      && LCTF_TYPE_TO_INDEX (fp, tp->ctt_type) <= fp->ctf_typemax)
    923      1.1  christos 	    fp->ctf_ptrtab[LCTF_TYPE_TO_INDEX (fp, tp->ctt_type)] = id;
    924      1.1  christos 	 /*FALLTHRU*/
    925      1.1  christos 
    926      1.1  christos 	case CTF_K_VOLATILE:
    927      1.1  christos 	case CTF_K_CONST:
    928      1.1  christos 	case CTF_K_RESTRICT:
    929      1.1  christos 	  if (!isroot)
    930      1.1  christos 	    break;
    931      1.1  christos 
    932      1.1  christos 	  err = ctf_hash_insert_type (fp->ctf_names.ctn_readonly, fp,
    933      1.1  christos 				      LCTF_INDEX_TO_TYPE (fp, id, child),
    934      1.1  christos 				      tp->ctt_name);
    935      1.1  christos 	  if (err != 0)
    936      1.1  christos 	    return err;
    937      1.1  christos 	  break;
    938      1.1  christos 	default:
    939      1.1  christos 	  ctf_err_warn (fp, 0, ECTF_CORRUPT,
    940      1.1  christos 			_("init_types(): unhandled CTF kind: %x"), kind);
    941      1.1  christos 	  return ECTF_CORRUPT;
    942      1.1  christos 	}
    943      1.1  christos 
    944      1.1  christos       *xp = (uint32_t) ((uintptr_t) tp - (uintptr_t) fp->ctf_buf);
    945      1.1  christos       tp = (ctf_type_t *) ((uintptr_t) tp + increment + vbytes);
    946      1.1  christos     }
    947      1.1  christos 
    948      1.1  christos   ctf_dprintf ("%lu total types processed\n", fp->ctf_typemax);
    949      1.1  christos   ctf_dprintf ("%u enum names hashed\n",
    950      1.1  christos 	       ctf_hash_size (fp->ctf_enums.ctn_readonly));
    951      1.1  christos   ctf_dprintf ("%u struct names hashed (%d long)\n",
    952      1.1  christos 	       ctf_hash_size (fp->ctf_structs.ctn_readonly), nlstructs);
    953      1.1  christos   ctf_dprintf ("%u union names hashed (%d long)\n",
    954      1.1  christos 	       ctf_hash_size (fp->ctf_unions.ctn_readonly), nlunions);
    955      1.1  christos   ctf_dprintf ("%u base type names hashed\n",
    956      1.1  christos 	       ctf_hash_size (fp->ctf_names.ctn_readonly));
    957      1.1  christos 
    958      1.1  christos   return 0;
    959      1.1  christos }
    960      1.1  christos 
    961      1.1  christos /* Endianness-flipping routines.
    962      1.1  christos 
    963      1.1  christos    We flip everything, mindlessly, even 1-byte entities, so that future
    964      1.1  christos    expansions do not require changes to this code.  */
    965      1.1  christos 
    966      1.1  christos /* Flip the endianness of the CTF header.  */
    967      1.1  christos 
    968  1.1.1.2  christos void
    969  1.1.1.2  christos ctf_flip_header (ctf_header_t *cth)
    970      1.1  christos {
    971      1.1  christos   swap_thing (cth->cth_preamble.ctp_magic);
    972      1.1  christos   swap_thing (cth->cth_preamble.ctp_version);
    973      1.1  christos   swap_thing (cth->cth_preamble.ctp_flags);
    974      1.1  christos   swap_thing (cth->cth_parlabel);
    975      1.1  christos   swap_thing (cth->cth_parname);
    976      1.1  christos   swap_thing (cth->cth_cuname);
    977      1.1  christos   swap_thing (cth->cth_objtoff);
    978      1.1  christos   swap_thing (cth->cth_funcoff);
    979      1.1  christos   swap_thing (cth->cth_objtidxoff);
    980      1.1  christos   swap_thing (cth->cth_funcidxoff);
    981      1.1  christos   swap_thing (cth->cth_varoff);
    982      1.1  christos   swap_thing (cth->cth_typeoff);
    983      1.1  christos   swap_thing (cth->cth_stroff);
    984      1.1  christos   swap_thing (cth->cth_strlen);
    985      1.1  christos }
    986      1.1  christos 
    987      1.1  christos /* Flip the endianness of the label section, an array of ctf_lblent_t.  */
    988      1.1  christos 
    989      1.1  christos static void
    990      1.1  christos flip_lbls (void *start, size_t len)
    991      1.1  christos {
    992      1.1  christos   ctf_lblent_t *lbl = start;
    993      1.1  christos   ssize_t i;
    994      1.1  christos 
    995      1.1  christos   for (i = len / sizeof (struct ctf_lblent); i > 0; lbl++, i--)
    996      1.1  christos     {
    997      1.1  christos       swap_thing (lbl->ctl_label);
    998      1.1  christos       swap_thing (lbl->ctl_type);
    999      1.1  christos     }
   1000      1.1  christos }
   1001      1.1  christos 
   1002      1.1  christos /* Flip the endianness of the data-object or function sections or their indexes,
   1003  1.1.1.2  christos    all arrays of uint32_t.  */
   1004      1.1  christos 
   1005      1.1  christos static void
   1006      1.1  christos flip_objts (void *start, size_t len)
   1007      1.1  christos {
   1008      1.1  christos   uint32_t *obj = start;
   1009      1.1  christos   ssize_t i;
   1010      1.1  christos 
   1011      1.1  christos   for (i = len / sizeof (uint32_t); i > 0; obj++, i--)
   1012      1.1  christos       swap_thing (*obj);
   1013      1.1  christos }
   1014      1.1  christos 
   1015      1.1  christos /* Flip the endianness of the variable section, an array of ctf_varent_t.  */
   1016      1.1  christos 
   1017      1.1  christos static void
   1018      1.1  christos flip_vars (void *start, size_t len)
   1019      1.1  christos {
   1020      1.1  christos   ctf_varent_t *var = start;
   1021      1.1  christos   ssize_t i;
   1022      1.1  christos 
   1023      1.1  christos   for (i = len / sizeof (struct ctf_varent); i > 0; var++, i--)
   1024      1.1  christos     {
   1025      1.1  christos       swap_thing (var->ctv_name);
   1026      1.1  christos       swap_thing (var->ctv_type);
   1027      1.1  christos     }
   1028      1.1  christos }
   1029      1.1  christos 
   1030      1.1  christos /* Flip the endianness of the type section, a tagged array of ctf_type or
   1031      1.1  christos    ctf_stype followed by variable data.  */
   1032      1.1  christos 
   1033      1.1  christos static int
   1034  1.1.1.2  christos flip_types (ctf_dict_t *fp, void *start, size_t len, int to_foreign)
   1035      1.1  christos {
   1036      1.1  christos   ctf_type_t *t = start;
   1037      1.1  christos 
   1038      1.1  christos   while ((uintptr_t) t < ((uintptr_t) start) + len)
   1039      1.1  christos     {
   1040  1.1.1.2  christos       uint32_t kind;
   1041  1.1.1.2  christos       size_t size;
   1042  1.1.1.2  christos       uint32_t vlen;
   1043  1.1.1.2  christos       size_t vbytes;
   1044  1.1.1.2  christos 
   1045  1.1.1.2  christos       if (to_foreign)
   1046  1.1.1.2  christos 	{
   1047  1.1.1.2  christos 	  kind = CTF_V2_INFO_KIND (t->ctt_info);
   1048  1.1.1.2  christos 	  size = t->ctt_size;
   1049  1.1.1.2  christos 	  vlen = CTF_V2_INFO_VLEN (t->ctt_info);
   1050  1.1.1.2  christos 	  vbytes = get_vbytes_v2 (fp, kind, size, vlen);
   1051  1.1.1.2  christos 	}
   1052  1.1.1.2  christos 
   1053      1.1  christos       swap_thing (t->ctt_name);
   1054      1.1  christos       swap_thing (t->ctt_info);
   1055      1.1  christos       swap_thing (t->ctt_size);
   1056      1.1  christos 
   1057  1.1.1.2  christos       if (!to_foreign)
   1058  1.1.1.2  christos 	{
   1059  1.1.1.2  christos 	  kind = CTF_V2_INFO_KIND (t->ctt_info);
   1060  1.1.1.2  christos 	  size = t->ctt_size;
   1061  1.1.1.2  christos 	  vlen = CTF_V2_INFO_VLEN (t->ctt_info);
   1062  1.1.1.2  christos 	  vbytes = get_vbytes_v2 (fp, kind, size, vlen);
   1063  1.1.1.2  christos 	}
   1064      1.1  christos 
   1065      1.1  christos       if (_libctf_unlikely_ (size == CTF_LSIZE_SENT))
   1066      1.1  christos 	{
   1067  1.1.1.2  christos 	  if (to_foreign)
   1068  1.1.1.2  christos 	    size = CTF_TYPE_LSIZE (t);
   1069  1.1.1.2  christos 
   1070      1.1  christos 	  swap_thing (t->ctt_lsizehi);
   1071      1.1  christos 	  swap_thing (t->ctt_lsizelo);
   1072  1.1.1.2  christos 
   1073  1.1.1.2  christos 	  if (!to_foreign)
   1074  1.1.1.2  christos 	    size = CTF_TYPE_LSIZE (t);
   1075  1.1.1.2  christos 
   1076      1.1  christos 	  t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_type_t));
   1077      1.1  christos 	}
   1078      1.1  christos       else
   1079      1.1  christos 	t = (ctf_type_t *) ((uintptr_t) t + sizeof (ctf_stype_t));
   1080      1.1  christos 
   1081      1.1  christos       switch (kind)
   1082      1.1  christos 	{
   1083      1.1  christos 	case CTF_K_FORWARD:
   1084      1.1  christos 	case CTF_K_UNKNOWN:
   1085      1.1  christos 	case CTF_K_POINTER:
   1086      1.1  christos 	case CTF_K_TYPEDEF:
   1087      1.1  christos 	case CTF_K_VOLATILE:
   1088      1.1  christos 	case CTF_K_CONST:
   1089      1.1  christos 	case CTF_K_RESTRICT:
   1090      1.1  christos 	  /* These types have no vlen data to swap.  */
   1091      1.1  christos 	  assert (vbytes == 0);
   1092      1.1  christos 	  break;
   1093      1.1  christos 
   1094      1.1  christos 	case CTF_K_INTEGER:
   1095      1.1  christos 	case CTF_K_FLOAT:
   1096      1.1  christos 	  {
   1097      1.1  christos 	    /* These types have a single uint32_t.  */
   1098      1.1  christos 
   1099      1.1  christos 	    uint32_t *item = (uint32_t *) t;
   1100      1.1  christos 
   1101      1.1  christos 	    swap_thing (*item);
   1102      1.1  christos 	    break;
   1103      1.1  christos 	  }
   1104      1.1  christos 
   1105      1.1  christos 	case CTF_K_FUNCTION:
   1106      1.1  christos 	  {
   1107      1.1  christos 	    /* This type has a bunch of uint32_ts.  */
   1108      1.1  christos 
   1109      1.1  christos 	    uint32_t *item = (uint32_t *) t;
   1110      1.1  christos 	    ssize_t i;
   1111      1.1  christos 
   1112      1.1  christos 	    for (i = vlen; i > 0; item++, i--)
   1113      1.1  christos 	      swap_thing (*item);
   1114      1.1  christos 	    break;
   1115      1.1  christos 	  }
   1116      1.1  christos 
   1117      1.1  christos 	case CTF_K_ARRAY:
   1118      1.1  christos 	  {
   1119      1.1  christos 	    /* This has a single ctf_array_t.  */
   1120      1.1  christos 
   1121      1.1  christos 	    ctf_array_t *a = (ctf_array_t *) t;
   1122      1.1  christos 
   1123      1.1  christos 	    assert (vbytes == sizeof (ctf_array_t));
   1124      1.1  christos 	    swap_thing (a->cta_contents);
   1125      1.1  christos 	    swap_thing (a->cta_index);
   1126      1.1  christos 	    swap_thing (a->cta_nelems);
   1127      1.1  christos 
   1128      1.1  christos 	    break;
   1129      1.1  christos 	  }
   1130      1.1  christos 
   1131      1.1  christos 	case CTF_K_SLICE:
   1132      1.1  christos 	  {
   1133      1.1  christos 	    /* This has a single ctf_slice_t.  */
   1134      1.1  christos 
   1135      1.1  christos 	    ctf_slice_t *s = (ctf_slice_t *) t;
   1136      1.1  christos 
   1137      1.1  christos 	    assert (vbytes == sizeof (ctf_slice_t));
   1138      1.1  christos 	    swap_thing (s->cts_type);
   1139      1.1  christos 	    swap_thing (s->cts_offset);
   1140      1.1  christos 	    swap_thing (s->cts_bits);
   1141      1.1  christos 
   1142      1.1  christos 	    break;
   1143      1.1  christos 	  }
   1144      1.1  christos 
   1145      1.1  christos 	case CTF_K_STRUCT:
   1146      1.1  christos 	case CTF_K_UNION:
   1147      1.1  christos 	  {
   1148      1.1  christos 	    /* This has an array of ctf_member or ctf_lmember, depending on
   1149      1.1  christos 	       size.  We could consider it to be a simple array of uint32_t,
   1150      1.1  christos 	       but for safety's sake in case these structures ever acquire
   1151      1.1  christos 	       non-uint32_t members, do it member by member.  */
   1152      1.1  christos 
   1153      1.1  christos 	    if (_libctf_unlikely_ (size >= CTF_LSTRUCT_THRESH))
   1154      1.1  christos 	      {
   1155      1.1  christos 		ctf_lmember_t *lm = (ctf_lmember_t *) t;
   1156      1.1  christos 		ssize_t i;
   1157      1.1  christos 		for (i = vlen; i > 0; i--, lm++)
   1158      1.1  christos 		  {
   1159      1.1  christos 		    swap_thing (lm->ctlm_name);
   1160      1.1  christos 		    swap_thing (lm->ctlm_offsethi);
   1161      1.1  christos 		    swap_thing (lm->ctlm_type);
   1162      1.1  christos 		    swap_thing (lm->ctlm_offsetlo);
   1163      1.1  christos 		  }
   1164      1.1  christos 	      }
   1165      1.1  christos 	    else
   1166      1.1  christos 	      {
   1167      1.1  christos 		ctf_member_t *m = (ctf_member_t *) t;
   1168      1.1  christos 		ssize_t i;
   1169      1.1  christos 		for (i = vlen; i > 0; i--, m++)
   1170      1.1  christos 		  {
   1171      1.1  christos 		    swap_thing (m->ctm_name);
   1172      1.1  christos 		    swap_thing (m->ctm_offset);
   1173      1.1  christos 		    swap_thing (m->ctm_type);
   1174      1.1  christos 		  }
   1175      1.1  christos 	      }
   1176      1.1  christos 	    break;
   1177      1.1  christos 	  }
   1178      1.1  christos 
   1179      1.1  christos 	case CTF_K_ENUM:
   1180      1.1  christos 	  {
   1181      1.1  christos 	    /* This has an array of ctf_enum_t.  */
   1182      1.1  christos 
   1183      1.1  christos 	    ctf_enum_t *item = (ctf_enum_t *) t;
   1184      1.1  christos 	    ssize_t i;
   1185      1.1  christos 
   1186      1.1  christos 	    for (i = vlen; i > 0; item++, i--)
   1187      1.1  christos 	      {
   1188      1.1  christos 		swap_thing (item->cte_name);
   1189      1.1  christos 		swap_thing (item->cte_value);
   1190      1.1  christos 	      }
   1191      1.1  christos 	    break;
   1192      1.1  christos 	  }
   1193      1.1  christos 	default:
   1194      1.1  christos 	  ctf_err_warn (fp, 0, ECTF_CORRUPT,
   1195      1.1  christos 			_("unhandled CTF kind in endianness conversion: %x"),
   1196      1.1  christos 			kind);
   1197      1.1  christos 	  return ECTF_CORRUPT;
   1198      1.1  christos 	}
   1199      1.1  christos 
   1200      1.1  christos       t = (ctf_type_t *) ((uintptr_t) t + vbytes);
   1201      1.1  christos     }
   1202      1.1  christos 
   1203      1.1  christos   return 0;
   1204      1.1  christos }
   1205      1.1  christos 
   1206      1.1  christos /* Flip the endianness of BUF, given the offsets in the (already endian-
   1207  1.1.1.2  christos    converted) CTH.  If TO_FOREIGN is set, flip to foreign-endianness; if not,
   1208  1.1.1.2  christos    flip away.
   1209      1.1  christos 
   1210      1.1  christos    All of this stuff happens before the header is fully initialized, so the
   1211      1.1  christos    LCTF_*() macros cannot be used yet.  Since we do not try to endian-convert v1
   1212      1.1  christos    data, this is no real loss.  */
   1213      1.1  christos 
   1214  1.1.1.2  christos int
   1215  1.1.1.2  christos ctf_flip (ctf_dict_t *fp, ctf_header_t *cth, unsigned char *buf,
   1216  1.1.1.2  christos 	  int to_foreign)
   1217      1.1  christos {
   1218  1.1.1.2  christos   ctf_dprintf("flipping endianness\n");
   1219  1.1.1.2  christos 
   1220      1.1  christos   flip_lbls (buf + cth->cth_lbloff, cth->cth_objtoff - cth->cth_lbloff);
   1221      1.1  christos   flip_objts (buf + cth->cth_objtoff, cth->cth_funcoff - cth->cth_objtoff);
   1222      1.1  christos   flip_objts (buf + cth->cth_funcoff, cth->cth_objtidxoff - cth->cth_funcoff);
   1223      1.1  christos   flip_objts (buf + cth->cth_objtidxoff, cth->cth_funcidxoff - cth->cth_objtidxoff);
   1224      1.1  christos   flip_objts (buf + cth->cth_funcidxoff, cth->cth_varoff - cth->cth_funcidxoff);
   1225      1.1  christos   flip_vars (buf + cth->cth_varoff, cth->cth_typeoff - cth->cth_varoff);
   1226  1.1.1.2  christos   return flip_types (fp, buf + cth->cth_typeoff,
   1227  1.1.1.2  christos 		     cth->cth_stroff - cth->cth_typeoff, to_foreign);
   1228      1.1  christos }
   1229      1.1  christos 
   1230  1.1.1.2  christos /* Set up the ctl hashes in a ctf_dict_t.  Called by both writable and
   1231      1.1  christos    non-writable dictionary initialization.  */
   1232  1.1.1.2  christos void ctf_set_ctl_hashes (ctf_dict_t *fp)
   1233      1.1  christos {
   1234      1.1  christos   /* Initialize the ctf_lookup_by_name top-level dictionary.  We keep an
   1235      1.1  christos      array of type name prefixes and the corresponding ctf_hash to use.  */
   1236      1.1  christos   fp->ctf_lookups[0].ctl_prefix = "struct";
   1237      1.1  christos   fp->ctf_lookups[0].ctl_len = strlen (fp->ctf_lookups[0].ctl_prefix);
   1238      1.1  christos   fp->ctf_lookups[0].ctl_hash = &fp->ctf_structs;
   1239      1.1  christos   fp->ctf_lookups[1].ctl_prefix = "union";
   1240      1.1  christos   fp->ctf_lookups[1].ctl_len = strlen (fp->ctf_lookups[1].ctl_prefix);
   1241      1.1  christos   fp->ctf_lookups[1].ctl_hash = &fp->ctf_unions;
   1242      1.1  christos   fp->ctf_lookups[2].ctl_prefix = "enum";
   1243      1.1  christos   fp->ctf_lookups[2].ctl_len = strlen (fp->ctf_lookups[2].ctl_prefix);
   1244      1.1  christos   fp->ctf_lookups[2].ctl_hash = &fp->ctf_enums;
   1245      1.1  christos   fp->ctf_lookups[3].ctl_prefix = _CTF_NULLSTR;
   1246      1.1  christos   fp->ctf_lookups[3].ctl_len = strlen (fp->ctf_lookups[3].ctl_prefix);
   1247      1.1  christos   fp->ctf_lookups[3].ctl_hash = &fp->ctf_names;
   1248      1.1  christos   fp->ctf_lookups[4].ctl_prefix = NULL;
   1249      1.1  christos   fp->ctf_lookups[4].ctl_len = 0;
   1250      1.1  christos   fp->ctf_lookups[4].ctl_hash = NULL;
   1251      1.1  christos }
   1252      1.1  christos 
   1253      1.1  christos /* Open a CTF file, mocking up a suitable ctf_sect.  */
   1254      1.1  christos 
   1255  1.1.1.2  christos ctf_dict_t *ctf_simple_open (const char *ctfsect, size_t ctfsect_size,
   1256      1.1  christos 			     const char *symsect, size_t symsect_size,
   1257      1.1  christos 			     size_t symsect_entsize,
   1258      1.1  christos 			     const char *strsect, size_t strsect_size,
   1259      1.1  christos 			     int *errp)
   1260      1.1  christos {
   1261      1.1  christos   return ctf_simple_open_internal (ctfsect, ctfsect_size, symsect, symsect_size,
   1262      1.1  christos 				   symsect_entsize, strsect, strsect_size, NULL,
   1263      1.1  christos 				   0, errp);
   1264      1.1  christos }
   1265      1.1  christos 
   1266      1.1  christos /* Open a CTF file, mocking up a suitable ctf_sect and overriding the external
   1267      1.1  christos    strtab with a synthetic one.  */
   1268      1.1  christos 
   1269  1.1.1.2  christos ctf_dict_t *ctf_simple_open_internal (const char *ctfsect, size_t ctfsect_size,
   1270      1.1  christos 				      const char *symsect, size_t symsect_size,
   1271      1.1  christos 				      size_t symsect_entsize,
   1272      1.1  christos 				      const char *strsect, size_t strsect_size,
   1273      1.1  christos 				      ctf_dynhash_t *syn_strtab, int writable,
   1274      1.1  christos 				      int *errp)
   1275      1.1  christos {
   1276      1.1  christos   ctf_sect_t skeleton;
   1277      1.1  christos 
   1278      1.1  christos   ctf_sect_t ctf_sect, sym_sect, str_sect;
   1279      1.1  christos   ctf_sect_t *ctfsectp = NULL;
   1280      1.1  christos   ctf_sect_t *symsectp = NULL;
   1281      1.1  christos   ctf_sect_t *strsectp = NULL;
   1282      1.1  christos 
   1283      1.1  christos   skeleton.cts_name = _CTF_SECTION;
   1284      1.1  christos   skeleton.cts_entsize = 1;
   1285      1.1  christos 
   1286      1.1  christos   if (ctfsect)
   1287      1.1  christos     {
   1288      1.1  christos       memcpy (&ctf_sect, &skeleton, sizeof (struct ctf_sect));
   1289      1.1  christos       ctf_sect.cts_data = ctfsect;
   1290      1.1  christos       ctf_sect.cts_size = ctfsect_size;
   1291      1.1  christos       ctfsectp = &ctf_sect;
   1292      1.1  christos     }
   1293      1.1  christos 
   1294      1.1  christos   if (symsect)
   1295      1.1  christos     {
   1296      1.1  christos       memcpy (&sym_sect, &skeleton, sizeof (struct ctf_sect));
   1297      1.1  christos       sym_sect.cts_data = symsect;
   1298      1.1  christos       sym_sect.cts_size = symsect_size;
   1299      1.1  christos       sym_sect.cts_entsize = symsect_entsize;
   1300      1.1  christos       symsectp = &sym_sect;
   1301      1.1  christos     }
   1302      1.1  christos 
   1303      1.1  christos   if (strsect)
   1304      1.1  christos     {
   1305      1.1  christos       memcpy (&str_sect, &skeleton, sizeof (struct ctf_sect));
   1306      1.1  christos       str_sect.cts_data = strsect;
   1307      1.1  christos       str_sect.cts_size = strsect_size;
   1308      1.1  christos       strsectp = &str_sect;
   1309      1.1  christos     }
   1310      1.1  christos 
   1311      1.1  christos   return ctf_bufopen_internal (ctfsectp, symsectp, strsectp, syn_strtab,
   1312      1.1  christos 			       writable, errp);
   1313      1.1  christos }
   1314      1.1  christos 
   1315      1.1  christos /* Decode the specified CTF buffer and optional symbol table, and create a new
   1316  1.1.1.2  christos    CTF dict representing the symbolic debugging information.  This code can
   1317      1.1  christos    be used directly by the debugger, or it can be used as the engine for
   1318      1.1  christos    ctf_fdopen() or ctf_open(), below.  */
   1319      1.1  christos 
   1320  1.1.1.2  christos ctf_dict_t *
   1321      1.1  christos ctf_bufopen (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
   1322      1.1  christos 	     const ctf_sect_t *strsect, int *errp)
   1323      1.1  christos {
   1324      1.1  christos   return ctf_bufopen_internal (ctfsect, symsect, strsect, NULL, 0, errp);
   1325      1.1  christos }
   1326      1.1  christos 
   1327      1.1  christos /* Like ctf_bufopen, but overriding the external strtab with a synthetic one.  */
   1328      1.1  christos 
   1329  1.1.1.2  christos ctf_dict_t *
   1330      1.1  christos ctf_bufopen_internal (const ctf_sect_t *ctfsect, const ctf_sect_t *symsect,
   1331      1.1  christos 		      const ctf_sect_t *strsect, ctf_dynhash_t *syn_strtab,
   1332      1.1  christos 		      int writable, int *errp)
   1333      1.1  christos {
   1334      1.1  christos   const ctf_preamble_t *pp;
   1335      1.1  christos   size_t hdrsz = sizeof (ctf_header_t);
   1336      1.1  christos   ctf_header_t *hp;
   1337  1.1.1.2  christos   ctf_dict_t *fp;
   1338      1.1  christos   int foreign_endian = 0;
   1339      1.1  christos   int err;
   1340      1.1  christos 
   1341      1.1  christos   libctf_init_debug();
   1342      1.1  christos 
   1343      1.1  christos   if ((ctfsect == NULL) || ((symsect != NULL) &&
   1344      1.1  christos 			    ((strsect == NULL) && syn_strtab == NULL)))
   1345      1.1  christos     return (ctf_set_open_errno (errp, EINVAL));
   1346      1.1  christos 
   1347      1.1  christos   if (symsect != NULL && symsect->cts_entsize != sizeof (Elf32_Sym) &&
   1348      1.1  christos       symsect->cts_entsize != sizeof (Elf64_Sym))
   1349      1.1  christos     return (ctf_set_open_errno (errp, ECTF_SYMTAB));
   1350      1.1  christos 
   1351      1.1  christos   if (symsect != NULL && symsect->cts_data == NULL)
   1352      1.1  christos     return (ctf_set_open_errno (errp, ECTF_SYMBAD));
   1353      1.1  christos 
   1354      1.1  christos   if (strsect != NULL && strsect->cts_data == NULL)
   1355      1.1  christos     return (ctf_set_open_errno (errp, ECTF_STRBAD));
   1356      1.1  christos 
   1357      1.1  christos   if (ctfsect->cts_size < sizeof (ctf_preamble_t))
   1358      1.1  christos     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
   1359      1.1  christos 
   1360      1.1  christos   pp = (const ctf_preamble_t *) ctfsect->cts_data;
   1361      1.1  christos 
   1362      1.1  christos   ctf_dprintf ("ctf_bufopen: magic=0x%x version=%u\n",
   1363      1.1  christos 	       pp->ctp_magic, pp->ctp_version);
   1364      1.1  christos 
   1365      1.1  christos   /* Validate each part of the CTF header.
   1366      1.1  christos 
   1367      1.1  christos      First, we validate the preamble (common to all versions).  At that point,
   1368      1.1  christos      we know the endianness and specific header version, and can validate the
   1369      1.1  christos      version-specific parts including section offsets and alignments.
   1370      1.1  christos 
   1371      1.1  christos      We specifically do not support foreign-endian old versions.  */
   1372      1.1  christos 
   1373      1.1  christos   if (_libctf_unlikely_ (pp->ctp_magic != CTF_MAGIC))
   1374      1.1  christos     {
   1375      1.1  christos       if (pp->ctp_magic == bswap_16 (CTF_MAGIC))
   1376      1.1  christos 	{
   1377      1.1  christos 	  if (pp->ctp_version != CTF_VERSION_3)
   1378      1.1  christos 	    return (ctf_set_open_errno (errp, ECTF_CTFVERS));
   1379      1.1  christos 	  foreign_endian = 1;
   1380      1.1  christos 	}
   1381      1.1  christos       else
   1382      1.1  christos 	return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
   1383      1.1  christos     }
   1384      1.1  christos 
   1385      1.1  christos   if (_libctf_unlikely_ ((pp->ctp_version < CTF_VERSION_1)
   1386      1.1  christos 			 || (pp->ctp_version > CTF_VERSION_3)))
   1387      1.1  christos     return (ctf_set_open_errno (errp, ECTF_CTFVERS));
   1388      1.1  christos 
   1389      1.1  christos   if ((symsect != NULL) && (pp->ctp_version < CTF_VERSION_2))
   1390      1.1  christos     {
   1391      1.1  christos       /* The symtab can contain function entries which contain embedded ctf
   1392      1.1  christos 	 info.  We do not support dynamically upgrading such entries (none
   1393      1.1  christos 	 should exist in any case, since dwarf2ctf does not create them).  */
   1394      1.1  christos 
   1395  1.1.1.2  christos       ctf_err_warn (NULL, 0, ECTF_NOTSUP, _("ctf_bufopen: CTF version %d "
   1396  1.1.1.2  christos 					    "symsect not supported"),
   1397  1.1.1.2  christos 		    pp->ctp_version);
   1398      1.1  christos       return (ctf_set_open_errno (errp, ECTF_NOTSUP));
   1399      1.1  christos     }
   1400      1.1  christos 
   1401      1.1  christos   if (pp->ctp_version < CTF_VERSION_3)
   1402      1.1  christos     hdrsz = sizeof (ctf_header_v2_t);
   1403      1.1  christos 
   1404      1.1  christos   if (_libctf_unlikely_ (pp->ctp_flags > CTF_F_MAX))
   1405  1.1.1.2  christos     {
   1406  1.1.1.2  christos       ctf_err_warn (NULL, 0, ECTF_FLAGS, _("ctf_bufopen: invalid header "
   1407  1.1.1.2  christos 					   "flags: %x"),
   1408  1.1.1.2  christos 		    (unsigned int) pp->ctp_flags);
   1409  1.1.1.2  christos       return (ctf_set_open_errno (errp, ECTF_FLAGS));
   1410  1.1.1.2  christos     }
   1411      1.1  christos 
   1412      1.1  christos   if (ctfsect->cts_size < hdrsz)
   1413      1.1  christos     return (ctf_set_open_errno (errp, ECTF_NOCTFBUF));
   1414      1.1  christos 
   1415  1.1.1.2  christos   if ((fp = malloc (sizeof (ctf_dict_t))) == NULL)
   1416      1.1  christos     return (ctf_set_open_errno (errp, ENOMEM));
   1417      1.1  christos 
   1418  1.1.1.2  christos   memset (fp, 0, sizeof (ctf_dict_t));
   1419      1.1  christos 
   1420      1.1  christos   if (writable)
   1421      1.1  christos     fp->ctf_flags |= LCTF_RDWR;
   1422      1.1  christos 
   1423      1.1  christos   if ((fp->ctf_header = malloc (sizeof (struct ctf_header))) == NULL)
   1424      1.1  christos     {
   1425      1.1  christos       free (fp);
   1426      1.1  christos       return (ctf_set_open_errno (errp, ENOMEM));
   1427      1.1  christos     }
   1428      1.1  christos   hp = fp->ctf_header;
   1429      1.1  christos   memcpy (hp, ctfsect->cts_data, hdrsz);
   1430      1.1  christos   if (pp->ctp_version < CTF_VERSION_3)
   1431      1.1  christos     upgrade_header (hp);
   1432      1.1  christos 
   1433      1.1  christos   if (foreign_endian)
   1434  1.1.1.2  christos     ctf_flip_header (hp);
   1435      1.1  christos   fp->ctf_openflags = hp->cth_flags;
   1436      1.1  christos   fp->ctf_size = hp->cth_stroff + hp->cth_strlen;
   1437      1.1  christos 
   1438      1.1  christos   ctf_dprintf ("ctf_bufopen: uncompressed size=%lu\n",
   1439      1.1  christos 	       (unsigned long) fp->ctf_size);
   1440      1.1  christos 
   1441      1.1  christos   if (hp->cth_lbloff > fp->ctf_size || hp->cth_objtoff > fp->ctf_size
   1442      1.1  christos       || hp->cth_funcoff > fp->ctf_size || hp->cth_objtidxoff > fp->ctf_size
   1443      1.1  christos       || hp->cth_funcidxoff > fp->ctf_size || hp->cth_typeoff > fp->ctf_size
   1444      1.1  christos       || hp->cth_stroff > fp->ctf_size)
   1445  1.1.1.2  christos     {
   1446  1.1.1.2  christos       ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("header offset exceeds CTF size"));
   1447  1.1.1.2  christos       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
   1448  1.1.1.2  christos     }
   1449      1.1  christos 
   1450      1.1  christos   if (hp->cth_lbloff > hp->cth_objtoff
   1451      1.1  christos       || hp->cth_objtoff > hp->cth_funcoff
   1452      1.1  christos       || hp->cth_funcoff > hp->cth_typeoff
   1453      1.1  christos       || hp->cth_funcoff > hp->cth_objtidxoff
   1454      1.1  christos       || hp->cth_objtidxoff > hp->cth_funcidxoff
   1455      1.1  christos       || hp->cth_funcidxoff > hp->cth_varoff
   1456      1.1  christos       || hp->cth_varoff > hp->cth_typeoff || hp->cth_typeoff > hp->cth_stroff)
   1457  1.1.1.2  christos     {
   1458  1.1.1.2  christos       ctf_err_warn (NULL, 0, ECTF_CORRUPT, _("overlapping CTF sections"));
   1459  1.1.1.2  christos       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
   1460  1.1.1.2  christos     }
   1461      1.1  christos 
   1462      1.1  christos   if ((hp->cth_lbloff & 3) || (hp->cth_objtoff & 2)
   1463      1.1  christos       || (hp->cth_funcoff & 2) || (hp->cth_objtidxoff & 2)
   1464      1.1  christos       || (hp->cth_funcidxoff & 2) || (hp->cth_varoff & 3)
   1465      1.1  christos       || (hp->cth_typeoff & 3))
   1466  1.1.1.2  christos     {
   1467  1.1.1.2  christos       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
   1468  1.1.1.2  christos 		    _("CTF sections not properly aligned"));
   1469  1.1.1.2  christos       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
   1470  1.1.1.2  christos     }
   1471  1.1.1.2  christos 
   1472  1.1.1.2  christos   /* This invariant will be lifted in v4, but for now it is true.  */
   1473  1.1.1.2  christos 
   1474  1.1.1.2  christos   if ((hp->cth_funcidxoff - hp->cth_objtidxoff != 0) &&
   1475  1.1.1.2  christos       (hp->cth_funcidxoff - hp->cth_objtidxoff
   1476  1.1.1.2  christos        != hp->cth_funcoff - hp->cth_objtoff))
   1477  1.1.1.2  christos     {
   1478  1.1.1.2  christos       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
   1479  1.1.1.2  christos 		    _("Object index section is neither empty nor the "
   1480  1.1.1.2  christos 		      "same length as the object section: %u versus %u "
   1481  1.1.1.2  christos 		      "bytes"), hp->cth_funcoff - hp->cth_objtoff,
   1482  1.1.1.2  christos 		    hp->cth_funcidxoff - hp->cth_objtidxoff);
   1483  1.1.1.2  christos       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
   1484  1.1.1.2  christos     }
   1485  1.1.1.2  christos 
   1486  1.1.1.2  christos   if ((hp->cth_varoff - hp->cth_funcidxoff != 0) &&
   1487  1.1.1.2  christos       (hp->cth_varoff - hp->cth_funcidxoff
   1488  1.1.1.2  christos        != hp->cth_objtidxoff - hp->cth_funcoff) &&
   1489  1.1.1.2  christos       (hp->cth_flags & CTF_F_NEWFUNCINFO))
   1490  1.1.1.2  christos     {
   1491  1.1.1.2  christos       ctf_err_warn (NULL, 0, ECTF_CORRUPT,
   1492  1.1.1.2  christos 		    _("Function index section is neither empty nor the "
   1493  1.1.1.2  christos 		      "same length as the function section: %u versus %u "
   1494  1.1.1.2  christos 		      "bytes"), hp->cth_objtidxoff - hp->cth_funcoff,
   1495  1.1.1.2  christos 		    hp->cth_varoff - hp->cth_funcidxoff);
   1496  1.1.1.2  christos       return (ctf_set_open_errno (errp, ECTF_CORRUPT));
   1497  1.1.1.2  christos     }
   1498      1.1  christos 
   1499      1.1  christos   /* Once everything is determined to be valid, attempt to decompress the CTF
   1500      1.1  christos      data buffer if it is compressed, or copy it into new storage if it is not
   1501      1.1  christos      compressed but needs endian-flipping.  Otherwise we just put the data
   1502      1.1  christos      section's buffer pointer into ctf_buf, below.  */
   1503      1.1  christos 
   1504      1.1  christos   /* Note: if this is a v1 buffer, it will be reallocated and expanded by
   1505      1.1  christos      init_types().  */
   1506      1.1  christos 
   1507      1.1  christos   if (hp->cth_flags & CTF_F_COMPRESS)
   1508      1.1  christos     {
   1509      1.1  christos       size_t srclen;
   1510      1.1  christos       uLongf dstlen;
   1511      1.1  christos       const void *src;
   1512      1.1  christos       int rc = Z_OK;
   1513      1.1  christos 
   1514      1.1  christos       /* We are allocating this ourselves, so we can drop the ctf header
   1515      1.1  christos 	 copy in favour of ctf->ctf_header.  */
   1516      1.1  christos 
   1517      1.1  christos       if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
   1518      1.1  christos 	{
   1519      1.1  christos 	  err = ECTF_ZALLOC;
   1520      1.1  christos 	  goto bad;
   1521      1.1  christos 	}
   1522      1.1  christos       fp->ctf_dynbase = fp->ctf_base;
   1523      1.1  christos       hp->cth_flags &= ~CTF_F_COMPRESS;
   1524      1.1  christos 
   1525      1.1  christos       src = (unsigned char *) ctfsect->cts_data + hdrsz;
   1526      1.1  christos       srclen = ctfsect->cts_size - hdrsz;
   1527      1.1  christos       dstlen = fp->ctf_size;
   1528      1.1  christos       fp->ctf_buf = fp->ctf_base;
   1529      1.1  christos 
   1530      1.1  christos       if ((rc = uncompress (fp->ctf_base, &dstlen, src, srclen)) != Z_OK)
   1531      1.1  christos 	{
   1532      1.1  christos 	  ctf_err_warn (NULL, 0, ECTF_DECOMPRESS, _("zlib inflate err: %s"),
   1533      1.1  christos 			zError (rc));
   1534      1.1  christos 	  err = ECTF_DECOMPRESS;
   1535      1.1  christos 	  goto bad;
   1536      1.1  christos 	}
   1537      1.1  christos 
   1538      1.1  christos       if ((size_t) dstlen != fp->ctf_size)
   1539      1.1  christos 	{
   1540      1.1  christos 	  ctf_err_warn (NULL, 0, ECTF_CORRUPT,
   1541      1.1  christos 			_("zlib inflate short: got %lu of %lu bytes"),
   1542      1.1  christos 			(unsigned long) dstlen, (unsigned long) fp->ctf_size);
   1543      1.1  christos 	  err = ECTF_CORRUPT;
   1544      1.1  christos 	  goto bad;
   1545      1.1  christos 	}
   1546      1.1  christos     }
   1547  1.1.1.2  christos   else
   1548      1.1  christos     {
   1549  1.1.1.2  christos       if (_libctf_unlikely_ (ctfsect->cts_size < hdrsz + fp->ctf_size))
   1550      1.1  christos 	{
   1551  1.1.1.2  christos 	  ctf_err_warn (NULL, 0, ECTF_CORRUPT,
   1552  1.1.1.2  christos 			_("%lu byte long CTF dictionary overruns %lu byte long CTF section"),
   1553  1.1.1.2  christos 			(unsigned long) ctfsect->cts_size,
   1554  1.1.1.2  christos 			(unsigned long) (hdrsz + fp->ctf_size));
   1555  1.1.1.2  christos 	  err = ECTF_CORRUPT;
   1556      1.1  christos 	  goto bad;
   1557      1.1  christos 	}
   1558  1.1.1.2  christos 
   1559  1.1.1.2  christos       if (foreign_endian)
   1560  1.1.1.2  christos 	{
   1561  1.1.1.2  christos 	  if ((fp->ctf_base = malloc (fp->ctf_size)) == NULL)
   1562  1.1.1.2  christos 	    {
   1563  1.1.1.2  christos 	      err = ECTF_ZALLOC;
   1564  1.1.1.2  christos 	      goto bad;
   1565  1.1.1.2  christos 	    }
   1566  1.1.1.2  christos 	  fp->ctf_dynbase = fp->ctf_base;
   1567  1.1.1.2  christos 	  memcpy (fp->ctf_base, ((unsigned char *) ctfsect->cts_data) + hdrsz,
   1568  1.1.1.2  christos 		  fp->ctf_size);
   1569  1.1.1.2  christos 	  fp->ctf_buf = fp->ctf_base;
   1570  1.1.1.2  christos 	}
   1571  1.1.1.2  christos       else
   1572  1.1.1.2  christos 	{
   1573  1.1.1.2  christos 	  /* We are just using the section passed in -- but its header may
   1574  1.1.1.2  christos 	     be an old version.  Point ctf_buf past the old header, and
   1575  1.1.1.2  christos 	     never touch it again.  */
   1576  1.1.1.2  christos 	  fp->ctf_base = (unsigned char *) ctfsect->cts_data;
   1577  1.1.1.2  christos 	  fp->ctf_dynbase = NULL;
   1578  1.1.1.2  christos 	  fp->ctf_buf = fp->ctf_base + hdrsz;
   1579  1.1.1.2  christos 	}
   1580      1.1  christos     }
   1581      1.1  christos 
   1582      1.1  christos   /* Once we have uncompressed and validated the CTF data buffer, we can
   1583  1.1.1.2  christos      proceed with initializing the ctf_dict_t we allocated above.
   1584      1.1  christos 
   1585      1.1  christos      Nothing that depends on buf or base should be set directly in this function
   1586      1.1  christos      before the init_types() call, because it may be reallocated during
   1587      1.1  christos      transparent upgrade if this recension of libctf is so configured: see
   1588      1.1  christos      ctf_set_base().  */
   1589      1.1  christos 
   1590      1.1  christos   ctf_set_version (fp, hp, hp->cth_version);
   1591  1.1.1.2  christos   if (ctf_str_create_atoms (fp) < 0)
   1592  1.1.1.2  christos     {
   1593  1.1.1.2  christos       err = ENOMEM;
   1594  1.1.1.2  christos       goto bad;
   1595  1.1.1.2  christos     }
   1596  1.1.1.2  christos 
   1597      1.1  christos   fp->ctf_parmax = CTF_MAX_PTYPE;
   1598      1.1  christos   memcpy (&fp->ctf_data, ctfsect, sizeof (ctf_sect_t));
   1599      1.1  christos 
   1600      1.1  christos   if (symsect != NULL)
   1601      1.1  christos     {
   1602      1.1  christos       memcpy (&fp->ctf_symtab, symsect, sizeof (ctf_sect_t));
   1603      1.1  christos       memcpy (&fp->ctf_strtab, strsect, sizeof (ctf_sect_t));
   1604      1.1  christos     }
   1605      1.1  christos 
   1606      1.1  christos   if (fp->ctf_data.cts_name != NULL)
   1607      1.1  christos     if ((fp->ctf_data.cts_name = strdup (fp->ctf_data.cts_name)) == NULL)
   1608      1.1  christos       {
   1609      1.1  christos 	err = ENOMEM;
   1610      1.1  christos 	goto bad;
   1611      1.1  christos       }
   1612      1.1  christos   if (fp->ctf_symtab.cts_name != NULL)
   1613      1.1  christos     if ((fp->ctf_symtab.cts_name = strdup (fp->ctf_symtab.cts_name)) == NULL)
   1614      1.1  christos       {
   1615      1.1  christos 	err = ENOMEM;
   1616      1.1  christos 	goto bad;
   1617      1.1  christos       }
   1618      1.1  christos   if (fp->ctf_strtab.cts_name != NULL)
   1619      1.1  christos     if ((fp->ctf_strtab.cts_name = strdup (fp->ctf_strtab.cts_name)) == NULL)
   1620      1.1  christos       {
   1621      1.1  christos 	err = ENOMEM;
   1622      1.1  christos 	goto bad;
   1623      1.1  christos       }
   1624      1.1  christos 
   1625      1.1  christos   if (fp->ctf_data.cts_name == NULL)
   1626      1.1  christos     fp->ctf_data.cts_name = _CTF_NULLSTR;
   1627      1.1  christos   if (fp->ctf_symtab.cts_name == NULL)
   1628      1.1  christos     fp->ctf_symtab.cts_name = _CTF_NULLSTR;
   1629      1.1  christos   if (fp->ctf_strtab.cts_name == NULL)
   1630      1.1  christos     fp->ctf_strtab.cts_name = _CTF_NULLSTR;
   1631      1.1  christos 
   1632      1.1  christos   if (strsect != NULL)
   1633      1.1  christos     {
   1634      1.1  christos       fp->ctf_str[CTF_STRTAB_1].cts_strs = strsect->cts_data;
   1635      1.1  christos       fp->ctf_str[CTF_STRTAB_1].cts_len = strsect->cts_size;
   1636      1.1  christos     }
   1637      1.1  christos   fp->ctf_syn_ext_strtab = syn_strtab;
   1638      1.1  christos 
   1639      1.1  christos   if (foreign_endian &&
   1640  1.1.1.2  christos       (err = ctf_flip (fp, hp, fp->ctf_buf, 0)) != 0)
   1641      1.1  christos     {
   1642  1.1.1.2  christos       /* We can be certain that ctf_flip() will have endian-flipped everything
   1643      1.1  christos 	 other than the types table when we return.  In particular the header
   1644      1.1  christos 	 is fine, so set it, to allow freeing to use the usual code path.  */
   1645      1.1  christos 
   1646      1.1  christos       ctf_set_base (fp, hp, fp->ctf_base);
   1647      1.1  christos       goto bad;
   1648      1.1  christos     }
   1649      1.1  christos 
   1650      1.1  christos   ctf_set_base (fp, hp, fp->ctf_base);
   1651      1.1  christos 
   1652  1.1.1.2  christos   /* No need to do anything else for dynamic dicts: they do not support symbol
   1653  1.1.1.2  christos      lookups, and the type table is maintained in the dthashes.  */
   1654      1.1  christos   if (fp->ctf_flags & LCTF_RDWR)
   1655      1.1  christos     {
   1656      1.1  christos       fp->ctf_refcnt = 1;
   1657      1.1  christos       return fp;
   1658      1.1  christos     }
   1659      1.1  christos 
   1660      1.1  christos   if ((err = init_types (fp, hp)) != 0)
   1661      1.1  christos     goto bad;
   1662      1.1  christos 
   1663  1.1.1.2  christos   /* Allocate and initialize the symtab translation table, pointed to by
   1664  1.1.1.2  christos      ctf_sxlate, and the corresponding index sections.  This table may be too
   1665  1.1.1.2  christos      large for the actual size of the object and function info sections: if so,
   1666  1.1.1.2  christos      ctf_nsyms will be adjusted and the excess will never be used.  It's
   1667  1.1.1.2  christos      possible to do indexed symbol lookups even without a symbol table, so check
   1668  1.1.1.2  christos      even in that case.  Initially, we assume the symtab is native-endian: if it
   1669  1.1.1.2  christos      isn't, the caller will inform us later by calling ctf_symsect_endianness.  */
   1670  1.1.1.2  christos #ifdef WORDS_BIGENDIAN
   1671  1.1.1.2  christos   fp->ctf_symsect_little_endian = 0;
   1672  1.1.1.2  christos #else
   1673  1.1.1.2  christos   fp->ctf_symsect_little_endian = 1;
   1674  1.1.1.2  christos #endif
   1675      1.1  christos 
   1676      1.1  christos   if (symsect != NULL)
   1677      1.1  christos     {
   1678      1.1  christos       fp->ctf_nsyms = symsect->cts_size / symsect->cts_entsize;
   1679      1.1  christos       fp->ctf_sxlate = malloc (fp->ctf_nsyms * sizeof (uint32_t));
   1680      1.1  christos 
   1681      1.1  christos       if (fp->ctf_sxlate == NULL)
   1682      1.1  christos 	{
   1683      1.1  christos 	  err = ENOMEM;
   1684      1.1  christos 	  goto bad;
   1685      1.1  christos 	}
   1686      1.1  christos     }
   1687      1.1  christos 
   1688  1.1.1.2  christos   if ((err = init_symtab (fp, hp, symsect)) != 0)
   1689  1.1.1.2  christos     goto bad;
   1690  1.1.1.2  christos 
   1691      1.1  christos   ctf_set_ctl_hashes (fp);
   1692      1.1  christos 
   1693      1.1  christos   if (symsect != NULL)
   1694      1.1  christos     {
   1695      1.1  christos       if (symsect->cts_entsize == sizeof (Elf64_Sym))
   1696      1.1  christos 	(void) ctf_setmodel (fp, CTF_MODEL_LP64);
   1697      1.1  christos       else
   1698      1.1  christos 	(void) ctf_setmodel (fp, CTF_MODEL_ILP32);
   1699      1.1  christos     }
   1700      1.1  christos   else
   1701      1.1  christos     (void) ctf_setmodel (fp, CTF_MODEL_NATIVE);
   1702      1.1  christos 
   1703      1.1  christos   fp->ctf_refcnt = 1;
   1704      1.1  christos   return fp;
   1705      1.1  christos 
   1706      1.1  christos bad:
   1707      1.1  christos   ctf_set_open_errno (errp, err);
   1708      1.1  christos   ctf_err_warn_to_open (fp);
   1709  1.1.1.2  christos   ctf_dict_close (fp);
   1710      1.1  christos   return NULL;
   1711      1.1  christos }
   1712      1.1  christos 
   1713  1.1.1.2  christos /* Bump the refcount on the specified CTF dict, to allow export of ctf_dict_t's
   1714  1.1.1.2  christos    from iterators that open and close the ctf_dict_t around the loop.  (This
   1715  1.1.1.2  christos    does not extend their lifetime beyond that of the ctf_archive_t in which they
   1716  1.1.1.2  christos    are contained.)  */
   1717      1.1  christos 
   1718      1.1  christos void
   1719  1.1.1.2  christos ctf_ref (ctf_dict_t *fp)
   1720      1.1  christos {
   1721      1.1  christos   fp->ctf_refcnt++;
   1722      1.1  christos }
   1723      1.1  christos 
   1724  1.1.1.2  christos /* Close the specified CTF dict and free associated data structures.  Note that
   1725  1.1.1.2  christos    ctf_dict_close() is a reference counted operation: if the specified file is
   1726  1.1.1.2  christos    the parent of other active dict, its reference count will be greater than one
   1727  1.1.1.2  christos    and it will be freed later when no active children exist.  */
   1728      1.1  christos 
   1729      1.1  christos void
   1730  1.1.1.2  christos ctf_dict_close (ctf_dict_t *fp)
   1731      1.1  christos {
   1732      1.1  christos   ctf_dtdef_t *dtd, *ntd;
   1733      1.1  christos   ctf_dvdef_t *dvd, *nvd;
   1734  1.1.1.2  christos   ctf_in_flight_dynsym_t *did, *nid;
   1735      1.1  christos   ctf_err_warning_t *err, *nerr;
   1736      1.1  christos 
   1737      1.1  christos   if (fp == NULL)
   1738  1.1.1.2  christos     return;		   /* Allow ctf_dict_close(NULL) to simplify caller code.  */
   1739      1.1  christos 
   1740  1.1.1.2  christos   ctf_dprintf ("ctf_dict_close(%p) refcnt=%u\n", (void *) fp, fp->ctf_refcnt);
   1741      1.1  christos 
   1742      1.1  christos   if (fp->ctf_refcnt > 1)
   1743      1.1  christos     {
   1744      1.1  christos       fp->ctf_refcnt--;
   1745      1.1  christos       return;
   1746      1.1  christos     }
   1747      1.1  christos 
   1748      1.1  christos   /* It is possible to recurse back in here, notably if dicts in the
   1749      1.1  christos      ctf_link_inputs or ctf_link_outputs cite this dict as a parent without
   1750      1.1  christos      using ctf_import_unref.  Do nothing in that case.  */
   1751      1.1  christos   if (fp->ctf_refcnt == 0)
   1752      1.1  christos     return;
   1753      1.1  christos 
   1754      1.1  christos   fp->ctf_refcnt--;
   1755      1.1  christos   free (fp->ctf_dyncuname);
   1756      1.1  christos   free (fp->ctf_dynparname);
   1757      1.1  christos   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
   1758  1.1.1.2  christos     ctf_dict_close (fp->ctf_parent);
   1759      1.1  christos 
   1760      1.1  christos   for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
   1761      1.1  christos     {
   1762      1.1  christos       ntd = ctf_list_next (dtd);
   1763      1.1  christos       ctf_dtd_delete (fp, dtd);
   1764      1.1  christos     }
   1765      1.1  christos   ctf_dynhash_destroy (fp->ctf_dthash);
   1766      1.1  christos   if (fp->ctf_flags & LCTF_RDWR)
   1767      1.1  christos     {
   1768      1.1  christos       ctf_dynhash_destroy (fp->ctf_structs.ctn_writable);
   1769      1.1  christos       ctf_dynhash_destroy (fp->ctf_unions.ctn_writable);
   1770      1.1  christos       ctf_dynhash_destroy (fp->ctf_enums.ctn_writable);
   1771      1.1  christos       ctf_dynhash_destroy (fp->ctf_names.ctn_writable);
   1772      1.1  christos     }
   1773      1.1  christos   else
   1774      1.1  christos     {
   1775      1.1  christos       ctf_hash_destroy (fp->ctf_structs.ctn_readonly);
   1776      1.1  christos       ctf_hash_destroy (fp->ctf_unions.ctn_readonly);
   1777      1.1  christos       ctf_hash_destroy (fp->ctf_enums.ctn_readonly);
   1778      1.1  christos       ctf_hash_destroy (fp->ctf_names.ctn_readonly);
   1779      1.1  christos     }
   1780      1.1  christos 
   1781      1.1  christos   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
   1782      1.1  christos     {
   1783      1.1  christos       nvd = ctf_list_next (dvd);
   1784      1.1  christos       ctf_dvd_delete (fp, dvd);
   1785      1.1  christos     }
   1786      1.1  christos   ctf_dynhash_destroy (fp->ctf_dvhash);
   1787  1.1.1.2  christos 
   1788  1.1.1.2  christos   ctf_dynhash_destroy (fp->ctf_symhash);
   1789  1.1.1.2  christos   free (fp->ctf_funcidx_sxlate);
   1790  1.1.1.2  christos   free (fp->ctf_objtidx_sxlate);
   1791  1.1.1.2  christos   ctf_dynhash_destroy (fp->ctf_objthash);
   1792  1.1.1.2  christos   ctf_dynhash_destroy (fp->ctf_funchash);
   1793  1.1.1.2  christos   free (fp->ctf_dynsymidx);
   1794  1.1.1.2  christos   ctf_dynhash_destroy (fp->ctf_dynsyms);
   1795  1.1.1.2  christos   for (did = ctf_list_next (&fp->ctf_in_flight_dynsyms); did != NULL; did = nid)
   1796  1.1.1.2  christos     {
   1797  1.1.1.2  christos       nid = ctf_list_next (did);
   1798  1.1.1.2  christos       ctf_list_delete (&fp->ctf_in_flight_dynsyms, did);
   1799  1.1.1.2  christos       free (did);
   1800  1.1.1.2  christos     }
   1801  1.1.1.2  christos 
   1802      1.1  christos   ctf_str_free_atoms (fp);
   1803      1.1  christos   free (fp->ctf_tmp_typeslice);
   1804      1.1  christos 
   1805      1.1  christos   if (fp->ctf_data.cts_name != _CTF_NULLSTR)
   1806      1.1  christos     free ((char *) fp->ctf_data.cts_name);
   1807      1.1  christos 
   1808      1.1  christos   if (fp->ctf_symtab.cts_name != _CTF_NULLSTR)
   1809      1.1  christos     free ((char *) fp->ctf_symtab.cts_name);
   1810      1.1  christos 
   1811      1.1  christos   if (fp->ctf_strtab.cts_name != _CTF_NULLSTR)
   1812      1.1  christos     free ((char *) fp->ctf_strtab.cts_name);
   1813      1.1  christos   else if (fp->ctf_data_mmapped)
   1814      1.1  christos     ctf_munmap (fp->ctf_data_mmapped, fp->ctf_data_mmapped_len);
   1815      1.1  christos 
   1816      1.1  christos   free (fp->ctf_dynbase);
   1817      1.1  christos 
   1818      1.1  christos   ctf_dynhash_destroy (fp->ctf_syn_ext_strtab);
   1819      1.1  christos   ctf_dynhash_destroy (fp->ctf_link_inputs);
   1820      1.1  christos   ctf_dynhash_destroy (fp->ctf_link_outputs);
   1821      1.1  christos   ctf_dynhash_destroy (fp->ctf_link_type_mapping);
   1822      1.1  christos   ctf_dynhash_destroy (fp->ctf_link_in_cu_mapping);
   1823      1.1  christos   ctf_dynhash_destroy (fp->ctf_link_out_cu_mapping);
   1824      1.1  christos   ctf_dynhash_destroy (fp->ctf_add_processing);
   1825      1.1  christos   ctf_dedup_fini (fp, NULL, 0);
   1826      1.1  christos   ctf_dynset_destroy (fp->ctf_dedup_atoms_alloc);
   1827      1.1  christos 
   1828      1.1  christos   for (err = ctf_list_next (&fp->ctf_errs_warnings); err != NULL; err = nerr)
   1829      1.1  christos     {
   1830      1.1  christos       nerr = ctf_list_next (err);
   1831      1.1  christos       ctf_list_delete (&fp->ctf_errs_warnings, err);
   1832      1.1  christos       free (err->cew_text);
   1833      1.1  christos       free (err);
   1834      1.1  christos     }
   1835      1.1  christos 
   1836      1.1  christos   free (fp->ctf_sxlate);
   1837      1.1  christos   free (fp->ctf_txlate);
   1838      1.1  christos   free (fp->ctf_ptrtab);
   1839  1.1.1.2  christos   free (fp->ctf_pptrtab);
   1840      1.1  christos 
   1841      1.1  christos   free (fp->ctf_header);
   1842      1.1  christos   free (fp);
   1843      1.1  christos }
   1844      1.1  christos 
   1845  1.1.1.2  christos /* Backward compatibility.  */
   1846  1.1.1.2  christos void
   1847  1.1.1.2  christos ctf_file_close (ctf_file_t *fp)
   1848  1.1.1.2  christos {
   1849  1.1.1.2  christos   ctf_dict_close (fp);
   1850  1.1.1.2  christos }
   1851  1.1.1.2  christos 
   1852      1.1  christos /* The converse of ctf_open().  ctf_open() disguises whatever it opens as an
   1853      1.1  christos    archive, so closing one is just like closing an archive.  */
   1854      1.1  christos void
   1855      1.1  christos ctf_close (ctf_archive_t *arc)
   1856      1.1  christos {
   1857      1.1  christos   ctf_arc_close (arc);
   1858      1.1  christos }
   1859      1.1  christos 
   1860  1.1.1.2  christos /* Get the CTF archive from which this ctf_dict_t is derived.  */
   1861      1.1  christos ctf_archive_t *
   1862  1.1.1.2  christos ctf_get_arc (const ctf_dict_t *fp)
   1863      1.1  christos {
   1864      1.1  christos   return fp->ctf_archive;
   1865      1.1  christos }
   1866      1.1  christos 
   1867      1.1  christos /* Return the ctfsect out of the core ctf_impl.  Useful for freeing the
   1868  1.1.1.2  christos    ctfsect's data * after ctf_dict_close(), which is why we return the actual
   1869      1.1  christos    structure, not a pointer to it, since that is likely to become a pointer to
   1870      1.1  christos    freed data before the return value is used under the expected use case of
   1871  1.1.1.2  christos    ctf_getsect()/ ctf_dict_close()/free().  */
   1872      1.1  christos ctf_sect_t
   1873  1.1.1.2  christos ctf_getdatasect (const ctf_dict_t *fp)
   1874      1.1  christos {
   1875      1.1  christos   return fp->ctf_data;
   1876      1.1  christos }
   1877      1.1  christos 
   1878  1.1.1.2  christos ctf_sect_t
   1879  1.1.1.2  christos ctf_getsymsect (const ctf_dict_t *fp)
   1880  1.1.1.2  christos {
   1881  1.1.1.2  christos   return fp->ctf_symtab;
   1882  1.1.1.2  christos }
   1883  1.1.1.2  christos 
   1884  1.1.1.2  christos ctf_sect_t
   1885  1.1.1.2  christos ctf_getstrsect (const ctf_dict_t *fp)
   1886  1.1.1.2  christos {
   1887  1.1.1.2  christos   return fp->ctf_strtab;
   1888  1.1.1.2  christos }
   1889  1.1.1.2  christos 
   1890  1.1.1.2  christos /* Set the endianness of the symbol table attached to FP.  */
   1891  1.1.1.2  christos void
   1892  1.1.1.2  christos ctf_symsect_endianness (ctf_dict_t *fp, int little_endian)
   1893  1.1.1.2  christos {
   1894  1.1.1.2  christos   int old_endianness = fp->ctf_symsect_little_endian;
   1895  1.1.1.2  christos 
   1896  1.1.1.2  christos   fp->ctf_symsect_little_endian = !!little_endian;
   1897  1.1.1.2  christos 
   1898  1.1.1.2  christos   /* If we already have a symtab translation table, we need to repopulate it if
   1899  1.1.1.2  christos      our idea of the endianness has changed.  */
   1900  1.1.1.2  christos 
   1901  1.1.1.2  christos   if (old_endianness != fp->ctf_symsect_little_endian
   1902  1.1.1.2  christos       && fp->ctf_sxlate != NULL && fp->ctf_symtab.cts_data != NULL)
   1903  1.1.1.2  christos     assert (init_symtab (fp, fp->ctf_header, &fp->ctf_symtab) == 0);
   1904  1.1.1.2  christos }
   1905  1.1.1.2  christos 
   1906  1.1.1.2  christos /* Return the CTF handle for the parent CTF dict, if one exists.  Otherwise
   1907  1.1.1.2  christos    return NULL to indicate this dict has no imported parent.  */
   1908  1.1.1.2  christos ctf_dict_t *
   1909  1.1.1.2  christos ctf_parent_dict (ctf_dict_t *fp)
   1910      1.1  christos {
   1911      1.1  christos   return fp->ctf_parent;
   1912      1.1  christos }
   1913      1.1  christos 
   1914  1.1.1.2  christos /* Backward compatibility.  */
   1915  1.1.1.2  christos ctf_dict_t *
   1916  1.1.1.2  christos ctf_parent_file (ctf_dict_t *fp)
   1917  1.1.1.2  christos {
   1918  1.1.1.2  christos   return ctf_parent_dict (fp);
   1919  1.1.1.2  christos }
   1920  1.1.1.2  christos 
   1921  1.1.1.2  christos /* Return the name of the parent CTF dict, if one exists, or NULL otherwise.  */
   1922      1.1  christos const char *
   1923  1.1.1.2  christos ctf_parent_name (ctf_dict_t *fp)
   1924      1.1  christos {
   1925      1.1  christos   return fp->ctf_parname;
   1926      1.1  christos }
   1927      1.1  christos 
   1928      1.1  christos /* Set the parent name.  It is an error to call this routine without calling
   1929      1.1  christos    ctf_import() at some point.  */
   1930      1.1  christos int
   1931  1.1.1.2  christos ctf_parent_name_set (ctf_dict_t *fp, const char *name)
   1932      1.1  christos {
   1933      1.1  christos   if (fp->ctf_dynparname != NULL)
   1934      1.1  christos     free (fp->ctf_dynparname);
   1935      1.1  christos 
   1936      1.1  christos   if ((fp->ctf_dynparname = strdup (name)) == NULL)
   1937      1.1  christos     return (ctf_set_errno (fp, ENOMEM));
   1938      1.1  christos   fp->ctf_parname = fp->ctf_dynparname;
   1939      1.1  christos   return 0;
   1940      1.1  christos }
   1941      1.1  christos 
   1942      1.1  christos /* Return the name of the compilation unit this CTF file applies to.  Usually
   1943  1.1.1.2  christos    non-NULL only for non-parent dicts.  */
   1944      1.1  christos const char *
   1945  1.1.1.2  christos ctf_cuname (ctf_dict_t *fp)
   1946      1.1  christos {
   1947      1.1  christos   return fp->ctf_cuname;
   1948      1.1  christos }
   1949      1.1  christos 
   1950      1.1  christos /* Set the compilation unit name.  */
   1951      1.1  christos int
   1952  1.1.1.2  christos ctf_cuname_set (ctf_dict_t *fp, const char *name)
   1953      1.1  christos {
   1954      1.1  christos   if (fp->ctf_dyncuname != NULL)
   1955      1.1  christos     free (fp->ctf_dyncuname);
   1956      1.1  christos 
   1957      1.1  christos   if ((fp->ctf_dyncuname = strdup (name)) == NULL)
   1958      1.1  christos     return (ctf_set_errno (fp, ENOMEM));
   1959      1.1  christos   fp->ctf_cuname = fp->ctf_dyncuname;
   1960      1.1  christos   return 0;
   1961      1.1  christos }
   1962      1.1  christos 
   1963  1.1.1.2  christos /* Import the types from the specified parent dict by storing a pointer to it in
   1964  1.1.1.2  christos    ctf_parent and incrementing its reference count.  Only one parent is allowed:
   1965  1.1.1.2  christos    if a parent already exists, it is replaced by the new parent.  The pptrtab
   1966  1.1.1.2  christos    is wiped, and will be refreshed by the next ctf_lookup_by_name call.  */
   1967      1.1  christos int
   1968  1.1.1.2  christos ctf_import (ctf_dict_t *fp, ctf_dict_t *pfp)
   1969      1.1  christos {
   1970      1.1  christos   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
   1971      1.1  christos     return (ctf_set_errno (fp, EINVAL));
   1972      1.1  christos 
   1973      1.1  christos   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
   1974      1.1  christos     return (ctf_set_errno (fp, ECTF_DMODEL));
   1975      1.1  christos 
   1976      1.1  christos   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
   1977  1.1.1.2  christos     ctf_dict_close (fp->ctf_parent);
   1978      1.1  christos   fp->ctf_parent = NULL;
   1979      1.1  christos 
   1980  1.1.1.2  christos   free (fp->ctf_pptrtab);
   1981  1.1.1.2  christos   fp->ctf_pptrtab = NULL;
   1982  1.1.1.2  christos   fp->ctf_pptrtab_len = 0;
   1983  1.1.1.2  christos   fp->ctf_pptrtab_typemax = 0;
   1984  1.1.1.2  christos 
   1985      1.1  christos   if (pfp != NULL)
   1986      1.1  christos     {
   1987      1.1  christos       int err;
   1988      1.1  christos 
   1989      1.1  christos       if (fp->ctf_parname == NULL)
   1990      1.1  christos 	if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
   1991      1.1  christos 	  return err;
   1992      1.1  christos 
   1993      1.1  christos       fp->ctf_flags |= LCTF_CHILD;
   1994      1.1  christos       pfp->ctf_refcnt++;
   1995      1.1  christos       fp->ctf_parent_unreffed = 0;
   1996      1.1  christos     }
   1997      1.1  christos 
   1998      1.1  christos   fp->ctf_parent = pfp;
   1999      1.1  christos   return 0;
   2000      1.1  christos }
   2001      1.1  christos 
   2002      1.1  christos /* Like ctf_import, but does not increment the refcount on the imported parent
   2003      1.1  christos    or close it at any point: as a result it can go away at any time and the
   2004      1.1  christos    caller must do all freeing itself.  Used internally to avoid refcount
   2005      1.1  christos    loops.  */
   2006      1.1  christos int
   2007  1.1.1.2  christos ctf_import_unref (ctf_dict_t *fp, ctf_dict_t *pfp)
   2008      1.1  christos {
   2009      1.1  christos   if (fp == NULL || fp == pfp || (pfp != NULL && pfp->ctf_refcnt == 0))
   2010      1.1  christos     return (ctf_set_errno (fp, EINVAL));
   2011      1.1  christos 
   2012      1.1  christos   if (pfp != NULL && pfp->ctf_dmodel != fp->ctf_dmodel)
   2013      1.1  christos     return (ctf_set_errno (fp, ECTF_DMODEL));
   2014      1.1  christos 
   2015      1.1  christos   if (fp->ctf_parent && !fp->ctf_parent_unreffed)
   2016  1.1.1.2  christos     ctf_dict_close (fp->ctf_parent);
   2017      1.1  christos   fp->ctf_parent = NULL;
   2018      1.1  christos 
   2019  1.1.1.2  christos   free (fp->ctf_pptrtab);
   2020  1.1.1.2  christos   fp->ctf_pptrtab = NULL;
   2021  1.1.1.2  christos   fp->ctf_pptrtab_len = 0;
   2022  1.1.1.2  christos   fp->ctf_pptrtab_typemax = 0;
   2023      1.1  christos   if (pfp != NULL)
   2024      1.1  christos     {
   2025      1.1  christos       int err;
   2026      1.1  christos 
   2027      1.1  christos       if (fp->ctf_parname == NULL)
   2028      1.1  christos 	if ((err = ctf_parent_name_set (fp, "PARENT")) < 0)
   2029      1.1  christos 	  return err;
   2030      1.1  christos 
   2031      1.1  christos       fp->ctf_flags |= LCTF_CHILD;
   2032      1.1  christos       fp->ctf_parent_unreffed = 1;
   2033      1.1  christos     }
   2034      1.1  christos 
   2035      1.1  christos   fp->ctf_parent = pfp;
   2036      1.1  christos   return 0;
   2037      1.1  christos }
   2038      1.1  christos 
   2039  1.1.1.2  christos /* Set the data model constant for the CTF dict.  */
   2040      1.1  christos int
   2041  1.1.1.2  christos ctf_setmodel (ctf_dict_t *fp, int model)
   2042      1.1  christos {
   2043      1.1  christos   const ctf_dmodel_t *dp;
   2044      1.1  christos 
   2045      1.1  christos   for (dp = _libctf_models; dp->ctd_name != NULL; dp++)
   2046      1.1  christos     {
   2047      1.1  christos       if (dp->ctd_code == model)
   2048      1.1  christos 	{
   2049      1.1  christos 	  fp->ctf_dmodel = dp;
   2050      1.1  christos 	  return 0;
   2051      1.1  christos 	}
   2052      1.1  christos     }
   2053      1.1  christos 
   2054      1.1  christos   return (ctf_set_errno (fp, EINVAL));
   2055      1.1  christos }
   2056      1.1  christos 
   2057  1.1.1.2  christos /* Return the data model constant for the CTF dict.  */
   2058      1.1  christos int
   2059  1.1.1.2  christos ctf_getmodel (ctf_dict_t *fp)
   2060      1.1  christos {
   2061      1.1  christos   return fp->ctf_dmodel->ctd_code;
   2062      1.1  christos }
   2063      1.1  christos 
   2064  1.1.1.2  christos /* The caller can hang an arbitrary pointer off each ctf_dict_t using this
   2065      1.1  christos    function.  */
   2066      1.1  christos void
   2067  1.1.1.2  christos ctf_setspecific (ctf_dict_t *fp, void *data)
   2068      1.1  christos {
   2069      1.1  christos   fp->ctf_specific = data;
   2070      1.1  christos }
   2071      1.1  christos 
   2072      1.1  christos /* Retrieve the arbitrary pointer again.  */
   2073      1.1  christos void *
   2074  1.1.1.2  christos ctf_getspecific (ctf_dict_t *fp)
   2075      1.1  christos {
   2076      1.1  christos   return fp->ctf_specific;
   2077      1.1  christos }
   2078