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));