diff options
Diffstat (limited to 'usr/src/lib/libctf/common/ctf_dwarf.c')
-rw-r--r-- | usr/src/lib/libctf/common/ctf_dwarf.c | 93 |
1 files changed, 49 insertions, 44 deletions
diff --git a/usr/src/lib/libctf/common/ctf_dwarf.c b/usr/src/lib/libctf/common/ctf_dwarf.c index 58a0f5f4a7..b0b221f96e 100644 --- a/usr/src/lib/libctf/common/ctf_dwarf.c +++ b/usr/src/lib/libctf/common/ctf_dwarf.c @@ -202,6 +202,7 @@ #include <libctf_impl.h> #include <sys/avl.h> #include <sys/debug.h> +#include <sys/list.h> #include <gelf.h> #include <libdwarf.h> #include <dwarf.h> @@ -1152,7 +1153,7 @@ ctf_dwarf_create_base(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot, bzero(&enc, sizeof (ctf_encoding_t)); enc.cte_bits = sz * 8; if ((ret = ctf_dwarf_parse_int(name, &kind, &enc, &nname)) == 0) { - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); name = nname; } else { if (ret != EINVAL) { @@ -1167,7 +1168,7 @@ ctf_dwarf_create_base(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot, &enc, &nname)) != 0) { goto out; } else if (nname != NULL) { - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); name = nname; } } @@ -1180,7 +1181,7 @@ ctf_dwarf_create_base(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot, ret = ctf_dwmap_add(cup, id, die, B_FALSE); } out: - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); return (ret); } @@ -1440,7 +1441,7 @@ ctf_dwarf_fixup_sou(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t base, boolean_t add) } else if ((ret = ctf_dwarf_member_offset(cup, memb, mid, &memboff)) != 0) { if (mname != NULL) - ctf_free(mname, strlen(mname) + 1); + ctf_strfree(mname); return (ret); } @@ -1453,12 +1454,12 @@ ctf_dwarf_fixup_sou(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t base, boolean_t add) "failed to add member %s: %s\n", mname, ctf_errmsg(ctf_errno(cup->cu_ctfp))); if (mname != NULL) - ctf_free(mname, strlen(mname) + 1); + ctf_strfree(mname); return (ECTF_CONVBKERR); } if (mname != NULL) - ctf_free(mname, strlen(mname) + 1); + ctf_strfree(mname); next: if ((ret = ctf_dwarf_sib(cup, memb, &sib)) != 0) @@ -1530,7 +1531,7 @@ ctf_dwarf_create_sou(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, ctf_dprintf("added sou %s (%d) (%ld) forward=%d\n", name, kind, base, decl == B_TRUE); if (name != NULL) - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); if (base == CTF_ERR) return (ctf_errno(cup->cu_ctfp)); *idp = base; @@ -1845,33 +1846,28 @@ ctf_dwarf_create_reference(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, ctf_id_t id; Dwarf_Die tdie; char *name; - size_t namelen; if ((ret = ctf_dwarf_string(cup, die, DW_AT_name, &name)) != 0 && ret != ENOENT) return (ret); - if (ret == ENOENT) { + if (ret == ENOENT) name = NULL; - namelen = 0; - } else { - namelen = strlen(name); - } ctf_dprintf("reference kind %d %s\n", kind, name != NULL ? name : "<>"); if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) != 0) { if (ret != ENOENT) { - ctf_free(name, namelen); + ctf_strfree(name); return (ret); } if ((id = ctf_dwarf_void(cup)) == CTF_ERR) { - ctf_free(name, namelen); + ctf_strfree(name); return (ctf_errno(cup->cu_ctfp)); } } else { if ((ret = ctf_dwarf_convert_type(cup, tdie, &id, CTF_ADD_NONROOT)) != 0) { - ctf_free(name, namelen); + ctf_strfree(name); return (ret); } } @@ -1883,17 +1879,17 @@ ctf_dwarf_create_reference(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, *idp = id; } - ctf_free(name, namelen); + ctf_strfree(name); return (ret); } if ((*idp = ctf_add_reftype(cup->cu_ctfp, isroot, name, id, kind)) == CTF_ERR) { - ctf_free(name, namelen); + ctf_strfree(name); return (ctf_errno(cup->cu_ctfp)); } - ctf_free(name, namelen); + ctf_strfree(name); return (ctf_dwmap_add(cup, *idp, die, B_FALSE)); } @@ -1997,7 +1993,7 @@ ctf_dwarf_create_enum(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot) "value\n"); ret = ECTF_CONVBKERR; } - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); break; } @@ -2021,16 +2017,16 @@ ctf_dwarf_create_enum(ctf_cu_t *cup, Dwarf_Die die, ctf_id_t *idp, int isroot) "to %s (%d)\n", name, eval, enumname == NULL ? "<anon>" : enumname, id); } - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); break; } - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); } out: if (enumname != NULL) - ctf_free(enumname, strlen(enumname) + 1); + ctf_strfree(enumname); return (ret); } @@ -2251,7 +2247,7 @@ ctf_dwarf_function_count(ctf_cu_t *cup, Dwarf_Die die, ctf_funcinfo_t *fip, fip->ctc_flags |= CTF_FUNC_VARARG; else fip->ctc_argc++; - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); } else if (tag == DW_TAG_formal_parameter) { fip->ctc_argc++; } else if (tag == DW_TAG_unspecified_parameters && @@ -2338,7 +2334,7 @@ ctf_dwarf_convert_function(ctf_cu_t *cup, Dwarf_Die die) if ((ret = ctf_dwarf_boolean(cup, die, DW_AT_declaration, &b)) != 0) { if (ret != ENOENT) { - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); return (ret); } } else if (b != 0) { @@ -2351,12 +2347,12 @@ ctf_dwarf_convert_function(ctf_cu_t *cup, Dwarf_Die die) */ ctf_dprintf("ignoring declaration of function %s (die %llx)\n", name, ctf_die_offset(cup, die)); - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); return (0); } if ((cdf = ctf_alloc(sizeof (ctf_dwfunc_t))) == NULL) { - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); return (ENOMEM); } bzero(cdf, sizeof (ctf_dwfunc_t)); @@ -2365,18 +2361,18 @@ ctf_dwarf_convert_function(ctf_cu_t *cup, Dwarf_Die die) if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) == 0) { if ((ret = ctf_dwarf_convert_type(cup, tdie, &(cdf->cdf_fip.ctc_return), CTF_ADD_ROOT)) != 0) { - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); ctf_free(cdf, sizeof (ctf_dwfunc_t)); return (ret); } } else if (ret != ENOENT) { - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); ctf_free(cdf, sizeof (ctf_dwfunc_t)); return (ret); } else { if ((cdf->cdf_fip.ctc_return = ctf_dwarf_void(cup)) == CTF_ERR) { - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); ctf_free(cdf, sizeof (ctf_dwfunc_t)); return (ctf_errno(cup->cu_ctfp)); } @@ -2394,7 +2390,7 @@ ctf_dwarf_convert_function(ctf_cu_t *cup, Dwarf_Die die) */ if ((ret = ctf_dwarf_function_count(cup, die, &cdf->cdf_fip, B_FALSE)) != 0) { - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); ctf_free(cdf, sizeof (ctf_dwfunc_t)); return (ret); } @@ -2404,14 +2400,14 @@ ctf_dwarf_convert_function(ctf_cu_t *cup, Dwarf_Die die) uint_t argc = cdf->cdf_fip.ctc_argc; cdf->cdf_argv = ctf_alloc(sizeof (ctf_id_t) * argc); if (cdf->cdf_argv == NULL) { - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); ctf_free(cdf, sizeof (ctf_dwfunc_t)); return (ENOMEM); } if ((ret = ctf_dwarf_convert_fargs(cup, die, &cdf->cdf_fip, cdf->cdf_argv)) != 0) { ctf_free(cdf->cdf_argv, sizeof (ctf_id_t) * argc); - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); ctf_free(cdf, sizeof (ctf_dwfunc_t)); return (ret); } @@ -2422,7 +2418,7 @@ ctf_dwarf_convert_function(ctf_cu_t *cup, Dwarf_Die die) if ((ret = ctf_dwarf_isglobal(cup, die, &cdf->cdf_global)) != 0) { ctf_free(cdf->cdf_argv, sizeof (ctf_id_t) * cdf->cdf_fip.ctc_argc); - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); ctf_free(cdf, sizeof (ctf_dwfunc_t)); return (ret); } @@ -2478,7 +2474,7 @@ ctf_dwarf_convert_variable(ctf_cu_t *cup, Dwarf_Die die) return (0); if ((ret = ctf_dwarf_refdie(cup, die, DW_AT_type, &tdie)) != 0) { - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); return (ret); } @@ -2487,7 +2483,7 @@ ctf_dwarf_convert_variable(ctf_cu_t *cup, Dwarf_Die die) return (ret); if ((cdv = ctf_alloc(sizeof (ctf_dwvar_t))) == NULL) { - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); return (ENOMEM); } @@ -2496,7 +2492,7 @@ ctf_dwarf_convert_variable(ctf_cu_t *cup, Dwarf_Die die) if ((ret = ctf_dwarf_isglobal(cup, die, &cdv->cdv_global)) != 0) { ctf_free(cdv, sizeof (ctf_dwvar_t)); - ctf_free(name, strlen(name) + 1); + ctf_strfree(name); return (ret); } @@ -3082,7 +3078,7 @@ ctf_dwarf_free_die(ctf_cu_t *cup) ctf_dprintf("Trying to free name: %p\n", cup->cu_name); if (cup->cu_name != NULL) { - ctf_free(cup->cu_name, strlen(cup->cu_name) + 1); + ctf_strfree(cup->cu_name); cup->cu_name = NULL; } @@ -3095,7 +3091,7 @@ ctf_dwarf_free_die(ctf_cu_t *cup) ctf_dprintf("Trying to free functions\n"); for (cdf = ctf_list_next(&cup->cu_funcs); cdf != NULL; cdf = ndf) { ndf = ctf_list_next(cdf); - ctf_free(cdf->cdf_name, strlen(cdf->cdf_name) + 1); + ctf_strfree(cdf->cdf_name); if (cdf->cdf_fip.ctc_argc != 0) { ctf_free(cdf->cdf_argv, sizeof (ctf_id_t) * cdf->cdf_fip.ctc_argc); @@ -3106,7 +3102,7 @@ ctf_dwarf_free_die(ctf_cu_t *cup) ctf_dprintf("Trying to free variables\n"); for (cdv = ctf_list_next(&cup->cu_vars); cdv != NULL; cdv = ndv) { ndv = ctf_list_next(cdv); - ctf_free(cdv->cdv_name, strlen(cdv->cdv_name) + 1); + ctf_strfree(cdv->cdv_name); ctf_free(cdv, sizeof (ctf_dwvar_t)); } @@ -3228,11 +3224,10 @@ ctf_dwarf_preinit_dies(ctf_convert_t *cch, int fd, Elf *elf, Dwarf_Debug dw, } if (ctf_dwarf_string(cup, cu, DW_AT_name, &name) == 0) { - size_t len = strlen(name) + 1; char *b = basename(name); cup->cu_name = strdup(b); - ctf_free(name, len); + ctf_strfree(name); if (cup->cu_name == NULL) return (ENOMEM); } @@ -3329,9 +3324,11 @@ ctf_dwarf_init_die(ctf_cu_t *cup) * the -m option. */ static boolean_t -c_source_has_debug(const char *file, ctf_cu_t *cus, size_t nr_cus) +c_source_has_debug(ctf_convert_t *cch, const char *file, + ctf_cu_t *cus, size_t nr_cus) { const char *basename = strrchr(file, '/'); + ctf_convert_filelist_t *ccf; if (basename == NULL) basename = file; @@ -3347,6 +3344,14 @@ c_source_has_debug(const char *file, ctf_cu_t *cus, size_t nr_cus) strncmp(basename, "values-", strlen("values-")) == 0) return (B_TRUE); + for (ccf = list_head(&cch->cch_nodebug); ccf != NULL; + ccf = list_next(&cch->cch_nodebug, ccf)) { + if (ccf->ccf_basename != NULL && + strcmp(basename, ccf->ccf_basename) == 0) { + return (B_TRUE); + } + } + for (size_t i = 0; i < nr_cus; i++) { if (cus[i].cu_name != NULL && strcmp(basename, cus[i].cu_name) == 0) { @@ -3423,7 +3428,7 @@ ctf_dwarf_check_missing(ctf_convert_t *cch, ctf_cu_t *cus, size_t nr_cus, if (len < 2 || strncmp(".c", &file[len - 2], 2) != 0) continue; - if (!c_source_has_debug(file, cus, nr_cus)) { + if (!c_source_has_debug(cch, file, cus, nr_cus)) { if (cch->cch_warncb != NULL) { cch->cch_warncb( cch->cch_warncb_arg, |