OSDN Git Service

* gcov.c (STRING_SIZE): Remove.
authornathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Jan 2012 18:58:30 +0000 (18:58 +0000)
committernathan <nathan@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 11 Jan 2012 18:58:30 +0000 (18:58 +0000)
(generate_results): Erase annotations for source files with no
coverage information.
(read_line): New.
(output_lines): Use it.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@183105 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/gcov.c

index 16bcd96..28624d1 100644 (file)
@@ -1,3 +1,11 @@
+2012-01-11  Nathan Sidwell  <nathan@acm.org>
+
+       * gcov.c (STRING_SIZE): Remove.
+       (generate_results): Erase annotations for source files with no
+       coverage information.
+       (read_line): New.
+       (output_lines): Use it.
+
 2012-01-11  Eric Botcazou  <ebotcazou@adacore.com>
 
        * gimple.h (gimplify_body): Remove first argument.
index aa857b7..9707111 100644 (file)
@@ -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)