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