Changeset View
Changeset View
Standalone View
Standalone View
cddl/contrib/opensolaris/common/ctf/ctf_create.c
Show First 20 Lines • Show All 294 Lines • ▼ Show 20 Lines | case CTF_K_UNION: | ||||
if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH) | if (dtd->dtd_data.ctt_size < CTF_LSTRUCT_THRESH) | ||||
size += sizeof (ctf_member_t) * vlen; | size += sizeof (ctf_member_t) * vlen; | ||||
else | else | ||||
size += sizeof (ctf_lmember_t) * vlen; | size += sizeof (ctf_lmember_t) * vlen; | ||||
break; | break; | ||||
case CTF_K_ENUM: | case CTF_K_ENUM: | ||||
size += sizeof (ctf_enum_t) * vlen; | size += sizeof (ctf_enum_t) * vlen; | ||||
break; | break; | ||||
case CTF_K_CONSTVAL: | |||||
size += vlen; | |||||
break; | |||||
} | } | ||||
} | } | ||||
/* | /* | ||||
* Fill in the string table offset and size, compute the size of the | * Fill in the string table offset and size, compute the size of the | ||||
* entire CTF buffer we need, and then allocate a new buffer and | * entire CTF buffer we need, and then allocate a new buffer and | ||||
* bcopy the finished header to the start of the buffer. | * bcopy the finished header to the start of the buffer. | ||||
*/ | */ | ||||
▲ Show 20 Lines • Show All 91 Lines • ▼ Show 20 Lines | case CTF_K_UNION: | ||||
t = ctf_copy_lmembers(dtd, (uint_t)(s - s0), t); | t = ctf_copy_lmembers(dtd, (uint_t)(s - s0), t); | ||||
s = ctf_copy_membnames(dtd, s); | s = ctf_copy_membnames(dtd, s); | ||||
break; | break; | ||||
case CTF_K_ENUM: | case CTF_K_ENUM: | ||||
t = ctf_copy_emembers(dtd, (uint_t)(s - s0), t); | t = ctf_copy_emembers(dtd, (uint_t)(s - s0), t); | ||||
s = ctf_copy_membnames(dtd, s); | s = ctf_copy_membnames(dtd, s); | ||||
break; | break; | ||||
case CTF_K_CONSTVAL: | |||||
switch (vlen) { | |||||
case 0: | |||||
break; | |||||
case 4: { | |||||
int32_t i32 = dtd->dtd_u.dtu_extra; | |||||
memcpy(t, &i32, sizeof(i32)); | |||||
t += sizeof(i32); | |||||
} | } | ||||
break; | |||||
case 8: | |||||
memcpy(t, &dtd->dtd_u.dtu_extra, | |||||
sizeof(dtd->dtd_u.dtu_extra)); | |||||
t += sizeof(dtd->dtd_u.dtu_extra); | |||||
break; | |||||
} | } | ||||
break; | |||||
} | |||||
} | |||||
/* | /* | ||||
* Finally, we are ready to ctf_bufopen() the new container. If this | * Finally, we are ready to ctf_bufopen() the new container. If this | ||||
* is successful, we then switch nfp and fp and free the old container. | * is successful, we then switch nfp and fp and free the old container. | ||||
*/ | */ | ||||
ctf_data_protect(buf, size); | ctf_data_protect(buf, size); | ||||
cts.cts_name = _CTF_SECTION; | cts.cts_name = _CTF_SECTION; | ||||
cts.cts_type = SHT_PROGBITS; | cts.cts_type = SHT_PROGBITS; | ||||
▲ Show 20 Lines • Show All 107 Lines • ▼ Show 20 Lines | case CTF_K_ARRAY: | ||||
break; | break; | ||||
case CTF_K_TYPEDEF: | case CTF_K_TYPEDEF: | ||||
ctf_ref_dec(fp, dtd->dtd_data.ctt_type); | ctf_ref_dec(fp, dtd->dtd_data.ctt_type); | ||||
break; | break; | ||||
case CTF_K_POINTER: | case CTF_K_POINTER: | ||||
case CTF_K_VOLATILE: | case CTF_K_VOLATILE: | ||||
case CTF_K_CONST: | case CTF_K_CONST: | ||||
case CTF_K_RESTRICT: | case CTF_K_RESTRICT: | ||||
case CTF_K_CONSTVAL: | |||||
ctf_ref_dec(fp, dtd->dtd_data.ctt_type); | ctf_ref_dec(fp, dtd->dtd_data.ctt_type); | ||||
break; | break; | ||||
} | } | ||||
if (dtd->dtd_name) { | if (dtd->dtd_name) { | ||||
len = strlen(dtd->dtd_name) + 1; | len = strlen(dtd->dtd_name) + 1; | ||||
ctf_free(dtd->dtd_name, len); | ctf_free(dtd->dtd_name, len); | ||||
fp->ctf_dtstrlen -= len; | fp->ctf_dtstrlen -= len; | ||||
▲ Show 20 Lines • Show All 434 Lines • ▼ Show 20 Lines | |||||
} | } | ||||
ctf_id_t | ctf_id_t | ||||
ctf_add_restrict(ctf_file_t *fp, uint_t flag, ctf_id_t ref) | ctf_add_restrict(ctf_file_t *fp, uint_t flag, ctf_id_t ref) | ||||
{ | { | ||||
return (ctf_add_reftype(fp, flag, ref, CTF_K_RESTRICT)); | return (ctf_add_reftype(fp, flag, ref, CTF_K_RESTRICT)); | ||||
} | } | ||||
/* cribbed from ctf_add_reftype() */ | |||||
static ctf_id_t | |||||
ctf_add_constval(ctf_file_t *fp, ctf_id_t ref, int vlen, int64_t val) | |||||
{ | |||||
ctf_dtdef_t *dtd; | |||||
ctf_id_t type; | |||||
if (ref == CTF_ERR || ref < 0 || ref > CTF_MAX_TYPE) | |||||
return (ctf_set_errno(fp, EINVAL)); | |||||
if ((type = ctf_add_generic(fp, CTF_ADD_NONROOT, NULL, &dtd)) == | |||||
CTF_ERR) | |||||
return (CTF_ERR); /* errno is set for us */ | |||||
ctf_ref_inc(fp, ref); | |||||
if (vlen < 0) { | |||||
if (val == 0) | |||||
vlen = 0; | |||||
else if (val >= INT32_MIN && val <= INT32_MAX) | |||||
vlen = 4; | |||||
else | |||||
vlen = 8; | |||||
} | |||||
dtd->dtd_data.ctt_info = CTF_TYPE_INFO(CTF_K_CONSTVAL, 0, vlen); | |||||
dtd->dtd_data.ctt_type = (ushort_t)ref; | |||||
dtd->dtd_u.dtu_extra = val; | |||||
return (type); | |||||
} | |||||
int | int | ||||
ctf_add_enumerator(ctf_file_t *fp, ctf_id_t enid, const char *name, int value) | ctf_add_enumerator(ctf_file_t *fp, ctf_id_t enid, const char *name, int value) | ||||
{ | { | ||||
ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, enid); | ctf_dtdef_t *dtd = ctf_dtd_lookup(fp, enid); | ||||
ctf_dmdef_t *dmd; | ctf_dmdef_t *dmd; | ||||
uint_t kind, vlen, root; | uint_t kind, vlen, root; | ||||
char *s; | char *s; | ||||
▲ Show 20 Lines • Show All 400 Lines • ▼ Show 20 Lines | case CTF_K_RESTRICT: | ||||
src_type = ctf_type_reference(src_fp, src_type); | src_type = ctf_type_reference(src_fp, src_type); | ||||
src_type = ctf_add_type(dst_fp, src_fp, src_type); | src_type = ctf_add_type(dst_fp, src_fp, src_type); | ||||
if (src_type == CTF_ERR) | if (src_type == CTF_ERR) | ||||
return (CTF_ERR); /* errno is set for us */ | return (CTF_ERR); /* errno is set for us */ | ||||
dst_type = ctf_add_reftype(dst_fp, flag, src_type, kind); | dst_type = ctf_add_reftype(dst_fp, flag, src_type, kind); | ||||
break; | break; | ||||
case CTF_K_CONSTVAL: { | |||||
ctf_id_t ref_type; | |||||
ssize_t increment; | |||||
int64_t i64; | |||||
int32_t i32; | |||||
void *dptr; | |||||
ref_type = ctf_type_reference(src_fp, src_type); | |||||
ref_type = ctf_add_type(dst_fp, src_fp, ref_type); | |||||
if (ref_type == CTF_ERR) | |||||
return (CTF_ERR); /* errno is set for us */ | |||||
(void) ctf_get_ctt_size(src_fp, tp, NULL, &increment); | |||||
dptr = (void *)((uintptr_t)tp + increment); | |||||
switch (vlen) { | |||||
case 0: | |||||
i64 = 0; | |||||
break; | |||||
case 4: | |||||
memcpy(&i32, dptr, sizeof(i32)); | |||||
i64 = i32; | |||||
break; | |||||
case 8: | |||||
memcpy(&i64, dptr, sizeof(i64)); | |||||
break; | |||||
default: | |||||
return (ctf_set_errno(src_fp, EINVAL)); | |||||
} | |||||
dst_type = ctf_add_constval(dst_fp, ref_type, vlen, i64); | |||||
break; | |||||
} | |||||
case CTF_K_ARRAY: | case CTF_K_ARRAY: | ||||
if (ctf_array_info(src_fp, src_type, &src_ar) == CTF_ERR) | if (ctf_array_info(src_fp, src_type, &src_ar) == CTF_ERR) | ||||
return (ctf_set_errno(dst_fp, ctf_errno(src_fp))); | return (ctf_set_errno(dst_fp, ctf_errno(src_fp))); | ||||
src_ar.ctr_contents = | src_ar.ctr_contents = | ||||
ctf_add_type(dst_fp, src_fp, src_ar.ctr_contents); | ctf_add_type(dst_fp, src_fp, src_ar.ctr_contents); | ||||
src_ar.ctr_index = | src_ar.ctr_index = | ||||
▲ Show 20 Lines • Show All 150 Lines • Show Last 20 Lines |