Home | History | Annotate | Line # | Download | only in libctf
ctf-create.c revision 1.1.1.2
      1 /* CTF dict creation.
      2    Copyright (C) 2019-2022 Free Software Foundation, Inc.
      3 
      4    This file is part of libctf.
      5 
      6    libctf is free software; you can redistribute it and/or modify it under
      7    the terms of the GNU General Public License as published by the Free
      8    Software Foundation; either version 3, or (at your option) any later
      9    version.
     10 
     11    This program is distributed in the hope that it will be useful, but
     12    WITHOUT ANY WARRANTY; without even the implied warranty of
     13    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
     14    See the GNU General Public License for more details.
     15 
     16    You should have received a copy of the GNU General Public License
     17    along with this program; see the file COPYING.  If not see
     18    <http://www.gnu.org/licenses/>.  */
     19 
     20 #include <ctf-impl.h>
     21 #include <sys/param.h>
     22 #include <string.h>
     23 #include <unistd.h>
     24 
     25 #ifndef EOVERFLOW
     26 #define EOVERFLOW ERANGE
     27 #endif
     28 
     29 #ifndef roundup
     30 #define roundup(x, y)  ((((x) + ((y) - 1)) / (y)) * (y))
     31 #endif
     32 
     33 /* The initial size of a dynamic type's vlen in members.  Arbitrary: the bigger
     34    this is, the less allocation needs to be done for small structure
     35    initialization, and the more memory is wasted for small structures during CTF
     36    construction.  No effect on generated CTF or ctf_open()ed CTF. */
     37 #define INITIAL_VLEN 16
     38 
     39 /* Make sure the ptrtab has enough space for at least one more type.
     40 
     41    We start with 4KiB of ptrtab, enough for a thousand types, then grow it 25%
     42    at a time.  */
     43 
     44 static int
     45 ctf_grow_ptrtab (ctf_dict_t *fp)
     46 {
     47   size_t new_ptrtab_len = fp->ctf_ptrtab_len;
     48 
     49   /* We allocate one more ptrtab entry than we need, for the initial zero,
     50      plus one because the caller will probably allocate a new type.  */
     51 
     52   if (fp->ctf_ptrtab == NULL)
     53     new_ptrtab_len = 1024;
     54   else if ((fp->ctf_typemax + 2) > fp->ctf_ptrtab_len)
     55     new_ptrtab_len = fp->ctf_ptrtab_len * 1.25;
     56 
     57   if (new_ptrtab_len != fp->ctf_ptrtab_len)
     58     {
     59       uint32_t *new_ptrtab;
     60 
     61       if ((new_ptrtab = realloc (fp->ctf_ptrtab,
     62 				 new_ptrtab_len * sizeof (uint32_t))) == NULL)
     63 	return (ctf_set_errno (fp, ENOMEM));
     64 
     65       fp->ctf_ptrtab = new_ptrtab;
     66       memset (fp->ctf_ptrtab + fp->ctf_ptrtab_len, 0,
     67 	      (new_ptrtab_len - fp->ctf_ptrtab_len) * sizeof (uint32_t));
     68       fp->ctf_ptrtab_len = new_ptrtab_len;
     69     }
     70   return 0;
     71 }
     72 
     73 /* Make sure a vlen has enough space: expand it otherwise.  Unlike the ptrtab,
     74    which grows quite slowly, the vlen grows in big jumps because it is quite
     75    expensive to expand: the caller has to scan the old vlen for string refs
     76    first and remove them, then re-add them afterwards.  The initial size is
     77    more or less arbitrary.  */
     78 static int
     79 ctf_grow_vlen (ctf_dict_t *fp, ctf_dtdef_t *dtd, size_t vlen)
     80 {
     81   unsigned char *old = dtd->dtd_vlen;
     82 
     83   if (dtd->dtd_vlen_alloc > vlen)
     84     return 0;
     85 
     86   if ((dtd->dtd_vlen = realloc (dtd->dtd_vlen,
     87 				dtd->dtd_vlen_alloc * 2)) == NULL)
     88     {
     89       dtd->dtd_vlen = old;
     90       return (ctf_set_errno (fp, ENOMEM));
     91     }
     92   memset (dtd->dtd_vlen + dtd->dtd_vlen_alloc, 0, dtd->dtd_vlen_alloc);
     93   dtd->dtd_vlen_alloc *= 2;
     94   return 0;
     95 }
     96 
     97 /* To create an empty CTF dict, we just declare a zeroed header and call
     98    ctf_bufopen() on it.  If ctf_bufopen succeeds, we mark the new dict r/w and
     99    initialize the dynamic members.  We start assigning type IDs at 1 because
    100    type ID 0 is used as a sentinel and a not-found indicator.  */
    101 
    102 ctf_dict_t *
    103 ctf_create (int *errp)
    104 {
    105   static const ctf_header_t hdr = { .cth_preamble = { CTF_MAGIC, CTF_VERSION, 0 } };
    106 
    107   ctf_dynhash_t *dthash;
    108   ctf_dynhash_t *dvhash;
    109   ctf_dynhash_t *structs = NULL, *unions = NULL, *enums = NULL, *names = NULL;
    110   ctf_dynhash_t *objthash = NULL, *funchash = NULL;
    111   ctf_sect_t cts;
    112   ctf_dict_t *fp;
    113 
    114   libctf_init_debug();
    115   dthash = ctf_dynhash_create (ctf_hash_integer, ctf_hash_eq_integer,
    116 			       NULL, NULL);
    117   if (dthash == NULL)
    118     {
    119       ctf_set_open_errno (errp, EAGAIN);
    120       goto err;
    121     }
    122 
    123   dvhash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
    124 			       NULL, NULL);
    125   if (dvhash == NULL)
    126     {
    127       ctf_set_open_errno (errp, EAGAIN);
    128       goto err_dt;
    129     }
    130 
    131   structs = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
    132 				NULL, NULL);
    133   unions = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
    134 			       NULL, NULL);
    135   enums = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
    136 			      NULL, NULL);
    137   names = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
    138 			      NULL, NULL);
    139   objthash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
    140 				 free, NULL);
    141   funchash = ctf_dynhash_create (ctf_hash_string, ctf_hash_eq_string,
    142 				 free, NULL);
    143   if (!structs || !unions || !enums || !names)
    144     {
    145       ctf_set_open_errno (errp, EAGAIN);
    146       goto err_dv;
    147     }
    148 
    149   cts.cts_name = _CTF_SECTION;
    150   cts.cts_data = &hdr;
    151   cts.cts_size = sizeof (hdr);
    152   cts.cts_entsize = 1;
    153 
    154   if ((fp = ctf_bufopen_internal (&cts, NULL, NULL, NULL, 1, errp)) == NULL)
    155     goto err_dv;
    156 
    157   fp->ctf_structs.ctn_writable = structs;
    158   fp->ctf_unions.ctn_writable = unions;
    159   fp->ctf_enums.ctn_writable = enums;
    160   fp->ctf_names.ctn_writable = names;
    161   fp->ctf_objthash = objthash;
    162   fp->ctf_funchash = funchash;
    163   fp->ctf_dthash = dthash;
    164   fp->ctf_dvhash = dvhash;
    165   fp->ctf_dtoldid = 0;
    166   fp->ctf_snapshots = 1;
    167   fp->ctf_snapshot_lu = 0;
    168   fp->ctf_flags |= LCTF_DIRTY;
    169 
    170   ctf_set_ctl_hashes (fp);
    171   ctf_setmodel (fp, CTF_MODEL_NATIVE);
    172   if (ctf_grow_ptrtab (fp) < 0)
    173     {
    174       ctf_set_open_errno (errp, ctf_errno (fp));
    175       ctf_dict_close (fp);
    176       return NULL;
    177     }
    178 
    179   return fp;
    180 
    181  err_dv:
    182   ctf_dynhash_destroy (structs);
    183   ctf_dynhash_destroy (unions);
    184   ctf_dynhash_destroy (enums);
    185   ctf_dynhash_destroy (names);
    186   ctf_dynhash_destroy (objthash);
    187   ctf_dynhash_destroy (funchash);
    188   ctf_dynhash_destroy (dvhash);
    189  err_dt:
    190   ctf_dynhash_destroy (dthash);
    191  err:
    192   return NULL;
    193 }
    194 
    195 /* Compatibility: just update the threshold for ctf_discard.  */
    196 int
    197 ctf_update (ctf_dict_t *fp)
    198 {
    199   if (!(fp->ctf_flags & LCTF_RDWR))
    200     return (ctf_set_errno (fp, ECTF_RDONLY));
    201 
    202   fp->ctf_dtoldid = fp->ctf_typemax;
    203   return 0;
    204 }
    205 
    206 ctf_names_t *
    207 ctf_name_table (ctf_dict_t *fp, int kind)
    208 {
    209   switch (kind)
    210     {
    211     case CTF_K_STRUCT:
    212       return &fp->ctf_structs;
    213     case CTF_K_UNION:
    214       return &fp->ctf_unions;
    215     case CTF_K_ENUM:
    216       return &fp->ctf_enums;
    217     default:
    218       return &fp->ctf_names;
    219     }
    220 }
    221 
    222 int
    223 ctf_dtd_insert (ctf_dict_t *fp, ctf_dtdef_t *dtd, int flag, int kind)
    224 {
    225   const char *name;
    226   if (ctf_dynhash_insert (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type,
    227 			  dtd) < 0)
    228     {
    229       ctf_set_errno (fp, ENOMEM);
    230       return -1;
    231     }
    232 
    233   if (flag == CTF_ADD_ROOT && dtd->dtd_data.ctt_name
    234       && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL)
    235     {
    236       if (ctf_dynhash_insert (ctf_name_table (fp, kind)->ctn_writable,
    237 			      (char *) name, (void *) (uintptr_t)
    238 			      dtd->dtd_type) < 0)
    239 	{
    240 	  ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t)
    241 			      dtd->dtd_type);
    242 	  ctf_set_errno (fp, ENOMEM);
    243 	  return -1;
    244 	}
    245     }
    246   ctf_list_append (&fp->ctf_dtdefs, dtd);
    247   return 0;
    248 }
    249 
    250 void
    251 ctf_dtd_delete (ctf_dict_t *fp, ctf_dtdef_t *dtd)
    252 {
    253   int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
    254   size_t vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
    255   int name_kind = kind;
    256   const char *name;
    257 
    258   ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type);
    259 
    260   switch (kind)
    261     {
    262     case CTF_K_STRUCT:
    263     case CTF_K_UNION:
    264       {
    265 	ctf_lmember_t *memb = (ctf_lmember_t *) dtd->dtd_vlen;
    266 	size_t i;
    267 
    268 	for (i = 0; i < vlen; i++)
    269 	  ctf_str_remove_ref (fp, ctf_strraw (fp, memb[i].ctlm_name),
    270 			      &memb[i].ctlm_name);
    271       }
    272       break;
    273     case CTF_K_ENUM:
    274       {
    275 	ctf_enum_t *en = (ctf_enum_t *) dtd->dtd_vlen;
    276 	size_t i;
    277 
    278 	for (i = 0; i < vlen; i++)
    279 	  ctf_str_remove_ref (fp, ctf_strraw (fp, en[i].cte_name),
    280 			      &en[i].cte_name);
    281       }
    282       break;
    283     case CTF_K_FORWARD:
    284       name_kind = dtd->dtd_data.ctt_type;
    285       break;
    286     }
    287   free (dtd->dtd_vlen);
    288   dtd->dtd_vlen_alloc = 0;
    289 
    290   if (dtd->dtd_data.ctt_name
    291       && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
    292       && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
    293     {
    294       ctf_dynhash_remove (ctf_name_table (fp, name_kind)->ctn_writable,
    295 			  name);
    296       ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
    297     }
    298 
    299   ctf_list_delete (&fp->ctf_dtdefs, dtd);
    300   free (dtd);
    301 }
    302 
    303 ctf_dtdef_t *
    304 ctf_dtd_lookup (const ctf_dict_t *fp, ctf_id_t type)
    305 {
    306   return (ctf_dtdef_t *)
    307     ctf_dynhash_lookup (fp->ctf_dthash, (void *) (uintptr_t) type);
    308 }
    309 
    310 ctf_dtdef_t *
    311 ctf_dynamic_type (const ctf_dict_t *fp, ctf_id_t id)
    312 {
    313   ctf_id_t idx;
    314 
    315   if (!(fp->ctf_flags & LCTF_RDWR))
    316     return NULL;
    317 
    318   if ((fp->ctf_flags & LCTF_CHILD) && LCTF_TYPE_ISPARENT (fp, id))
    319     fp = fp->ctf_parent;
    320 
    321   idx = LCTF_TYPE_TO_INDEX(fp, id);
    322 
    323   if ((unsigned long) idx <= fp->ctf_typemax)
    324     return ctf_dtd_lookup (fp, id);
    325   return NULL;
    326 }
    327 
    328 int
    329 ctf_dvd_insert (ctf_dict_t *fp, ctf_dvdef_t *dvd)
    330 {
    331   if (ctf_dynhash_insert (fp->ctf_dvhash, dvd->dvd_name, dvd) < 0)
    332     {
    333       ctf_set_errno (fp, ENOMEM);
    334       return -1;
    335     }
    336   ctf_list_append (&fp->ctf_dvdefs, dvd);
    337   return 0;
    338 }
    339 
    340 void
    341 ctf_dvd_delete (ctf_dict_t *fp, ctf_dvdef_t *dvd)
    342 {
    343   ctf_dynhash_remove (fp->ctf_dvhash, dvd->dvd_name);
    344   free (dvd->dvd_name);
    345 
    346   ctf_list_delete (&fp->ctf_dvdefs, dvd);
    347   free (dvd);
    348 }
    349 
    350 ctf_dvdef_t *
    351 ctf_dvd_lookup (const ctf_dict_t *fp, const char *name)
    352 {
    353   return (ctf_dvdef_t *) ctf_dynhash_lookup (fp->ctf_dvhash, name);
    354 }
    355 
    356 /* Discard all of the dynamic type definitions and variable definitions that
    357    have been added to the dict since the last call to ctf_update().  We locate
    358    such types by scanning the dtd list and deleting elements that have type IDs
    359    greater than ctf_dtoldid, which is set by ctf_update(), above, and by
    360    scanning the variable list and deleting elements that have update IDs equal
    361    to the current value of the last-update snapshot count (indicating that they
    362    were added after the most recent call to ctf_update()).  */
    363 int
    364 ctf_discard (ctf_dict_t *fp)
    365 {
    366   ctf_snapshot_id_t last_update =
    367     { fp->ctf_dtoldid,
    368       fp->ctf_snapshot_lu + 1 };
    369 
    370   /* Update required?  */
    371   if (!(fp->ctf_flags & LCTF_DIRTY))
    372     return 0;
    373 
    374   return (ctf_rollback (fp, last_update));
    375 }
    376 
    377 ctf_snapshot_id_t
    378 ctf_snapshot (ctf_dict_t *fp)
    379 {
    380   ctf_snapshot_id_t snapid;
    381   snapid.dtd_id = fp->ctf_typemax;
    382   snapid.snapshot_id = fp->ctf_snapshots++;
    383   return snapid;
    384 }
    385 
    386 /* Like ctf_discard(), only discards everything after a particular ID.  */
    387 int
    388 ctf_rollback (ctf_dict_t *fp, ctf_snapshot_id_t id)
    389 {
    390   ctf_dtdef_t *dtd, *ntd;
    391   ctf_dvdef_t *dvd, *nvd;
    392 
    393   if (!(fp->ctf_flags & LCTF_RDWR))
    394     return (ctf_set_errno (fp, ECTF_RDONLY));
    395 
    396   if (fp->ctf_snapshot_lu >= id.snapshot_id)
    397     return (ctf_set_errno (fp, ECTF_OVERROLLBACK));
    398 
    399   for (dtd = ctf_list_next (&fp->ctf_dtdefs); dtd != NULL; dtd = ntd)
    400     {
    401       int kind;
    402       const char *name;
    403 
    404       ntd = ctf_list_next (dtd);
    405 
    406       if (LCTF_TYPE_TO_INDEX (fp, dtd->dtd_type) <= id.dtd_id)
    407 	continue;
    408 
    409       kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
    410       if (kind == CTF_K_FORWARD)
    411 	kind = dtd->dtd_data.ctt_type;
    412 
    413       if (dtd->dtd_data.ctt_name
    414 	  && (name = ctf_strraw (fp, dtd->dtd_data.ctt_name)) != NULL
    415 	  && LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info))
    416 	{
    417 	  ctf_dynhash_remove (ctf_name_table (fp, kind)->ctn_writable,
    418 			      name);
    419 	  ctf_str_remove_ref (fp, name, &dtd->dtd_data.ctt_name);
    420 	}
    421 
    422       ctf_dynhash_remove (fp->ctf_dthash, (void *) (uintptr_t) dtd->dtd_type);
    423       ctf_dtd_delete (fp, dtd);
    424     }
    425 
    426   for (dvd = ctf_list_next (&fp->ctf_dvdefs); dvd != NULL; dvd = nvd)
    427     {
    428       nvd = ctf_list_next (dvd);
    429 
    430       if (dvd->dvd_snapshots <= id.snapshot_id)
    431 	continue;
    432 
    433       ctf_dvd_delete (fp, dvd);
    434     }
    435 
    436   fp->ctf_typemax = id.dtd_id;
    437   fp->ctf_snapshots = id.snapshot_id;
    438 
    439   if (fp->ctf_snapshots == fp->ctf_snapshot_lu)
    440     fp->ctf_flags &= ~LCTF_DIRTY;
    441 
    442   return 0;
    443 }
    444 
    445 /* Note: vlen is the amount of space *allocated* for the vlen.  It may well not
    446    be the amount of space used (yet): the space used is declared in per-kind
    447    fashion in the dtd_data's info word.  */
    448 static ctf_id_t
    449 ctf_add_generic (ctf_dict_t *fp, uint32_t flag, const char *name, int kind,
    450 		 size_t vlen, ctf_dtdef_t **rp)
    451 {
    452   ctf_dtdef_t *dtd;
    453   ctf_id_t type;
    454 
    455   if (flag != CTF_ADD_NONROOT && flag != CTF_ADD_ROOT)
    456     return (ctf_set_errno (fp, EINVAL));
    457 
    458   if (!(fp->ctf_flags & LCTF_RDWR))
    459     return (ctf_set_errno (fp, ECTF_RDONLY));
    460 
    461   if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) >= CTF_MAX_TYPE)
    462     return (ctf_set_errno (fp, ECTF_FULL));
    463 
    464   if (LCTF_INDEX_TO_TYPE (fp, fp->ctf_typemax, 1) == (CTF_MAX_PTYPE - 1))
    465     return (ctf_set_errno (fp, ECTF_FULL));
    466 
    467   /* Make sure ptrtab always grows to be big enough for all types.  */
    468   if (ctf_grow_ptrtab (fp) < 0)
    469       return CTF_ERR;				/* errno is set for us. */
    470 
    471   if ((dtd = calloc (1, sizeof (ctf_dtdef_t))) == NULL)
    472     return (ctf_set_errno (fp, EAGAIN));
    473 
    474   dtd->dtd_vlen_alloc = vlen;
    475   if (vlen > 0)
    476     {
    477       if ((dtd->dtd_vlen = calloc (1, vlen)) == NULL)
    478 	goto oom;
    479     }
    480   else
    481     dtd->dtd_vlen = NULL;
    482 
    483   type = ++fp->ctf_typemax;
    484   type = LCTF_INDEX_TO_TYPE (fp, type, (fp->ctf_flags & LCTF_CHILD));
    485 
    486   dtd->dtd_data.ctt_name = ctf_str_add_pending (fp, name,
    487 						&dtd->dtd_data.ctt_name);
    488   dtd->dtd_type = type;
    489 
    490   if (dtd->dtd_data.ctt_name == 0 && name != NULL && name[0] != '\0')
    491     goto oom;
    492 
    493   if (ctf_dtd_insert (fp, dtd, flag, kind) < 0)
    494     goto err;					/* errno is set for us.  */
    495 
    496   fp->ctf_flags |= LCTF_DIRTY;
    497 
    498   *rp = dtd;
    499   return type;
    500 
    501  oom:
    502   ctf_set_errno (fp, EAGAIN);
    503  err:
    504   free (dtd->dtd_vlen);
    505   free (dtd);
    506   return CTF_ERR;
    507 }
    508 
    509 /* When encoding integer sizes, we want to convert a byte count in the range
    510    1-8 to the closest power of 2 (e.g. 3->4, 5->8, etc).  The clp2() function
    511    is a clever implementation from "Hacker's Delight" by Henry Warren, Jr.  */
    512 static size_t
    513 clp2 (size_t x)
    514 {
    515   x--;
    516 
    517   x |= (x >> 1);
    518   x |= (x >> 2);
    519   x |= (x >> 4);
    520   x |= (x >> 8);
    521   x |= (x >> 16);
    522 
    523   return (x + 1);
    524 }
    525 
    526 ctf_id_t
    527 ctf_add_encoded (ctf_dict_t *fp, uint32_t flag,
    528 		 const char *name, const ctf_encoding_t *ep, uint32_t kind)
    529 {
    530   ctf_dtdef_t *dtd;
    531   ctf_id_t type;
    532   uint32_t encoding;
    533 
    534   if (ep == NULL)
    535     return (ctf_set_errno (fp, EINVAL));
    536 
    537   if (name == NULL || name[0] == '\0')
    538     return (ctf_set_errno (fp, ECTF_NONAME));
    539 
    540   if (!ctf_assert (fp, kind == CTF_K_INTEGER || kind == CTF_K_FLOAT))
    541     return -1;					/* errno is set for us.  */
    542 
    543   if ((type = ctf_add_generic (fp, flag, name, kind, sizeof (uint32_t),
    544 			       &dtd)) == CTF_ERR)
    545     return CTF_ERR;		/* errno is set for us.  */
    546 
    547   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
    548   dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
    549 				 / CHAR_BIT);
    550   switch (kind)
    551     {
    552     case CTF_K_INTEGER:
    553       encoding = CTF_INT_DATA (ep->cte_format, ep->cte_offset, ep->cte_bits);
    554       break;
    555     case CTF_K_FLOAT:
    556       encoding = CTF_FP_DATA (ep->cte_format, ep->cte_offset, ep->cte_bits);
    557       break;
    558     }
    559   memcpy (dtd->dtd_vlen, &encoding, sizeof (encoding));
    560 
    561   return type;
    562 }
    563 
    564 ctf_id_t
    565 ctf_add_reftype (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref, uint32_t kind)
    566 {
    567   ctf_dtdef_t *dtd;
    568   ctf_id_t type;
    569   ctf_dict_t *tmp = fp;
    570   int child = fp->ctf_flags & LCTF_CHILD;
    571 
    572   if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
    573     return (ctf_set_errno (fp, EINVAL));
    574 
    575   if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
    576     return CTF_ERR;		/* errno is set for us.  */
    577 
    578   if ((type = ctf_add_generic (fp, flag, NULL, kind, 0, &dtd)) == CTF_ERR)
    579     return CTF_ERR;		/* errno is set for us.  */
    580 
    581   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, flag, 0);
    582   dtd->dtd_data.ctt_type = (uint32_t) ref;
    583 
    584   if (kind != CTF_K_POINTER)
    585     return type;
    586 
    587   /* If we are adding a pointer, update the ptrtab, pointing at this type from
    588      the type it points to.  Note that ctf_typemax is at this point one higher
    589      than we want to check against, because it's just been incremented for the
    590      addition of this type.  The pptrtab is lazily-updated as needed, so is not
    591      touched here.  */
    592 
    593   uint32_t type_idx = LCTF_TYPE_TO_INDEX (fp, type);
    594   uint32_t ref_idx = LCTF_TYPE_TO_INDEX (fp, ref);
    595 
    596   if (LCTF_TYPE_ISCHILD (fp, ref) == child
    597       && ref_idx < fp->ctf_typemax)
    598     fp->ctf_ptrtab[ref_idx] = type_idx;
    599 
    600   return type;
    601 }
    602 
    603 ctf_id_t
    604 ctf_add_slice (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref,
    605 	       const ctf_encoding_t *ep)
    606 {
    607   ctf_dtdef_t *dtd;
    608   ctf_slice_t slice;
    609   ctf_id_t resolved_ref = ref;
    610   ctf_id_t type;
    611   int kind;
    612   const ctf_type_t *tp;
    613   ctf_dict_t *tmp = fp;
    614 
    615   if (ep == NULL)
    616     return (ctf_set_errno (fp, EINVAL));
    617 
    618   if ((ep->cte_bits > 255) || (ep->cte_offset > 255))
    619     return (ctf_set_errno (fp, ECTF_SLICEOVERFLOW));
    620 
    621   if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
    622     return (ctf_set_errno (fp, EINVAL));
    623 
    624   if (ref != 0 && ((tp = ctf_lookup_by_id (&tmp, ref)) == NULL))
    625     return CTF_ERR;		/* errno is set for us.  */
    626 
    627   /* Make sure we ultimately point to an integral type.  We also allow slices to
    628      point to the unimplemented type, for now, because the compiler can emit
    629      such slices, though they're not very much use.  */
    630 
    631   resolved_ref = ctf_type_resolve_unsliced (tmp, ref);
    632   kind = ctf_type_kind_unsliced (tmp, resolved_ref);
    633 
    634   if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) &&
    635       (kind != CTF_K_ENUM)
    636       && (ref != 0))
    637     return (ctf_set_errno (fp, ECTF_NOTINTFP));
    638 
    639   if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_SLICE,
    640 			       sizeof (ctf_slice_t), &dtd)) == CTF_ERR)
    641     return CTF_ERR;		/* errno is set for us.  */
    642 
    643   memset (&slice, 0, sizeof (ctf_slice_t));
    644 
    645   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_SLICE, flag, 0);
    646   dtd->dtd_data.ctt_size = clp2 (P2ROUNDUP (ep->cte_bits, CHAR_BIT)
    647 				 / CHAR_BIT);
    648   slice.cts_type = (uint32_t) ref;
    649   slice.cts_bits = ep->cte_bits;
    650   slice.cts_offset = ep->cte_offset;
    651   memcpy (dtd->dtd_vlen, &slice, sizeof (ctf_slice_t));
    652 
    653   return type;
    654 }
    655 
    656 ctf_id_t
    657 ctf_add_integer (ctf_dict_t *fp, uint32_t flag,
    658 		 const char *name, const ctf_encoding_t *ep)
    659 {
    660   return (ctf_add_encoded (fp, flag, name, ep, CTF_K_INTEGER));
    661 }
    662 
    663 ctf_id_t
    664 ctf_add_float (ctf_dict_t *fp, uint32_t flag,
    665 	       const char *name, const ctf_encoding_t *ep)
    666 {
    667   return (ctf_add_encoded (fp, flag, name, ep, CTF_K_FLOAT));
    668 }
    669 
    670 ctf_id_t
    671 ctf_add_pointer (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
    672 {
    673   return (ctf_add_reftype (fp, flag, ref, CTF_K_POINTER));
    674 }
    675 
    676 ctf_id_t
    677 ctf_add_array (ctf_dict_t *fp, uint32_t flag, const ctf_arinfo_t *arp)
    678 {
    679   ctf_dtdef_t *dtd;
    680   ctf_array_t cta;
    681   ctf_id_t type;
    682   ctf_dict_t *tmp = fp;
    683 
    684   if (arp == NULL)
    685     return (ctf_set_errno (fp, EINVAL));
    686 
    687   if (arp->ctr_contents != 0
    688       && ctf_lookup_by_id (&tmp, arp->ctr_contents) == NULL)
    689     return CTF_ERR;		/* errno is set for us.  */
    690 
    691   tmp = fp;
    692   if (ctf_lookup_by_id (&tmp, arp->ctr_index) == NULL)
    693     return CTF_ERR;		/* errno is set for us.  */
    694 
    695   if (ctf_type_kind (fp, arp->ctr_index) == CTF_K_FORWARD)
    696     {
    697       ctf_err_warn (fp, 1, ECTF_INCOMPLETE,
    698 		    _("ctf_add_array: index type %lx is incomplete"),
    699 		    arp->ctr_contents);
    700       return (ctf_set_errno (fp, ECTF_INCOMPLETE));
    701     }
    702 
    703   if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_ARRAY,
    704 			       sizeof (ctf_array_t), &dtd)) == CTF_ERR)
    705     return CTF_ERR;		/* errno is set for us.  */
    706 
    707   memset (&cta, 0, sizeof (ctf_array_t));
    708 
    709   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ARRAY, flag, 0);
    710   dtd->dtd_data.ctt_size = 0;
    711   cta.cta_contents = (uint32_t) arp->ctr_contents;
    712   cta.cta_index = (uint32_t) arp->ctr_index;
    713   cta.cta_nelems = arp->ctr_nelems;
    714   memcpy (dtd->dtd_vlen, &cta, sizeof (ctf_array_t));
    715 
    716   return type;
    717 }
    718 
    719 int
    720 ctf_set_array (ctf_dict_t *fp, ctf_id_t type, const ctf_arinfo_t *arp)
    721 {
    722   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
    723   ctf_array_t *vlen;
    724 
    725   if (!(fp->ctf_flags & LCTF_RDWR))
    726     return (ctf_set_errno (fp, ECTF_RDONLY));
    727 
    728   if (dtd == NULL
    729       || LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info) != CTF_K_ARRAY)
    730     return (ctf_set_errno (fp, ECTF_BADID));
    731 
    732   vlen = (ctf_array_t *) dtd->dtd_vlen;
    733   fp->ctf_flags |= LCTF_DIRTY;
    734   vlen->cta_contents = (uint32_t) arp->ctr_contents;
    735   vlen->cta_index = (uint32_t) arp->ctr_index;
    736   vlen->cta_nelems = arp->ctr_nelems;
    737 
    738   return 0;
    739 }
    740 
    741 ctf_id_t
    742 ctf_add_function (ctf_dict_t *fp, uint32_t flag,
    743 		  const ctf_funcinfo_t *ctc, const ctf_id_t *argv)
    744 {
    745   ctf_dtdef_t *dtd;
    746   ctf_id_t type;
    747   uint32_t vlen;
    748   uint32_t *vdat;
    749   ctf_dict_t *tmp = fp;
    750   size_t initial_vlen;
    751   size_t i;
    752 
    753   if (!(fp->ctf_flags & LCTF_RDWR))
    754     return (ctf_set_errno (fp, ECTF_RDONLY));
    755 
    756   if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0
    757       || (ctc->ctc_argc != 0 && argv == NULL))
    758     return (ctf_set_errno (fp, EINVAL));
    759 
    760   vlen = ctc->ctc_argc;
    761   if (ctc->ctc_flags & CTF_FUNC_VARARG)
    762     vlen++;	       /* Add trailing zero to indicate varargs (see below).  */
    763 
    764   if (ctc->ctc_return != 0
    765       && ctf_lookup_by_id (&tmp, ctc->ctc_return) == NULL)
    766     return CTF_ERR;				/* errno is set for us.  */
    767 
    768   if (vlen > CTF_MAX_VLEN)
    769     return (ctf_set_errno (fp, EOVERFLOW));
    770 
    771   /* One word extra allocated for padding for 4-byte alignment if need be.
    772      Not reflected in vlen: we don't want to copy anything into it, and
    773      it's in addition to (e.g.) the trailing 0 indicating varargs.  */
    774 
    775   initial_vlen = (sizeof (uint32_t) * (vlen + (vlen & 1)));
    776   if ((type = ctf_add_generic (fp, flag, NULL, CTF_K_FUNCTION,
    777 			       initial_vlen, &dtd)) == CTF_ERR)
    778     return CTF_ERR;				/* errno is set for us.  */
    779 
    780   vdat = (uint32_t *) dtd->dtd_vlen;
    781 
    782   for (i = 0; i < ctc->ctc_argc; i++)
    783     {
    784       tmp = fp;
    785       if (argv[i] != 0 && ctf_lookup_by_id (&tmp, argv[i]) == NULL)
    786 	return CTF_ERR;				/* errno is set for us.  */
    787       vdat[i] = (uint32_t) argv[i];
    788     }
    789 
    790   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FUNCTION, flag, vlen);
    791   dtd->dtd_data.ctt_type = (uint32_t) ctc->ctc_return;
    792 
    793   if (ctc->ctc_flags & CTF_FUNC_VARARG)
    794     vdat[vlen - 1] = 0;		   /* Add trailing zero to indicate varargs.  */
    795 
    796   return type;
    797 }
    798 
    799 ctf_id_t
    800 ctf_add_struct_sized (ctf_dict_t *fp, uint32_t flag, const char *name,
    801 		      size_t size)
    802 {
    803   ctf_dtdef_t *dtd;
    804   ctf_id_t type = 0;
    805   size_t initial_vlen = sizeof (ctf_lmember_t) * INITIAL_VLEN;
    806 
    807   /* Promote root-visible forwards to structs.  */
    808   if (name != NULL)
    809     type = ctf_lookup_by_rawname (fp, CTF_K_STRUCT, name);
    810 
    811   if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
    812     dtd = ctf_dtd_lookup (fp, type);
    813   else if ((type = ctf_add_generic (fp, flag, name, CTF_K_STRUCT,
    814 				    initial_vlen, &dtd)) == CTF_ERR)
    815     return CTF_ERR;		/* errno is set for us.  */
    816 
    817   /* Forwards won't have any vlen yet.  */
    818   if (dtd->dtd_vlen_alloc == 0)
    819     {
    820       if ((dtd->dtd_vlen = calloc (1, initial_vlen)) == NULL)
    821 	return (ctf_set_errno (fp, ENOMEM));
    822       dtd->dtd_vlen_alloc = initial_vlen;
    823     }
    824 
    825   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_STRUCT, flag, 0);
    826   dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
    827   dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
    828   dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
    829 
    830   return type;
    831 }
    832 
    833 ctf_id_t
    834 ctf_add_struct (ctf_dict_t *fp, uint32_t flag, const char *name)
    835 {
    836   return (ctf_add_struct_sized (fp, flag, name, 0));
    837 }
    838 
    839 ctf_id_t
    840 ctf_add_union_sized (ctf_dict_t *fp, uint32_t flag, const char *name,
    841 		     size_t size)
    842 {
    843   ctf_dtdef_t *dtd;
    844   ctf_id_t type = 0;
    845   size_t initial_vlen = sizeof (ctf_lmember_t) * INITIAL_VLEN;
    846 
    847   /* Promote root-visible forwards to unions.  */
    848   if (name != NULL)
    849     type = ctf_lookup_by_rawname (fp, CTF_K_UNION, name);
    850 
    851   if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
    852     dtd = ctf_dtd_lookup (fp, type);
    853   else if ((type = ctf_add_generic (fp, flag, name, CTF_K_UNION,
    854 				    initial_vlen, &dtd)) == CTF_ERR)
    855     return CTF_ERR;		/* errno is set for us */
    856 
    857   /* Forwards won't have any vlen yet.  */
    858   if (dtd->dtd_vlen_alloc == 0)
    859     {
    860       if ((dtd->dtd_vlen = calloc (1, initial_vlen)) == NULL)
    861 	return (ctf_set_errno (fp, ENOMEM));
    862       dtd->dtd_vlen_alloc = initial_vlen;
    863     }
    864 
    865   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_UNION, flag, 0);
    866   dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
    867   dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (size);
    868   dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (size);
    869 
    870   return type;
    871 }
    872 
    873 ctf_id_t
    874 ctf_add_union (ctf_dict_t *fp, uint32_t flag, const char *name)
    875 {
    876   return (ctf_add_union_sized (fp, flag, name, 0));
    877 }
    878 
    879 ctf_id_t
    880 ctf_add_enum (ctf_dict_t *fp, uint32_t flag, const char *name)
    881 {
    882   ctf_dtdef_t *dtd;
    883   ctf_id_t type = 0;
    884   size_t initial_vlen = sizeof (ctf_enum_t) * INITIAL_VLEN;
    885 
    886   /* Promote root-visible forwards to enums.  */
    887   if (name != NULL)
    888     type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
    889 
    890   if (type != 0 && ctf_type_kind (fp, type) == CTF_K_FORWARD)
    891     dtd = ctf_dtd_lookup (fp, type);
    892   else if ((type = ctf_add_generic (fp, flag, name, CTF_K_ENUM,
    893 				    initial_vlen, &dtd)) == CTF_ERR)
    894     return CTF_ERR;		/* errno is set for us.  */
    895 
    896   /* Forwards won't have any vlen yet.  */
    897   if (dtd->dtd_vlen_alloc == 0)
    898     {
    899       if ((dtd->dtd_vlen = calloc (1, initial_vlen)) == NULL)
    900 	return (ctf_set_errno (fp, ENOMEM));
    901       dtd->dtd_vlen_alloc = initial_vlen;
    902     }
    903 
    904   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_ENUM, flag, 0);
    905   dtd->dtd_data.ctt_size = fp->ctf_dmodel->ctd_int;
    906 
    907   return type;
    908 }
    909 
    910 ctf_id_t
    911 ctf_add_enum_encoded (ctf_dict_t *fp, uint32_t flag, const char *name,
    912 		      const ctf_encoding_t *ep)
    913 {
    914   ctf_id_t type = 0;
    915 
    916   /* First, create the enum if need be, using most of the same machinery as
    917      ctf_add_enum(), to ensure that we do not allow things past that are not
    918      enums or forwards to them.  (This includes other slices: you cannot slice a
    919      slice, which would be a useless thing to do anyway.)  */
    920 
    921   if (name != NULL)
    922     type = ctf_lookup_by_rawname (fp, CTF_K_ENUM, name);
    923 
    924   if (type != 0)
    925     {
    926       if ((ctf_type_kind (fp, type) != CTF_K_FORWARD) &&
    927 	  (ctf_type_kind_unsliced (fp, type) != CTF_K_ENUM))
    928 	return (ctf_set_errno (fp, ECTF_NOTINTFP));
    929     }
    930   else if ((type = ctf_add_enum (fp, flag, name)) == CTF_ERR)
    931     return CTF_ERR;		/* errno is set for us.  */
    932 
    933   /* Now attach a suitable slice to it.  */
    934 
    935   return ctf_add_slice (fp, flag, type, ep);
    936 }
    937 
    938 ctf_id_t
    939 ctf_add_forward (ctf_dict_t *fp, uint32_t flag, const char *name,
    940 		 uint32_t kind)
    941 {
    942   ctf_dtdef_t *dtd;
    943   ctf_id_t type = 0;
    944 
    945   if (!ctf_forwardable_kind (kind))
    946     return (ctf_set_errno (fp, ECTF_NOTSUE));
    947 
    948   if (name == NULL || name[0] == '\0')
    949     return (ctf_set_errno (fp, ECTF_NONAME));
    950 
    951   /* If the type is already defined or exists as a forward tag, just
    952      return the ctf_id_t of the existing definition.  */
    953 
    954   type = ctf_lookup_by_rawname (fp, kind, name);
    955 
    956   if (type)
    957     return type;
    958 
    959   if ((type = ctf_add_generic (fp, flag, name, kind, 0, &dtd)) == CTF_ERR)
    960     return CTF_ERR;		/* errno is set for us.  */
    961 
    962   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_FORWARD, flag, 0);
    963   dtd->dtd_data.ctt_type = kind;
    964 
    965   return type;
    966 }
    967 
    968 ctf_id_t
    969 ctf_add_unknown (ctf_dict_t *fp, uint32_t flag, const char *name)
    970 {
    971   ctf_dtdef_t *dtd;
    972   ctf_id_t type = 0;
    973 
    974   /* If a type is already defined with this name, error (if not CTF_K_UNKNOWN)
    975      or just return it.  */
    976 
    977   if (name != NULL && name[0] != '\0' && flag == CTF_ADD_ROOT
    978       && (type = ctf_lookup_by_rawname (fp, CTF_K_UNKNOWN, name)))
    979     {
    980       if (ctf_type_kind (fp, type) == CTF_K_UNKNOWN)
    981 	return type;
    982       else
    983 	{
    984 	  ctf_err_warn (fp, 1, ECTF_CONFLICT,
    985 			_("ctf_add_unknown: cannot add unknown type "
    986 			  "named %s: type of this name already defined"),
    987 			name ? name : _("(unnamed type)"));
    988 	  return (ctf_set_errno (fp, ECTF_CONFLICT));
    989 	}
    990     }
    991 
    992   if ((type = ctf_add_generic (fp, flag, name, CTF_K_UNKNOWN, 0, &dtd)) == CTF_ERR)
    993     return CTF_ERR;		/* errno is set for us.  */
    994 
    995   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_UNKNOWN, flag, 0);
    996   dtd->dtd_data.ctt_type = 0;
    997 
    998   return type;
    999 }
   1000 
   1001 ctf_id_t
   1002 ctf_add_typedef (ctf_dict_t *fp, uint32_t flag, const char *name,
   1003 		 ctf_id_t ref)
   1004 {
   1005   ctf_dtdef_t *dtd;
   1006   ctf_id_t type;
   1007   ctf_dict_t *tmp = fp;
   1008 
   1009   if (ref == CTF_ERR || ref > CTF_MAX_TYPE)
   1010     return (ctf_set_errno (fp, EINVAL));
   1011 
   1012   if (name == NULL || name[0] == '\0')
   1013     return (ctf_set_errno (fp, ECTF_NONAME));
   1014 
   1015   if (ref != 0 && ctf_lookup_by_id (&tmp, ref) == NULL)
   1016     return CTF_ERR;		/* errno is set for us.  */
   1017 
   1018   if ((type = ctf_add_generic (fp, flag, name, CTF_K_TYPEDEF, 0,
   1019 			       &dtd)) == CTF_ERR)
   1020     return CTF_ERR;		/* errno is set for us.  */
   1021 
   1022   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (CTF_K_TYPEDEF, flag, 0);
   1023   dtd->dtd_data.ctt_type = (uint32_t) ref;
   1024 
   1025   return type;
   1026 }
   1027 
   1028 ctf_id_t
   1029 ctf_add_volatile (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
   1030 {
   1031   return (ctf_add_reftype (fp, flag, ref, CTF_K_VOLATILE));
   1032 }
   1033 
   1034 ctf_id_t
   1035 ctf_add_const (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
   1036 {
   1037   return (ctf_add_reftype (fp, flag, ref, CTF_K_CONST));
   1038 }
   1039 
   1040 ctf_id_t
   1041 ctf_add_restrict (ctf_dict_t *fp, uint32_t flag, ctf_id_t ref)
   1042 {
   1043   return (ctf_add_reftype (fp, flag, ref, CTF_K_RESTRICT));
   1044 }
   1045 
   1046 int
   1047 ctf_add_enumerator (ctf_dict_t *fp, ctf_id_t enid, const char *name,
   1048 		    int value)
   1049 {
   1050   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, enid);
   1051   unsigned char *old_vlen;
   1052   ctf_enum_t *en;
   1053   size_t i;
   1054 
   1055   uint32_t kind, vlen, root;
   1056 
   1057   if (name == NULL)
   1058     return (ctf_set_errno (fp, EINVAL));
   1059 
   1060   if (!(fp->ctf_flags & LCTF_RDWR))
   1061     return (ctf_set_errno (fp, ECTF_RDONLY));
   1062 
   1063   if (dtd == NULL)
   1064     return (ctf_set_errno (fp, ECTF_BADID));
   1065 
   1066   kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
   1067   root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
   1068   vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
   1069 
   1070   if (kind != CTF_K_ENUM)
   1071     return (ctf_set_errno (fp, ECTF_NOTENUM));
   1072 
   1073   if (vlen == CTF_MAX_VLEN)
   1074     return (ctf_set_errno (fp, ECTF_DTFULL));
   1075 
   1076   old_vlen = dtd->dtd_vlen;
   1077   if (ctf_grow_vlen (fp, dtd, sizeof (ctf_enum_t) * (vlen + 1)) < 0)
   1078     return -1;					/* errno is set for us.  */
   1079   en = (ctf_enum_t *) dtd->dtd_vlen;
   1080 
   1081   if (dtd->dtd_vlen != old_vlen)
   1082     {
   1083       ptrdiff_t move = (signed char *) dtd->dtd_vlen - (signed char *) old_vlen;
   1084 
   1085       /* Remove pending refs in the old vlen region and reapply them.  */
   1086 
   1087       for (i = 0; i < vlen; i++)
   1088 	ctf_str_move_pending (fp, &en[i].cte_name, move);
   1089     }
   1090 
   1091   for (i = 0; i < vlen; i++)
   1092     if (strcmp (ctf_strptr (fp, en[i].cte_name), name) == 0)
   1093       return (ctf_set_errno (fp, ECTF_DUPLICATE));
   1094 
   1095   en[i].cte_name = ctf_str_add_pending (fp, name, &en[i].cte_name);
   1096   en[i].cte_value = value;
   1097 
   1098   if (en[i].cte_name == 0 && name != NULL && name[0] != '\0')
   1099     return -1;					/* errno is set for us. */
   1100 
   1101   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
   1102 
   1103   fp->ctf_flags |= LCTF_DIRTY;
   1104 
   1105   return 0;
   1106 }
   1107 
   1108 int
   1109 ctf_add_member_offset (ctf_dict_t *fp, ctf_id_t souid, const char *name,
   1110 		       ctf_id_t type, unsigned long bit_offset)
   1111 {
   1112   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, souid);
   1113 
   1114   ssize_t msize, malign, ssize;
   1115   uint32_t kind, vlen, root;
   1116   size_t i;
   1117   int is_incomplete = 0;
   1118   unsigned char *old_vlen;
   1119   ctf_lmember_t *memb;
   1120 
   1121   if (!(fp->ctf_flags & LCTF_RDWR))
   1122     return (ctf_set_errno (fp, ECTF_RDONLY));
   1123 
   1124   if (dtd == NULL)
   1125     return (ctf_set_errno (fp, ECTF_BADID));
   1126 
   1127   if (name != NULL && name[0] == '\0')
   1128     name = NULL;
   1129 
   1130   kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
   1131   root = LCTF_INFO_ISROOT (fp, dtd->dtd_data.ctt_info);
   1132   vlen = LCTF_INFO_VLEN (fp, dtd->dtd_data.ctt_info);
   1133 
   1134   if (kind != CTF_K_STRUCT && kind != CTF_K_UNION)
   1135     return (ctf_set_errno (fp, ECTF_NOTSOU));
   1136 
   1137   if (vlen == CTF_MAX_VLEN)
   1138     return (ctf_set_errno (fp, ECTF_DTFULL));
   1139 
   1140   old_vlen = dtd->dtd_vlen;
   1141   if (ctf_grow_vlen (fp, dtd, sizeof (ctf_lmember_t) * (vlen + 1)) < 0)
   1142     return -1;					/* errno is set for us.  */
   1143   memb = (ctf_lmember_t *) dtd->dtd_vlen;
   1144 
   1145   if (dtd->dtd_vlen != old_vlen)
   1146     {
   1147       ptrdiff_t move = (signed char *) dtd->dtd_vlen - (signed char *) old_vlen;
   1148 
   1149       /* Remove pending refs in the old vlen region and reapply them.  */
   1150 
   1151       for (i = 0; i < vlen; i++)
   1152 	ctf_str_move_pending (fp, &memb[i].ctlm_name, move);
   1153     }
   1154 
   1155   if (name != NULL)
   1156     {
   1157       for (i = 0; i < vlen; i++)
   1158 	if (strcmp (ctf_strptr (fp, memb[i].ctlm_name), name) == 0)
   1159 	  return (ctf_set_errno (fp, ECTF_DUPLICATE));
   1160     }
   1161 
   1162   if ((msize = ctf_type_size (fp, type)) < 0 ||
   1163       (malign = ctf_type_align (fp, type)) < 0)
   1164     {
   1165       /* The unimplemented type, and any type that resolves to it, has no size
   1166 	 and no alignment: it can correspond to any number of compiler-inserted
   1167 	 types.  We allow incomplete types through since they are routinely
   1168 	 added to the ends of structures, and can even be added elsewhere in
   1169 	 structures by the deduplicator.  They are assumed to be zero-size with
   1170 	 no alignment: this is often wrong, but problems can be avoided in this
   1171 	 case by explicitly specifying the size of the structure via the _sized
   1172 	 functions.  The deduplicator always does this.  */
   1173 
   1174       msize = 0;
   1175       malign = 0;
   1176       if (ctf_errno (fp) == ECTF_NONREPRESENTABLE)
   1177 	ctf_set_errno (fp, 0);
   1178       else if (ctf_errno (fp) == ECTF_INCOMPLETE)
   1179 	is_incomplete = 1;
   1180       else
   1181 	return -1;		/* errno is set for us.  */
   1182     }
   1183 
   1184   memb[vlen].ctlm_name = ctf_str_add_pending (fp, name, &memb[vlen].ctlm_name);
   1185   memb[vlen].ctlm_type = type;
   1186   if (memb[vlen].ctlm_name == 0 && name != NULL && name[0] != '\0')
   1187     return -1;			/* errno is set for us.  */
   1188 
   1189   if (kind == CTF_K_STRUCT && vlen != 0)
   1190     {
   1191       if (bit_offset == (unsigned long) - 1)
   1192 	{
   1193 	  /* Natural alignment.  */
   1194 
   1195 	  ctf_id_t ltype = ctf_type_resolve (fp, memb[vlen - 1].ctlm_type);
   1196 	  size_t off = CTF_LMEM_OFFSET(&memb[vlen - 1]);
   1197 
   1198 	  ctf_encoding_t linfo;
   1199 	  ssize_t lsize;
   1200 
   1201 	  /* Propagate any error from ctf_type_resolve.  If the last member was
   1202 	     of unimplemented type, this may be -ECTF_NONREPRESENTABLE: we
   1203 	     cannot insert right after such a member without explicit offset
   1204 	     specification, because its alignment and size is not known.  */
   1205 	  if (ltype == CTF_ERR)
   1206 	    return -1;	/* errno is set for us.  */
   1207 
   1208 	  if (is_incomplete)
   1209 	    {
   1210 	      ctf_err_warn (fp, 1, ECTF_INCOMPLETE,
   1211 			    _("ctf_add_member_offset: cannot add member %s of "
   1212 			      "incomplete type %lx to struct %lx without "
   1213 			      "specifying explicit offset\n"),
   1214 			    name ? name : _("(unnamed member)"), type, souid);
   1215 	      return (ctf_set_errno (fp, ECTF_INCOMPLETE));
   1216 	    }
   1217 
   1218 	  if (ctf_type_encoding (fp, ltype, &linfo) == 0)
   1219 	    off += linfo.cte_bits;
   1220 	  else if ((lsize = ctf_type_size (fp, ltype)) > 0)
   1221 	    off += lsize * CHAR_BIT;
   1222 	  else if (lsize == -1 && ctf_errno (fp) == ECTF_INCOMPLETE)
   1223 	    {
   1224 	      const char *lname = ctf_strraw (fp, memb[vlen - 1].ctlm_name);
   1225 
   1226 	      ctf_err_warn (fp, 1, ECTF_INCOMPLETE,
   1227 			    _("ctf_add_member_offset: cannot add member %s of "
   1228 			      "type %lx to struct %lx without specifying "
   1229 			      "explicit offset after member %s of type %lx, "
   1230 			      "which is an incomplete type\n"),
   1231 			    name ? name : _("(unnamed member)"), type, souid,
   1232 			    lname ? lname : _("(unnamed member)"), ltype);
   1233 	      return -1;			/* errno is set for us.  */
   1234 	    }
   1235 
   1236 	  /* Round up the offset of the end of the last member to
   1237 	     the next byte boundary, convert 'off' to bytes, and
   1238 	     then round it up again to the next multiple of the
   1239 	     alignment required by the new member.  Finally,
   1240 	     convert back to bits and store the result in
   1241 	     dmd_offset.  Technically we could do more efficient
   1242 	     packing if the new member is a bit-field, but we're
   1243 	     the "compiler" and ANSI says we can do as we choose.  */
   1244 
   1245 	  off = roundup (off, CHAR_BIT) / CHAR_BIT;
   1246 	  off = roundup (off, MAX (malign, 1));
   1247 	  memb[vlen].ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (off * CHAR_BIT);
   1248 	  memb[vlen].ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (off * CHAR_BIT);
   1249 	  ssize = off + msize;
   1250 	}
   1251       else
   1252 	{
   1253 	  /* Specified offset in bits.  */
   1254 
   1255 	  memb[vlen].ctlm_offsethi = CTF_OFFSET_TO_LMEMHI (bit_offset);
   1256 	  memb[vlen].ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO (bit_offset);
   1257 	  ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
   1258 	  ssize = MAX (ssize, ((signed) bit_offset / CHAR_BIT) + msize);
   1259 	}
   1260     }
   1261   else
   1262     {
   1263       memb[vlen].ctlm_offsethi = 0;
   1264       memb[vlen].ctlm_offsetlo = 0;
   1265       ssize = ctf_get_ctt_size (fp, &dtd->dtd_data, NULL, NULL);
   1266       ssize = MAX (ssize, msize);
   1267     }
   1268 
   1269   dtd->dtd_data.ctt_size = CTF_LSIZE_SENT;
   1270   dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI (ssize);
   1271   dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO (ssize);
   1272   dtd->dtd_data.ctt_info = CTF_TYPE_INFO (kind, root, vlen + 1);
   1273 
   1274   fp->ctf_flags |= LCTF_DIRTY;
   1275   return 0;
   1276 }
   1277 
   1278 int
   1279 ctf_add_member_encoded (ctf_dict_t *fp, ctf_id_t souid, const char *name,
   1280 			ctf_id_t type, unsigned long bit_offset,
   1281 			const ctf_encoding_t encoding)
   1282 {
   1283   ctf_dtdef_t *dtd = ctf_dtd_lookup (fp, type);
   1284   int kind = LCTF_INFO_KIND (fp, dtd->dtd_data.ctt_info);
   1285   int otype = type;
   1286 
   1287   if ((kind != CTF_K_INTEGER) && (kind != CTF_K_FLOAT) && (kind != CTF_K_ENUM))
   1288     return (ctf_set_errno (fp, ECTF_NOTINTFP));
   1289 
   1290   if ((type = ctf_add_slice (fp, CTF_ADD_NONROOT, otype, &encoding)) == CTF_ERR)
   1291     return -1;			/* errno is set for us.  */
   1292 
   1293   return ctf_add_member_offset (fp, souid, name, type, bit_offset);
   1294 }
   1295 
   1296 int
   1297 ctf_add_member (ctf_dict_t *fp, ctf_id_t souid, const char *name,
   1298 		ctf_id_t type)
   1299 {
   1300   return ctf_add_member_offset (fp, souid, name, type, (unsigned long) - 1);
   1301 }
   1302 
   1303 int
   1304 ctf_add_variable (ctf_dict_t *fp, const char *name, ctf_id_t ref)
   1305 {
   1306   ctf_dvdef_t *dvd;
   1307   ctf_dict_t *tmp = fp;
   1308 
   1309   if (!(fp->ctf_flags & LCTF_RDWR))
   1310     return (ctf_set_errno (fp, ECTF_RDONLY));
   1311 
   1312   if (ctf_dvd_lookup (fp, name) != NULL)
   1313     return (ctf_set_errno (fp, ECTF_DUPLICATE));
   1314 
   1315   if (ctf_lookup_by_id (&tmp, ref) == NULL)
   1316     return -1;			/* errno is set for us.  */
   1317 
   1318   /* Make sure this type is representable.  */
   1319   if ((ctf_type_resolve (fp, ref) == CTF_ERR)
   1320       && (ctf_errno (fp) == ECTF_NONREPRESENTABLE))
   1321     return -1;
   1322 
   1323   if ((dvd = malloc (sizeof (ctf_dvdef_t))) == NULL)
   1324     return (ctf_set_errno (fp, EAGAIN));
   1325 
   1326   if (name != NULL && (dvd->dvd_name = strdup (name)) == NULL)
   1327     {
   1328       free (dvd);
   1329       return (ctf_set_errno (fp, EAGAIN));
   1330     }
   1331   dvd->dvd_type = ref;
   1332   dvd->dvd_snapshots = fp->ctf_snapshots;
   1333 
   1334   if (ctf_dvd_insert (fp, dvd) < 0)
   1335     {
   1336       free (dvd->dvd_name);
   1337       free (dvd);
   1338       return -1;			/* errno is set for us.  */
   1339     }
   1340 
   1341   fp->ctf_flags |= LCTF_DIRTY;
   1342   return 0;
   1343 }
   1344 
   1345 int
   1346 ctf_add_funcobjt_sym (ctf_dict_t *fp, int is_function, const char *name, ctf_id_t id)
   1347 {
   1348   ctf_dict_t *tmp = fp;
   1349   char *dupname;
   1350   ctf_dynhash_t *h = is_function ? fp->ctf_funchash : fp->ctf_objthash;
   1351 
   1352   if (!(fp->ctf_flags & LCTF_RDWR))
   1353     return (ctf_set_errno (fp, ECTF_RDONLY));
   1354 
   1355   if (ctf_dynhash_lookup (fp->ctf_objthash, name) != NULL ||
   1356       ctf_dynhash_lookup (fp->ctf_funchash, name) != NULL)
   1357     return (ctf_set_errno (fp, ECTF_DUPLICATE));
   1358 
   1359   if (ctf_lookup_by_id (&tmp, id) == NULL)
   1360     return -1;                                  /* errno is set for us.  */
   1361 
   1362   if (is_function && ctf_type_kind (fp, id) != CTF_K_FUNCTION)
   1363     return (ctf_set_errno (fp, ECTF_NOTFUNC));
   1364 
   1365   if ((dupname = strdup (name)) == NULL)
   1366     return (ctf_set_errno (fp, ENOMEM));
   1367 
   1368   if (ctf_dynhash_insert (h, dupname, (void *) (uintptr_t) id) < 0)
   1369     {
   1370       free (dupname);
   1371       return (ctf_set_errno (fp, ENOMEM));
   1372     }
   1373   return 0;
   1374 }
   1375 
   1376 int
   1377 ctf_add_objt_sym (ctf_dict_t *fp, const char *name, ctf_id_t id)
   1378 {
   1379   return (ctf_add_funcobjt_sym (fp, 0, name, id));
   1380 }
   1381 
   1382 int
   1383 ctf_add_func_sym (ctf_dict_t *fp, const char *name, ctf_id_t id)
   1384 {
   1385   return (ctf_add_funcobjt_sym (fp, 1, name, id));
   1386 }
   1387 
   1388 typedef struct ctf_bundle
   1389 {
   1390   ctf_dict_t *ctb_dict;		/* CTF dict handle.  */
   1391   ctf_id_t ctb_type;		/* CTF type identifier.  */
   1392   ctf_dtdef_t *ctb_dtd;		/* CTF dynamic type definition (if any).  */
   1393 } ctf_bundle_t;
   1394 
   1395 static int
   1396 enumcmp (const char *name, int value, void *arg)
   1397 {
   1398   ctf_bundle_t *ctb = arg;
   1399   int bvalue;
   1400 
   1401   if (ctf_enum_value (ctb->ctb_dict, ctb->ctb_type, name, &bvalue) < 0)
   1402     {
   1403       ctf_err_warn (ctb->ctb_dict, 0, 0,
   1404 		    _("conflict due to enum %s iteration error"), name);
   1405       return 1;
   1406     }
   1407   if (value != bvalue)
   1408     {
   1409       ctf_err_warn (ctb->ctb_dict, 1, ECTF_CONFLICT,
   1410 		    _("conflict due to enum value change: %i versus %i"),
   1411 		    value, bvalue);
   1412       return 1;
   1413     }
   1414   return 0;
   1415 }
   1416 
   1417 static int
   1418 enumadd (const char *name, int value, void *arg)
   1419 {
   1420   ctf_bundle_t *ctb = arg;
   1421 
   1422   return (ctf_add_enumerator (ctb->ctb_dict, ctb->ctb_type,
   1423 			      name, value) < 0);
   1424 }
   1425 
   1426 static int
   1427 membcmp (const char *name, ctf_id_t type _libctf_unused_, unsigned long offset,
   1428 	 void *arg)
   1429 {
   1430   ctf_bundle_t *ctb = arg;
   1431   ctf_membinfo_t ctm;
   1432 
   1433   /* Don't check nameless members (e.g. anonymous structs/unions) against each
   1434      other.  */
   1435   if (name[0] == 0)
   1436     return 0;
   1437 
   1438   if (ctf_member_info (ctb->ctb_dict, ctb->ctb_type, name, &ctm) < 0)
   1439     {
   1440       ctf_err_warn (ctb->ctb_dict, 0, 0,
   1441 		    _("conflict due to struct member %s iteration error"),
   1442 		    name);
   1443       return 1;
   1444     }
   1445   if (ctm.ctm_offset != offset)
   1446     {
   1447       ctf_err_warn (ctb->ctb_dict, 1, ECTF_CONFLICT,
   1448 		    _("conflict due to struct member %s offset change: "
   1449 		      "%lx versus %lx"),
   1450 		    name, ctm.ctm_offset, offset);
   1451       return 1;
   1452     }
   1453   return 0;
   1454 }
   1455 
   1456 /* Record the correspondence between a source and ctf_add_type()-added
   1457    destination type: both types are translated into parent type IDs if need be,
   1458    so they relate to the actual dictionary they are in.  Outside controlled
   1459    circumstances (like linking) it is probably not useful to do more than
   1460    compare these pointers, since there is nothing stopping the user closing the
   1461    source dict whenever they want to.
   1462 
   1463    Our OOM handling here is just to not do anything, because this is called deep
   1464    enough in the call stack that doing anything useful is painfully difficult:
   1465    the worst consequence if we do OOM is a bit of type duplication anyway.  */
   1466 
   1467 static void
   1468 ctf_add_type_mapping (ctf_dict_t *src_fp, ctf_id_t src_type,
   1469 		      ctf_dict_t *dst_fp, ctf_id_t dst_type)
   1470 {
   1471   if (LCTF_TYPE_ISPARENT (src_fp, src_type) && src_fp->ctf_parent)
   1472     src_fp = src_fp->ctf_parent;
   1473 
   1474   src_type = LCTF_TYPE_TO_INDEX(src_fp, src_type);
   1475 
   1476   if (LCTF_TYPE_ISPARENT (dst_fp, dst_type) && dst_fp->ctf_parent)
   1477     dst_fp = dst_fp->ctf_parent;
   1478 
   1479   dst_type = LCTF_TYPE_TO_INDEX(dst_fp, dst_type);
   1480 
   1481   if (dst_fp->ctf_link_type_mapping == NULL)
   1482     {
   1483       ctf_hash_fun f = ctf_hash_type_key;
   1484       ctf_hash_eq_fun e = ctf_hash_eq_type_key;
   1485 
   1486       if ((dst_fp->ctf_link_type_mapping = ctf_dynhash_create (f, e, free,
   1487 							       NULL)) == NULL)
   1488 	return;
   1489     }
   1490 
   1491   ctf_link_type_key_t *key;
   1492   key = calloc (1, sizeof (struct ctf_link_type_key));
   1493   if (!key)
   1494     return;
   1495 
   1496   key->cltk_fp = src_fp;
   1497   key->cltk_idx = src_type;
   1498 
   1499   /* No OOM checking needed, because if this doesn't work the worst we'll do is
   1500      add a few more duplicate types (which will probably run out of memory
   1501      anyway).  */
   1502   ctf_dynhash_insert (dst_fp->ctf_link_type_mapping, key,
   1503 		      (void *) (uintptr_t) dst_type);
   1504 }
   1505 
   1506 /* Look up a type mapping: return 0 if none.  The DST_FP is modified to point to
   1507    the parent if need be.  The ID returned is from the dst_fp's perspective.  */
   1508 static ctf_id_t
   1509 ctf_type_mapping (ctf_dict_t *src_fp, ctf_id_t src_type, ctf_dict_t **dst_fp)
   1510 {
   1511   ctf_link_type_key_t key;
   1512   ctf_dict_t *target_fp = *dst_fp;
   1513   ctf_id_t dst_type = 0;
   1514 
   1515   if (LCTF_TYPE_ISPARENT (src_fp, src_type) && src_fp->ctf_parent)
   1516     src_fp = src_fp->ctf_parent;
   1517 
   1518   src_type = LCTF_TYPE_TO_INDEX(src_fp, src_type);
   1519   key.cltk_fp = src_fp;
   1520   key.cltk_idx = src_type;
   1521 
   1522   if (target_fp->ctf_link_type_mapping)
   1523     dst_type = (uintptr_t) ctf_dynhash_lookup (target_fp->ctf_link_type_mapping,
   1524 					       &key);
   1525 
   1526   if (dst_type != 0)
   1527     {
   1528       dst_type = LCTF_INDEX_TO_TYPE (target_fp, dst_type,
   1529 				     target_fp->ctf_parent != NULL);
   1530       *dst_fp = target_fp;
   1531       return dst_type;
   1532     }
   1533 
   1534   if (target_fp->ctf_parent)
   1535     target_fp = target_fp->ctf_parent;
   1536   else
   1537     return 0;
   1538 
   1539   if (target_fp->ctf_link_type_mapping)
   1540     dst_type = (uintptr_t) ctf_dynhash_lookup (target_fp->ctf_link_type_mapping,
   1541 					       &key);
   1542 
   1543   if (dst_type)
   1544     dst_type = LCTF_INDEX_TO_TYPE (target_fp, dst_type,
   1545 				   target_fp->ctf_parent != NULL);
   1546 
   1547   *dst_fp = target_fp;
   1548   return dst_type;
   1549 }
   1550 
   1551 /* The ctf_add_type routine is used to copy a type from a source CTF dictionary
   1552    to a dynamic destination dictionary.  This routine operates recursively by
   1553    following the source type's links and embedded member types.  If the
   1554    destination dict already contains a named type which has the same attributes,
   1555    then we succeed and return this type but no changes occur.  */
   1556 static ctf_id_t
   1557 ctf_add_type_internal (ctf_dict_t *dst_fp, ctf_dict_t *src_fp, ctf_id_t src_type,
   1558 		       ctf_dict_t *proc_tracking_fp)
   1559 {
   1560   ctf_id_t dst_type = CTF_ERR;
   1561   uint32_t dst_kind = CTF_K_UNKNOWN;
   1562   ctf_dict_t *tmp_fp = dst_fp;
   1563   ctf_id_t tmp;
   1564 
   1565   const char *name;
   1566   uint32_t kind, forward_kind, flag, vlen;
   1567 
   1568   const ctf_type_t *src_tp, *dst_tp;
   1569   ctf_bundle_t src, dst;
   1570   ctf_encoding_t src_en, dst_en;
   1571   ctf_arinfo_t src_ar, dst_ar;
   1572 
   1573   ctf_funcinfo_t ctc;
   1574 
   1575   ctf_id_t orig_src_type = src_type;
   1576 
   1577   if (!(dst_fp->ctf_flags & LCTF_RDWR))
   1578     return (ctf_set_errno (dst_fp, ECTF_RDONLY));
   1579 
   1580   if ((src_tp = ctf_lookup_by_id (&src_fp, src_type)) == NULL)
   1581     return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
   1582 
   1583   if ((ctf_type_resolve (src_fp, src_type) == CTF_ERR)
   1584       && (ctf_errno (src_fp) == ECTF_NONREPRESENTABLE))
   1585     return (ctf_set_errno (dst_fp, ECTF_NONREPRESENTABLE));
   1586 
   1587   name = ctf_strptr (src_fp, src_tp->ctt_name);
   1588   kind = LCTF_INFO_KIND (src_fp, src_tp->ctt_info);
   1589   flag = LCTF_INFO_ISROOT (src_fp, src_tp->ctt_info);
   1590   vlen = LCTF_INFO_VLEN (src_fp, src_tp->ctt_info);
   1591 
   1592   /* If this is a type we are currently in the middle of adding, hand it
   1593      straight back.  (This lets us handle self-referential structures without
   1594      considering forwards and empty structures the same as their completed
   1595      forms.)  */
   1596 
   1597   tmp = ctf_type_mapping (src_fp, src_type, &tmp_fp);
   1598 
   1599   if (tmp != 0)
   1600     {
   1601       if (ctf_dynhash_lookup (proc_tracking_fp->ctf_add_processing,
   1602 			      (void *) (uintptr_t) src_type))
   1603 	return tmp;
   1604 
   1605       /* If this type has already been added from this dictionary, and is the
   1606 	 same kind and (if a struct or union) has the same number of members,
   1607 	 hand it straight back.  */
   1608 
   1609       if (ctf_type_kind_unsliced (tmp_fp, tmp) == (int) kind)
   1610 	{
   1611 	  if (kind == CTF_K_STRUCT || kind == CTF_K_UNION
   1612 	      || kind == CTF_K_ENUM)
   1613 	    {
   1614 	      if ((dst_tp = ctf_lookup_by_id (&tmp_fp, dst_type)) != NULL)
   1615 		if (vlen == LCTF_INFO_VLEN (tmp_fp, dst_tp->ctt_info))
   1616 		  return tmp;
   1617 	    }
   1618 	  else
   1619 	    return tmp;
   1620 	}
   1621     }
   1622 
   1623   forward_kind = kind;
   1624   if (kind == CTF_K_FORWARD)
   1625     forward_kind = src_tp->ctt_type;
   1626 
   1627   /* If the source type has a name and is a root type (visible at the top-level
   1628      scope), lookup the name in the destination dictionary and verify that it is
   1629      of the same kind before we do anything else.  */
   1630 
   1631   if ((flag & CTF_ADD_ROOT) && name[0] != '\0'
   1632       && (tmp = ctf_lookup_by_rawname (dst_fp, forward_kind, name)) != 0)
   1633     {
   1634       dst_type = tmp;
   1635       dst_kind = ctf_type_kind_unsliced (dst_fp, dst_type);
   1636     }
   1637 
   1638   /* If an identically named dst_type exists, fail with ECTF_CONFLICT
   1639      unless dst_type is a forward declaration and src_type is a struct,
   1640      union, or enum (i.e. the definition of the previous forward decl).
   1641 
   1642      We also allow addition in the opposite order (addition of a forward when a
   1643      struct, union, or enum already exists), which is a NOP and returns the
   1644      already-present struct, union, or enum.  */
   1645 
   1646   if (dst_type != CTF_ERR && dst_kind != kind)
   1647     {
   1648       if (kind == CTF_K_FORWARD
   1649 	  && (dst_kind == CTF_K_ENUM || dst_kind == CTF_K_STRUCT
   1650 	      || dst_kind == CTF_K_UNION))
   1651 	{
   1652 	  ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
   1653 	  return dst_type;
   1654 	}
   1655 
   1656       if (dst_kind != CTF_K_FORWARD
   1657 	  || (kind != CTF_K_ENUM && kind != CTF_K_STRUCT
   1658 	      && kind != CTF_K_UNION))
   1659 	{
   1660 	  ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
   1661 			_("ctf_add_type: conflict for type %s: "
   1662 			  "kinds differ, new: %i; old (ID %lx): %i"),
   1663 			name, kind, dst_type, dst_kind);
   1664 	  return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
   1665 	}
   1666     }
   1667 
   1668   /* We take special action for an integer, float, or slice since it is
   1669      described not only by its name but also its encoding.  For integers,
   1670      bit-fields exploit this degeneracy.  */
   1671 
   1672   if (kind == CTF_K_INTEGER || kind == CTF_K_FLOAT || kind == CTF_K_SLICE)
   1673     {
   1674       if (ctf_type_encoding (src_fp, src_type, &src_en) != 0)
   1675 	return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
   1676 
   1677       if (dst_type != CTF_ERR)
   1678 	{
   1679 	  ctf_dict_t *fp = dst_fp;
   1680 
   1681 	  if ((dst_tp = ctf_lookup_by_id (&fp, dst_type)) == NULL)
   1682 	    return CTF_ERR;
   1683 
   1684 	  if (ctf_type_encoding (dst_fp, dst_type, &dst_en) != 0)
   1685 	    return CTF_ERR;			/* errno set for us.  */
   1686 
   1687 	  if (LCTF_INFO_ISROOT (fp, dst_tp->ctt_info) & CTF_ADD_ROOT)
   1688 	    {
   1689 	      /* The type that we found in the hash is also root-visible.  If
   1690 		 the two types match then use the existing one; otherwise,
   1691 		 declare a conflict.  Note: slices are not certain to match
   1692 		 even if there is no conflict: we must check the contained type
   1693 		 too.  */
   1694 
   1695 	      if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
   1696 		{
   1697 		  if (kind != CTF_K_SLICE)
   1698 		    {
   1699 		      ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
   1700 		      return dst_type;
   1701 		    }
   1702 		}
   1703 	      else
   1704 		  {
   1705 		    return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
   1706 		  }
   1707 	    }
   1708 	  else
   1709 	    {
   1710 	      /* We found a non-root-visible type in the hash.  If its encoding
   1711 		 is the same, we can reuse it, unless it is a slice.  */
   1712 
   1713 	      if (memcmp (&src_en, &dst_en, sizeof (ctf_encoding_t)) == 0)
   1714 		{
   1715 		  if (kind != CTF_K_SLICE)
   1716 		    {
   1717 		      ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
   1718 		      return dst_type;
   1719 		    }
   1720 		}
   1721 	    }
   1722 	}
   1723     }
   1724 
   1725   src.ctb_dict = src_fp;
   1726   src.ctb_type = src_type;
   1727   src.ctb_dtd = NULL;
   1728 
   1729   dst.ctb_dict = dst_fp;
   1730   dst.ctb_type = dst_type;
   1731   dst.ctb_dtd = NULL;
   1732 
   1733   /* Now perform kind-specific processing.  If dst_type is CTF_ERR, then we add
   1734      a new type with the same properties as src_type to dst_fp.  If dst_type is
   1735      not CTF_ERR, then we verify that dst_type has the same attributes as
   1736      src_type.  We recurse for embedded references.  Before we start, we note
   1737      that we are processing this type, to prevent infinite recursion: we do not
   1738      re-process any type that appears in this list.  The list is emptied
   1739      wholesale at the end of processing everything in this recursive stack.  */
   1740 
   1741   if (ctf_dynhash_insert (proc_tracking_fp->ctf_add_processing,
   1742 			  (void *) (uintptr_t) src_type, (void *) 1) < 0)
   1743     return ctf_set_errno (dst_fp, ENOMEM);
   1744 
   1745   switch (kind)
   1746     {
   1747     case CTF_K_INTEGER:
   1748       /*  If we found a match we will have either returned it or declared a
   1749 	  conflict.  */
   1750       dst_type = ctf_add_integer (dst_fp, flag, name, &src_en);
   1751       break;
   1752 
   1753     case CTF_K_FLOAT:
   1754       /* If we found a match we will have either returned it or declared a
   1755        conflict.  */
   1756       dst_type = ctf_add_float (dst_fp, flag, name, &src_en);
   1757       break;
   1758 
   1759     case CTF_K_SLICE:
   1760       /* We have checked for conflicting encodings: now try to add the
   1761 	 contained type.  */
   1762       src_type = ctf_type_reference (src_fp, src_type);
   1763       src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
   1764 					proc_tracking_fp);
   1765 
   1766       if (src_type == CTF_ERR)
   1767 	return CTF_ERR;				/* errno is set for us.  */
   1768 
   1769       dst_type = ctf_add_slice (dst_fp, flag, src_type, &src_en);
   1770       break;
   1771 
   1772     case CTF_K_POINTER:
   1773     case CTF_K_VOLATILE:
   1774     case CTF_K_CONST:
   1775     case CTF_K_RESTRICT:
   1776       src_type = ctf_type_reference (src_fp, src_type);
   1777       src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
   1778 					proc_tracking_fp);
   1779 
   1780       if (src_type == CTF_ERR)
   1781 	return CTF_ERR;				/* errno is set for us.  */
   1782 
   1783       dst_type = ctf_add_reftype (dst_fp, flag, src_type, kind);
   1784       break;
   1785 
   1786     case CTF_K_ARRAY:
   1787       if (ctf_array_info (src_fp, src_type, &src_ar) != 0)
   1788 	return (ctf_set_errno (dst_fp, ctf_errno (src_fp)));
   1789 
   1790       src_ar.ctr_contents =
   1791 	ctf_add_type_internal (dst_fp, src_fp, src_ar.ctr_contents,
   1792 			       proc_tracking_fp);
   1793       src_ar.ctr_index = ctf_add_type_internal (dst_fp, src_fp,
   1794 						src_ar.ctr_index,
   1795 						proc_tracking_fp);
   1796       src_ar.ctr_nelems = src_ar.ctr_nelems;
   1797 
   1798       if (src_ar.ctr_contents == CTF_ERR || src_ar.ctr_index == CTF_ERR)
   1799 	return CTF_ERR;				/* errno is set for us.  */
   1800 
   1801       if (dst_type != CTF_ERR)
   1802 	{
   1803 	  if (ctf_array_info (dst_fp, dst_type, &dst_ar) != 0)
   1804 	    return CTF_ERR;			/* errno is set for us.  */
   1805 
   1806 	  if (memcmp (&src_ar, &dst_ar, sizeof (ctf_arinfo_t)))
   1807 	    {
   1808 	      ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
   1809 			    _("conflict for type %s against ID %lx: array info "
   1810 			      "differs, old %lx/%lx/%x; new: %lx/%lx/%x"),
   1811 			    name, dst_type, src_ar.ctr_contents,
   1812 			    src_ar.ctr_index, src_ar.ctr_nelems,
   1813 			    dst_ar.ctr_contents, dst_ar.ctr_index,
   1814 			    dst_ar.ctr_nelems);
   1815 	      return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
   1816 	    }
   1817 	}
   1818       else
   1819 	dst_type = ctf_add_array (dst_fp, flag, &src_ar);
   1820       break;
   1821 
   1822     case CTF_K_FUNCTION:
   1823       ctc.ctc_return = ctf_add_type_internal (dst_fp, src_fp,
   1824 					      src_tp->ctt_type,
   1825 					      proc_tracking_fp);
   1826       ctc.ctc_argc = 0;
   1827       ctc.ctc_flags = 0;
   1828 
   1829       if (ctc.ctc_return == CTF_ERR)
   1830 	return CTF_ERR;				/* errno is set for us.  */
   1831 
   1832       dst_type = ctf_add_function (dst_fp, flag, &ctc, NULL);
   1833       break;
   1834 
   1835     case CTF_K_STRUCT:
   1836     case CTF_K_UNION:
   1837       {
   1838 	ctf_next_t *i = NULL;
   1839 	ssize_t offset;
   1840 	const char *membname;
   1841 	ctf_id_t src_membtype;
   1842 
   1843 	/* Technically to match a struct or union we need to check both
   1844 	   ways (src members vs. dst, dst members vs. src) but we make
   1845 	   this more optimal by only checking src vs. dst and comparing
   1846 	   the total size of the structure (which we must do anyway)
   1847 	   which covers the possibility of dst members not in src.
   1848 	   This optimization can be defeated for unions, but is so
   1849 	   pathological as to render it irrelevant for our purposes.  */
   1850 
   1851 	if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
   1852 	    && dst_kind != CTF_K_FORWARD)
   1853 	  {
   1854 	    if (ctf_type_size (src_fp, src_type) !=
   1855 		ctf_type_size (dst_fp, dst_type))
   1856 	      {
   1857 		ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
   1858 			      _("conflict for type %s against ID %lx: union "
   1859 				"size differs, old %li, new %li"), name,
   1860 			      dst_type, (long) ctf_type_size (src_fp, src_type),
   1861 			      (long) ctf_type_size (dst_fp, dst_type));
   1862 		return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
   1863 	      }
   1864 
   1865 	    if (ctf_member_iter (src_fp, src_type, membcmp, &dst))
   1866 	      {
   1867 		ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
   1868 			      _("conflict for type %s against ID %lx: members "
   1869 				"differ, see above"), name, dst_type);
   1870 		return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
   1871 	      }
   1872 
   1873 	    break;
   1874 	  }
   1875 
   1876 	dst_type = ctf_add_struct_sized (dst_fp, flag, name,
   1877 					 ctf_type_size (src_fp, src_type));
   1878 	if (dst_type == CTF_ERR)
   1879 	  return CTF_ERR;			/* errno is set for us.  */
   1880 
   1881 	/* Pre-emptively add this struct to the type mapping so that
   1882 	   structures that refer to themselves work.  */
   1883 	ctf_add_type_mapping (src_fp, src_type, dst_fp, dst_type);
   1884 
   1885 	while ((offset = ctf_member_next (src_fp, src_type, &i, &membname,
   1886 					  &src_membtype, 0)) >= 0)
   1887 	  {
   1888 	    ctf_dict_t *dst = dst_fp;
   1889 	    ctf_id_t dst_membtype = ctf_type_mapping (src_fp, src_membtype, &dst);
   1890 
   1891 	    if (dst_membtype == 0)
   1892 	      {
   1893 		dst_membtype = ctf_add_type_internal (dst_fp, src_fp,
   1894 						      src_membtype,
   1895 						      proc_tracking_fp);
   1896 		if (dst_membtype == CTF_ERR)
   1897 		  {
   1898 		    if (ctf_errno (dst_fp) != ECTF_NONREPRESENTABLE)
   1899 		      {
   1900 			ctf_next_destroy (i);
   1901 			break;
   1902 		      }
   1903 		  }
   1904 	      }
   1905 
   1906 	    if (ctf_add_member_offset (dst_fp, dst_type, membname,
   1907 				       dst_membtype, offset) < 0)
   1908 	      {
   1909 		ctf_next_destroy (i);
   1910 		break;
   1911 	      }
   1912 	  }
   1913 	if (ctf_errno (src_fp) != ECTF_NEXT_END)
   1914 	  return CTF_ERR;			/* errno is set for us.  */
   1915 	break;
   1916       }
   1917 
   1918     case CTF_K_ENUM:
   1919       if (dst_type != CTF_ERR && kind != CTF_K_FORWARD
   1920 	  && dst_kind != CTF_K_FORWARD)
   1921 	{
   1922 	  if (ctf_enum_iter (src_fp, src_type, enumcmp, &dst)
   1923 	      || ctf_enum_iter (dst_fp, dst_type, enumcmp, &src))
   1924 	    {
   1925 	      ctf_err_warn (dst_fp, 1, ECTF_CONFLICT,
   1926 			    _("conflict for enum %s against ID %lx: members "
   1927 			      "differ, see above"), name, dst_type);
   1928 	      return (ctf_set_errno (dst_fp, ECTF_CONFLICT));
   1929 	    }
   1930 	}
   1931       else
   1932 	{
   1933 	  dst_type = ctf_add_enum (dst_fp, flag, name);
   1934 	  if ((dst.ctb_type = dst_type) == CTF_ERR
   1935 	      || ctf_enum_iter (src_fp, src_type, enumadd, &dst))
   1936 	    return CTF_ERR;			/* errno is set for us */
   1937 	}
   1938       break;
   1939 
   1940     case CTF_K_FORWARD:
   1941       if (dst_type == CTF_ERR)
   1942 	  dst_type = ctf_add_forward (dst_fp, flag, name, forward_kind);
   1943       break;
   1944 
   1945     case CTF_K_TYPEDEF:
   1946       src_type = ctf_type_reference (src_fp, src_type);
   1947       src_type = ctf_add_type_internal (dst_fp, src_fp, src_type,
   1948 					proc_tracking_fp);
   1949 
   1950       if (src_type == CTF_ERR)
   1951 	return CTF_ERR;				/* errno is set for us.  */
   1952 
   1953       /* If dst_type is not CTF_ERR at this point, we should check if
   1954 	 ctf_type_reference(dst_fp, dst_type) != src_type and if so fail with
   1955 	 ECTF_CONFLICT.  However, this causes problems with bitness typedefs
   1956 	 that vary based on things like if 32-bit then pid_t is int otherwise
   1957 	 long.  We therefore omit this check and assume that if the identically
   1958 	 named typedef already exists in dst_fp, it is correct or
   1959 	 equivalent.  */
   1960 
   1961       if (dst_type == CTF_ERR)
   1962 	  dst_type = ctf_add_typedef (dst_fp, flag, name, src_type);
   1963 
   1964       break;
   1965 
   1966     default:
   1967       return (ctf_set_errno (dst_fp, ECTF_CORRUPT));
   1968     }
   1969 
   1970   if (dst_type != CTF_ERR)
   1971     ctf_add_type_mapping (src_fp, orig_src_type, dst_fp, dst_type);
   1972   return dst_type;
   1973 }
   1974 
   1975 ctf_id_t
   1976 ctf_add_type (ctf_dict_t *dst_fp, ctf_dict_t *src_fp, ctf_id_t src_type)
   1977 {
   1978   ctf_id_t id;
   1979 
   1980   if (!src_fp->ctf_add_processing)
   1981     src_fp->ctf_add_processing = ctf_dynhash_create (ctf_hash_integer,
   1982 						     ctf_hash_eq_integer,
   1983 						     NULL, NULL);
   1984 
   1985   /* We store the hash on the source, because it contains only source type IDs:
   1986      but callers will invariably expect errors to appear on the dest.  */
   1987   if (!src_fp->ctf_add_processing)
   1988     return (ctf_set_errno (dst_fp, ENOMEM));
   1989 
   1990   id = ctf_add_type_internal (dst_fp, src_fp, src_type, src_fp);
   1991   ctf_dynhash_empty (src_fp->ctf_add_processing);
   1992 
   1993   return id;
   1994 }
   1995