From: marxin <mliska@suse.cz>
To: gcc-patches@gcc.gnu.org
Subject: [PATCH 5/7] GCOV: std::vector refactoring.
Date: Thu, 26 Oct 2017 08:12:00 -0000 [thread overview]
Message-ID: <a7b9c5b9c4be2534644f7aaeb2ac562d8b458030.1509005504.git.mliska@suse.cz> (raw)
In-Reply-To: <cover.1509005504.git.mliska@suse.cz>
gcc/ChangeLog:
2017-10-26 Martin Liska <mliska@suse.cz>
* gcov.c (struct source_info): Remove typedef.
(source_info::source_info): Add proper ctor.
(accumulate_line_counts): Use struct, not it's typedef.
(output_gcov_file): Likewise.
(output_lines): Likewise.
(main): Do not allocate an array.
(output_intermediate_file): Use size of vector container.
(process_file): Resize the vector.
(generate_results): Do not preallocate, use newly added vector
lines.
(release_structures): Do not release sources.
(find_source): Use vector methods.
(add_line_counts): Do not use typedef.
---
gcc/gcov.c | 89 +++++++++++++++++++++++++++-----------------------------------
1 file changed, 39 insertions(+), 50 deletions(-)
diff --git a/gcc/gcov.c b/gcc/gcov.c
index 8ba63f002d8..e2d33edb984 100644
--- a/gcc/gcov.c
+++ b/gcc/gcov.c
@@ -272,22 +272,29 @@ line_t::has_block (block_t *needle)
/* Describes a file mentioned in the block graph. Contains an array
of line info. */
-typedef struct source_info
+struct source_info
{
+ /* Default constructor. */
+ source_info ();
+
/* Canonical name of source file. */
char *name;
time_t file_time;
- /* Array of line information. */
- line_t *lines;
- unsigned num_lines;
+ /* Vector of line information. */
+ vector<line_t> lines;
coverage_t coverage;
/* Functions in this source file. These are in ascending line
number order. */
function_t *functions;
-} source_t;
+};
+
+source_info::source_info (): name (NULL), file_time (), lines (),
+ coverage (), functions (NULL)
+{
+}
typedef struct name_map
{
@@ -300,9 +307,8 @@ typedef struct name_map
static function_t *functions;
static function_t **fn_end = &functions;
-static source_t *sources; /* Array of source files */
-static unsigned n_sources; /* Number of sources */
-static unsigned a_sources; /* Allocated sources */
+/* Vector of source files. */
+static vector<source_info> sources;
static name_map_t *names; /* Mapping of file names to sources */
static unsigned n_names; /* Number of names */
@@ -448,10 +454,10 @@ static void add_line_counts (coverage_t *, function_t *);
static void executed_summary (unsigned, unsigned);
static void function_summary (const coverage_t *, const char *);
static const char *format_gcov (gcov_type, gcov_type, int);
-static void accumulate_line_counts (source_t *);
-static void output_gcov_file (const char *, source_t *);
+static void accumulate_line_counts (source_info *);
+static void output_gcov_file (const char *, source_info *);
static int output_branch_count (FILE *, int, const arc_t *);
-static void output_lines (FILE *, const source_t *);
+static void output_lines (FILE *, const source_info *);
static char *make_gcov_file_name (const char *, const char *);
static char *mangle_name (const char *, char *);
static void release_structures (void);
@@ -668,8 +674,6 @@ main (int argc, char **argv)
a_names = 10;
names = XNEWVEC (name_map_t, a_names);
- a_sources = 10;
- sources = XNEWVEC (source_t, a_sources);
argno = process_args (argc, argv);
if (optind == argc)
@@ -868,7 +872,7 @@ included. Instead the intermediate format here outputs only a single
file 'foo.cc.gcov' similar to the above example. */
static void
-output_intermediate_file (FILE *gcov_file, source_t *src)
+output_intermediate_file (FILE *gcov_file, source_info *src)
{
unsigned line_num; /* current line number. */
const line_t *line; /* current line info ptr. */
@@ -885,7 +889,7 @@ output_intermediate_file (FILE *gcov_file, source_t *src)
}
for (line_num = 1, line = &src->lines[line_num];
- line_num < src->num_lines;
+ line_num < src->lines.size ();
line_num++, line++)
{
arc_t *arc;
@@ -967,8 +971,8 @@ process_file (const char *file_name)
{
unsigned last_line
= block->locations[i].lines.back () + 1;
- if (last_line > sources[s].num_lines)
- sources[s].num_lines = last_line;
+ if (last_line > sources[s].lines.size ())
+ sources[s].lines.resize (last_line);
}
}
}
@@ -987,7 +991,7 @@ process_file (const char *file_name)
}
static void
-output_gcov_file (const char *file_name, source_t *src)
+output_gcov_file (const char *file_name, source_info *src)
{
char *gcov_file_name = make_gcov_file_name (file_name, src->coverage.name);
@@ -1020,14 +1024,8 @@ output_gcov_file (const char *file_name, source_t *src)
static void
generate_results (const char *file_name)
{
- unsigned ix;
- source_t *src;
function_t *fn;
- for (ix = n_sources, src = sources; ix--; src++)
- if (src->num_lines)
- src->lines = XCNEWVEC (line_t, src->num_lines);
-
for (fn = functions; fn; fn = fn->next)
{
coverage_t coverage;
@@ -1052,8 +1050,10 @@ generate_results (const char *file_name)
file_name = canonicalize_name (file_name);
}
- for (ix = n_sources, src = sources; ix--; src++)
+ for (vector<source_info>::iterator it = sources.begin ();
+ it != sources.end (); it++)
{
+ source_info *src = &(*it);
if (flag_relative_only)
{
/* Ignore this source, if it is an absolute path (after
@@ -1091,10 +1091,6 @@ release_structures (void)
unsigned ix;
function_t *fn;
- for (ix = n_sources; ix--;)
- free (sources[ix].lines);
- free (sources);
-
for (ix = n_names; ix--;)
free (names[ix].name);
free (names);
@@ -1239,25 +1235,15 @@ find_source (const char *file_name)
if (!name_map)
{
/* Not found with canonical name, create a new source. */
- source_t *src;
-
- if (n_sources == a_sources)
- {
- a_sources *= 2;
- src = XNEWVEC (source_t, a_sources);
- memcpy (src, sources, n_sources * sizeof (*sources));
- free (sources);
- sources = src;
- }
-
- idx = n_sources;
+ source_info *src;
+ idx = sources.size ();
name_map = &names[n_names++];
name_map->name = canon;
name_map->src = idx;
- src = &sources[n_sources++];
- memset (src, 0, sizeof (*src));
+ sources.push_back (source_info ());
+ src = &sources.back ();
src->name = canon;
src->coverage.name = src->name;
if (source_length
@@ -2293,7 +2279,7 @@ add_line_counts (coverage_t *coverage, function_t *fn)
fn->blocks_executed++;
for (unsigned i = 0; i < block->locations.size (); i++)
{
- const source_t *src = &sources[block->locations[i].source_file_idx];
+ source_info *src = &sources[block->locations[i].source_file_idx];
vector<unsigned> &lines = block->locations[i].lines;
for (unsigned j = 0; j < lines.size (); j++)
@@ -2349,11 +2335,10 @@ add_line_counts (coverage_t *coverage, function_t *fn)
/* Accumulate the line counts of a file. */
static void
-accumulate_line_counts (source_t *src)
+accumulate_line_counts (source_info *src)
{
- line_t *line;
function_t *fn, *fn_p, *fn_n;
- unsigned ix;
+ unsigned ix = 0;
/* Reverse the function order. */
for (fn = src->functions, fn_p = NULL; fn; fn_p = fn, fn = fn_n)
@@ -2363,8 +2348,10 @@ accumulate_line_counts (source_t *src)
}
src->functions = fn_p;
- for (ix = src->num_lines, line = src->lines; ix--; line++)
+ for (vector<line_t>::reverse_iterator it = src->lines.rbegin ();
+ it != src->lines.rend (); it++)
{
+ line_t *line = &(*it);
if (line->blocks)
{
/* The user expects the line count to be the number of times
@@ -2417,6 +2404,8 @@ accumulate_line_counts (source_t *src)
if (line->count)
src->coverage.lines_executed++;
}
+
+ ix++;
}
}
@@ -2578,7 +2567,7 @@ output_line_beginning (FILE *f, bool exists, bool unexceptional,
information. */
static void
-output_lines (FILE *gcov_file, const source_t *src)
+output_lines (FILE *gcov_file, const source_info *src)
{
#define DEFAULT_LINE_START " -: 0:"
@@ -2611,7 +2600,7 @@ output_lines (FILE *gcov_file, const source_t *src)
fn = src->functions;
for (line_num = 1, line = &src->lines[line_num];
- line_num < src->num_lines; line_num++, line++)
+ line_num < src->lines.size (); line_num++, line++)
{
for (; fn && fn->line == line_num; fn = fn->next_file_fn)
{
--
2.14.2
next prev parent reply other threads:[~2017-10-26 8:12 UTC|newest]
Thread overview: 33+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-10-26 8:12 [PATCH 0/7] GCOV: another set of improvements marxin
2017-10-26 8:12 ` marxin [this message]
2017-10-30 14:17 ` [PATCH 5/7] GCOV: std::vector refactoring Nathan Sidwell
2017-10-26 8:12 ` [PATCH 1/7] GCOV: document behavior of -fkeep-{static,inline}-functions (PR gcov-profile/82633) marxin
2017-10-30 12:17 ` Nathan Sidwell
2017-10-31 11:12 ` Martin Liška
2017-10-26 8:12 ` [PATCH 4/7] GCOV: add -j argument (human readable format) marxin
2017-10-30 12:44 ` Nathan Sidwell
2017-10-31 11:54 ` Martin Liška
2017-10-31 12:10 ` Nathan Sidwell
2017-10-31 14:04 ` Martin Liška
2017-10-31 14:39 ` Nathan Sidwell
2017-10-31 15:33 ` Martin Liška
2017-10-26 8:12 ` [PATCH 2/7] GCOV: introduce usage of terminal colors marxin
2017-10-30 12:20 ` Nathan Sidwell
2017-10-30 14:53 ` David Malcolm
2017-10-31 11:14 ` Martin Liška
2017-10-26 8:12 ` [PATCH 3/7] GCOV: add support for lines with an unexecuted lines marxin
2017-10-30 12:27 ` Nathan Sidwell
2017-10-31 11:29 ` Martin Liška
2017-11-02 15:33 ` Eric Botcazou
2017-10-26 8:12 ` [PATCH 7/7] GCOV: std::vector refactoring III marxin
2017-10-30 14:23 ` Nathan Sidwell
2017-10-26 8:19 ` [PATCH 6/7] GCOV: Vector refactoring II marxin
2017-10-30 14:19 ` Nathan Sidwell
2017-10-26 8:47 ` [PATCH 8/N][RFC] GCOV: support multiple functions per a line Martin Liška
2017-10-26 12:06 ` Nathan Sidwell
2017-11-01 8:00 ` [PATCH 8/N][RFC] v2 " Martin Liška
2017-11-07 10:53 ` [PATCH 8/N][RFC][v3]: " Martin Liška
2017-11-07 15:09 ` Nathan Sidwell
2017-11-08 11:42 ` Martin Liška
2017-11-08 15:12 ` Nathan Sidwell
2017-11-09 9:47 ` Martin Liška
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=a7b9c5b9c4be2534644f7aaeb2ac562d8b458030.1509005504.git.mliska@suse.cz \
--to=mliska@suse.cz \
--cc=gcc-patches@gcc.gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).