diff mbox

[driver/64690] Fix -freport-bug issue with comments.

Message ID 54C0B3F0.7080508@partner.samsung.com
State New
Headers show

Commit Message

max Jan. 22, 2015, 8:25 a.m. UTC
Hi,

As -freport-bug dumps also the error output into the file as /* ... */ 
comment, there is a problem if that text includes /* or */ character 
sequences.
This patch fixes this by not wrapping error output with /* ... */, but 
comment out each line with C++ style comments instead.

Tested on PR64688 testcase with added /*  */ before last line, bootstrap 
in progress.

Ok to commit if bootstrap succeed?

-Maxim

Comments

Jakub Jelinek Jan. 22, 2015, 9:51 a.m. UTC | #1
On Thu, Jan 22, 2015 at 12:25:20PM +0400, Maxim Ostapenko wrote:
> gcc/ChangeLog:
> 
> 2015-01-22  Max Ostapenko  <m.ostapenko@partner.samsung.com>
> 
> 	PR driver/64690
> 	* gcc.c (insert_comments): New function.
> 	(try_generate_repro): Call it.
> 	(append_text): Removed.
> 
> diff --git a/gcc/gcc.c b/gcc/gcc.c
> index 52d0521..6d3939c 100644
> --- a/gcc/gcc.c
> +++ b/gcc/gcc.c
> @@ -6487,6 +6487,28 @@ out:
>    return status;
>  }
>  
> +/* This routine reads lines from IN file, adds C++ style comments
> +   at the begining of each line and writes result into OUT.  */
> +
> +static void
> +insert_comments (const char *file_in, const char *file_out)
> +{
> +  FILE *in = fopen (file_in, "rb");
> +  FILE *out = fopen (file_out, "wb");
> +  char line[256];
> +  fputs ("// ", out);
> +  while (fgets (line, sizeof (line), in))
> +    {
> +      fputs (line, out);
> +      if (strchr (line, '\n'))
> +	{
> +	  fputs ("// ", out);
> +	}

Please don't put {}s around single line if body.

Also, if file_in ends with a newline, won't that mean an extra "// " will be
printed?
So what about

  bool add_comment = true;
  while (fgets (line, sizeof (line, in))
    {
      if (add_comment)
	fputs ("// ", out);
      add_comment = strchr (line, '\n') != NULL;
    }
?

Otherwise LGTM.

	Jakub
diff mbox

Patch

gcc/ChangeLog:

2015-01-22  Max Ostapenko  <m.ostapenko@partner.samsung.com>

	PR driver/64690
	* gcc.c (insert_comments): New function.
	(try_generate_repro): Call it.
	(append_text): Removed.

diff --git a/gcc/gcc.c b/gcc/gcc.c
index 52d0521..6d3939c 100644
--- a/gcc/gcc.c
+++ b/gcc/gcc.c
@@ -6487,6 +6487,28 @@  out:
   return status;
 }
 
+/* This routine reads lines from IN file, adds C++ style comments
+   at the begining of each line and writes result into OUT.  */
+
+static void
+insert_comments (const char *file_in, const char *file_out)
+{
+  FILE *in = fopen (file_in, "rb");
+  FILE *out = fopen (file_out, "wb");
+  char line[256];
+  fputs ("// ", out);
+  while (fgets (line, sizeof (line), in))
+    {
+      fputs (line, out);
+      if (strchr (line, '\n'))
+	{
+	  fputs ("// ", out);
+	}
+    }
+  fclose (in);
+  fclose (out);
+}
+
 /* This routine adds preprocessed source code into the given ERR_FILE.
    To do this, it adds "-E" to NEW_ARGV and execute RUN_ATTEMPT routine to
    add information in report file.  RUN_ATTEMPT should return
@@ -6523,19 +6545,6 @@  do_report_bug (const char **new_argv, const int nargs,
     }
 }
 
-/* Append string STR to file FILE.  */
-
-static void
-append_text (char *file, const char *str)
-{
-  int fd = open (file, O_RDWR | O_APPEND);
-  if (fd < 0)
-    return;
-
-  write (fd, str, strlen (str));
-  close (fd);
-}
-
 /* Try to reproduce ICE.  If bug is reproducible, generate report .err file
    containing GCC configuration, backtrace, compiler's command line options
    and preprocessed source code.  */
@@ -6598,16 +6607,10 @@  try_generate_repro (const char **argv)
 	  emit_system_info = 1;
 	}
 
-      if (emit_system_info)
-	append_text (temp_stderr_files[attempt], "/*\n");
-
       status = run_attempt (new_argv, temp_stdout_files[attempt],
 			    temp_stderr_files[attempt], emit_system_info,
 			    append);
 
-      if (emit_system_info)
-	append_text (temp_stderr_files[attempt], "*/\n");
-
       if (status != ATTEMPT_STATUS_ICE)
 	{
 	  fnotice (stderr, "The bug is not reproducible, so it is"
@@ -6619,11 +6622,17 @@  try_generate_repro (const char **argv)
   if (!check_repro (temp_stdout_files, temp_stderr_files))
     goto out;
 
-  /* In final attempt we append compiler options and preprocesssed code to last
-     generated .err file with configuration and backtrace.  */
-  do_report_bug (new_argv, nargs,
-		 &temp_stderr_files[RETRY_ICE_ATTEMPTS - 1],
-		 &temp_stdout_files[RETRY_ICE_ATTEMPTS - 1]);
+  {
+    /* Insert commented out backtrace into report file.  */
+    char **stderr_commented = &temp_stdout_files[RETRY_ICE_ATTEMPTS - 1];
+    insert_comments (temp_stderr_files[RETRY_ICE_ATTEMPTS - 1],
+		     *stderr_commented);
+
+    /* In final attempt we append compiler options and preprocesssed code to last
+       generated .out file with configuration and backtrace.  */
+    char **output = &temp_stdout_files[RETRY_ICE_ATTEMPTS - 1];
+    do_report_bug (new_argv, nargs, stderr_commented, output);
+  }
 
 out:
   for (i = 0; i < RETRY_ICE_ATTEMPTS * 2; i++)