Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1754292AbbEKN7V (ORCPT ); Mon, 11 May 2015 09:59:21 -0400 Received: from mail.kernel.org ([198.145.29.136]:40881 "EHLO mail.kernel.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754234AbbEKN7T (ORCPT ); Mon, 11 May 2015 09:59:19 -0400 Date: Mon, 11 May 2015 10:59:14 -0300 From: Arnaldo Carvalho de Melo To: He Kuang Cc: masami.hiramatsu.pt@hitachi.com, a.p.zijlstra@chello.nl, jolsa@kernel.org, mingo@redhat.com, wangnan0@huawei.com, linux-kernel@vger.kernel.org Subject: Re: [PATCH v4 1/3] perf probe: Remove length limitation for showing available variables Message-ID: <20150511135914.GG28183@kernel.org> References: <1431349804-31849-1-git-send-email-hekuang@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <1431349804-31849-1-git-send-email-hekuang@huawei.com> X-Url: http://acmel.wordpress.com User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 6259 Lines: 176 Em Mon, May 11, 2015 at 01:10:02PM +0000, He Kuang escreveu: > Use struct strbuf instead of bare char[] to remove the length limitation > of variables in variable_list, so they will not disappear due to > overlength, and make preparation for adding more description for > variables. I guess there were no changes wrt v3 for this patch, right? V3 is already applied. - Arnaldo > Signed-off-by: He Kuang > Acked-by: Masami Hiramatsu > --- > tools/perf/util/dwarf-aux.c | 50 +++++++++++++++++++----------------------- > tools/perf/util/dwarf-aux.h | 4 ++-- > tools/perf/util/probe-finder.c | 17 ++++++++------ > 3 files changed, 34 insertions(+), 37 deletions(-) > > diff --git a/tools/perf/util/dwarf-aux.c b/tools/perf/util/dwarf-aux.c > index 16d46e2..737c9db 100644 > --- a/tools/perf/util/dwarf-aux.c > +++ b/tools/perf/util/dwarf-aux.c > @@ -848,19 +848,17 @@ Dwarf_Die *die_find_member(Dwarf_Die *st_die, const char *name, > /** > * die_get_typename - Get the name of given variable DIE > * @vr_die: a variable DIE > - * @buf: a buffer for result type name > - * @len: a max-length of @buf > + * @buf: a strbuf for result type name > * > - * Get the name of @vr_die and stores it to @buf. Return the actual length > - * of type name if succeeded. Return -E2BIG if @len is not enough long, and > - * Return -ENOENT if failed to find type name. > + * Get the name of @vr_die and stores it to @buf. Return 0 if succeeded. > + * and Return -ENOENT if failed to find type name. > * Note that the result will stores typedef name if possible, and stores > * "*(function_type)" if the type is a function pointer. > */ > -int die_get_typename(Dwarf_Die *vr_die, char *buf, int len) > +int die_get_typename(Dwarf_Die *vr_die, struct strbuf *buf) > { > Dwarf_Die type; > - int tag, ret, ret2; > + int tag, ret; > const char *tmp = ""; > > if (__die_get_real_type(vr_die, &type) == NULL) > @@ -871,8 +869,8 @@ int die_get_typename(Dwarf_Die *vr_die, char *buf, int len) > tmp = "*"; > else if (tag == DW_TAG_subroutine_type) { > /* Function pointer */ > - ret = snprintf(buf, len, "(function_type)"); > - return (ret >= len) ? -E2BIG : ret; > + strbuf_addf(buf, "(function_type)"); > + return 0; > } else { > if (!dwarf_diename(&type)) > return -ENOENT; > @@ -883,39 +881,35 @@ int die_get_typename(Dwarf_Die *vr_die, char *buf, int len) > else if (tag == DW_TAG_enumeration_type) > tmp = "enum "; > /* Write a base name */ > - ret = snprintf(buf, len, "%s%s", tmp, dwarf_diename(&type)); > - return (ret >= len) ? -E2BIG : ret; > - } > - ret = die_get_typename(&type, buf, len); > - if (ret > 0) { > - ret2 = snprintf(buf + ret, len - ret, "%s", tmp); > - ret = (ret2 >= len - ret) ? -E2BIG : ret2 + ret; > + strbuf_addf(buf, "%s%s", tmp, dwarf_diename(&type)); > + return 0; > } > + ret = die_get_typename(&type, buf); > + if (ret == 0) > + strbuf_addf(buf, "%s", tmp); > + > return ret; > } > > /** > * die_get_varname - Get the name and type of given variable DIE > * @vr_die: a variable DIE > - * @buf: a buffer for type and variable name > - * @len: the max-length of @buf > + * @buf: a strbuf for type and variable name > * > * Get the name and type of @vr_die and stores it in @buf as "type\tname". > */ > -int die_get_varname(Dwarf_Die *vr_die, char *buf, int len) > +int die_get_varname(Dwarf_Die *vr_die, struct strbuf *buf) > { > - int ret, ret2; > + int ret; > > - ret = die_get_typename(vr_die, buf, len); > + ret = die_get_typename(vr_die, buf); > if (ret < 0) { > pr_debug("Failed to get type, make it unknown.\n"); > - ret = snprintf(buf, len, "(unknown_type)"); > - } > - if (ret > 0) { > - ret2 = snprintf(buf + ret, len - ret, "\t%s", > - dwarf_diename(vr_die)); > - ret = (ret2 >= len - ret) ? -E2BIG : ret2 + ret; > + strbuf_addf(buf, "(unknown_type)"); > } > - return ret; > + > + strbuf_addf(buf, "\t%s", dwarf_diename(vr_die)); > + > + return 0; > } > > diff --git a/tools/perf/util/dwarf-aux.h b/tools/perf/util/dwarf-aux.h > index 50a3cdc..60676fd 100644 > --- a/tools/perf/util/dwarf-aux.h > +++ b/tools/perf/util/dwarf-aux.h > @@ -117,8 +117,8 @@ extern Dwarf_Die *die_find_member(Dwarf_Die *st_die, const char *name, > Dwarf_Die *die_mem); > > /* Get the name of given variable DIE */ > -extern int die_get_typename(Dwarf_Die *vr_die, char *buf, int len); > +extern int die_get_typename(Dwarf_Die *vr_die, struct strbuf *buf); > > /* Get the name and type of given variable DIE, stored as "type\tname" */ > -extern int die_get_varname(Dwarf_Die *vr_die, char *buf, int len); > +extern int die_get_varname(Dwarf_Die *vr_die, struct strbuf *buf); > #endif > diff --git a/tools/perf/util/probe-finder.c b/tools/perf/util/probe-finder.c > index d5f60c0..dcca551 100644 > --- a/tools/perf/util/probe-finder.c > +++ b/tools/perf/util/probe-finder.c > @@ -1253,14 +1253,11 @@ int debuginfo__find_trace_events(struct debuginfo *dbg, > return (ret < 0) ? ret : tf.ntevs; > } > > -#define MAX_VAR_LEN 64 > - > /* Collect available variables in this scope */ > static int collect_variables_cb(Dwarf_Die *die_mem, void *data) > { > struct available_var_finder *af = data; > struct variable_list *vl; > - char buf[MAX_VAR_LEN]; > int tag, ret; > > vl = &af->vls[af->nvls - 1]; > @@ -1272,10 +1269,16 @@ static int collect_variables_cb(Dwarf_Die *die_mem, void *data) > af->pf.fb_ops, &af->pf.sp_die, > NULL); > if (ret == 0) { > - ret = die_get_varname(die_mem, buf, MAX_VAR_LEN); > - pr_debug2("Add new var: %s\n", buf); > - if (ret > 0) > - strlist__add(vl->vars, buf); > + struct strbuf buf; > + > + strbuf_init(&buf, 64); > + ret = die_get_varname(die_mem, &buf); > + pr_debug2("Add new var: %s\n", buf.buf); > + if (ret == 0) { > + strlist__add(vl->vars, > + strbuf_detach(&buf, NULL)); > + } > + strbuf_release(&buf); > } > } > > -- > 1.8.5.2 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/