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