Changeset View
Changeset View
Standalone View
Standalone View
cddl/contrib/opensolaris/tools/ctf/cvt/tdata.c
Show First 20 Lines • Show All 60 Lines • ▼ Show 20 Lines | tdesc_layouthash(int nbuckets, void *node) | ||||
if (tdp->t_name) | if (tdp->t_name) | ||||
name = tdp->t_name; | name = tdp->t_name; | ||||
else { | else { | ||||
switch (tdp->t_type) { | switch (tdp->t_type) { | ||||
case POINTER: | case POINTER: | ||||
case TYPEDEF: | case TYPEDEF: | ||||
case VOLATILE: | case VOLATILE: | ||||
case CONST: | case CONST: | ||||
case CONSTVAL: | |||||
case RESTRICT: | case RESTRICT: | ||||
name = tdp->t_tdesc->t_name; | name = tdp->t_tdesc->t_name; | ||||
markj: I don't really understand this. What's the name of a constval? Why would two constvals with the… | |||||
Done Inline ActionsIt's possible this change is errneous. In many ways constval is similar to other qualifying ctf types like restrict/const/volatile/pointer, so a lot of this change was looking for places where behavior is changed based on kind and adding constval if it looked needed. I don't recall how I decided to add it here. You're right — the underlying type name doesn't indicate two constvals are equivalent, which is why we had to add tdesc_cvcmp(). cem: It's possible this change is errneous.
In many ways constval is similar to other qualifying… | |||||
Not Done Inline ActionsOk, I understand it better now. This is just used for hashing; I think your change here is ok. markj: Ok, I understand it better now. This is just used for hashing; I think your change here is ok. | |||||
break; | break; | ||||
case FUNCTION: | case FUNCTION: | ||||
h = tdp->t_fndef->fn_nargs + | h = tdp->t_fndef->fn_nargs + | ||||
tdp->t_fndef->fn_vargs; | tdp->t_fndef->fn_vargs; | ||||
name = tdp->t_fndef->fn_ret->t_name; | name = tdp->t_fndef->fn_ret->t_name; | ||||
break; | break; | ||||
case ARRAY: | case ARRAY: | ||||
h = tdp->t_ardef->ad_nelems; | h = tdp->t_ardef->ad_nelems; | ||||
▲ Show 20 Lines • Show All 89 Lines • ▼ Show 20 Lines | |||||
int | int | ||||
tdesc_namecmp(void *arg1, void *arg2) | tdesc_namecmp(void *arg1, void *arg2) | ||||
{ | { | ||||
tdesc_t *tdp1 = arg1, *tdp2 = arg2; | tdesc_t *tdp1 = arg1, *tdp2 = arg2; | ||||
return (!streq(tdp1->t_name, tdp2->t_name)); | return (!streq(tdp1->t_name, tdp2->t_name)); | ||||
} | } | ||||
#define FNV1A_INITIAL_VALUE 0xcbf29ce484222325ull | |||||
static uint64_t | |||||
fnv1a_update(uint64_t hash, const void *v, size_t len) | |||||
{ | |||||
const uint8_t *data = v; | |||||
for (; len--; data++) { | |||||
hash ^= (uint64_t)*data; | |||||
hash *= 0x100000001b3ull; | |||||
} | |||||
return (hash); | |||||
} | |||||
int | |||||
tdesc_cvhash(int nbuckets, void *data) | |||||
{ | |||||
tdesc_t *cv = data; | |||||
uint64_t h; | |||||
h = FNV1A_INITIAL_VALUE; | |||||
h = fnv1a_update(h, &cv->t_tdesc, sizeof(cv->t_tdesc)); | |||||
h = fnv1a_update(h, &cv->t_extra, sizeof(cv->t_extra)); | |||||
return (h % nbuckets); | |||||
} | |||||
int | |||||
tdesc_cvcmp(void *v1, void *v2) | |||||
{ | |||||
const tdesc_t *cv1, *cv2; | |||||
int rc; | |||||
cv1 = v1; | |||||
cv2 = v2; | |||||
rc = tdesc_idcmp(cv1->t_tdesc, cv2->t_tdesc); | |||||
if (rc != 0) | |||||
return (rc); | |||||
if (cv1->t_extra == cv2->t_extra) | |||||
return (0); | |||||
else | |||||
return (cv1->t_extra > cv2->t_extra ? 1 : -1); | |||||
} | |||||
#ifdef illumos | #ifdef illumos | ||||
/*ARGSUSED1*/ | /*ARGSUSED1*/ | ||||
static int | static int | ||||
tdesc_print(void *data, void *private __unused) | tdesc_print(void *data, void *private __unused) | ||||
{ | { | ||||
tdesc_t *tdp = data; | tdesc_t *tdp = data; | ||||
printf("%7d %s\n", tdp->t_id, tdesc_name(tdp)); | printf("%7d %s\n", tdp->t_id, tdesc_name(tdp)); | ||||
▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | while (el) { | ||||
el = el->el_next; | el = el->el_next; | ||||
if (oel->el_name) | if (oel->el_name) | ||||
free(oel->el_name); | free(oel->el_name); | ||||
free(oel); | free(oel); | ||||
} | } | ||||
} | } | ||||
static void (*free_cbs[])(tdesc_t *) = { | static void (*free_cbs[STABTYPE_LAST])(tdesc_t *) = { | ||||
NULL, | [INTRINSIC] = free_intr, | ||||
free_intr, | [ARRAY] = free_ardef, | ||||
NULL, | [STRUCT] = free_mlist, | ||||
free_ardef, | [UNION] = free_mlist, | ||||
NULL, | [ENUM] = free_elist, | ||||
free_mlist, | |||||
free_mlist, | |||||
free_elist, | |||||
NULL, | |||||
NULL, | |||||
NULL, | |||||
NULL, | |||||
NULL, | |||||
NULL | |||||
}; | }; | ||||
/*ARGSUSED1*/ | /*ARGSUSED1*/ | ||||
static void | static void | ||||
tdesc_free_cb(void *arg, void *private __unused) | tdesc_free_cb(void *arg, void *private __unused) | ||||
{ | { | ||||
tdesc_t *tdp = arg; | tdesc_t *tdp = arg; | ||||
if (tdp->t_name) | if (tdp->t_name) | ||||
▲ Show 20 Lines • Show All 164 Lines • ▼ Show 20 Lines | build_hashes(tdesc_t *ctdp, tdesc_t **ctdpp __unused, void *private) | ||||
tdata_t *td = private; | tdata_t *td = private; | ||||
hash_add(td->td_idhash, ctdp); | hash_add(td->td_idhash, ctdp); | ||||
hash_add(td->td_layouthash, ctdp); | hash_add(td->td_layouthash, ctdp); | ||||
return (1); | return (1); | ||||
} | } | ||||
static tdtrav_cb_f build_hashes_cbs[] = { | static tdtrav_cb_f build_hashes_cbs[STABTYPE_LAST] = { | ||||
NULL, | [INTRINSIC] = build_hashes, | ||||
build_hashes, /* intrinsic */ | [POINTER] = build_hashes, | ||||
build_hashes, /* pointer */ | [ARRAY] = build_hashes, | ||||
build_hashes, /* array */ | [FUNCTION] = build_hashes, | ||||
build_hashes, /* function */ | [STRUCT] = build_hashes, | ||||
build_hashes, /* struct */ | [UNION] = build_hashes, | ||||
build_hashes, /* union */ | [ENUM] = build_hashes, | ||||
build_hashes, /* enum */ | [FORWARD] = build_hashes, | ||||
build_hashes, /* forward */ | [TYPEDEF] = build_hashes, | ||||
build_hashes, /* typedef */ | [TYPEDEF_UNRES] = tdtrav_assert, | ||||
tdtrav_assert, /* typedef_unres */ | [VOLATILE] = build_hashes, | ||||
build_hashes, /* volatile */ | [CONST] = build_hashes, | ||||
build_hashes, /* const */ | [RESTRICT] = build_hashes, | ||||
build_hashes /* restrict */ | [CONSTVAL] = build_hashes, | ||||
}; | }; | ||||
Done Inline ActionsDesignated initializers? markj: Designated initializers? | |||||
Done Inline Actionswill do cem: will do | |||||
static void | static void | ||||
tdata_build_hashes_common(tdata_t *td, hash_t *hash) | tdata_build_hashes_common(tdata_t *td, hash_t *hash) | ||||
{ | { | ||||
(void) iitraverse_hash(hash, &td->td_curvgen, NULL, NULL, | (void) iitraverse_hash(hash, &td->td_curvgen, NULL, NULL, | ||||
build_hashes_cbs, td); | build_hashes_cbs, td); | ||||
} | } | ||||
Show All 36 Lines |
I don't really understand this. What's the name of a constval? Why would two constvals with the same name be equivalent?