Print this page
10823 should ignore DW_TAG_subprogram with DW_AT_declaration tags
10824 GCC7-derived CTF can double qualifiers on arrays
10825 ctfdump -c drops last type
10826 ctfdump -c goes off the rails with a missing parent
Reviewed by: Robert Mustacchi <rm@joyent.com>
Reviewed by: Jerry Jelinek <jerry.jelinek@joyent.com>
Reviewed by: Jason King <jason.king@joyent.com>
Approved by: Jerry Jelinek <jerry.jelinek@joyent.com>

*** 23,33 **** /* * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ ! #pragma ident "%Z%%M% %I% %E% SMI" #include <sys/sysmacros.h> #include <ctf_impl.h> /* --- 23,35 ---- /* * Copyright 2006 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ ! /* ! * Copyright 2019, Joyent, Inc. ! */ #include <sys/sysmacros.h> #include <ctf_impl.h> /*
*** 309,313 **** --- 311,362 ---- for (argc = MIN(argc, f.ctc_argc); argc != 0; argc--) *argv++ = *dp++; return (0); } + + /* + * Unlike the normal lookup routines, ctf_dyn_*() variants consult both the + * processed CTF contents of a ctf_file_t as well as the dynamic types in the + * dtdef list. + */ + + const ctf_type_t * + ctf_dyn_lookup_by_id(ctf_file_t *fp, ctf_id_t id) + { + ctf_file_t **fpp = &fp; + const ctf_type_t *t; + ctf_dtdef_t *dtd; + + if ((t = ctf_lookup_by_id(fpp, id)) != NULL) + return (t); + + if ((dtd = ctf_dtd_lookup(fp, id)) == NULL) + return (NULL); + + return (&dtd->dtd_data); + } + + int + ctf_dyn_array_info(ctf_file_t *infp, ctf_id_t id, ctf_arinfo_t *arinfop) + { + ctf_file_t *fp = infp; + const ctf_type_t *t; + ctf_dtdef_t *dtd; + + if ((t = ctf_lookup_by_id(&fp, id)) != NULL) { + + if (LCTF_INFO_KIND(fp, t->ctt_info) != CTF_K_ARRAY) + return (ctf_set_errno(infp, ECTF_NOTARRAY)); + + return (ctf_array_info(fp, id, arinfop)); + } + + if ((dtd = ctf_dtd_lookup(fp, id)) == NULL) + return (ctf_set_errno(infp, ENOENT)); + + if (LCTF_INFO_KIND(fp, dtd->dtd_data.ctt_info) != CTF_K_ARRAY) + return (ctf_set_errno(infp, ECTF_NOTARRAY)); + + bcopy(&dtd->dtd_u.dtu_arr, arinfop, sizeof (*arinfop)); + return (0); + }