From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 2041) id 3D63138387E0; Tue, 14 Jun 2022 18:10:41 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 3D63138387E0 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable From: Vladimir Mezentsev To: bfd-cvs@sourceware.org, gdb-cvs@sourceware.org Subject: [binutils-gdb] gprofng: fix build with -Werror=format-security X-Act-Checkin: binutils-gdb X-Git-Author: Vladimir Mezentsev X-Git-Refname: refs/heads/master X-Git-Oldrev: 362a867f2ac16f597d06e8a9a3f6c15afa7adf6f X-Git-Newrev: 8e2de6c81a90e98ed95dfc0ffef1e3df9cfff6b7 Message-Id: <20220614181041.3D63138387E0@sourceware.org> Date: Tue, 14 Jun 2022 18:10:41 +0000 (GMT) X-BeenThere: gdb-cvs@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-cvs mailing list List-Unsubscribe: , List-Archive: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 14 Jun 2022 18:10:41 -0000 https://sourceware.org/git/gitweb.cgi?p=3Dbinutils-gdb.git;h=3D8e2de6c81a90= e98ed95dfc0ffef1e3df9cfff6b7 commit 8e2de6c81a90e98ed95dfc0ffef1e3df9cfff6b7 Author: Vladimir Mezentsev Date: Mon Jun 13 23:49:52 2022 -0700 gprofng: fix build with -Werror=3Dformat-security =20 gprofng/ChangeLog 2022-06-13 Vladimir Mezentsev =20 PR gprofng/28968 * src/src/Hist_data.cc (print_row): Make param const. * src/src/Hist_data.h (print_row): Likewise. * src/src/Print.h: Remove unused functions and variables. * src/Print.cc: Fix -Werror=3Dformat-security errors. * src/parse.cc: Likewise. Diff: --- gprofng/src/Hist_data.cc | 3 +- gprofng/src/Hist_data.h | 3 +- gprofng/src/Print.cc | 813 +++++++------------------------------------= ---- gprofng/src/Print.h | 14 +- gprofng/src/parse.cc | 34 +- 5 files changed, 141 insertions(+), 726 deletions(-) diff --git a/gprofng/src/Hist_data.cc b/gprofng/src/Hist_data.cc index 44122039b0c..8c35cddd81c 100644 --- a/gprofng/src/Hist_data.cc +++ b/gprofng/src/Hist_data.cc @@ -898,7 +898,8 @@ append_str (StringBuilder *sb, char *s, size_t len, int= vis_bits) } =20 void -Hist_data::print_row (StringBuilder *sb, int row, Metric::HistMetric *hmp,= char *mark) +Hist_data::print_row (StringBuilder *sb, int row, Metric::HistMetric *hmp, + const char *mark) { TValue res; char buf[256]; diff --git a/gprofng/src/Hist_data.h b/gprofng/src/Hist_data.h index c5f7281abbf..c73d1fdca26 100644 --- a/gprofng/src/Hist_data.h +++ b/gprofng/src/Hist_data.h @@ -116,7 +116,8 @@ public: TValue *get_real_value (TValue *res, int met_index, int row); TValue *get_value (TValue *res, int met_index, int row); TValue *get_value (TValue *res, int met_index, HistItem *hi); - void print_row (StringBuilder *sb, int row, Metric::HistMetric *hist_met= ric, char *mark); + void print_row(StringBuilder *sb, int row, Metric::HistMetric *hist_metr= ic, + const char *mark); void print_content (FILE *out_file, Metric::HistMetric *hist_metric, int= limit); int print_label (FILE *out_file, Metric::HistMetric *hist_metric, int sp= ace); void update_total (Hist_data::HistItem *new_total); diff --git a/gprofng/src/Print.cc b/gprofng/src/Print.cc index d6662df4745..d415d591e1e 100644 --- a/gprofng/src/Print.cc +++ b/gprofng/src/Print.cc @@ -25,7 +25,6 @@ #include #include #include -//#include #include #include #include @@ -251,231 +250,6 @@ print_header (Experiment *exp, FILE *out_file) free (msg); } =20 -void -get_width (Hist_data *data, - MetricList *metrics_list, Metric::HistMetric *hist_metric) -{ - Metric *mitem; - Metric::HistMetric *hitem; - int last_column; - int index; - - // find the last visible column. - last_column =3D 0; - Vec_loop (Metric*, metrics_list->get_items (), index, mitem) - { - if (mitem->is_visible () || mitem->is_tvisible () || mitem->is_pvisibl= e ()) - last_column =3D index; - } - - // find the width for each column. - - Vec_loop (Metric*, metrics_list->get_items (), index, mitem) - { - hitem =3D &hist_metric[index]; - - if (mitem->is_visible ()) - { - if (mitem->get_vtype () =3D=3D VT_LABEL) - { - if (index =3D=3D last_column) - hitem->maxvalue_width =3D 0; - else - hitem->maxvalue_width =3D data->name_maxlen (); - // truncate names which will be too long - if (hitem->maxvalue_width > MAX_LEN - 3) - hitem->maxvalue_width =3D MAX_LEN - 3; - } - else if (mitem->get_vtype () =3D=3D VT_ADDRESS) - { - hitem->maxvalue_width =3D data->value_maxlen (index); - if (hitem->maxvalue_width < 13) - hitem->maxvalue_width =3D 13; - } - else - hitem->maxvalue_width =3D data->value_maxlen (index); - } - else - hitem->maxvalue_width =3D 0; - - if (mitem->is_tvisible ()) - { - if (mitem->get_visbits () & VAL_RATIO) - hitem->maxtime_width =3D data->value_maxlen (index); - else - hitem->maxtime_width =3D data->time_maxlen (index, - dbeSession->get_clock (-1)); - } - else - { - hitem->maxtime_width =3D 0; - } - } -} - -void -get_format (char **fmt_int, char **fmt_real0, char **fmt_real1, - MetricList *metrics_list, Metric::HistMetric *hist_metric, - int nspace) -{ - Metric *mitem; - Metric::HistMetric *hitem; - int index; - int visible, tvisible, pvisible; - size_t maxlen; - bool prev; - char numstr[MAX_LEN], pstr_int[MAX_LEN], - pstr_real0[MAX_LEN], pstr_real1[MAX_LEN]; - - // find the width for each column. - Vec_loop (Metric*, metrics_list->get_items (), index, mitem) - { - hitem =3D &hist_metric[index]; - visible =3D mitem->is_visible (); - tvisible =3D mitem->is_tvisible (); - pvisible =3D mitem->is_pvisible (); - *pstr_int =3D *pstr_real0 =3D *pstr_real1 =3D '\0'; - - // Get 'Show Value' format - const char *sign =3D (mitem->get_visbits () & VAL_DELTA) ? "+" : ""; - if (visible) - { - maxlen =3D hitem->maxvalue_width; - switch (mitem->get_vtype2 ()) - { - case VT_DOUBLE: - if (mitem->get_visbits () & VAL_RATIO) - { - snprintf (numstr, sizeof (numstr), "x %%#%d.0lf ", - (int) (maxlen - 3)); - snprintf (pstr_real0, sizeof (pstr_real0), numstr, 0.0); - snprintf (pstr_real1, sizeof (pstr_real1), "x%%s%%%d.3lf ", - (int) maxlen); - } - else - { - snprintf (numstr, sizeof (numstr), "%%#%s%d.0lf ", sign, - (int) (maxlen - 3)); - snprintf (pstr_real0, sizeof (pstr_real0), numstr, 0.0); - snprintf (pstr_real1, sizeof (pstr_real1), "%%s%%%s%d.3lf ", - sign, (int) maxlen); - } - break; - case VT_INT: - snprintf (pstr_int, sizeof (pstr_int), "%%%s%dd ", sign, - (int) maxlen); - break; - case VT_LLONG: - snprintf (pstr_int, sizeof (pstr_int), "%%%s%dlld ", sign, - (int) maxlen); - break; - case VT_ULLONG: - snprintf (pstr_int, sizeof (pstr_int), "%%%s%dllu ", sign, - (int) maxlen); - break; - case VT_ADDRESS: - if (maxlen <=3D 13) - { - snprintf (pstr_int, sizeof (pstr_int), "%%%dd:0x%%08x", 2); - } - else - { - snprintf (pstr_int, sizeof (pstr_int), "%%%dd:0x%%08x", - (int) (maxlen - 13)); - } - break; - case VT_FLOAT: - snprintf (numstr, sizeof (numstr), "%%#%d.0f ", - (int) (maxlen - 3)); - snprintf (pstr_real0, sizeof (pstr_real0), numstr, 0.0); - snprintf (pstr_real1, sizeof (pstr_real1), "%%%d.3f ", - (int) maxlen); - break; - case VT_SHORT: - snprintf (pstr_int, sizeof (pstr_int), "%%%dhu ", (int) maxlen); - break; - case VT_LABEL: - if (maxlen =3D=3D 0) // last column - snprintf (pstr_int, sizeof (pstr_int), NTXT ("%%s%%s")); - else if (maxlen + nspace >=3D MAX_LEN - 3) - snprintf (pstr_int, sizeof (pstr_int), NTXT ("%%s%%-%d.%ds "), - MAX_LEN - 7, MAX_LEN - 7); - else - snprintf (pstr_int, sizeof (pstr_int), NTXT ("%%s%%-%ds "), - (int) (maxlen + nspace)); - break; - default: - break; - } - } - - // Get 'Show Time' format - if (tvisible) - { - maxlen =3D hitem->maxtime_width; - if (mitem->get_visbits () & VAL_RATIO) - { - snprintf (numstr, sizeof (numstr), " %%%s#%d.0lf ", - sign, (int) (maxlen - 3)); - snprintf (pstr_real0, sizeof (pstr_real0), numstr, 0.0); - snprintf (pstr_real1, sizeof (pstr_real1), "%%s%%%s%d.3lf ", - sign, (int) maxlen); - } - else - { - snprintf (numstr, sizeof (numstr), "%%%s#%d.0lf ", - sign, (int) (maxlen - 3)); - snprintf (pstr_real0, sizeof (pstr_real0), numstr, 0.0); - snprintf (pstr_real1, sizeof (pstr_real1), "%%s%%%s%d.3lf ", - sign, (int) maxlen); - } - } - - // Copy format - if (*pstr_int) - fmt_int[index] =3D dbe_strdup (pstr_int); - else - fmt_int[index] =3D NULL; - - if (*pstr_real0) - fmt_real0[index] =3D dbe_strdup (pstr_real0); - else - fmt_real0[index] =3D NULL; - - if (*pstr_real1) - fmt_real1[index] =3D dbe_strdup (pstr_real1); - else - fmt_real1[index] =3D NULL; - - // Set total width - hitem->width =3D 0; - if (hitem->maxvalue_width > 0) - { - hitem->width +=3D hitem->maxvalue_width; - prev =3D true; - } - else - prev =3D false; - - if (hitem->maxtime_width > 0) - { - if (prev) - hitem->width++; - hitem->width +=3D hitem->maxtime_width; - prev =3D true; - } - - if (pvisible) - { - if (prev) - hitem->width++; - hitem->width +=3D 6; // adjust to change format from xx.yy% - } - if (visible || tvisible || pvisible) - mitem->legend_width (hitem, 2); - } -} - static char * delTrailingBlanks (char *s) { @@ -503,26 +277,26 @@ print_label (FILE *out_file, MetricList *metrics_list, if (mitem->is_visible () || mitem->is_tvisible () || mitem->is_pvisi= ble ()) { Metric::HistMetric *hitem =3D hist_metric + index; - char *fmt; + const char *s; if (index > 0 && mitem->get_type () =3D=3D Metric::ONAME) { - fmt =3D NTXT (" %-*s"); + s =3D " "; name_offset =3D strlen (line1); } else - fmt =3D NTXT ("%-*s"); + s =3D ""; int width =3D (int) hitem->width; size_t len =3D strlen (line1); - snprintf (line1 + len, sizeof (line1) - len, fmt, width, + snprintf (line1 + len, sizeof (line1) - len, "%s%-*s", s, width, hitem->legend1); len =3D strlen (line2); - snprintf (line2 + len, sizeof (line2) - len, fmt, width, + snprintf (line2 + len, sizeof (line2) - len, "%s%-*s", s, width, hitem->legend2); len =3D strlen (line3); - snprintf (line3 + len, sizeof (line3) - len, fmt, width, + snprintf (line3 + len, sizeof (line3) - len, "%s%-*s", s, width, hitem->legend3); len =3D strlen (line0); - snprintf (line0 + len, sizeof (line0) - len, fmt, width, + snprintf (line0 + len, sizeof (line0) - len, "%s%-*s", s, width, mitem->legend ? mitem->legend : NTXT ("")); } } @@ -535,198 +309,6 @@ print_label (FILE *out_file, MetricList *metrics_list, return name_offset; } =20 -static int -print_one_visible (FILE *out_file, char *fmt_int, char *fmt_real0, char *f= mt_real1, - TValue *value, int visbits) -{ - int nc =3D 0; - switch (value->tag) - { - case VT_DOUBLE: - if (value->d =3D=3D 0.0) - nc =3D fprintf (out_file, fmt_real0); - else - { - if (visbits & VAL_RATIO) - { - if (value->d > 99.999) - nc =3D fprintf (out_file, fmt_real1, NTXT (">"), 99.999); - else - nc =3D fprintf (out_file, fmt_real1, NTXT (" "), value->d); - } - else - nc =3D fprintf (out_file, fmt_real1, NTXT (""), value->d); - } - break; - case VT_INT: - nc =3D fprintf (out_file, fmt_int, value->i); - break; - case VT_LLONG: - case VT_ULLONG: - nc =3D fprintf (out_file, fmt_int, value->ll); - break; - case VT_ADDRESS: - nc =3D fprintf (out_file, fmt_int, ADDRESS_SEG (value->ll), - ADDRESS_OFF (value->ll)); - break; - case VT_FLOAT: - if (value->f =3D=3D 0.0) - nc =3D fprintf (out_file, fmt_real0); - else - nc =3D fprintf (out_file, fmt_real1, value->f); - break; - case VT_SHORT: - nc =3D fprintf (out_file, fmt_int, value->s); - break; - // ignoring the following cases (why?) - case VT_HRTIME: - case VT_LABEL: - case VT_OFFSET: - break; - } - return nc; -} - -static int -print_one_tvisible (FILE *out_file, char *fmt_real0, char *fmt_real1, - TValue *value, int visbits, int clock) -{ - int nc; - if (value->ll =3D=3D 0LL) - nc =3D fprintf (out_file, fmt_real0); - else - { - if (visbits & VAL_RATIO) - { - if (value->d > 99.999) - nc =3D fprintf (out_file, fmt_real1, NTXT (">"), 99.999); - else - nc =3D fprintf (out_file, fmt_real1, NTXT (" "), value->d); - } - else - nc =3D fprintf (out_file, fmt_real1, "", 1.e-6 * value->ll / clock); - } - return nc; -} - -static void -print_one (FILE *out_file, Hist_data *data, Hist_data::HistItem *item, - char **fmt_int, char **fmt_real0, char **fmt_real1, - MetricList *metrics_list, Metric::HistMetric *hist_metric, - char *mark, Histable::NameFormat nfmt) -{ - Metric *mitem; - Metric::HistMetric *hitem; - int index, nc, np, i; - int visible, tvisible, pvisible; - TValue *value; - double percent; - - if (item->type =3D=3D Module::AT_EMPTY) - { - fprintf (out_file, nl); - return; - } - - // set name_is_Total - int name_is_Total =3D 0; - - Vec_loop (Metric*, metrics_list->get_items (), index, mitem) - { - if (mitem->get_type () !=3D Metric::ONAME) - continue; - name_is_Total =3D strcmp (item->obj->get_name (), GTXT ("")) = =3D=3D 0; - break; - } - - np =3D 0; - Vec_loop (Metric*, metrics_list->get_items (), index, mitem) - { - visible =3D mitem->is_visible (); - tvisible =3D mitem->is_tvisible (); - pvisible =3D mitem->is_pvisible (); - - // alignment - for (i =3D 0; i < np; i++) - fputc (' ', out_file); - - hitem =3D &hist_metric[index]; - nc =3D 0; - if (tvisible) - { - value =3D &(item->value[index]); - nc =3D print_one_tvisible (out_file, fmt_real0[index], fmt_real1[index], - value, mitem->get_visbits (), - dbeSession->get_clock (-1)); - } - else - nc =3D 0; - - if (visible) - { - if (mitem->get_vtype () =3D=3D VT_LABEL) - { - value =3D &(item->value[index]); - if (value->tag =3D=3D VT_OFFSET) - nc +=3D fprintf (out_file, fmt_int[index], mark, - ((DataObject*) (item->obj))->get_offset_name ()); - else - nc +=3D fprintf (out_file, fmt_int[index], mark, - item->obj->get_name (nfmt)); - } - else if (name_is_Total && - (strcmp (mitem->get_username (), "Block Covered %") =3D=3D 0 - || strcmp (mitem->get_username (), "Instr Covered %") =3D=3D 0)) - { - char stmp[128]; - snprintf (stmp, sizeof (stmp), fmt_int[index], 0); - - /* and now blank that '0' out */ - for (int ii =3D 0; ii < 128; ii++) - { - if (stmp[ii] !=3D '0') - continue; - stmp[ii] =3D ' '; - break; - } - nc +=3D fprintf (out_file, stmp); - } - else - nc +=3D print_one_visible (out_file, fmt_int[index], fmt_real0[index], - fmt_real1[index], &(item->value[index]), - mitem->get_visbits ()); - } - - if (pvisible) - { - percent =3D data->get_percentage (item->value[index].to_double (), index); - if (percent =3D=3D 0.0) - // adjust to change format from xx.yy% - nc +=3D fprintf (out_file, NTXT ("%#4.0f "), 0.); - else - // adjust format below to change format from xx.yy% - nc +=3D fprintf (out_file, NTXT ("%6.2f "), (100.0 * percent)); - } - np =3D (int) (hitem->width - nc); - } - fprintf (out_file, nl); -} - -void -print_content (FILE *out_file, Hist_data *data, - char **fmt_int, char **fmt_real0, char **fmt_real1, - MetricList *metrics_list, Metric::HistMetric *hist_metric, - int limit, Histable::NameFormat nfmt) -{ - // printing contents. - for (int i =3D 0; i < limit; i++) - { - Hist_data::HistItem *item =3D data->fetch (i); - print_one (out_file, data, item, fmt_int, fmt_real0, fmt_real1, - metrics_list, hist_metric, NTXT (" "), nfmt); - } -} - er_print_histogram::er_print_histogram (DbeView *_dbev, Hist_data *data, MetricList *metrics_list, Print_mode disp_type, int limit, @@ -806,58 +388,40 @@ void er_print_histogram::dump_annotated_dataobjects (Vector *marks, int ithreshold) { - Metric::HistMetric *hist_metric; - char **fmt_int, **fmt_real0, **fmt_real1; - int no_metrics =3D mlist->get_items ()->size (); - int name_index =3D -1; - Histable::NameFormat nfmt =3D dbev->get_name_format (); if (!dbeSession->is_datamode_available ()) fprintf (out_file, - GTXT ("No dataspace information recorded in experiments\n\n")); + GTXT ("No dataspace information recorded in experiment= s\n\n")); =20 Hist_data *layout_data =3D dbev->get_data_space ()->get_layout_data (his= t_data, marks, ithreshold); + Metric::HistMetric *hist_metric =3D layout_data->get_histmetrics (); =20 - for (int mind =3D 0; mind < no_metrics; mind++) - if (mlist->get_items ()->fetch (mind)->get_type () =3D=3D Metric::ONAM= E) - name_index =3D mind; - - fmt_int =3D new char*[no_metrics]; - fmt_real0 =3D new char*[no_metrics]; - fmt_real1 =3D new char*[no_metrics]; - hist_metric =3D new Metric::HistMetric[no_metrics]; - - // use new layout_data to set metric format - get_width (hist_data, mlist, hist_metric); - get_format (fmt_int, fmt_real0, fmt_real1, mlist, hist_metric, 0); - snprintf (hist_metric[name_index].legend2, MAX_LEN, GTXT ("* +offset .el= ement")); - print_label (out_file, mlist, hist_metric, 3); +// snprintf (hist_metric[name_index].legend2, MAX_LEN, GTXT ("* +offset .= element")); + layout_data->print_label (out_file, hist_metric, 3); fprintf (out_file, nl); + StringBuilder sb; + for (long i =3D 0; i < layout_data->size (); i++) { - Hist_data::HistItem* item =3D layout_data->fetch (i); + sb.setLength (0); if (marks->find (i) !=3D -1) - fprintf (out_file, NTXT ("## ")); + sb.append ("## "); else - fprintf (out_file, NTXT (" ")); - print_one (out_file, layout_data, item, fmt_int, fmt_real0, fmt_real= 1, - mlist, hist_metric, NTXT (" "), nfmt); + sb.append (" "); + layout_data->print_row (&sb, i, hist_metric, " "); + sb.toFileLn (out_file); } fprintf (out_file, nl); - - // free format strings. - for (int i =3D 0; i < no_metrics; i++) - { - free (fmt_int[i]); - free (fmt_real0[i]); - free (fmt_real1[i]); - } - delete[] fmt_int; - delete[] fmt_real0; - delete[] fmt_real1; - delete[] hist_metric; delete layout_data; } =20 +static int +max_length(size_t len, size_t str_len) +{ + if (str_len > len) + return str_len; + return len; +} + void er_print_histogram::dump_detail (int limit) { @@ -869,24 +433,14 @@ er_print_histogram::dump_detail (int limit) MetricList *prop_mlist =3D new MetricList (mlist); Metric *mitem; int index, i; - size_t max_len, len, smax_len, slen; - Vaddr pc; Module *module; LoadObject *loadobject; char *sname, *oname, *lname, *alias, *mangle; - char fmt_name[MAX_LEN]; - char fmt_elem[MAX_LEN]; - char fmt_real1[MAX_LEN], fmt_real2[MAX_LEN]; - char fmt_int1[MAX_LEN], fmt_int2[MAX_LEN]; - char fmt_long1[MAX_LEN], fmt_long2[MAX_LEN], fmt_long3[MAX_LEN]; - char fmt_int0[MAX_LEN], fmt_long0[MAX_LEN]; - char numstr[MAX_LEN]; =20 Histable::NameFormat nfmt =3D dbev->get_name_format (); =20 // Check max. length of metrics names - max_len =3D smax_len =3D 0; - + size_t len =3D 0, slen =3D 0; Vec_loop (Metric*, prop_mlist->get_items (), index, mitem) { mitem->set_vvisible (true); @@ -896,79 +450,37 @@ er_print_histogram::dump_detail (int limit) if (mitem->get_subtype () !=3D Metric::STATIC) { mitem->set_pvisible (true); - len =3D hist_data->value_maxlen (index); - if (max_len < len) - max_len =3D len; - slen =3D strlen (mitem->get_name ()); - if (smax_len < slen) - smax_len =3D slen; + len =3D max_length (len, hist_data->value_maxlen (index)); + slen =3D max_length (slen, strlen (mitem->get_name ())); } } =20 // now get the length of the other (non-performance-data) messages if (hist_data->type =3D=3D Histable::FUNCTION) { - slen =3D strlen (GTXT ("Source File")); - if (smax_len < slen) - smax_len =3D slen; - slen =3D strlen (GTXT ("Object File")); - if (smax_len < slen) - smax_len =3D slen; - slen =3D strlen (GTXT ("Load Object")); - if (smax_len < slen) - smax_len =3D slen; - slen =3D strlen (GTXT ("Mangled Name")); - if (smax_len < slen) - smax_len =3D slen; - slen =3D strlen (GTXT ("Aliases")); - if (smax_len < slen) - smax_len =3D slen; + slen =3D max_length (slen, strlen (GTXT ("Source File"))); + slen =3D max_length (slen, strlen (GTXT ("Object File"))); + slen =3D max_length (slen, strlen (GTXT ("Load Object"))); + slen =3D max_length (slen, strlen (GTXT ("Mangled Name"))); + slen =3D max_length (slen, strlen (GTXT ("Aliases"))); } else if (hist_data->type =3D=3D Histable::DOBJECT) { - slen =3D strlen (GTXT ("Scope")); - if (smax_len < slen) - smax_len =3D slen; - slen =3D strlen (GTXT ("Type")); - if (smax_len < slen) - smax_len =3D slen; - slen =3D strlen (GTXT ("Member of")); - if (smax_len < slen) - smax_len =3D slen; - slen =3D strlen (GTXT ("Offset (bytes)")); - if (smax_len < slen) - smax_len =3D slen; - slen =3D strlen (GTXT ("Size (bytes)")); - if (smax_len < slen) - smax_len =3D slen; - slen =3D strlen (GTXT ("Elements")); - if (smax_len < slen) - smax_len =3D slen; - } - snprintf (fmt_name, sizeof (fmt_name), NTXT ("\t%%%ds: "), (int) smax_le= n); - snprintf (fmt_elem, sizeof (fmt_elem), NTXT ("\t%%%ds "), (int) smax_le= n); - snprintf (numstr, sizeof (numstr), "%%#%d.0lf ( %#1.0f %%%%%%%%)\n", - (int) (max_len - 3), 0.); - snprintf (fmt_real1, sizeof (fmt_real1), numstr, 0.0); - snprintf (fmt_real2, sizeof (fmt_real2), NTXT ("%%%d.3lf (%%5.1f%%%%)\n"= ), - (int) max_len); - snprintf (fmt_int0, sizeof (fmt_int0), NTXT ("%%%dd\n"), (int) max_len); - snprintf (numstr, sizeof (numstr), NTXT ("%%%dd ( %#1.0f %%%%%%%%)\n"), - (int) max_len, 0.); - snprintf (fmt_int1, sizeof (fmt_int1), numstr, 0); - snprintf (fmt_int2, sizeof (fmt_int2), NTXT ("%%%dd (%%5.1f%%%%)\n"), - (int) max_len); - snprintf (fmt_long0, sizeof (fmt_long0), NTXT ("%%%dllu\n"), (int) max_l= en); - snprintf (numstr, sizeof (numstr), NTXT ("%%%dd ( %#1.0f %%%%%%%%)\n"), - (int) max_len, 0.); - snprintf (fmt_long1, sizeof (fmt_long1), numstr, 0); - snprintf (fmt_long2, sizeof (fmt_long2), "%%%dllu (%%5.1f%%%%)\n", - (int) max_len); - snprintf (numstr, sizeof (numstr), NTXT ("\t%%%ds %%%%%dllu\n"), - (int) (smax_len + 1), (int) max_len); - snprintf (fmt_long3, sizeof (fmt_long3), numstr, GTXT ("Count:")); - snprintf (numstr, sizeof (numstr), "%%%dd ( %#1.0f %%%%%%%%) %%#%d.0lf\= n", - (int) max_len, 0., (int) (max_len - 6)); + slen =3D max_length (slen, strlen (GTXT ("Scope"))); + slen =3D max_length (slen, strlen (GTXT ("Type"))); + slen =3D max_length (slen, strlen (GTXT ("Member of"))); + slen =3D max_length (slen, strlen (GTXT ("Offset (bytes)"))); + slen =3D max_length (slen, strlen (GTXT ("Size (bytes)"))); + slen =3D max_length (slen, strlen (GTXT ("Elements"))); + } + int max_len =3D (int) len; + int smax_len =3D (int) slen; + +#define PR_TITLE(t) fprintf (out_file, "\t%*s:", smax_len, t) +#define PR(title, nm) PR_TITLE(title); \ + if (nm) \ + fprintf (out_file, " %s", nm); \ + fprintf (out_file, "\n") =20 // now loop over the objects int num_printed_items =3D 0; @@ -1032,84 +544,45 @@ er_print_histogram::dump_detail (int limit) if (mitem->get_subtype () =3D=3D Metric::STATIC && htype =3D=3D Histable::DOBJECT) continue; - fprintf (out_file, fmt_name, mitem->get_name ()); + PR_TITLE (mitem->get_name ()); =20 + char buf[128]; + char *s =3D values[index].to_str (buf, sizeof (buf)); if (mitem->get_value_styles () & VAL_PERCENT) { dvalue =3D values[index].to_double (); - switch (mitem->get_vtype ()) + percent =3D 100.0 * current_data->get_percentage (dvalue, index); + if (!mitem->is_time_val ()) { - case VT_DOUBLE: - if (dvalue =3D=3D 0.0) - fprintf (out_file, fmt_real1); - else - fprintf (out_file, fmt_real2, dvalue, 100.0 - * current_data->get_percentage (dvalue, index)); - break; - case VT_INT: - if (dvalue =3D=3D 0.0) - fprintf (out_file, fmt_int1); - else - fprintf (out_file, fmt_int2, (int) dvalue, 100.0 - * current_data->get_percentage (dvalue, index)); - break; - case VT_LLONG: - case VT_ULLONG: - if (values[index].ll =3D=3D 0LL) - { - if (mitem->is_time_val ()) - { - fprintf (out_file, fmt_real1); - fprintf (out_file, fmt_long3, 0LL); - } - else - fprintf (out_file, fmt_long1); - } + fprintf (out_file, " %*s", max_len, s); + if (dvalue =3D=3D 0.) + fprintf (out_file, " ( 0. %%)\n"); else - { - percent =3D 100.0 * - current_data->get_percentage (dvalue, index); - if (mitem->is_time_val ()) - { - dvalue /=3D 1.e+6 * dbeSession->get_clock (-1); - fprintf (out_file, fmt_real2, dvalue, percent); - fprintf (out_file, fmt_long3, values[index].ll); - } - else - fprintf (out_file, fmt_long2, values[index].ll, - percent); - } - break; - default: - break; + fprintf (out_file, " (%5.1f%%)\n", percent); + continue; } + + TValue v; + v.tag =3D VT_DOUBLE; + v.sign =3D false; + v.d =3D dvalue / (1.e+6 * dbeSession->get_clock (-1)); + char buf1[128]; + char *s1 =3D v.to_str (buf1, sizeof (buf1)); + fprintf (out_file, " %*s", max_len, s1); + if (dvalue =3D=3D 0.) + fprintf (out_file, " ( 0. %%)\n"); + else + fprintf (out_file, " (%5.1f%%)\n", percent); + PR_TITLE (GTXT ("Count")); } - else + + int max_len1 =3D max_len; + for (int j =3D (int) strlen (s) - 1; j >=3D 0 && s[j] =3D=3D ' '; j--) { - switch (mitem->get_vtype ()) - { - case VT_INT: - fprintf (out_file, fmt_int0, values[index].i); - break; - case VT_LLONG: - case VT_ULLONG: - fprintf (out_file, fmt_long0, values[index].ll); - break; - case VT_ADDRESS: - pc =3D values[index].ll; - fprintf (out_file, NTXT ("%u:0x%08x\n"), ADDRESS_SEG (pc), - ADDRESS_OFF (pc)); - break; - case VT_DOUBLE: - if (values[index].d =3D=3D 0.0) - fprintf (out_file, fmt_real1); - else - fprintf (out_file, "\t%*.3lf\n", (int) (max_len - 5), values[index].d); - break; - default: - break; - } + s[j] =3D 0; + max_len1--; } + fprintf (out_file, " %*s\n", max_len1, s); } =20 // now add the descriptive information about the object @@ -1139,29 +612,11 @@ er_print_histogram::dump_detail (int limit) if (htype =3D=3D Histable::INSTR && dbeSession->is_datamode_availab= le ()) alias =3D ((DbeInstr*) obj)->get_descriptor (); =20 - fprintf (out_file, fmt_name, GTXT ("Source File")); - if (sname) - fprintf (out_file, NTXT ("%s"), sname); - fprintf (out_file, NTXT ("\n")); - - fprintf (out_file, fmt_name, GTXT ("Object File")); - if (oname) - fprintf (out_file, NTXT ("%s"), oname); - fprintf (out_file, NTXT ("\n")); - - fprintf (out_file, fmt_name, GTXT ("Load Object")); - if (lname) - fprintf (out_file, NTXT ("%s"), lname); - fprintf (out_file, NTXT ("\n")); - - fprintf (out_file, fmt_name, GTXT ("Mangled Name")); - if (mangle) - fprintf (out_file, NTXT ("%s"), mangle); - fprintf (out_file, NTXT ("\n")); - fprintf (out_file, fmt_name, GTXT ("Aliases")); - if (alias) - fprintf (out_file, NTXT ("%s"), alias); - fprintf (out_file, NTXT ("\n")); + PR (GTXT ("Source File"), sname); + PR (GTXT ("Object File"), oname); + PR (GTXT ("Load Object"), lname); + PR (GTXT ("Mangled Name"), mangle); + PR (GTXT ("Aliases"), alias); } } else @@ -1171,7 +626,7 @@ er_print_histogram::dump_detail (int limit) Histable *scope =3D dobj->get_scope (); =20 // print the scope - fprintf (out_file, fmt_name, GTXT ("Scope")); + PR_TITLE (GTXT ("Scope")); if (!scope) fprintf (out_file, GTXT ("(Global)\n")); else switch (scope->get_type ()) @@ -1188,7 +643,7 @@ er_print_histogram::dump_detail (int limit) } =20 // print the type name - fprintf (out_file, fmt_name, GTXT ("Type")); + PR_TITLE (GTXT ("Type")); if (dobj->get_typename ()) fprintf (out_file, NTXT ("%s\n"), dobj->get_typename ()); else @@ -1199,16 +654,16 @@ er_print_histogram::dump_detail (int limit) { if (dobj->get_parent ()) { - fprintf (out_file, fmt_name, GTXT ("Member of")); + PR_TITLE (GTXT ("Member of")); fprintf (out_file, NTXT ("%s\n"), dobj->get_parent ()->get_name ()); } - fprintf (out_file, fmt_name, GTXT ("Offset (bytes)")); + PR_TITLE (GTXT ("Offset (bytes)")); fprintf (out_file, NTXT ("%lld\n"), (long long) dobj->get_offset ()= ); } // print the size if (dobj->get_size ()) { - fprintf (out_file, fmt_name, GTXT ("Size (bytes)")); + PR_TITLE (GTXT ("Size (bytes)")); fprintf (out_file, NTXT ("%lld\n"), (long long) dobj->get_size ()); } } @@ -1284,11 +739,9 @@ dump_anno_file (FILE *fp, Histable::Type type, Module= *module, DbeView *dbev, Function *func, Vector *marks, int threshold, int vis_bits, int src_visible, bool hex_visible, bool src_only) { - int no_metrics, lspace, mspace, tspace, - remain, mindex, next_mark, hidx, - index; + int lspace, mspace, tspace, remain, mindex, next_mark, hidx, index; Metric *mitem; - char **fmt_int, **fmt_real0, **fmt_real1, buf[MAX_LEN]; + char buf[MAX_LEN]; Hist_data::HistItem *item; =20 SourceFile *srcContext =3D NULL; @@ -1327,10 +780,6 @@ dump_anno_file (FILE *fp, Histable::Type type, Module= *module, DbeView *dbev, // force the name metric to be invisible MetricList *nmlist =3D hdata->get_metric_list (); nmlist->find_metric (GTXT ("name"), Metric::STATIC)->clear_all_visbits (= ); - no_metrics =3D nmlist->get_items ()->size (); - fmt_int =3D new char*[no_metrics]; - fmt_real0 =3D new char*[no_metrics]; - fmt_real1 =3D new char*[no_metrics]; Metric::HistMetric *hist_metric =3D hdata->get_histmetrics (); =20 // lspace is for max line number that's inserted; use to set width @@ -1455,9 +904,6 @@ dump_anno_file (FILE *fp, Histable::Type type, Module = *module, DbeView *dbev, item->value[lind].l =3D dbe_strdup (GTXT ("INTERNAL ERROR: missing l= ine text")); fprintf (fp, NTXT ("%s\n"), item->value[lind].l); } - delete[] fmt_int; - delete[] fmt_real0; - delete[] fmt_real1; delete hdata; } =20 @@ -2405,7 +1851,7 @@ er_print_experiment::data_dump () =20 if (stat) { - snprintf (fmt1, sizeof (fmt1), NTXT ("%%50s")); + max_len1 =3D 50; if (exp_idx2 > exp_idx1) { statistics_sum (maxlen); @@ -2417,7 +1863,7 @@ er_print_experiment::data_dump () } else if (over) { - snprintf (fmt1, sizeof (fmt1), NTXT ("%%30s")); + max_len1 =3D 50; if (exp_idx2 > exp_idx1) { overview_sum (maxlen); @@ -2484,9 +1930,7 @@ er_print_experiment::overview_dump (int exp_idx, int = &maxlen) } =20 //Get the collection params for the sample selection and display them. - fprintf (out_file, NTXT ("\n\n")); - fprintf (out_file, fmt1, GTXT ("Individual samples")); - fprintf (out_file, NTXT ("\n\n")); + fprintf (out_file, "\n\n%*s\n\n", max_len1, GTXT ("Individual samples")); =20 size =3D ovw_data->size (); ovw_item_labels =3D ovw_data->get_labels (); @@ -2494,8 +1938,8 @@ er_print_experiment::overview_dump (int exp_idx, int = &maxlen) for (index =3D 0; index < size; index++) { ovw_item =3D ovw_data->fetch (index); - fprintf (out_file, fmt1, GTXT ("Sample Number")); - fprintf (out_file, NTXT (": %d\n\n"), ovw_item.number); + fprintf (out_file, "%*s: %d\n\n", max_len1, GTXT ("Sample Number"), + ovw_item.number); overview_item (&ovw_item, &ovw_item_labels); fprintf (out_file, nl); } @@ -2514,13 +1958,10 @@ er_print_experiment::overview_summary (Ovw_data *ov= w_data, int &maxlen) len =3D snprintf (buf, sizeof (buf), "%.3lf", tstodouble (totals.total.t= )); if (maxlen < len) maxlen =3D len; - snprintf (buf, sizeof (buf), NTXT ("%%#%d.0lf ( %#1.0f %%%%%%%%)"), - maxlen - 3, 0.); - snprintf (fmt2, sizeof (fmt2), NTXT ("%%%d.3lf"), maxlen); - snprintf (fmt3, sizeof (fmt3), buf, 0.0); - snprintf (fmt4, sizeof (fmt4), NTXT ("%%%d.3lf (%%5.1f%%%%)"), maxlen); - fprintf (out_file, fmt1, GTXT ("Aggregated statistics for selected sampl= es")); - fprintf (out_file, NTXT ("\n\n")); + max_len2 =3D maxlen; + max_len3 =3D maxlen; + fprintf (out_file, "%*s\n\n", max_len1, + GTXT ("Aggregated statistics for selected samples")); =20 ovw_item_labels =3D ovw_data->get_labels (); overview_item (&totals, &ovw_item_labels); @@ -2537,30 +1978,25 @@ er_print_experiment::overview_item (Ovw_data::Ovw_i= tem *ovw_item, start =3D tstodouble (ovw_item->start); end =3D tstodouble (ovw_item->end); =20 - fprintf (out_file, fmt1, GTXT ("Start Label")); - fprintf (out_file, NTXT (": ")); - fprintf (out_file, NTXT ("%s"), ovw_item->start_label); - fprintf (out_file, nl); - fprintf (out_file, fmt1, GTXT ("End Label")); - fprintf (out_file, NTXT (": %s\n"), ovw_item->end_label); + fprintf (out_file, "%*s: %s\n", max_len1, GTXT ("Start Label"), + ovw_item->start_label); + fprintf (out_file, "%*s: %s\n", max_len1, GTXT ("End Label"), + ovw_item->end_label); =20 - fprintf (out_file, fmt1, GTXT ("Start Time (sec.)")); - fprintf (out_file, NTXT (": ")); + fprintf (out_file, "%*s: ", max_len1, GTXT ("Start Time (sec.)")); if (start =3D=3D -1.0) fprintf (out_file, GTXT ("N/A")); else - fprintf (out_file, fmt2, start); + fprintf (out_file, "%*.3f", max_len2, start); fprintf (out_file, nl); - fprintf (out_file, fmt1, GTXT ("End Time (sec.)")); - fprintf (out_file, NTXT (": ")); + fprintf (out_file, "%*s: ", max_len1, GTXT ("End Time (sec.)")); if (end =3D=3D -1.0) fprintf (out_file, GTXT ("N/A")); else - fprintf (out_file, fmt2, end); + fprintf (out_file, "%*.3f", max_len2, end); fprintf (out_file, nl); - fprintf (out_file, fmt1, GTXT ("Duration (sec.)")); - fprintf (out_file, NTXT (": ")); - fprintf (out_file, fmt2, tstodouble (ovw_item->duration)); + fprintf (out_file, "%*s: ", max_len1, GTXT ("Duration (sec.)")); + fprintf (out_file, "%*.3f", max_len2, tstodouble (ovw_item->duration)); fprintf (out_file, NTXT ("\n")); =20 size =3D ovw_item->size; @@ -2568,19 +2004,16 @@ er_print_experiment::overview_item (Ovw_data::Ovw_i= tem *ovw_item, tsadd (&total_time, &ovw_item->values[index].t); =20 total_value =3D tstodouble (total_time); - fprintf (out_file, fmt1, GTXT ("Total Thread Time (sec.)")); - fprintf (out_file, NTXT (": ")); - fprintf (out_file, fmt2, tstodouble (ovw_item->tlwp)); + fprintf (out_file, "%*s: %*.3f", max_len1, GTXT ("Total Thread Time (sec= .)"), + max_len2, tstodouble (ovw_item->tlwp)); fprintf (out_file, NTXT ("\n")); - fprintf (out_file, fmt1, GTXT ("Average number of Threads")); - fprintf (out_file, NTXT (": ")); + fprintf (out_file, "%*s: ", max_len1, GTXT ("Average number of Threads")= ); if (tstodouble (ovw_item->duration) !=3D 0) - fprintf (out_file, fmt2, ovw_item->nlwp); + fprintf (out_file, "%*.3f", max_len2, ovw_item->nlwp); else fprintf (out_file, GTXT ("N/A")); fprintf (out_file, NTXT ("\n\n")); - fprintf (out_file, fmt1, GTXT ("Process Times (sec.)")); - fprintf (out_file, NTXT (":\n")); + fprintf (out_file, "%*s:\n", max_len1, GTXT ("Process Times (sec.)")); for (index =3D 1; index < size; index++) { overview_value (&ovw_item_labels->values[index], ovw_item_labels->ty= pe, @@ -2599,21 +2032,21 @@ er_print_experiment::overview_value (Value *value, = ValueTag value_tag, switch (value_tag) { case VT_LABEL: - fprintf (out_file, fmt1, value->l); - fprintf (out_file, NTXT (": ")); + fprintf (out_file, "%*s: ", max_len1, value->l); break; case VT_HRTIME: dvalue =3D tstodouble (value->t); if (dvalue =3D=3D 0.0) - fprintf (out_file, fmt3, 0., 0.); + fprintf (out_file, "%*s ( 0. %%)", max_len3, "0. "); else - fprintf (out_file, fmt4, dvalue, 100.0 * dvalue / total_value); + fprintf (out_file, "%*.3f (%5.1f%%)", max_len3, dvalue, + 100.0 * dvalue / total_value); break; case VT_INT: fprintf (out_file, NTXT ("%d"), value->i); break; default: - fprintf (out_file, fmt3); + fprintf (out_file, "%*.3f", max_len3, total_value); } } =20 @@ -2645,7 +2078,7 @@ er_print_experiment::statistics_sum (int &maxlen) overview_sum (maxlen); =20 // print statistics data - snprintf (fmt2, sizeof (fmt2), NTXT (": %%%ds\n"), maxlen); + max_len2 =3D maxlen; statistics_item (sum_data); delete sum_data; } @@ -2682,7 +2115,7 @@ er_print_experiment::statistics_dump (int exp_idx, in= t &maxlen) fprintf (out_file, nl); =20 // print statistics data - snprintf (fmt2, sizeof (fmt2), NTXT (": %%%ds\n"), maxlen); + max_len2 =3D maxlen; statistics_item (stats_data); delete stats_data; } @@ -2697,8 +2130,8 @@ er_print_experiment::statistics_item (Stats_data *sta= ts_data) for (index =3D 0; index < size; index++) { stats_item =3D stats_data->fetch (index); - fprintf (out_file, fmt1, stats_item.label); - fprintf (out_file, fmt2, stats_item.value.to_str (buf, sizeof (buf))= ); + fprintf (out_file, "%*s: %*s\n", max_len1, stats_item.label, + max_len2, stats_item.value.to_str (buf, sizeof (buf))); } fprintf (out_file, nl); } diff --git a/gprofng/src/Print.h b/gprofng/src/Print.h index 4bc66558b6f..38a53048808 100644 --- a/gprofng/src/Print.h +++ b/gprofng/src/Print.h @@ -156,9 +156,6 @@ private: Histable *sobj; MetricList *mlist; Metric::HistMetric *hist_metric; - char **fmt_int; - char **fmt_real0; - char **fmt_real1; int limit; int print_row; }; @@ -225,15 +222,13 @@ public: void data_dump (); =20 private: - char fmt1[32], fmt2[32], fmt3[32], fmt4[32]; - // buffers shared by the following functions + int max_len1, max_len2, max_len3; void overview_sum (int &maxlen); void overview_dump (int exp_idx, int &maxlen); void overview_summary (Ovw_data *ovw_data, int &maxlen); void overview_item (Ovw_data::Ovw_item *ovw_item, Ovw_data::Ovw_item *ovw_item_labels); - void overview_value (Value *value, ValueTag value_tag, - double total_value); + void overview_value (Value *value, ValueTag value_tag, double total_valu= e); void statistics_sum (int &maxlen); void statistics_dump (int exp_idx, int &maxlen); void statistics_item (Stats_data *stats_data); @@ -252,11 +247,6 @@ void print_load_object (FILE *out_file); void print_header (Experiment *exp, FILE *out_file); =20 // Print Function metrics -void get_width (Hist_data *data, MetricList *metrics_list, - Metric::HistMetric *hist_metric); -void get_format (char **fmt_int, char **fmt_real0, char **fmt_real1, - MetricList *metrics_list, Metric::HistMetric *hist_metric, - int nspace); int print_label (FILE *out_file, MetricList *metrics_list, Metric::HistMetric *hist_metric, int space); void print_anno_file (char *name, const char *sel, const char *srcFile, diff --git a/gprofng/src/parse.cc b/gprofng/src/parse.cc index ab222708eee..eaed8ee7349 100644 --- a/gprofng/src/parse.cc +++ b/gprofng/src/parse.cc @@ -789,6 +789,12 @@ Experiment::process_seg_unmap_cmd (char */*cmd*/, hrti= me_t ts, Vaddr vaddr) return 0; } =20 +static bool +strstarts (const char *var, const char *x) +{ + return strncmp (var, x, strlen (x)) =3D=3D 0; +} + int Experiment::process_Linux_kernel_cmd (hrtime_t ts) { @@ -815,10 +821,6 @@ Experiment::process_Linux_kernel_cmd (hrtime_t ts) * but again Analyzer handles the case of not finding the fil= e or not reading DWARF from it. */ mod->set_file_name (dbe_strdup ("LinuxKernel")); - char last_mod_name[256]; - last_mod_name[0] =3D '\0'; - size_t line_n =3D 0; - char *line =3D NULL; char kallmodsyms_copy[MAXPATHLEN]; snprintf (kallmodsyms_copy, sizeof (kallmodsyms_copy), "%s/kallmodsyms", expt_name); @@ -834,6 +836,8 @@ Experiment::process_Linux_kernel_cmd (hrtime_t ts) } else { + size_t line_n =3D 0; + char *line =3D NULL; while (getline (&line, &line_n, fd) > 0) { long long unsigned sym_addr; @@ -851,9 +855,6 @@ Experiment::process_Linux_kernel_cmd (hrtime_t ts) if (strcmp (mod_name, "ctf") =3D=3D 0) strcpy (mod_name, "shared_ctf"); =20 - char *mod_name_ptr; - int skip; -#define strstarts(var, x) (strncmp(var, x, strlen (x)) =3D=3D 0) if (strcmp (sym_name, "__per_cpu_start") =3D=3D 0 || strcmp (sym_name, "__per_cpu_end") =3D=3D 0 || strstarts (sym_name, "__crc_") @@ -878,24 +879,14 @@ Experiment::process_Linux_kernel_cmd (hrtime_t ts) || strstarts (sym_name, "__dtrace_probe_") || (strstr (sym_name, ".") !=3D NULL && strstr (sym_name, ".clone.") =3D=3D NULL)) - { - mod_name_ptr =3D last_mod_name; - skip =3D 1; - } - else - { - mod_name_ptr =3D mod_name; - skip =3D 0; - } -#undef strstarts + continue; =20 - if (sym_text && skip =3D=3D 0) + if (sym_text) { char fname[128]; - snprintf (fname, sizeof (fname), "%s`%s", mod_name_ptr, sym_name); + snprintf (fname, sizeof (fname), "%s`%s", mod_name, sym_name); Function *func =3D dbeSession->createFunction (); func->set_name (fname); - // func->flags |=3D FUNC_FLAG_???; // XXX func->size =3D sym_size; func->img_offset =3D sym_addr; func->module =3D mod; @@ -906,11 +897,10 @@ Experiment::process_Linux_kernel_cmd (hrtime_t ts) if (lo_max < sym_addr + sym_size) lo_max =3D sym_addr + sym_size; } - sprintf (last_mod_name, mod_name_ptr); } fclose (fd); + free (line); } - free (line); lo->size =3D lo_max; lo->functions->sort (func_cmp); mod->functions->sort (func_cmp);