int mdb_ctf_lookup_by_symbol(const GElf_Sym *symp, const mdb_syminfo_t *sip, mdb_ctf_id_t *p) { ctf_file_t *fp = NULL; mdb_ctf_impl_t *mcip = (mdb_ctf_impl_t *)p; mdb_tgt_t *t = mdb.m_target; if (mcip == NULL) return (set_errno(EINVAL)); if (symp == NULL || sip == NULL) { mdb_ctf_type_invalidate(p); return (set_errno(EINVAL)); } if ((fp = mdb_tgt_addr_to_ctf(t, symp->st_value)) == NULL) { mdb_ctf_type_invalidate(p); return (-1); /* errno is set for us */ } if ((mcip->mci_id = ctf_lookup_by_symbol(fp, sip->sym_id)) == CTF_ERR) { mdb_ctf_type_invalidate(p); return (set_errno(ctf_to_errno(ctf_errno(fp)))); } mcip->mci_fp = fp; return (0); }
static void nm_print_ctfid(void *data) { nm_iter_info_t *niip = data; ctf_id_t id; uint_t index = niip->nii_id; ctf_file_t *fp = niip->nii_fp; if (fp != NULL && (id = ctf_lookup_by_symbol(fp, index)) != CTF_ERR) { mdb_printf("%-9ld", id); } else { mdb_printf("%9s", ""); } }
int dtrace_symbol_type(dtrace_hdl_t *dtp, const GElf_Sym *symp, const dtrace_syminfo_t *sip, dtrace_typeinfo_t *tip) { dt_module_t *dmp; tip->dtt_object = NULL; tip->dtt_ctfp = NULL; tip->dtt_type = CTF_ERR; tip->dtt_flags = 0; if ((dmp = dt_module_lookup_by_name(dtp, sip->dts_object)) == NULL) return (dt_set_errno(dtp, EDT_NOMOD)); if (symp->st_shndx == SHN_UNDEF && dmp->dm_extern != NULL) { dt_ident_t *idp = dt_idhash_lookup(dmp->dm_extern, sip->dts_name); if (idp == NULL) return (dt_set_errno(dtp, EDT_NOSYM)); tip->dtt_ctfp = idp->di_ctfp; tip->dtt_type = idp->di_type; } else if (GELF_ST_TYPE(symp->st_info) != STT_FUNC) { if (dt_module_getctf(dtp, dmp) == NULL) return (-1); /* errno is set for us */ tip->dtt_ctfp = dmp->dm_ctfp; tip->dtt_type = ctf_lookup_by_symbol(dmp->dm_ctfp, sip->dts_id); if (tip->dtt_type == CTF_ERR) { dtp->dt_ctferr = ctf_errno(tip->dtt_ctfp); return (dt_set_errno(dtp, EDT_CTF)); } } else { tip->dtt_ctfp = DT_FPTR_CTFP(dtp); tip->dtt_type = DT_FPTR_TYPE(dtp); } tip->dtt_object = dmp->dm_name; return (0); }
static void nm_print_ctype(void *data) { nm_iter_info_t *niip = data; char buf[256]; ctf_id_t id; char *str = NULL; uint_t index = niip->nii_id; ctf_file_t *fp = niip->nii_fp; if (fp != NULL) { if (GELF_ST_TYPE(niip->nii_symp->st_info) == STT_FUNC) str = nm_func_signature(fp, index, buf, sizeof (buf)); else if ((id = ctf_lookup_by_symbol(fp, index)) != CTF_ERR) str = ctf_type_name(fp, id, buf, sizeof (buf)); } if (str == NULL) str = "<unknown type>"; mdb_printf("%-50s", str); }