Changeset View
Changeset View
Standalone View
Standalone View
cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c
Show First 20 Lines • Show All 62 Lines • ▼ Show 20 Lines | |||||
}; | }; | ||||
/* | /* | ||||
* Macros to reverse byte order | * Macros to reverse byte order | ||||
*/ | */ | ||||
#define BSWAP_8(x) ((x) & 0xff) | #define BSWAP_8(x) ((x) & 0xff) | ||||
#define BSWAP_16(x) ((BSWAP_8(x) << 8) | BSWAP_8((x) >> 8)) | #define BSWAP_16(x) ((BSWAP_8(x) << 8) | BSWAP_8((x) >> 8)) | ||||
#define BSWAP_32(x) ((BSWAP_16(x) << 16) | BSWAP_16((x) >> 16)) | #define BSWAP_32(x) ((BSWAP_16(x) << 16) | BSWAP_16((x) >> 16)) | ||||
#define BSWAP_64(x) ((BSWAP_32(x) << 32) | BSWAP_32((x) >> 32)) | |||||
#define SWAP_16(x) (x) = BSWAP_16(x) | #define SWAP_16(x) (x) = BSWAP_16(x) | ||||
#define SWAP_32(x) (x) = BSWAP_32(x) | #define SWAP_32(x) (x) = BSWAP_32(x) | ||||
#define SWAP_64(x) (x) = BSWAP_64(x) | |||||
static int target_requires_swap; | static int target_requires_swap; | ||||
/*PRINTFLIKE1*/ | /*PRINTFLIKE1*/ | ||||
static void | static void | ||||
parseterminate(const char *fmt, ...) | parseterminate(const char *fmt, ...) | ||||
{ | { | ||||
static char msgbuf[1024]; /* sigh */ | static char msgbuf[1024]; /* sigh */ | ||||
▲ Show 20 Lines • Show All 436 Lines • ▼ Show 20 Lines | case FUNCTION: | ||||
break; | break; | ||||
case RESTRICT: | case RESTRICT: | ||||
ctt.ctt_info = CTF_TYPE_INFO(CTF_K_RESTRICT, isroot, 0); | ctt.ctt_info = CTF_TYPE_INFO(CTF_K_RESTRICT, isroot, 0); | ||||
ctt.ctt_type = tp->t_tdesc->t_id; | ctt.ctt_type = tp->t_tdesc->t_id; | ||||
write_unsized_type_rec(b, &ctt); | write_unsized_type_rec(b, &ctt); | ||||
break; | break; | ||||
case CONSTVAL: | |||||
if (tp->t_extra == 0) | |||||
i = 0; | |||||
else if (tp->t_extra >= INT32_MIN && tp->t_extra <= INT32_MAX) | |||||
i = 4; | |||||
else | |||||
i = 8; | |||||
ctt.ctt_info = CTF_TYPE_INFO(CTF_K_CONSTVAL, isroot, i); | |||||
ctt.ctt_type = tp->t_tdesc->t_id; | |||||
write_unsized_type_rec(b, &ctt); | |||||
if (i == 4) { | |||||
uint32_t u32 = (int32_t)tp->t_extra; | |||||
if (target_requires_swap) { | |||||
SWAP_32(u32); | |||||
} | |||||
ctf_buf_write(b, &u32, sizeof (u32)); | |||||
} else if (i == 8) { | |||||
uint64_t u64 = tp->t_extra; | |||||
if (target_requires_swap) { | |||||
SWAP_64(u64); | |||||
} | |||||
ctf_buf_write(b, &u64, sizeof (u64)); | |||||
} | |||||
break; | |||||
default: | default: | ||||
warning("Can't write unknown type %d\n", tp->t_type); | warning("Can't write unknown type %d\n", tp->t_type); | ||||
} | } | ||||
debug(3, "Wrote type %d %s\n", tp->t_id, tdesc_name(tp)); | debug(3, "Wrote type %d %s\n", tp->t_id, tdesc_name(tp)); | ||||
return (1); | return (1); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 275 Lines • ▼ Show 20 Lines | case CTF_K_UNION: | ||||
if (size < CTF_LSTRUCT_THRESH) | if (size < CTF_LSTRUCT_THRESH) | ||||
dptr += sizeof (ctf_member_t) * vlen; | dptr += sizeof (ctf_member_t) * vlen; | ||||
else | else | ||||
dptr += sizeof (ctf_lmember_t) * vlen; | dptr += sizeof (ctf_lmember_t) * vlen; | ||||
break; | break; | ||||
case CTF_K_ENUM: | case CTF_K_ENUM: | ||||
dptr += sizeof (ctf_enum_t) * vlen; | dptr += sizeof (ctf_enum_t) * vlen; | ||||
break; | break; | ||||
case CTF_K_CONSTVAL: | |||||
dptr += vlen; | |||||
break; | |||||
case CTF_K_UNKNOWN: | case CTF_K_UNKNOWN: | ||||
break; | break; | ||||
default: | default: | ||||
parseterminate("Unknown CTF type %d (#%d) at %#x", | parseterminate("Unknown CTF type %d (#%d) at %#x", | ||||
CTF_INFO_KIND(ctt->ctt_info), count, dptr - data); | CTF_INFO_KIND(ctt->ctt_info), count, dptr - data); | ||||
} | } | ||||
dptr += increment; | dptr += increment; | ||||
▲ Show 20 Lines • Show All 399 Lines • ▼ Show 20 Lines | case CTF_K_FUNCTION: | ||||
if (vlen & 1) | if (vlen & 1) | ||||
dptr += sizeof (ushort_t); | dptr += sizeof (ushort_t); | ||||
break; | break; | ||||
case CTF_K_RESTRICT: | case CTF_K_RESTRICT: | ||||
tdp->t_type = RESTRICT; | tdp->t_type = RESTRICT; | ||||
tdp->t_tdesc = tdarr[ctt->ctt_type]; | tdp->t_tdesc = tdarr[ctt->ctt_type]; | ||||
break; | |||||
case CTF_K_CONSTVAL: | |||||
tdp->t_type = CONSTVAL; | |||||
tdp->t_tdesc = tdarr[ctt->ctt_type]; | |||||
switch (vlen) { | |||||
case 0: | |||||
tdp->t_extra = 0; | |||||
break; | |||||
case 4: { | |||||
int32_t i32; | |||||
memcpy(&i32, dptr, sizeof(i32)); | |||||
tdp->t_extra = i32; | |||||
} | |||||
break; | |||||
case 8: | |||||
memcpy(&tdp->t_extra, dptr, | |||||
sizeof(tdp->t_extra)); | |||||
break; | |||||
default: | |||||
terminate("%s: Unrecognized CONSTVAL encoding " | |||||
"%d\n", __func__, vlen); | |||||
} | |||||
dptr += vlen; | |||||
break; | break; | ||||
case CTF_K_UNKNOWN: | case CTF_K_UNKNOWN: | ||||
break; | break; | ||||
default: | default: | ||||
warning("Can't parse unknown CTF type %d\n", kind); | warning("Can't parse unknown CTF type %d\n", kind); | ||||
} | } | ||||
▲ Show 20 Lines • Show All 143 Lines • Show Last 20 Lines |