aboutsummaryrefslogtreecommitdiff
path: root/gcc/gcov.c
diff options
context:
space:
mode:
authorNathan Sidwell <nathan@acm.org>2012-01-11 18:58:30 +0000
committerNathan Sidwell <nathan@gcc.gnu.org>2012-01-11 18:58:30 +0000
commit8f961b22656d69425ceb9304f1874132012c811c (patch)
tree192ff47d589a0a7a301a81e60ea26b9e867a2846 /gcc/gcov.c
parent3ad065efe1afb5f3fdb60be75416ca9af94b67b0 (diff)
downloadgcc-8f961b22656d69425ceb9304f1874132012c811c.zip
gcc-8f961b22656d69425ceb9304f1874132012c811c.tar.gz
gcc-8f961b22656d69425ceb9304f1874132012c811c.tar.bz2
gcov.c (STRING_SIZE): Remove.
* gcov.c (STRING_SIZE): Remove. (generate_results): Erase annotations for source files with no coverage information. (read_line): New. (output_lines): Use it. From-SVN: r183105
Diffstat (limited to 'gcc/gcov.c')
-rw-r--r--gcc/gcov.c115
1 files changed, 69 insertions, 46 deletions
diff --git a/gcc/gcov.c b/gcc/gcov.c
index aa857b7..9707111 100644
--- a/gcc/gcov.c
+++ b/gcc/gcov.c
@@ -64,8 +64,6 @@ along with Gcov; see the file COPYING3. If not see
/* This is the size of the buffer used to read in source file lines. */
-#define STRING_SIZE 200
-
struct function_info;
struct block_info;
struct source_info;
@@ -708,24 +706,33 @@ generate_results (const char *file_name)
function_summary (&src->coverage, "File");
total_lines += src->coverage.lines;
total_executed += src->coverage.lines_executed;
- if (flag_gcov_file && src->coverage.lines)
+ if (flag_gcov_file)
{
char *gcov_file_name
= make_gcov_file_name (file_name, src->coverage.name);
- FILE *gcov_file = fopen (gcov_file_name, "w");
- if (gcov_file)
+ if (src->coverage.lines)
{
- fnotice (stdout, "Creating '%s'\n", gcov_file_name);
- output_lines (gcov_file, src);
- if (ferror (gcov_file))
+ FILE *gcov_file = fopen (gcov_file_name, "w");
+
+ if (gcov_file)
+ {
+ fnotice (stdout, "Creating '%s'\n", gcov_file_name);
+ output_lines (gcov_file, src);
+ if (ferror (gcov_file))
fnotice (stderr, "Error writing output file '%s'\n",
gcov_file_name);
- fclose (gcov_file);
+ fclose (gcov_file);
+ }
+ else
+ fnotice (stderr, "Could not open output file '%s'\n",
+ gcov_file_name);
}
else
- fnotice (stderr, "Could not open output file '%s'\n",
- gcov_file_name);
+ {
+ unlink (gcov_file_name);
+ fnotice (stdout, "Removing '%s'\n", gcov_file_name);
+ }
free (gcov_file_name);
}
fnotice (stdout, "\n");
@@ -2188,6 +2195,44 @@ output_branch_count (FILE *gcov_file, int ix, const arc_t *arc)
}
+static const char *
+read_line (FILE *file)
+{
+ static char *string;
+ static size_t string_len;
+ size_t pos = 0;
+ char *ptr;
+
+ if (!string_len)
+ {
+ string_len = 200;
+ string = XNEWVEC (char, string_len);
+ }
+
+ while ((ptr = fgets (string + pos, string_len - pos, file)))
+ {
+ size_t len = strlen (string + pos);
+
+ if (string[pos + len - 1] == '\n')
+ {
+ string[pos + len - 1] = 0;
+ return string;
+ }
+ pos += len;
+ ptr = XNEWVEC (char, string_len * 2);
+ if (ptr)
+ {
+ memcpy (ptr, string, pos);
+ string = ptr;
+ string_len += 2;
+ }
+ else
+ pos = 0;
+ }
+
+ return pos ? string : NULL;
+}
+
/* Read in the source file one line at a time, and output that line to
the gcov file preceded by its execution count and other
information. */
@@ -2198,8 +2243,7 @@ output_lines (FILE *gcov_file, const source_t *src)
FILE *source_file;
unsigned line_num; /* current line number. */
const line_t *line; /* current line info ptr. */
- char string[STRING_SIZE]; /* line buffer. */
- char const *retval = ""; /* status of source file reading. */
+ const char *retval = ""; /* status of source file reading. */
function_t *fn = NULL;
fprintf (gcov_file, "%9s:%5d:Source:%s\n", "-", 0, src->coverage.name);
@@ -2246,31 +2290,20 @@ output_lines (FILE *gcov_file, const source_t *src)
fprintf (gcov_file, "\n");
}
+ if (retval)
+ retval = read_line (source_file);
+
/* For lines which don't exist in the .bb file, print '-' before
the source line. For lines which exist but were never
- executed, print '#####' before the source line. Otherwise,
- print the execution count before the source line. There are
- 16 spaces of indentation added before the source line so that
- tabs won't be messed up. */
- fprintf (gcov_file, "%9s:%5u:",
+ executed, print '#####' or '=====' before the source line.
+ Otherwise, print the execution count before the source line.
+ There are 16 spaces of indentation added before the source
+ line so that tabs won't be messed up. */
+ fprintf (gcov_file, "%9s:%5u:%s\n",
!line->exists ? "-" : line->count
? format_gcov (line->count, 0, -1)
- : line->unexceptional ? "#####" : "=====", line_num);
-
- if (retval)
- {
- /* Copy source line. */
- do
- {
- retval = fgets (string, STRING_SIZE, source_file);
- if (!retval)
- break;
- fputs (retval, gcov_file);
- }
- while (!retval[0] || retval[strlen (retval) - 1] != '\n');
- }
- if (!retval)
- fputs ("/*EOF*/\n", gcov_file);
+ : line->unexceptional ? "#####" : "=====", line_num,
+ retval ? retval : "/*EOF*/");
if (flag_all_blocks)
{
@@ -2306,18 +2339,8 @@ output_lines (FILE *gcov_file, const source_t *src)
last line of code. */
if (retval)
{
- for (; (retval = fgets (string, STRING_SIZE, source_file)); line_num++)
- {
- fprintf (gcov_file, "%9s:%5u:%s", "-", line_num, retval);
-
- while (!retval[0] || retval[strlen (retval) - 1] != '\n')
- {
- retval = fgets (string, STRING_SIZE, source_file);
- if (!retval)
- break;
- fputs (retval, gcov_file);
- }
- }
+ for (; (retval = read_line (source_file)); line_num++)
+ fprintf (gcov_file, "%9s:%5u:%s\n", "-", line_num, retval);
}
if (source_file)