Print this page
12259 CTF shouldn't assume enum size

*** 26,36 **** * Copyright 2012 Jason King. All rights reserved. * Use is subject to license terms. */ /* ! * Copyright 2019, Joyent, Inc. */ /* * CTF DWARF conversion theory. * --- 26,36 ---- * Copyright 2012 Jason King. All rights reserved. * Use is subject to license terms. */ /* ! * Copyright 2020 Joyent, Inc. */ /* * CTF DWARF conversion theory. *
*** 1211,1221 **** ctf_dwarf_fixup_sou(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t base, boolean_t add) { int ret, kind; Dwarf_Die child, memb; Dwarf_Unsigned size; - ulong_t nsz; kind = ctf_type_kind(cup->cu_ctfp, base); VERIFY(kind != CTF_ERR); VERIFY(kind == CTF_K_STRUCT || kind == CTF_K_UNION); --- 1211,1220 ----
*** 1304,1315 **** return (0); /* Finally set the size of the structure to the actual byte size */ if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_byte_size, &size)) != 0) return (ret); ! nsz = size; ! if ((ctf_set_size(cup->cu_ctfp, base, nsz)) == CTF_ERR) { int e = ctf_errno(cup->cu_ctfp); (void) snprintf(cup->cu_errbuf, cup->cu_errlen, "failed to set type size for %d to 0x%x: %s", base, (uint32_t)size, ctf_errmsg(e)); return (ECTF_CONVBKERR); --- 1303,1313 ---- return (0); /* Finally set the size of the structure to the actual byte size */ if ((ret = ctf_dwarf_unsigned(cup, die, DW_AT_byte_size, &size)) != 0) return (ret); ! if ((ctf_set_size(cup->cu_ctfp, base, size)) == CTF_ERR) { int e = ctf_errno(cup->cu_ctfp); (void) snprintf(cup->cu_errbuf, cup->cu_errlen, "failed to set type size for %d to 0x%x: %s", base, (uint32_t)size, ctf_errmsg(e)); return (ECTF_CONVBKERR);
*** 1612,1635 **** ctf_free(name, namelen); return (ctf_dwmap_add(cup, *idp, die, B_FALSE)); } static int ! ctf_dwarf_create_enum(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot) { int ret; ! ctf_id_t id; Dwarf_Die child; char *name; if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0 && ret != ENOENT) return (ret); if (ret == ENOENT) name = NULL; ! id = ctf_add_enum(cup->cu_ctfp, isroot, name); ctf_dprintf("added enum %s (%d)\n", name, id); if (name != NULL) ctf_free(name, strlen(name) + 1); if (id == CTF_ERR) return (ctf_errno(cup->cu_ctfp)); --- 1610,1666 ---- ctf_free(name, namelen); return (ctf_dwmap_add(cup, *idp, die, B_FALSE)); } + /* + * Get the size of the type of a particular die. Note that this is a simple + * version that doesn't attempt to traverse further than expecting a single + * sized type reference (so no qualifiers etc.). Nor does it attempt to do as + * much as ctf_type_size() - which we cannot use here as that doesn't look up + * dynamic types, and we don't yet want to do a ctf_update(). + */ static int ! ctf_dwarf_get_type_size(ctf_cu_t *cup, Dwarf_Die die, size_t *sizep) { + const ctf_type_t *t; + Dwarf_Die tdie; + ctf_id_t tid; int ret; ! ! if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) != 0) ! return (ret); ! ! if ((ret = ctf_dwarf_convert_type(cup, tdie, &tid, ! CTF_ADD_NONROOT)) != 0) ! return (ret); ! ! if ((t = ctf_dyn_lookup_by_id(cup->cu_ctfp, tid)) == NULL) ! return (ENOENT); ! ! *sizep = ctf_get_ctt_size(cup->cu_ctfp, t, NULL, NULL); ! return (0); ! } ! ! static int ! ctf_dwarf_create_enum(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot) ! { ! size_t size = 0; Dwarf_Die child; + ctf_id_t id; char *name; + int ret; if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0 && ret != ENOENT) return (ret); if (ret == ENOENT) name = NULL; ! ! (void) ctf_dwarf_get_type_size(cup, die, &size); ! ! id = ctf_add_enum(cup->cu_ctfp, isroot, name, size); ctf_dprintf("added enum %s (%d)\n", name, id); if (name != NULL) ctf_free(name, strlen(name) + 1); if (id == CTF_ERR) return (ctf_errno(cup->cu_ctfp));