Home | History | Annotate | Line # | Download | only in ctf
ctf_create.c revision 1.8
      1 /*
      2  * CDDL HEADER START
      3  *
      4  * The contents of this file are subject to the terms of the
      5  * Common Development and Distribution License, Version 1.0 only
      6  * (the "License").  You may not use this file except in compliance
      7  * with the License.
      8  *
      9  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
     10  * or http://www.opensolaris.org/os/licensing.
     11  * See the License for the specific language governing permissions
     12  * and limitations under the License.
     13  *
     14  * When distributing Covered Code, include this CDDL HEADER in each
     15  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
     16  * If applicable, add the following below this CDDL HEADER, with the
     17  * fields enclosed by brackets "[]" replaced with your own identifying
     18  * information: Portions Copyright [yyyy] [name of copyright owner]
     19  *
     20  * CDDL HEADER END
     21  */
     22 #ifdef HAVE_NBTOOL_CONFIG_H
     23 #include "nbtool_config.h"
     24 #endif
     25 
     26 /*
     27  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
     28  * Use is subject to license terms.
     29  */
     30 /*
     31  * Copyright (c) 2013, Joyent, Inc.  All rights reserved.
     32  */
     33 
     34 #include <sys/sysmacros.h>
     35 #include <sys/param.h>
     36 #include <sys/mman.h>
     37 #include <ctf_impl.h>
     38 #include <sys/debug.h>
     39 
     40 /*
     41  * This static string is used as the template for initially populating a
     42  * dynamic container's string table.  We always store \0 in the first byte,
     43  * and we use the generic string "PARENT" to mark this container's parent
     44  * if one is associated with the container using ctf_import().
     45  */
     46 static const char _CTF_STRTAB_TEMPLATE[] = "\0PARENT";
     47 
     48 /*
     49  * To create an empty CTF container, we just declare a zeroed header and call
     50  * ctf_bufopen() on it.  If ctf_bufopen succeeds, we mark the new container r/w
     51  * and initialize the dynamic members.  We set dtstrlen to 1 to reserve the
     52  * first byte of the string table for a \0 byte, and we start assigning type
     53  * IDs at 1 because type ID 0 is used as a sentinel.
     54  */
     55 ctf_file_t *
     56 ctf_create(int *errp)
     57 {
     58 	static const ctf_header_t hdr = { .cth_preamble = {
     59 		.ctp_magic = CTF_MAGIC,
     60 		.ctp_version = CTF_VERSION,
     61 		.ctp_flags = 0
     62 	} };
     63 
     64 	const ulong_t hashlen = 128;
     65 	ctf_dtdef_t **hash = ctf_alloc(hashlen * sizeof (ctf_dtdef_t *));
     66 	ctf_sect_t cts;
     67 	ctf_file_t *fp;
     68 
     69 	if (hash == NULL)
     70 		return (ctf_set_open_errno(errp, EAGAIN));
     71 
     72 	cts.cts_name = __UNCONST(_CTF_SECTION);
     73 	cts.cts_type = SHT_PROGBITS;
     74 	cts.cts_flags = 0;
     75 	cts.cts_data = __UNCONST(&hdr);
     76 	cts.cts_size = sizeof (hdr);
     77 	cts.cts_entsize = 1;
     78 	cts.cts_offset = 0;
     79 
     80 	if ((fp = ctf_bufopen(&cts, NULL, NULL, errp)) == NULL) {
     81 		ctf_free(hash, hashlen * sizeof (ctf_dtdef_t *));
     82 		return (NULL);
     83 	}
     84 
     85 	fp->ctf_flags |= LCTF_RDWR;
     86 	fp->ctf_dthashlen = hashlen;
     87 	memset(hash, 0, hashlen * sizeof (ctf_dtdef_t *));
     88 	fp->ctf_dthash = hash;
     89 	fp->ctf_dtstrlen = sizeof (_CTF_STRTAB_TEMPLATE);
     90 	fp->ctf_dtnextid = 1;
     91 	fp->ctf_dtoldid = 0;
     92 
     93 	return (fp);
     94 }
     95 
     96 static uchar_t *
     97 ctf_copy_smembers(const ctf_file_t *fp, ctf_dtdef_t *dtd, uint_t soff,
     98     uchar_t *t)
     99 {
    100 	ctf_dmdef_t *dmd = ctf_list_next(&dtd->dtd_u.dtu_members);
    101 	size_t sz;
    102 	uint_t name;
    103 
    104 	for (; dmd != NULL; dmd = ctf_list_next(dmd)) {
    105 		if (dmd->dmd_name) {
    106 			name = soff;
    107 			soff += strlen(dmd->dmd_name) + 1;
    108 		} else
    109 			name = 0;
    110 
    111 		if (fp->ctf_version == CTF_VERSION_2) {
    112 			struct ctf_member_v2 ctm;
    113 
    114 			ctm.ctm_name = name;
    115 			ctm.ctm_type = (ushort_t)dmd->dmd_type;
    116 			ctm.ctm_offset = (ushort_t)dmd->dmd_offset;
    117 
    118 			sz = sizeof (ctm);
    119 			memcpy(t, &ctm, sz);
    120 			t += sz;
    121 		} else {
    122 			struct ctf_member_v3 ctm;
    123 
    124 			ctm.ctm_name = name;
    125 			ctm.ctm_type = dmd->dmd_type;
    126 			ctm.ctm_offset = dmd->dmd_offset;
    127 
    128 			sz = sizeof (ctm);
    129 			memcpy(t, &ctm, sz);
    130 			t += sz;
    131 		}
    132 	}
    133 
    134 	return (t);
    135 }
    136 
    137 static uchar_t *
    138 ctf_copy_lmembers(const ctf_file_t *fp, ctf_dtdef_t *dtd, uint_t soff,
    139     uchar_t *t)
    140 {
    141 	ctf_dmdef_t *dmd = ctf_list_next(&dtd->dtd_u.dtu_members);
    142 	size_t sz;
    143 	uint_t name;
    144 
    145 	for (; dmd != NULL; dmd = ctf_list_next(dmd)) {
    146 		if (dmd->dmd_name) {
    147 			name = soff;
    148 			soff += strlen(dmd->dmd_name) + 1;
    149 		} else
    150 			name = 0;
    151 
    152 		if (fp->ctf_version == CTF_VERSION_2) {
    153 			struct ctf_lmember_v2 ctlm;
    154 
    155 			ctlm.ctlm_name = name;
    156 			ctlm.ctlm_type = (ushort_t)dmd->dmd_type;
    157 			ctlm.ctlm_pad = 0;
    158 			ctlm.ctlm_offsethi = CTF_OFFSET_TO_LMEMHI(dmd->dmd_offset);
    159 			ctlm.ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO(dmd->dmd_offset);
    160 
    161 			sz = sizeof (ctlm);
    162 			memcpy(t, &ctlm, sz);
    163 			t += sz;
    164 		} else {
    165 			struct ctf_lmember_v3 ctlm;
    166 
    167 			ctlm.ctlm_name = name;
    168 			ctlm.ctlm_type = dmd->dmd_type;
    169 			ctlm.ctlm_offsethi = CTF_OFFSET_TO_LMEMHI(dmd->dmd_offset);
    170 			ctlm.ctlm_offsetlo = CTF_OFFSET_TO_LMEMLO(dmd->dmd_offset);
    171 
    172 			sz = sizeof (ctlm);
    173 			memcpy(t, &ctlm, sz);
    174 			t += sz;
    175 		}
    176 
    177 	}
    178 
    179 	return (t);
    180 }
    181 
    182 static uchar_t *
    183 ctf_copy_emembers(ctf_dtdef_t *dtd, uint_t soff, uchar_t *t)
    184 {
    185 	ctf_dmdef_t *dmd = ctf_list_next(&dtd->dtd_u.dtu_members);
    186 	ctf_enum_t cte;
    187 
    188 	for (; dmd != NULL; dmd = ctf_list_next(dmd)) {
    189 		cte.cte_name = soff;
    190 		cte.cte_value = dmd->dmd_value;
    191 		soff += strlen(dmd->dmd_name) + 1;
    192 		memcpy(t, &cte, sizeof (cte));
    193 		t += sizeof (cte);
    194 	}
    195 
    196 	return (t);
    197 }
    198 
    199 static uchar_t *
    200 ctf_copy_membnames(ctf_dtdef_t *dtd, uchar_t *s)
    201 {
    202 	ctf_dmdef_t *dmd = ctf_list_next(&dtd->dtd_u.dtu_members);
    203 	size_t len;
    204 
    205 	for (; dmd != NULL; dmd = ctf_list_next(dmd)) {
    206 		if (dmd->dmd_name == NULL)
    207 			continue; /* skip anonymous members */
    208 		len = strlen(dmd->dmd_name) + 1;
    209 		memcpy(s, dmd->dmd_name, len);
    210 		s += len;
    211 	}
    212 
    213 	return (s);
    214 }
    215 
    216 /*
    217  * Only types of dyanmic CTF containers contain reference counts. These
    218  * containers are marked RD/WR. Because of that we basically make this a no-op
    219  * for compatability with non-dynamic CTF sections. This is also a no-op for
    220  * types which are not dynamic types. It is the responsibility of the caller to
    221  * make sure it is a valid type. We help that caller out on debug builds.
    222  *
    223  * Note that the reference counts are not maintained for types that are not
    224  * within this container. In other words if we have a type in a parent, that
    225  * will not have its reference count increased. On the flip side, the parent
    226  * will not be allowed to remove dynamic types if it has children.
    227  */
    228 static void
    229 ctf_ref_inc(ctf_file_t *fp, ctf_id_t tid)
    230 {
    231 	ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, tid);
    232 
    233 	if (dtd == NULL)
    234 		return;
    235 
    236 	if (!(fp->ctf_flags & LCTF_RDWR))
    237 		return;
    238 
    239 	dtd->dtd_ref++;
    240 }
    241 
    242 /*
    243  * Just as with ctf_ref_inc, this is a no-op on non-writeable containers and the
    244  * caller should ensure that this is already a valid type.
    245  */
    246 static void
    247 ctf_ref_dec(ctf_file_t *fp, ctf_id_t tid)
    248 {
    249 	ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, tid);
    250 
    251 	if (dtd == NULL)
    252 		return;
    253 
    254 	if (!(fp->ctf_flags & LCTF_RDWR))
    255 		return;
    256 
    257 	ASSERT(dtd->dtd_ref >= 1);
    258 	dtd->dtd_ref--;
    259 }
    260 
    261 /*
    262  * If the specified CTF container is writable and has been modified, reload
    263  * this container with the updated type definitions.  In order to make this
    264  * code and the rest of libctf as simple as possible, we perform updates by
    265  * taking the dynamic type definitions and creating an in-memory CTF file
    266  * containing the definitions, and then call ctf_bufopen() on it.  This not
    267  * only leverages ctf_bufopen(), but also avoids having to bifurcate the rest
    268  * of the library code with different lookup paths for static and dynamic
    269  * type definitions.  We are therefore optimizing greatly for lookup over
    270  * update, which we assume will be an uncommon operation.  We perform one
    271  * extra trick here for the benefit of callers and to keep our code simple:
    272  * ctf_bufopen() will return a new ctf_file_t, but we want to keep the fp
    273  * constant for the caller, so after ctf_bufopen() returns, we use memcpy to
    274  * swap the interior of the old and new ctf_file_t's, and then free the old.
    275  *
    276  * Note that the lists of dynamic types stays around and the resulting container
    277  * is still writeable. Furthermore, the reference counts that are on the dtd's
    278  * are still valid.
    279  */
    280 int
    281 ctf_update(ctf_file_t *fp)
    282 {
    283 	ctf_file_t ofp, *nfp;
    284 	ctf_header_t hdr;
    285 	ctf_dtdef_t *dtd;
    286 	ctf_sect_t cts;
    287 
    288 	uchar_t *s, *s0, *t;
    289 	size_t size;
    290 	void *buf;
    291 	int err;
    292 
    293 	if (!(fp->ctf_flags & LCTF_RDWR))
    294 		return (ctf_set_errno(fp, ECTF_RDONLY));
    295 
    296 	if (!(fp->ctf_flags & LCTF_DIRTY))
    297 		return (0); /* no update required */
    298 
    299 	/*
    300 	 * Fill in an initial CTF header.  We will leave the label, object,
    301 	 * and function sections empty and only output a header, type section,
    302 	 * and string table.  The type section begins at a 4-byte aligned
    303 	 * boundary past the CTF header itself (at relative offset zero).
    304 	 */
    305 	memset(&hdr, 0, sizeof (hdr));
    306 	hdr.cth_magic = CTF_MAGIC;
    307 	hdr.cth_version = fp->ctf_version;
    308 
    309 	if (fp->ctf_flags & LCTF_CHILD)
    310 		hdr.cth_parname = 1; /* i.e. _CTF_STRTAB_TEMPLATE[1] */
    311 
    312 	/*
    313 	 * Iterate through the dynamic type definition list and compute the
    314 	 * size of the CTF type section we will need to generate.
    315 	 */
    316 	for (size = 0, dtd = ctf_list_next(&fp->ctf_dtdefs);
    317 	    dtd != NULL; dtd = ctf_list_next(dtd)) {
    318 
    319 		uint_t kind = LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info);
    320 		uint_t vlen = LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info);
    321 
    322 		if (fp->ctf_version == CTF_VERSION_2) {
    323 			if (dtd->dtd_data.ctt_size != CTF_V2_LSIZE_SENT)
    324 				size += sizeof (struct ctf_stype_v2);
    325 			else
    326 				size += sizeof (struct ctf_type_v2);
    327 		} else {
    328 			if (dtd->dtd_data.ctt_size != LCTF_LSIZE_SENT(fp))
    329 				size += sizeof (struct ctf_stype_v3);
    330 			else
    331 				size += sizeof (struct ctf_type_v3);
    332 		}
    333 
    334 		switch (kind) {
    335 		case CTF_K_INTEGER:
    336 		case CTF_K_FLOAT:
    337 			size += sizeof (uint_t);
    338 			break;
    339 		case CTF_K_ARRAY:
    340 			size += fp->ctf_version == CTF_VERSION_2 ?
    341 			    sizeof (struct ctf_array_v2) :
    342 			    sizeof (struct ctf_array_v3);
    343 			break;
    344 		case CTF_K_FUNCTION:
    345 			size += roundup2(fp->ctf_idwidth * vlen, 4);
    346 			break;
    347 		case CTF_K_STRUCT:
    348 		case CTF_K_UNION:
    349 			if (fp->ctf_version == CTF_VERSION_2) {
    350 				if (dtd->dtd_data.ctt_size <
    351 				    LCTF_LSTRUCT_THRESH(fp))
    352 					size += sizeof (struct ctf_member_v2) *
    353 					    vlen;
    354 				else
    355 					size += sizeof (struct ctf_lmember_v2) *
    356 					    vlen;
    357 			} else {
    358 				if (dtd->dtd_data.ctt_size <
    359 				    LCTF_LSTRUCT_THRESH(fp))
    360 					size += sizeof (struct ctf_member_v3) *
    361 					    vlen;
    362 				else
    363 					size += sizeof (struct ctf_lmember_v3) *
    364 					    vlen;
    365 			}
    366 			break;
    367 		case CTF_K_ENUM:
    368 			size += sizeof (ctf_enum_t) * vlen;
    369 			break;
    370 		}
    371 	}
    372 
    373 	/*
    374 	 * Fill in the string table offset and size, compute the size of the
    375 	 * entire CTF buffer we need, and then allocate a new buffer and
    376 	 * memcpy the finished header to the start of the buffer.
    377 	 */
    378 	hdr.cth_stroff = hdr.cth_typeoff + size;
    379 	hdr.cth_strlen = fp->ctf_dtstrlen;
    380 	size = sizeof (ctf_header_t) + hdr.cth_stroff + hdr.cth_strlen;
    381 
    382 	if ((buf = ctf_data_alloc(size)) == MAP_FAILED)
    383 		return (ctf_set_errno(fp, EAGAIN));
    384 
    385 	memcpy(buf, &hdr, sizeof (ctf_header_t));
    386 	t = (uchar_t *)buf + sizeof (ctf_header_t);
    387 	s = s0 = (uchar_t *)buf + sizeof (ctf_header_t) + hdr.cth_stroff;
    388 
    389 	memcpy(s, _CTF_STRTAB_TEMPLATE, sizeof (_CTF_STRTAB_TEMPLATE));
    390 	s += sizeof (_CTF_STRTAB_TEMPLATE);
    391 
    392 	/*
    393 	 * We now take a final lap through the dynamic type definition list and
    394 	 * copy the appropriate type records and strings to the output buffer.
    395 	 */
    396 	for (dtd = ctf_list_next(&fp->ctf_dtdefs);
    397 	    dtd != NULL; dtd = ctf_list_next(dtd)) {
    398 		void *tp;
    399 		uint_t kind = LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info);
    400 		uint_t vlen = LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info);
    401 		struct ctf_type_v2 ctt;
    402 
    403 		uint_t encoding;
    404 		size_t len;
    405 
    406 		if (dtd->dtd_name != NULL) {
    407 			dtd->dtd_data.ctt_name = (uint_t)(s - s0);
    408 			len = strlen(dtd->dtd_name) + 1;
    409 			memcpy(s, dtd->dtd_name, len);
    410 			s += len;
    411 		} else
    412 			dtd->dtd_data.ctt_name = 0;
    413 
    414 		if (fp->ctf_version == CTF_VERSION_2) {
    415 			ctt.ctt_name = dtd->dtd_data.ctt_name;
    416 			ctt.ctt_info = (ushort_t)dtd->dtd_data.ctt_info;
    417 			ctt.ctt_size = (ushort_t)dtd->dtd_data.ctt_size;
    418 			if (dtd->dtd_data.ctt_size != CTF_V2_LSIZE_SENT)
    419 				len = sizeof (struct ctf_stype_v2);
    420 			else {
    421 				len = sizeof (struct ctf_type_v2);
    422 				ctt.ctt_lsizehi = dtd->dtd_data.ctt_lsizehi;
    423 				ctt.ctt_lsizelo = dtd->dtd_data.ctt_lsizelo;
    424 			}
    425 			tp = &ctt;
    426 		} else {
    427 			if (dtd->dtd_data.ctt_size != LCTF_LSIZE_SENT(fp))
    428 				len = sizeof (struct ctf_stype_v3);
    429 			else
    430 				len = sizeof (struct ctf_type_v3);
    431 			tp = &dtd->dtd_data;
    432 		}
    433 
    434 		memcpy(t, tp, len);
    435 		t += len;
    436 
    437 		switch (kind) {
    438 		case CTF_K_INTEGER:
    439 		case CTF_K_FLOAT:
    440 			if (kind == CTF_K_INTEGER) {
    441 				encoding = CTF_INT_DATA(
    442 				    dtd->dtd_u.dtu_enc.cte_format,
    443 				    dtd->dtd_u.dtu_enc.cte_offset,
    444 				    dtd->dtd_u.dtu_enc.cte_bits);
    445 			} else {
    446 				encoding = CTF_FP_DATA(
    447 				    dtd->dtd_u.dtu_enc.cte_format,
    448 				    dtd->dtd_u.dtu_enc.cte_offset,
    449 				    dtd->dtd_u.dtu_enc.cte_bits);
    450 			}
    451 			memcpy(t, &encoding, sizeof (encoding));
    452 			t += sizeof (encoding);
    453 			break;
    454 
    455 		case CTF_K_ARRAY:
    456 			if (fp->ctf_version == CTF_VERSION_2) {
    457 				struct ctf_array_v2 cta;
    458 
    459 				cta.cta_contents =
    460 				    (uint16_t)dtd->dtd_u.dtu_arr.ctr_contents;
    461 				cta.cta_index =
    462 				    (uint16_t)dtd->dtd_u.dtu_arr.ctr_index;
    463 				cta.cta_nelems = dtd->dtd_u.dtu_arr.ctr_nelems;
    464 
    465 				memcpy(t, &cta, sizeof (cta));
    466 				t += sizeof (cta);
    467 			} else {
    468 				struct ctf_array_v3 cta;
    469 
    470 				cta.cta_contents =
    471 				    dtd->dtd_u.dtu_arr.ctr_contents;
    472 				cta.cta_index = dtd->dtd_u.dtu_arr.ctr_index;
    473 				cta.cta_nelems = dtd->dtd_u.dtu_arr.ctr_nelems;
    474 
    475 				memcpy(t, &cta, sizeof (cta));
    476 				t += sizeof (cta);
    477 			}
    478 			break;
    479 
    480 		case CTF_K_FUNCTION: {
    481 			char *argv = (char *)(uintptr_t)t;
    482 			uint_t argc;
    483 
    484 			if (fp->ctf_version == CTF_VERSION_2) {
    485 				ushort_t arg;
    486 
    487 				for (argc = 0; argc < vlen;
    488 				    argc++, argv += sizeof(arg)) {
    489 					arg =
    490 					    (ushort_t)dtd->dtd_u.dtu_argv[argc];
    491 					memcpy(argv, &arg, sizeof(arg));
    492 				}
    493 			} else {
    494 				uint_t arg;
    495 
    496 				for (argc = 0; argc < vlen;
    497 				    argc++, argv += sizeof(arg)) {
    498 					arg = (uint_t)dtd->dtd_u.dtu_argv[argc];
    499 					memcpy(argv, &arg, sizeof(arg));
    500 				}
    501 			}
    502 
    503 			t = (uchar_t *)argv;
    504 			break;
    505 		}
    506 
    507 		case CTF_K_STRUCT:
    508 		case CTF_K_UNION:
    509 			if (dtd->dtd_data.ctt_size < LCTF_LSTRUCT_THRESH(fp))
    510 				t = ctf_copy_smembers(fp, dtd, (uint_t)(s - s0),
    511 				    t);
    512 			else
    513 				t = ctf_copy_lmembers(fp, dtd, (uint_t)(s - s0),
    514 				    t);
    515 			s = ctf_copy_membnames(dtd, s);
    516 			break;
    517 
    518 		case CTF_K_ENUM:
    519 			t = ctf_copy_emembers(dtd, (uint_t)(s - s0), t);
    520 			s = ctf_copy_membnames(dtd, s);
    521 			break;
    522 		}
    523 	}
    524 
    525 	/*
    526 	 * Finally, we are ready to ctf_bufopen() the new container.  If this
    527 	 * is successful, we then switch nfp and fp and free the old container.
    528 	 */
    529 	ctf_data_protect(buf, size);
    530 	cts.cts_name = _CTF_SECTION;
    531 	cts.cts_type = SHT_PROGBITS;
    532 	cts.cts_flags = 0;
    533 	cts.cts_data = buf;
    534 	cts.cts_size = size;
    535 	cts.cts_entsize = 1;
    536 	cts.cts_offset = 0;
    537 
    538 	if ((nfp = ctf_bufopen(&cts, NULL, NULL, &err)) == NULL) {
    539 		ctf_data_free(buf, size);
    540 		return (ctf_set_errno(fp, err));
    541 	}
    542 
    543 	(void) ctf_setmodel(nfp, ctf_getmodel(fp));
    544 	(void) ctf_import(nfp, fp->ctf_parent);
    545 
    546 	nfp->ctf_refcnt = fp->ctf_refcnt;
    547 	nfp->ctf_flags |= fp->ctf_flags & ~LCTF_DIRTY;
    548 	nfp->ctf_data.cts_data = NULL; /* force ctf_data_free() on close */
    549 	nfp->ctf_dthash = fp->ctf_dthash;
    550 	nfp->ctf_dthashlen = fp->ctf_dthashlen;
    551 	nfp->ctf_dtdefs = fp->ctf_dtdefs;
    552 	nfp->ctf_dtstrlen = fp->ctf_dtstrlen;
    553 	nfp->ctf_dtnextid = fp->ctf_dtnextid;
    554 	nfp->ctf_dtoldid = fp->ctf_dtnextid - 1;
    555 	nfp->ctf_specific = fp->ctf_specific;
    556 
    557 	fp->ctf_dthash = NULL;
    558 	fp->ctf_dthashlen = 0;
    559 	memset(&fp->ctf_dtdefs, 0, sizeof (ctf_list_t));
    560 
    561 	memcpy(&ofp, fp, sizeof (ctf_file_t));
    562 	memcpy(fp, nfp, sizeof (ctf_file_t));
    563 	memcpy(nfp, &ofp, sizeof (ctf_file_t));
    564 
    565 	/*
    566 	 * Initialize the ctf_lookup_by_name top-level dictionary.  We keep an
    567 	 * array of type name prefixes and the corresponding ctf_hash to use.
    568 	 * NOTE: This code must be kept in sync with the code in ctf_bufopen().
    569 	 */
    570 	fp->ctf_lookups[0].ctl_hash = &fp->ctf_structs;
    571 	fp->ctf_lookups[1].ctl_hash = &fp->ctf_unions;
    572 	fp->ctf_lookups[2].ctl_hash = &fp->ctf_enums;
    573 	fp->ctf_lookups[3].ctl_hash = &fp->ctf_names;
    574 
    575 	nfp->ctf_refcnt = 1; /* force nfp to be freed */
    576 	ctf_close(nfp);
    577 
    578 	return (0);
    579 }
    580 
    581 void
    582 ctf_dtd_insert(ctf_file_t *fp, ctf_dtdef_t *dtd)
    583 {
    584 	ulong_t h = dtd->dtd_type & (fp->ctf_dthashlen - 1);
    585 
    586 	dtd->dtd_hash = fp->ctf_dthash[h];
    587 	fp->ctf_dthash[h] = dtd;
    588 	ctf_list_append(&fp->ctf_dtdefs, dtd);
    589 }
    590 
    591 void
    592 ctf_dtd_delete(ctf_file_t *fp, ctf_dtdef_t *dtd)
    593 {
    594 	ulong_t h = dtd->dtd_type & (fp->ctf_dthashlen - 1);
    595 	ctf_dtdef_t *p, **q = &fp->ctf_dthash[h];
    596 	ctf_dmdef_t *dmd, *nmd;
    597 	size_t len;
    598 	int kind, i;
    599 
    600 	for (p = *q; p != NULL; p = p->dtd_hash) {
    601 		if (p != dtd)
    602 			q = &p->dtd_hash;
    603 		else
    604 			break;
    605 	}
    606 
    607 	if (p != NULL)
    608 		*q = p->dtd_hash;
    609 
    610 	kind = LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info);
    611 	switch (kind) {
    612 	case CTF_K_STRUCT:
    613 	case CTF_K_UNION:
    614 	case CTF_K_ENUM:
    615 		for (dmd = ctf_list_next(&dtd->dtd_u.dtu_members);
    616 		    dmd != NULL; dmd = nmd) {
    617 			if (dmd->dmd_name != NULL) {
    618 				len = strlen(dmd->dmd_name) + 1;
    619 				ctf_free(dmd->dmd_name, len);
    620 				fp->ctf_dtstrlen -= len;
    621 			}
    622 			if (kind != CTF_K_ENUM)
    623 				ctf_ref_dec(fp, dmd->dmd_type);
    624 			nmd = ctf_list_next(dmd);
    625 			ctf_free(dmd, sizeof (ctf_dmdef_t));
    626 		}
    627 		break;
    628 	case CTF_K_FUNCTION:
    629 		ctf_ref_dec(fp, dtd->dtd_data.ctt_type);
    630 		for (i = 0; i < LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info); i++)
    631 			if (dtd->dtd_u.dtu_argv[i] != 0)
    632 				ctf_ref_dec(fp, dtd->dtd_u.dtu_argv[i]);
    633 		ctf_free(dtd->dtd_u.dtu_argv, sizeof (ctf_id_t) *
    634 		    LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info));
    635 		break;
    636 	case CTF_K_ARRAY:
    637 		ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_contents);
    638 		ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_index);
    639 		break;
    640 	case CTF_K_TYPEDEF:
    641 		ctf_ref_dec(fp, dtd->dtd_data.ctt_type);
    642 		break;
    643 	case CTF_K_POINTER:
    644 	case CTF_K_VOLATILE:
    645 	case CTF_K_CONST:
    646 	case CTF_K_RESTRICT:
    647 		ctf_ref_dec(fp, dtd->dtd_data.ctt_type);
    648 		break;
    649 	}
    650 
    651 	if (dtd->dtd_name) {
    652 		len = strlen(dtd->dtd_name) + 1;
    653 		ctf_free(dtd->dtd_name, len);
    654 		fp->ctf_dtstrlen -= len;
    655 	}
    656 
    657 	ctf_list_delete(&fp->ctf_dtdefs, dtd);
    658 	ctf_free(dtd, sizeof (ctf_dtdef_t));
    659 }
    660 
    661 ctf_dtdef_t *
    662 ctf_dtd_lookup(ctf_file_t *fp, ctf_id_t type)
    663 {
    664 	ulong_t h = type & (fp->ctf_dthashlen - 1);
    665 	ctf_dtdef_t *dtd;
    666 
    667 	if (fp->ctf_dthash == NULL)
    668 		return (NULL);
    669 
    670 	for (dtd = fp->ctf_dthash[h]; dtd != NULL; dtd = dtd->dtd_hash) {
    671 		if (dtd->dtd_type == type)
    672 			break;
    673 	}
    674 
    675 	return (dtd);
    676 }
    677 
    678 /*
    679  * Discard all of the dynamic type definitions that have been added to the
    680  * container since the last call to ctf_update().  We locate such types by
    681  * scanning the list and deleting elements that have type IDs greater than
    682  * ctf_dtoldid, which is set by ctf_update(), above. Note that to work properly
    683  * with our reference counting schemes, we must delete the dynamic list in
    684  * reverse.
    685  */
    686 int
    687 ctf_discard(ctf_file_t *fp)
    688 {
    689 	ctf_dtdef_t *dtd, *ntd;
    690 
    691 	if (!(fp->ctf_flags & LCTF_RDWR))
    692 		return (ctf_set_errno(fp, ECTF_RDONLY));
    693 
    694 	if (!(fp->ctf_flags & LCTF_DIRTY))
    695 		return (0); /* no update required */
    696 
    697 	for (dtd = ctf_list_prev(&fp->ctf_dtdefs); dtd != NULL; dtd = ntd) {
    698 		ntd = ctf_list_prev(dtd);
    699 		if (LCTF_TYPE_TO_INDEX(fp, dtd->dtd_type) <= fp->ctf_dtoldid)
    700 			continue; /* skip types that have been committed */
    701 
    702 		ctf_dtd_delete(fp, dtd);
    703 	}
    704 
    705 	fp->ctf_dtnextid = fp->ctf_dtoldid + 1;
    706 	fp->ctf_flags &= ~LCTF_DIRTY;
    707 
    708 	return (0);
    709 }
    710 
    711 static ctf_id_t
    712 ctf_add_generic(ctf_file_t *fp, uint_t flag, const char *name, ctf_dtdef_t **rp)
    713 {
    714 	ctf_dtdef_t *dtd;
    715 	ctf_id_t type;
    716 	char *s = NULL;
    717 
    718 	if (flag != CTF_ADD_NONROOT && flag != CTF_ADD_ROOT)
    719 		return (ctf_set_errno(fp, EINVAL));
    720 
    721 	if (!(fp->ctf_flags & LCTF_RDWR))
    722 		return (ctf_set_errno(fp, ECTF_RDONLY));
    723 
    724 	if (LCTF_INDEX_TO_TYPE(fp, fp->ctf_dtnextid, 1) > LCTF_MAX_TYPE(fp)) {
    725 		ctf_dprintf("type id overflow %lu\n", fp->ctf_dtnextid);
    726 		return (ctf_set_errno(fp, ECTF_FULL));
    727 	}
    728 
    729 	if ((dtd = ctf_alloc(sizeof (ctf_dtdef_t))) == NULL)
    730 		return (ctf_set_errno(fp, EAGAIN));
    731 
    732 	if (name != NULL && *name != '\0' && (s = ctf_strdup(name)) == NULL) {
    733 		ctf_free(dtd, sizeof (ctf_dtdef_t));
    734 		return (ctf_set_errno(fp, EAGAIN));
    735 	}
    736 
    737 	type = fp->ctf_dtnextid++;
    738 	type = LCTF_INDEX_TO_TYPE(fp, type, (fp->ctf_flags & LCTF_CHILD));
    739 
    740 	memset(dtd, 0, sizeof (ctf_dtdef_t));
    741 	dtd->dtd_name = s;
    742 	dtd->dtd_type = type;
    743 
    744 	if (s != NULL)
    745 		fp->ctf_dtstrlen += strlen(s) + 1;
    746 
    747 	ctf_dtd_insert(fp, dtd);
    748 	fp->ctf_flags |= LCTF_DIRTY;
    749 
    750 	*rp = dtd;
    751 	return (type);
    752 }
    753 
    754 /*
    755  * When encoding integer sizes, we want to convert a byte count in the range
    756  * 1-8 to the closest power of 2 (e.g. 3->4, 5->8, etc).  The clp2() function
    757  * is a clever implementation from "Hacker's Delight" by Henry Warren, Jr.
    758  */
    759 static size_t
    760 clp2(size_t x)
    761 {
    762 	x--;
    763 
    764 	x |= (x >> 1);
    765 	x |= (x >> 2);
    766 	x |= (x >> 4);
    767 	x |= (x >> 8);
    768 	x |= (x >> 16);
    769 
    770 	return (x + 1);
    771 }
    772 
    773 static ctf_id_t
    774 ctf_add_encoded(ctf_file_t *fp, uint_t flag,
    775     const char *name, const ctf_encoding_t *ep, uint_t kind)
    776 {
    777 	ctf_dtdef_t *dtd;
    778 	ctf_id_t type;
    779 
    780 	if (ep == NULL)
    781 		return (ctf_set_errno(fp, EINVAL));
    782 
    783 	if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR)
    784 		return (CTF_ERR); /* errno is set for us */
    785 
    786 	dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, kind, flag, 0);
    787 	dtd->dtd_data.ctt_size = clp2(P2ROUNDUP(ep->cte_bits, NBBY) / NBBY);
    788 	dtd->dtd_u.dtu_enc = *ep;
    789 
    790 	return (type);
    791 }
    792 
    793 static ctf_id_t
    794 ctf_add_reftype(ctf_file_t *fp, uint_t flag, ctf_id_t ref, uint_t kind)
    795 {
    796 	ctf_dtdef_t *dtd;
    797 	ctf_id_t type;
    798 
    799 	if (ref == CTF_ERR || ref < 0 || ref > LCTF_MAX_TYPE(fp))
    800 		return (ctf_set_errno(fp, EINVAL));
    801 
    802 	if ((type = ctf_add_generic(fp, flag, NULL, &dtd)) == CTF_ERR)
    803 		return (CTF_ERR); /* errno is set for us */
    804 
    805 	ctf_ref_inc(fp, ref);
    806 
    807 	dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, kind, flag, 0);
    808 	dtd->dtd_data.ctt_type = (uint_t)ref;
    809 
    810 	return (type);
    811 }
    812 
    813 ctf_id_t
    814 ctf_add_integer(ctf_file_t *fp, uint_t flag,
    815     const char *name, const ctf_encoding_t *ep)
    816 {
    817 	return (ctf_add_encoded(fp, flag, name, ep, CTF_K_INTEGER));
    818 }
    819 
    820 ctf_id_t
    821 ctf_add_float(ctf_file_t *fp, uint_t flag,
    822     const char *name, const ctf_encoding_t *ep)
    823 {
    824 	return (ctf_add_encoded(fp, flag, name, ep, CTF_K_FLOAT));
    825 }
    826 
    827 ctf_id_t
    828 ctf_add_pointer(ctf_file_t *fp, uint_t flag, ctf_id_t ref)
    829 {
    830 	return (ctf_add_reftype(fp, flag, ref, CTF_K_POINTER));
    831 }
    832 
    833 ctf_id_t
    834 ctf_add_array(ctf_file_t *fp, uint_t flag, const ctf_arinfo_t *arp)
    835 {
    836 	ctf_dtdef_t *dtd;
    837 	ctf_id_t type;
    838 	ctf_file_t *fpd;
    839 
    840 	if (arp == NULL)
    841 		return (ctf_set_errno(fp, EINVAL));
    842 
    843 	fpd = fp;
    844 	if (ctf_lookup_by_id(&fpd, arp->ctr_contents) == NULL &&
    845 	    ctf_dtd_lookup(fp, arp->ctr_contents) == NULL)
    846 		return (ctf_set_errno(fp, ECTF_BADID));
    847 
    848 	fpd = fp;
    849 	if (ctf_lookup_by_id(&fpd, arp->ctr_index) == NULL &&
    850 	    ctf_dtd_lookup(fp, arp->ctr_index) == NULL)
    851 		return (ctf_set_errno(fp, ECTF_BADID));
    852 
    853 	if ((type = ctf_add_generic(fp, flag, NULL, &dtd)) == CTF_ERR)
    854 		return (CTF_ERR); /* errno is set for us */
    855 
    856 	dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_ARRAY, flag, 0);
    857 	dtd->dtd_data.ctt_size = 0;
    858 	dtd->dtd_u.dtu_arr = *arp;
    859 	ctf_ref_inc(fp, arp->ctr_contents);
    860 	ctf_ref_inc(fp, arp->ctr_index);
    861 
    862 	return (type);
    863 }
    864 
    865 int
    866 ctf_set_array(ctf_file_t *fp, ctf_id_t type, const ctf_arinfo_t *arp)
    867 {
    868 	ctf_file_t *fpd;
    869 	ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, type);
    870 
    871 	if (!(fp->ctf_flags & LCTF_RDWR))
    872 		return (ctf_set_errno(fp, ECTF_RDONLY));
    873 
    874 	if (dtd == NULL ||
    875 	    LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info) != CTF_K_ARRAY)
    876 		return (ctf_set_errno(fp, ECTF_BADID));
    877 
    878 	fpd = fp;
    879 	if (ctf_lookup_by_id(&fpd, arp->ctr_contents) == NULL &&
    880 	    ctf_dtd_lookup(fp, arp->ctr_contents) == NULL)
    881 		return (ctf_set_errno(fp, ECTF_BADID));
    882 
    883 	fpd = fp;
    884 	if (ctf_lookup_by_id(&fpd, arp->ctr_index) == NULL &&
    885 	    ctf_dtd_lookup(fp, arp->ctr_index) == NULL)
    886 		return (ctf_set_errno(fp, ECTF_BADID));
    887 
    888 	ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_contents);
    889 	ctf_ref_dec(fp, dtd->dtd_u.dtu_arr.ctr_index);
    890 	fp->ctf_flags |= LCTF_DIRTY;
    891 	dtd->dtd_u.dtu_arr = *arp;
    892 	ctf_ref_inc(fp, arp->ctr_contents);
    893 	ctf_ref_inc(fp, arp->ctr_index);
    894 
    895 	return (0);
    896 }
    897 
    898 ctf_id_t
    899 ctf_add_function(ctf_file_t *fp, uint_t flag,
    900     const ctf_funcinfo_t *ctc, const ctf_id_t *argv)
    901 {
    902 	ctf_dtdef_t *dtd;
    903 	ctf_id_t type;
    904 	uint_t vlen;
    905 	int i;
    906 	ctf_id_t *vdat = NULL;
    907 	ctf_file_t *fpd;
    908 
    909 	if (ctc == NULL || (ctc->ctc_flags & ~CTF_FUNC_VARARG) != 0 ||
    910 	    (ctc->ctc_argc != 0 && argv == NULL))
    911 		return (ctf_set_errno(fp, EINVAL));
    912 
    913 	vlen = ctc->ctc_argc;
    914 	if (ctc->ctc_flags & CTF_FUNC_VARARG)
    915 		vlen++; /* add trailing zero to indicate varargs (see below) */
    916 
    917 	if (vlen > LCTF_MAX_VLEN(fp))
    918 		return (ctf_set_errno(fp, EOVERFLOW));
    919 
    920 	fpd = fp;
    921 	if (ctf_lookup_by_id(&fpd, ctc->ctc_return) == NULL &&
    922 	    ctf_dtd_lookup(fp, ctc->ctc_return) == NULL)
    923 		return (ctf_set_errno(fp, ECTF_BADID));
    924 
    925 	for (i = 0; i < ctc->ctc_argc; i++) {
    926 		fpd = fp;
    927 		if (ctf_lookup_by_id(&fpd, argv[i]) == NULL &&
    928 		    ctf_dtd_lookup(fp, argv[i]) == NULL)
    929 			return (ctf_set_errno(fp, ECTF_BADID));
    930 	}
    931 
    932 	if (vlen != 0 && (vdat = ctf_alloc(sizeof (ctf_id_t) * vlen)) == NULL)
    933 		return (ctf_set_errno(fp, EAGAIN));
    934 
    935 	if ((type = ctf_add_generic(fp, flag, NULL, &dtd)) == CTF_ERR) {
    936 		ctf_free(vdat, sizeof (ctf_id_t) * vlen);
    937 		return (CTF_ERR); /* errno is set for us */
    938 	}
    939 
    940 	dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_FUNCTION, flag, vlen);
    941 	dtd->dtd_data.ctt_type = ctc->ctc_return;
    942 
    943 	ctf_ref_inc(fp, ctc->ctc_return);
    944 	for (i = 0; i < ctc->ctc_argc; i++)
    945 		ctf_ref_inc(fp, argv[i]);
    946 
    947 	memcpy(vdat, argv, sizeof (ctf_id_t) * ctc->ctc_argc);
    948 	if (ctc->ctc_flags & CTF_FUNC_VARARG)
    949 		vdat[vlen - 1] = 0; /* add trailing zero to indicate varargs */
    950 	dtd->dtd_u.dtu_argv = vdat;
    951 
    952 	return (type);
    953 }
    954 
    955 ctf_id_t
    956 ctf_add_struct(ctf_file_t *fp, uint_t flag, const char *name)
    957 {
    958 	ctf_hash_t *hp = &fp->ctf_structs;
    959 	ctf_helem_t *hep = NULL;
    960 	ctf_dtdef_t *dtd;
    961 	ctf_id_t type;
    962 
    963 	if (name != NULL)
    964 		hep = ctf_hash_lookup(hp, fp, name, strlen(name));
    965 
    966 	if (hep != NULL && ctf_type_kind(fp, hep->h_type) == CTF_K_FORWARD)
    967 		dtd = ctf_dtd_lookup(fp, type = hep->h_type);
    968 	else if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR)
    969 		return (CTF_ERR); /* errno is set for us */
    970 
    971 	dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_STRUCT, flag, 0);
    972 	dtd->dtd_data.ctt_size = 0;
    973 
    974 	return (type);
    975 }
    976 
    977 ctf_id_t
    978 ctf_add_union(ctf_file_t *fp, uint_t flag, const char *name)
    979 {
    980 	ctf_hash_t *hp = &fp->ctf_unions;
    981 	ctf_helem_t *hep = NULL;
    982 	ctf_dtdef_t *dtd;
    983 	ctf_id_t type;
    984 
    985 	if (name != NULL)
    986 		hep = ctf_hash_lookup(hp, fp, name, strlen(name));
    987 
    988 	if (hep != NULL && ctf_type_kind(fp, hep->h_type) == CTF_K_FORWARD)
    989 		dtd = ctf_dtd_lookup(fp, type = hep->h_type);
    990 	else if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR)
    991 		return (CTF_ERR); /* errno is set for us */
    992 
    993 	dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_UNION, flag, 0);
    994 	dtd->dtd_data.ctt_size = 0;
    995 
    996 	return (type);
    997 }
    998 
    999 ctf_id_t
   1000 ctf_add_enum(ctf_file_t *fp, uint_t flag, const char *name)
   1001 {
   1002 	ctf_hash_t *hp = &fp->ctf_enums;
   1003 	ctf_helem_t *hep = NULL;
   1004 	ctf_dtdef_t *dtd;
   1005 	ctf_id_t type;
   1006 
   1007 	if (name != NULL)
   1008 		hep = ctf_hash_lookup(hp, fp, name, strlen(name));
   1009 
   1010 	if (hep != NULL && ctf_type_kind(fp, hep->h_type) == CTF_K_FORWARD)
   1011 		dtd = ctf_dtd_lookup(fp, type = hep->h_type);
   1012 	else if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR)
   1013 		return (CTF_ERR); /* errno is set for us */
   1014 
   1015 	dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_ENUM, flag, 0);
   1016 	dtd->dtd_data.ctt_size = fp->ctf_dmodel->ctd_int;
   1017 
   1018 	return (type);
   1019 }
   1020 
   1021 ctf_id_t
   1022 ctf_add_forward(ctf_file_t *fp, uint_t flag, const char *name, uint_t kind)
   1023 {
   1024 	ctf_hash_t *hp;
   1025 	ctf_helem_t *hep;
   1026 	ctf_dtdef_t *dtd;
   1027 	ctf_id_t type;
   1028 
   1029 	switch (kind) {
   1030 	case CTF_K_STRUCT:
   1031 		hp = &fp->ctf_structs;
   1032 		break;
   1033 	case CTF_K_UNION:
   1034 		hp = &fp->ctf_unions;
   1035 		break;
   1036 	case CTF_K_ENUM:
   1037 		hp = &fp->ctf_enums;
   1038 		break;
   1039 	default:
   1040 		return (ctf_set_errno(fp, ECTF_NOTSUE));
   1041 	}
   1042 
   1043 	/*
   1044 	 * If the type is already defined or exists as a forward tag, just
   1045 	 * return the ctf_id_t of the existing definition.
   1046 	 */
   1047 	if (name != NULL && (hep = ctf_hash_lookup(hp,
   1048 	    fp, name, strlen(name))) != NULL)
   1049 		return (hep->h_type);
   1050 
   1051 	if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR)
   1052 		return (CTF_ERR); /* errno is set for us */
   1053 
   1054 	dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_FORWARD, flag, 0);
   1055 	dtd->dtd_data.ctt_type = kind;
   1056 
   1057 	return (type);
   1058 }
   1059 
   1060 ctf_id_t
   1061 ctf_add_typedef(ctf_file_t *fp, uint_t flag, const char *name, ctf_id_t ref)
   1062 {
   1063 	ctf_dtdef_t *dtd;
   1064 	ctf_id_t type;
   1065 	ctf_file_t *fpd;
   1066 
   1067 	fpd = fp;
   1068 	if (ref == CTF_ERR || (ctf_lookup_by_id(&fpd, ref) == NULL &&
   1069 	    ctf_dtd_lookup(fp, ref) == NULL))
   1070 		return (ctf_set_errno(fp, EINVAL));
   1071 
   1072 	if ((type = ctf_add_generic(fp, flag, name, &dtd)) == CTF_ERR)
   1073 		return (CTF_ERR); /* errno is set for us */
   1074 
   1075 	dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, CTF_K_TYPEDEF, flag, 0);
   1076 	dtd->dtd_data.ctt_type = ref;
   1077 	ctf_ref_inc(fp, ref);
   1078 
   1079 	return (type);
   1080 }
   1081 
   1082 ctf_id_t
   1083 ctf_add_volatile(ctf_file_t *fp, uint_t flag, ctf_id_t ref)
   1084 {
   1085 	return (ctf_add_reftype(fp, flag, ref, CTF_K_VOLATILE));
   1086 }
   1087 
   1088 ctf_id_t
   1089 ctf_add_const(ctf_file_t *fp, uint_t flag, ctf_id_t ref)
   1090 {
   1091 	return (ctf_add_reftype(fp, flag, ref, CTF_K_CONST));
   1092 }
   1093 
   1094 ctf_id_t
   1095 ctf_add_restrict(ctf_file_t *fp, uint_t flag, ctf_id_t ref)
   1096 {
   1097 	return (ctf_add_reftype(fp, flag, ref, CTF_K_RESTRICT));
   1098 }
   1099 
   1100 int
   1101 ctf_add_enumerator(ctf_file_t *fp, ctf_id_t enid, const char *name, int value)
   1102 {
   1103 	ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, enid);
   1104 	ctf_dmdef_t *dmd;
   1105 
   1106 	uint_t kind, vlen, root;
   1107 	char *s;
   1108 
   1109 	if (name == NULL)
   1110 		return (ctf_set_errno(fp, EINVAL));
   1111 
   1112 	if (!(fp->ctf_flags & LCTF_RDWR))
   1113 		return (ctf_set_errno(fp, ECTF_RDONLY));
   1114 
   1115 	if (dtd == NULL)
   1116 		return (ctf_set_errno(fp, ECTF_BADID));
   1117 
   1118 	kind = LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info);
   1119 	root = LCTF_INFO_ROOT(fp, dtd->dtd_data.ctt_info);
   1120 	vlen = LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info);
   1121 
   1122 	if (kind != CTF_K_ENUM)
   1123 		return (ctf_set_errno(fp, ECTF_NOTENUM));
   1124 
   1125 	if (vlen > LCTF_MAX_VLEN(fp))
   1126 		return (ctf_set_errno(fp, ECTF_DTFULL));
   1127 
   1128 	for (dmd = ctf_list_next(&dtd->dtd_u.dtu_members);
   1129 	    dmd != NULL; dmd = ctf_list_next(dmd)) {
   1130 		if (strcmp(dmd->dmd_name, name) == 0)
   1131 			return (ctf_set_errno(fp, ECTF_DUPMEMBER));
   1132 	}
   1133 
   1134 	if ((dmd = ctf_alloc(sizeof (ctf_dmdef_t))) == NULL)
   1135 		return (ctf_set_errno(fp, EAGAIN));
   1136 
   1137 	if ((s = ctf_strdup(name)) == NULL) {
   1138 		ctf_free(dmd, sizeof (ctf_dmdef_t));
   1139 		return (ctf_set_errno(fp, EAGAIN));
   1140 	}
   1141 
   1142 	dmd->dmd_name = s;
   1143 	dmd->dmd_type = CTF_ERR;
   1144 	dmd->dmd_offset = 0;
   1145 	dmd->dmd_value = value;
   1146 
   1147 	dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, kind, root, vlen + 1);
   1148 	ctf_list_append(&dtd->dtd_u.dtu_members, dmd);
   1149 
   1150 	fp->ctf_dtstrlen += strlen(s) + 1;
   1151 	fp->ctf_flags |= LCTF_DIRTY;
   1152 
   1153 	return (0);
   1154 }
   1155 
   1156 int
   1157 ctf_add_member(ctf_file_t *fp, ctf_id_t souid, const char *name, ctf_id_t type)
   1158 {
   1159 	ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, souid);
   1160 	ctf_dmdef_t *dmd;
   1161 
   1162 	ssize_t msize, malign, ssize;
   1163 	uint_t kind, vlen, root;
   1164 	char *s = NULL;
   1165 
   1166 	if (!(fp->ctf_flags & LCTF_RDWR))
   1167 		return (ctf_set_errno(fp, ECTF_RDONLY));
   1168 
   1169 	if (dtd == NULL)
   1170 		return (ctf_set_errno(fp, ECTF_BADID));
   1171 
   1172 	kind = LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info);
   1173 	root = LCTF_INFO_ROOT(fp, dtd->dtd_data.ctt_info);
   1174 	vlen = LCTF_INFO_VLEN(fp, dtd->dtd_data.ctt_info);
   1175 
   1176 	if (kind != CTF_K_STRUCT && kind != CTF_K_UNION)
   1177 		return (ctf_set_errno(fp, ECTF_NOTSOU));
   1178 
   1179 	if (vlen > LCTF_MAX_VLEN(fp))
   1180 		return (ctf_set_errno(fp, ECTF_DTFULL));
   1181 
   1182 	if (name != NULL) {
   1183 		for (dmd = ctf_list_next(&dtd->dtd_u.dtu_members);
   1184 		    dmd != NULL; dmd = ctf_list_next(dmd)) {
   1185 			if (dmd->dmd_name != NULL &&
   1186 			    strcmp(dmd->dmd_name, name) == 0)
   1187 				return (ctf_set_errno(fp, ECTF_DUPMEMBER));
   1188 		}
   1189 	}
   1190 
   1191 	if ((msize = ctf_type_size(fp, type)) == CTF_ERR ||
   1192 	    (malign = ctf_type_align(fp, type)) == CTF_ERR)
   1193 		return (CTF_ERR); /* errno is set for us */
   1194 
   1195 	if ((dmd = ctf_alloc(sizeof (ctf_dmdef_t))) == NULL)
   1196 		return (ctf_set_errno(fp, EAGAIN));
   1197 
   1198 	if (name != NULL && (s = ctf_strdup(name)) == NULL) {
   1199 		ctf_free(dmd, sizeof (ctf_dmdef_t));
   1200 		return (ctf_set_errno(fp, EAGAIN));
   1201 	}
   1202 
   1203 	dmd->dmd_name = s;
   1204 	dmd->dmd_type = type;
   1205 	dmd->dmd_value = -1;
   1206 
   1207 	if (kind == CTF_K_STRUCT && vlen != 0) {
   1208 		ctf_dmdef_t *lmd = ctf_list_prev(&dtd->dtd_u.dtu_members);
   1209 		ctf_id_t ltype = ctf_type_resolve(fp, lmd->dmd_type);
   1210 		size_t off = lmd->dmd_offset;
   1211 
   1212 		ctf_encoding_t linfo;
   1213 		ssize_t lsize;
   1214 
   1215 		if (ctf_type_encoding(fp, ltype, &linfo) != CTF_ERR)
   1216 			off += linfo.cte_bits;
   1217 		else if ((lsize = ctf_type_size(fp, ltype)) != CTF_ERR)
   1218 			off += lsize * NBBY;
   1219 
   1220 		/*
   1221 		 * Round up the offset of the end of the last member to the
   1222 		 * next byte boundary, convert 'off' to bytes, and then round
   1223 		 * it up again to the next multiple of the alignment required
   1224 		 * by the new member.  Finally, convert back to bits and store
   1225 		 * the result in dmd_offset.  Technically we could do more
   1226 		 * efficient packing if the new member is a bit-field, but
   1227 		 * we're the "compiler" and ANSI says we can do as we choose.
   1228 		 */
   1229 		off = roundup(off, NBBY) / NBBY;
   1230 		off = roundup(off, MAX(malign, 1));
   1231 		dmd->dmd_offset = off * NBBY;
   1232 		ssize = off + msize;
   1233 	} else {
   1234 		dmd->dmd_offset = 0;
   1235 		ssize = ctf_get_ctt_size(fp, &dtd->dtd_data, NULL, NULL);
   1236 		ssize = MAX(ssize, msize);
   1237 	}
   1238 
   1239 	if (ssize > LCTF_MAX_SIZE(fp)) {
   1240 		dtd->dtd_data.ctt_size = LCTF_LSIZE_SENT(fp);
   1241 		dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI(ssize);
   1242 		dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO(ssize);
   1243 	} else
   1244 		dtd->dtd_data.ctt_size = ssize;
   1245 
   1246 	dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(fp, kind, root, vlen + 1);
   1247 	ctf_list_append(&dtd->dtd_u.dtu_members, dmd);
   1248 
   1249 	if (s != NULL)
   1250 		fp->ctf_dtstrlen += strlen(s) + 1;
   1251 
   1252 	ctf_ref_inc(fp, type);
   1253 	fp->ctf_flags |= LCTF_DIRTY;
   1254 	return (0);
   1255 }
   1256 
   1257 /*
   1258  * This removes a type from the dynamic section. This will fail if the type is
   1259  * referenced by another type. Note that the CTF ID is never reused currently by
   1260  * CTF. Note that if this container is a parent container then we just outright
   1261  * refuse to remove the type. There currently is no notion of searching for the
   1262  * ctf_dtdef_t in parent containers. If there is, then this constraint could
   1263  * become finer grained.
   1264  */
   1265 int
   1266 ctf_delete_type(ctf_file_t *fp, ctf_id_t type)
   1267 {
   1268 	ctf_file_t *fpd;
   1269 	ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, type);
   1270 
   1271 	if (!(fp->ctf_flags & LCTF_RDWR))
   1272 		return (ctf_set_errno(fp, ECTF_RDONLY));
   1273 
   1274 	/*
   1275 	 * We want to give as useful an errno as possible. That means that we
   1276 	 * want to distinguish between a type which does not exist and one for
   1277 	 * which the type is not dynamic.
   1278 	 */
   1279 	fpd = fp;
   1280 	if (ctf_lookup_by_id(&fpd, type) == NULL &&
   1281 	    ctf_dtd_lookup(fp, type) == NULL)
   1282 		return (CTF_ERR); /* errno is set for us */
   1283 
   1284 	if (dtd == NULL)
   1285 		return (ctf_set_errno(fp, ECTF_NOTDYN));
   1286 
   1287 	if (dtd->dtd_ref != 0 || fp->ctf_refcnt > 1)
   1288 		return (ctf_set_errno(fp, ECTF_REFERENCED));
   1289 
   1290 	ctf_dtd_delete(fp, dtd);
   1291 	fp->ctf_flags |= LCTF_DIRTY;
   1292 	return (0);
   1293 }
   1294 
   1295 static int
   1296 enumcmp(const char *name, int value, void *arg)
   1297 {
   1298 	ctf_bundle_t *ctb = arg;
   1299 	int bvalue;
   1300 
   1301 	return (ctf_enum_value(ctb->ctb_file, ctb->ctb_type,
   1302 	    name, &bvalue) == CTF_ERR || value != bvalue);
   1303 }
   1304 
   1305 static int
   1306 enumadd(const char *name, int value, void *arg)
   1307 {
   1308 	ctf_bundle_t *ctb = arg;
   1309 
   1310 	return (ctf_add_enumerator(ctb->ctb_file, ctb->ctb_type,
   1311 	    name, value) == CTF_ERR);
   1312 }
   1313 
   1314 static int
   1315 membadd(const char *name, ctf_id_t type, ulong_t offset, void *arg)
   1316 {
   1317 	ctf_bundle_t *ctb = arg;
   1318 	ctf_dmdef_t *dmd;
   1319 	char *s = NULL;
   1320 
   1321 	if ((dmd = ctf_alloc(sizeof (ctf_dmdef_t))) == NULL)
   1322 		return (ctf_set_errno(ctb->ctb_file, EAGAIN));
   1323 
   1324 	if (name != NULL && *name != '\0' && (s = ctf_strdup(name)) == NULL) {
   1325 		ctf_free(dmd, sizeof (ctf_dmdef_t));
   1326 		return (ctf_set_errno(ctb->ctb_file, EAGAIN));
   1327 	}
   1328 
   1329 	/*
   1330 	 * For now, dmd_type is copied as the src_fp's type; it is reset to an
   1331 	 * equivalent dst_fp type by a final loop in ctf_add_type(), below.
   1332 	 */
   1333 	dmd->dmd_name = s;
   1334 	dmd->dmd_type = type;
   1335 	dmd->dmd_offset = offset;
   1336 	dmd->dmd_value = -1;
   1337 
   1338 	ctf_list_append(&ctb->ctb_dtd->dtd_u.dtu_members, dmd);
   1339 
   1340 	if (s != NULL)
   1341 		ctb->ctb_file->ctf_dtstrlen += strlen(s) + 1;
   1342 
   1343 	ctb->ctb_file->ctf_flags |= LCTF_DIRTY;
   1344 	return (0);
   1345 }
   1346 
   1347 static long
   1348 soucmp(ctf_file_t *src_fp, ctf_id_t src_type, ctf_file_t *dst_fp,
   1349     ctf_id_t dst_type)
   1350 {
   1351 	const void *src_tp, *dst_tp;
   1352 	const char *src_name, *dst_name;
   1353 	ssize_t src_sz, dst_sz, src_inc, dst_inc;
   1354 	uint_t dst_kind, dst_vlen, src_kind, src_vlen, n;
   1355 
   1356 	if ((src_type = ctf_type_resolve(src_fp, src_type)) == CTF_ERR)
   1357 		return (CTF_ERR);
   1358 	if ((dst_type = ctf_type_resolve(dst_fp, dst_type)) == CTF_ERR)
   1359 		return (CTF_ERR);
   1360 
   1361 	if ((src_tp = ctf_lookup_by_id(&src_fp, src_type)) == NULL)
   1362 		return (CTF_ERR);
   1363 	if ((dst_tp = ctf_lookup_by_id(&dst_fp, dst_type)) == NULL)
   1364 		return (CTF_ERR);
   1365 
   1366 	ctf_get_ctt_info(src_fp, src_tp, &src_kind, &src_vlen, NULL);
   1367 	ctf_get_ctt_info(dst_fp, dst_tp, &dst_kind, &dst_vlen, NULL);
   1368 
   1369 	if (src_kind != dst_kind)
   1370 		return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
   1371 	if (src_kind != CTF_K_STRUCT && src_kind != CTF_K_UNION)
   1372 		return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
   1373 	if (src_vlen != dst_vlen)
   1374 		return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
   1375 
   1376 	(void) ctf_get_ctt_size(src_fp, src_tp, &src_sz, &src_inc);
   1377 	(void) ctf_get_ctt_size(dst_fp, dst_tp, &dst_sz, &dst_inc);
   1378 	if (src_sz != dst_sz)
   1379 		return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
   1380 
   1381 	const char *src_mp, *dst_mp;
   1382 	ulong_t src_offset, dst_offset;
   1383 
   1384 	src_mp = (const char *)src_tp + src_inc;
   1385 	dst_mp = (const char *)dst_tp + dst_inc;
   1386 	for (n = src_vlen; n != 0;
   1387 	    n--, src_mp += src_inc, dst_mp += dst_inc) {
   1388 		ctf_get_ctm_info(src_fp, src_mp, src_sz, &src_inc, NULL,
   1389 		    &src_offset, &src_name);
   1390 		ctf_get_ctm_info(dst_fp, dst_mp, dst_sz, &dst_inc, NULL,
   1391 		    &dst_offset, &dst_name);
   1392 
   1393 		if (src_offset != dst_offset)
   1394 			return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
   1395 		if (strcmp(src_name, dst_name) != 0)
   1396 			return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
   1397 	}
   1398 
   1399 	return (0);
   1400 }
   1401 
   1402 /*
   1403  * The ctf_add_type routine is used to copy a type from a source CTF container
   1404  * to a dynamic destination container.  This routine operates recursively by
   1405  * following the source type's links and embedded member types.  If the
   1406  * destination container already contains a named type which has the same
   1407  * attributes, then we succeed and return this type but no changes occur.
   1408  */
   1409 ctf_id_t
   1410 ctf_add_type(ctf_file_t *dst_fp, ctf_file_t *src_fp, ctf_id_t src_type)
   1411 {
   1412 	ctf_id_t dst_type = CTF_ERR;
   1413 	uint_t dst_kind = CTF_K_UNKNOWN;
   1414 
   1415 	const void *tp;
   1416 	const char *name;
   1417 	uint_t type, kind, flag, vlen;
   1418 
   1419 	ctf_bundle_t src, dst;
   1420 	ctf_encoding_t src_en, main_en, dst_en;
   1421 	ctf_arinfo_t src_ar, dst_ar;
   1422 
   1423 	ctf_dtdef_t *dtd;
   1424 	ctf_funcinfo_t ctc;
   1425 	ssize_t size;
   1426 
   1427 	ctf_hash_t *hp;
   1428 	ctf_helem_t *hep;
   1429 
   1430 	if (dst_fp == src_fp)
   1431 		return (src_type);
   1432 
   1433 	if (!(dst_fp->ctf_flags & LCTF_RDWR))
   1434 		return (ctf_set_errno(dst_fp, ECTF_RDONLY));
   1435 
   1436 	if ((tp = ctf_lookup_by_id(&src_fp, src_type)) == NULL)
   1437 		return (ctf_set_errno(dst_fp, ctf_errno(src_fp)));
   1438 
   1439 	name = ctf_type_rname(src_fp, tp);
   1440 
   1441 	ctf_get_ctt_info(src_fp, tp, &kind, &vlen, &flag);
   1442 
   1443 	switch (kind) {
   1444 	case CTF_K_STRUCT:
   1445 		hp = &dst_fp->ctf_structs;
   1446 		break;
   1447 	case CTF_K_UNION:
   1448 		hp = &dst_fp->ctf_unions;
   1449 		break;
   1450 	case CTF_K_ENUM:
   1451 		hp = &dst_fp->ctf_enums;
   1452 		break;
   1453 	default:
   1454 		hp = &dst_fp->ctf_names;
   1455 		break;
   1456 	}
   1457 
   1458 	/*
   1459 	 * If the source type has a name and is a root type (visible at the
   1460 	 * top-level scope), lookup the name in the destination container and
   1461 	 * verify that it is of the same kind before we do anything else.
   1462 	 */
   1463 	if ((flag & CTF_ADD_ROOT) && name[0] != '\0' &&
   1464 	    (hep = ctf_hash_lookup(hp, dst_fp, name, strlen(name))) != NULL) {
   1465 		dst_type = (ctf_id_t)hep->h_type;
   1466 		dst_kind = ctf_type_kind(dst_fp, dst_type);
   1467 	}
   1468 
   1469 	/*
   1470 	 * If an identically named dst_type exists, fail with ECTF_CONFLICT
   1471 	 * unless dst_type is a forward declaration and src_type is a struct,
   1472 	 * union, or enum (i.e. the definition of the previous forward decl).
   1473 	 */
   1474 	if (dst_type != CTF_ERR && dst_kind != kind) {
   1475 		if (dst_kind != CTF_K_FORWARD || (kind != CTF_K_ENUM &&
   1476 		    kind != CTF_K_STRUCT && kind != CTF_K_UNION))
   1477 			return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
   1478 		else
   1479 			dst_type = CTF_ERR;
   1480 	}
   1481 
   1482 	/*
   1483 	 * If the non-empty name was not found in the appropriate hash, search
   1484 	 * the list of pending dynamic definitions that are not yet committed.
   1485 	 * If a matching name and kind are found, assume this is the type that
   1486 	 * we are looking for.  This is necessary to permit ctf_add_type() to
   1487 	 * operate recursively on entities such as a struct that contains a
   1488 	 * pointer member that refers to the same struct type.
   1489 	 *
   1490 	 * In the case of integer and floating point types, we match using the
   1491 	 * type encoding as well - else we may incorrectly return a bitfield
   1492 	 * type, for instance.
   1493 	 */
   1494 	if (dst_type == CTF_ERR && name[0] != '\0') {
   1495 		for (dtd = ctf_list_prev(&dst_fp->ctf_dtdefs); dtd != NULL &&
   1496 		    LCTF_TYPE_TO_INDEX(dst_fp, dtd->dtd_type) >
   1497 		    dst_fp->ctf_dtoldid; dtd = ctf_list_prev(dtd)) {
   1498 			if (LCTF_INFO_KIND(dst_fp, dtd->dtd_data.ctt_info) !=
   1499 			    kind || dtd->dtd_name == NULL ||
   1500 			    strcmp(dtd->dtd_name, name) != 0)
   1501 				continue;
   1502 			if (kind == CTF_K_INTEGER || kind == CTF_K_FLOAT) {
   1503 				if (ctf_type_encoding(src_fp, src_type,
   1504 				    &src_en) != 0)
   1505 					continue;
   1506 				if (memcmp(&src_en, &dtd->dtd_u.dtu_enc,
   1507 				    sizeof (ctf_encoding_t)) != 0)
   1508 					continue;
   1509 			}
   1510 			return (dtd->dtd_type);
   1511 		}
   1512 	}
   1513 
   1514 	src.ctb_file = src_fp;
   1515 	src.ctb_type = src_type;
   1516 	src.ctb_dtd = NULL;
   1517 
   1518 	dst.ctb_file = dst_fp;
   1519 	dst.ctb_type = dst_type;
   1520 	dst.ctb_dtd = NULL;
   1521 
   1522 	/*
   1523 	 * Now perform kind-specific processing.  If dst_type is CTF_ERR, then
   1524 	 * we add a new type with the same properties as src_type to dst_fp.
   1525 	 * If dst_type is not CTF_ERR, then we verify that dst_type has the
   1526 	 * same attributes as src_type.  We recurse for embedded references.
   1527 	 */
   1528 	switch (kind) {
   1529 	case CTF_K_INTEGER:
   1530 	case CTF_K_FLOAT:
   1531 		if (ctf_type_encoding(src_fp, src_type, &src_en) != 0)
   1532 			return (ctf_set_errno(dst_fp, ctf_errno(src_fp)));
   1533 
   1534 		/*
   1535 		 * This could be a bitfield, and the CTF library assumes
   1536 		 * intrinsics will appear before bitfields. Therefore,
   1537 		 * try to copy over the intrinsic prior to copying the
   1538 		 * bitfield.
   1539 		 */
   1540 		if (dst_type == CTF_ERR && name[0] != '\0' &&
   1541 		    (hep = ctf_hash_lookup(&src_fp->ctf_names, src_fp, name,
   1542 		    strlen(name))) != NULL &&
   1543 		    src_type != (ctf_id_t)hep->h_type) {
   1544 			if (ctf_type_encoding(src_fp, (ctf_id_t)hep->h_type,
   1545 			    &main_en) != 0) {
   1546 				return (ctf_set_errno(dst_fp,
   1547 				    ctf_errno(src_fp)));
   1548 			}
   1549 			if (memcmp(&src_en, &main_en, sizeof (ctf_encoding_t)) &&
   1550 			    ctf_add_type(dst_fp, src_fp,
   1551 			    (ctf_id_t)hep->h_type) == CTF_ERR)
   1552 				return (CTF_ERR); /* errno is set for us */
   1553 		}
   1554 
   1555 		if (dst_type != CTF_ERR) {
   1556 			if (ctf_type_encoding(dst_fp, dst_type, &dst_en) != 0)
   1557 				return (CTF_ERR); /* errno is set for us */
   1558 
   1559 			if (memcmp(&src_en, &dst_en, sizeof (ctf_encoding_t)))
   1560 				return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
   1561 
   1562 		} else if (kind == CTF_K_INTEGER) {
   1563 			dst_type = ctf_add_integer(dst_fp, flag, name, &src_en);
   1564 		} else
   1565 			dst_type = ctf_add_float(dst_fp, flag, name, &src_en);
   1566 		break;
   1567 
   1568 	case CTF_K_POINTER:
   1569 	case CTF_K_VOLATILE:
   1570 	case CTF_K_CONST:
   1571 	case CTF_K_RESTRICT:
   1572 		src_type = ctf_type_reference(src_fp, src_type);
   1573 		src_type = ctf_add_type(dst_fp, src_fp, src_type);
   1574 
   1575 		if (src_type == CTF_ERR)
   1576 			return (CTF_ERR); /* errno is set for us */
   1577 
   1578 		dst_type = ctf_add_reftype(dst_fp, flag, src_type, kind);
   1579 		break;
   1580 
   1581 	case CTF_K_ARRAY:
   1582 		if (ctf_array_info(src_fp, src_type, &src_ar) == CTF_ERR)
   1583 			return (ctf_set_errno(dst_fp, ctf_errno(src_fp)));
   1584 
   1585 		src_ar.ctr_contents =
   1586 		    ctf_add_type(dst_fp, src_fp, src_ar.ctr_contents);
   1587 		src_ar.ctr_index =
   1588 		    ctf_add_type(dst_fp, src_fp, src_ar.ctr_index);
   1589 		src_ar.ctr_nelems = src_ar.ctr_nelems;
   1590 
   1591 		if (src_ar.ctr_contents == CTF_ERR ||
   1592 		    src_ar.ctr_index == CTF_ERR)
   1593 			return (CTF_ERR); /* errno is set for us */
   1594 
   1595 		if (dst_type != CTF_ERR) {
   1596 			if (ctf_array_info(dst_fp, dst_type, &dst_ar) != 0)
   1597 				return (CTF_ERR); /* errno is set for us */
   1598 
   1599 			if (memcmp(&src_ar, &dst_ar, sizeof (ctf_arinfo_t)))
   1600 				return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
   1601 		} else
   1602 			dst_type = ctf_add_array(dst_fp, flag, &src_ar);
   1603 		break;
   1604 
   1605 	case CTF_K_FUNCTION:
   1606 		ctf_get_ctt_index(src_fp, tp, NULL, &type, NULL);
   1607 		ctc.ctc_return = ctf_add_type(dst_fp, src_fp, type);
   1608 		ctc.ctc_argc = 0;
   1609 		ctc.ctc_flags = 0;
   1610 
   1611 		if (ctc.ctc_return == CTF_ERR)
   1612 			return (CTF_ERR); /* errno is set for us */
   1613 
   1614 		dst_type = ctf_add_function(dst_fp, flag, &ctc, NULL);
   1615 		break;
   1616 
   1617 	case CTF_K_STRUCT:
   1618 	case CTF_K_UNION: {
   1619 		ctf_dmdef_t *dmd;
   1620 		int errs = 0;
   1621 
   1622 		if (dst_type != CTF_ERR && dst_kind != CTF_K_FORWARD) {
   1623 			/*
   1624 			 * Compare the sizes and fields of the two types.
   1625 			 * The field comparisons only check the names and
   1626 			 * offsets, so this is not perfect but is good enough
   1627 			 * for scenarios that we care about.
   1628 			 */
   1629 			if (soucmp(src_fp, src_type, dst_fp, dst_type) != 0)
   1630 				return (CTF_ERR); /* errno is set for us */
   1631 			break;
   1632 		}
   1633 
   1634 		/*
   1635 		 * Unlike the other cases, copying structs and unions is done
   1636 		 * manually so as to avoid repeated lookups in ctf_add_member
   1637 		 * and to ensure the exact same member offsets as in src_type.
   1638 		 */
   1639 		dst_type = ctf_add_generic(dst_fp, flag, name, &dtd);
   1640 		if (dst_type == CTF_ERR)
   1641 			return (CTF_ERR); /* errno is set for us */
   1642 
   1643 		dst.ctb_type = dst_type;
   1644 		dst.ctb_dtd = dtd;
   1645 
   1646 		if (ctf_member_iter(src_fp, src_type, membadd, &dst) != 0)
   1647 			errs++; /* increment errs and fail at bottom of case */
   1648 
   1649 		if ((size = ctf_type_size(src_fp, src_type)) >
   1650 		    LCTF_MAX_SIZE(src_fp)) {
   1651 			dtd->dtd_data.ctt_size = LCTF_LSIZE_SENT(dst_fp);
   1652 			dtd->dtd_data.ctt_lsizehi = CTF_SIZE_TO_LSIZE_HI(size);
   1653 			dtd->dtd_data.ctt_lsizelo = CTF_SIZE_TO_LSIZE_LO(size);
   1654 		} else
   1655 			dtd->dtd_data.ctt_size = size;
   1656 
   1657 		dtd->dtd_data.ctt_info = LCTF_TYPE_INFO(dst_fp, kind, flag,
   1658 		    vlen);
   1659 
   1660 		/*
   1661 		 * Make a final pass through the members changing each dmd_type
   1662 		 * (a src_fp type) to an equivalent type in dst_fp.  We pass
   1663 		 * through all members, leaving any that fail set to CTF_ERR.
   1664 		 */
   1665 		for (dmd = ctf_list_next(&dtd->dtd_u.dtu_members);
   1666 		    dmd != NULL; dmd = ctf_list_next(dmd)) {
   1667 			if ((dmd->dmd_type = ctf_add_type(dst_fp, src_fp,
   1668 			    dmd->dmd_type)) == CTF_ERR)
   1669 				errs++;
   1670 		}
   1671 
   1672 		if (errs)
   1673 			return (CTF_ERR); /* errno is set for us */
   1674 
   1675 		/*
   1676 		 * Now that we know that we can't fail, we go through and bump
   1677 		 * all the reference counts on the member types.
   1678 		 */
   1679 		for (dmd = ctf_list_next(&dtd->dtd_u.dtu_members);
   1680 		    dmd != NULL; dmd = ctf_list_next(dmd))
   1681 			ctf_ref_inc(dst_fp, dmd->dmd_type);
   1682 		break;
   1683 	}
   1684 
   1685 	case CTF_K_ENUM:
   1686 		if (dst_type != CTF_ERR && dst_kind != CTF_K_FORWARD) {
   1687 			if (ctf_enum_iter(src_fp, src_type, enumcmp, &dst) ||
   1688 			    ctf_enum_iter(dst_fp, dst_type, enumcmp, &src))
   1689 				return (ctf_set_errno(dst_fp, ECTF_CONFLICT));
   1690 		} else {
   1691 			dst_type = ctf_add_enum(dst_fp, flag, name);
   1692 			if ((dst.ctb_type = dst_type) == CTF_ERR ||
   1693 			    ctf_enum_iter(src_fp, src_type, enumadd, &dst))
   1694 				return (CTF_ERR); /* errno is set for us */
   1695 		}
   1696 		break;
   1697 
   1698 	case CTF_K_FORWARD:
   1699 		if (dst_type == CTF_ERR) {
   1700 			dst_type = ctf_add_forward(dst_fp,
   1701 			    flag, name, CTF_K_STRUCT); /* assume STRUCT */
   1702 		}
   1703 		break;
   1704 
   1705 	case CTF_K_TYPEDEF:
   1706 		src_type = ctf_type_reference(src_fp, src_type);
   1707 		src_type = ctf_add_type(dst_fp, src_fp, src_type);
   1708 
   1709 		if (src_type == CTF_ERR)
   1710 			return (CTF_ERR); /* errno is set for us */
   1711 
   1712 		/*
   1713 		 * If dst_type is not CTF_ERR at this point, we should check if
   1714 		 * ctf_type_reference(dst_fp, dst_type) != src_type and if so
   1715 		 * fail with ECTF_CONFLICT.  However, this causes problems with
   1716 		 * <sys/types.h> typedefs that vary based on things like if
   1717 		 * _ILP32x then pid_t is int otherwise long.  We therefore omit
   1718 		 * this check and assume that if the identically named typedef
   1719 		 * already exists in dst_fp, it is correct or equivalent.
   1720 		 */
   1721 		if (dst_type == CTF_ERR) {
   1722 			dst_type = ctf_add_typedef(dst_fp, flag,
   1723 			    name, src_type);
   1724 		}
   1725 		break;
   1726 
   1727 	default:
   1728 		return (ctf_set_errno(dst_fp, ECTF_CORRUPT));
   1729 	}
   1730 
   1731 	return (dst_type);
   1732 }
   1733