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