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