This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[PATCH] Fix #line generation in cpp (take 2)


Hi!

This is another attempt to fix the gcc.dg/cpp/20000628-1.c testcase.
Yesterday's attempt broke if there were multiple lines in macro arguments
(because buffer_stack_depth is include depth + macro nesting depth).
This patch was successfully bootstrapped on i386-redhat-linux,
sparc-redhat-linux and alpha-redhat-linux (and fixes the testcase).
Ok to commit?

2000-06-29  Jakub Jelinek  <jakub@redhat.com>

	* cpplib.h (struct cpp_reader): New field include_depth.
	(struct cpp_printer): Rename last_bsd to last_id.
	* cppfiles.c (read_include_file): Bump include_depth.
	* cpplex.c (cpp_pop_buffer): Decrement include_depth.
	(output_line_command): Output correct #line if a header
	is including itself and is not protected against multiple inclusion.
	Use include_depth instead of buffer_stack_depth, last_id instead of
	last_bsd.
	* cppinit.c (cpp_start_read): Initialize last_id instead of
	last_bsd.

--- gcc/cppfiles.c.jj	Thu Jun 22 13:47:17 2000
+++ gcc/cppfiles.c	Thu Jun 29 15:41:04 2000
@@ -529,6 +529,7 @@ read_include_file (pfile, inc)
   /* These must be set before prescan.  */
   fp->inc = inc;
   fp->nominal_fname = inc->name;
+  pfile->include_depth++;
   
   if (length == 0)
     inc->cmacro = NEVER_REREAD;
--- gcc/cpplex.c.jj	Wed Jun 28 22:38:14 2000
+++ gcc/cpplex.c	Thu Jun 29 15:36:48 2000
@@ -218,6 +218,8 @@ cpp_pop_buffer (pfile)
 	free ((PTR) buf->buf);
       if (pfile->system_include_depth)
 	pfile->system_include_depth--;
+      if (pfile->include_depth)
+	pfile->include_depth--;
       if (pfile->potential_control_macro)
 	{
 	  if (buf->inc->cmacro != NEVER_REREAD)
@@ -289,25 +291,26 @@ output_line_command (pfile, print, line)
   if (CPP_OPTION (pfile, no_line_commands))
     return;
 
-  /* Determine whether the current filename has changed, and if so,
-     how.  'nominal_fname' values are unique, so they can be compared
-     by comparing pointers.  */
-  if (ip->nominal_fname == print->last_fname)
-    change = same;
-  else
+  if (pfile->include_depth == print->last_id)
     {
-      if (pfile->buffer_stack_depth == print->last_bsd)
+      /* Determine whether the current filename has changed, and if so,
+	 how.  'nominal_fname' values are unique, so they can be compared
+	 by comparing pointers.  */
+      if (ip->nominal_fname == print->last_fname)
+	change = same;
+      else
 	change = rname;
+    }
+  else
+    {
+      if (pfile->include_depth > print->last_id)
+	change = enter;
       else
-	{
-	  if (pfile->buffer_stack_depth > print->last_bsd)
-	    change = enter;
-	  else
-	    change = leave;
-	  print->last_bsd = pfile->buffer_stack_depth;
-	}
-      print->last_fname = ip->nominal_fname;
+	change = leave;
+      print->last_id = pfile->include_depth;
     }
+  print->last_fname = ip->nominal_fname;
+
   /* If the current file has not changed, we can output a few newlines
      instead if we want to increase the line number by a small amount.
      We cannot do this if print->lineno is zero, because that means we
--- gcc/cpplib.h.jj	Thu Jun 22 13:47:17 2000
+++ gcc/cpplib.h	Thu Jun 29 15:37:49 2000
@@ -492,6 +492,9 @@ struct cpp_reader
   /* Current depth of buffer stack. */
   unsigned int buffer_stack_depth;
 
+  /* Current depth in #include directives.  */
+  unsigned int include_depth;
+
   /* Hash table of macros and assertions.  See cpphash.c */
   struct htab *hashtab;
 
@@ -564,7 +567,7 @@ struct cpp_printer
 {
   FILE *outf;			/* stream to write to */
   const char *last_fname;	/* previous file name */
-  unsigned int last_bsd;	/* did we just push? */
+  unsigned int last_id;		/* did we just push? */
   unsigned int lineno;		/* line currently being written */
   unsigned int written;		/* low water mark in token buffer */
 };
--- gcc/cppinit.c.jj	Thu Jun 22 13:47:17 2000
+++ gcc/cppinit.c	Thu Jun 29 15:37:27 2000
@@ -950,7 +950,7 @@ cpp_start_read (pfile, print, fname)
     {
       print->lineno = 0;
       print->last_fname = CPP_BUFFER (pfile)->nominal_fname;
-      print->last_bsd = pfile->buffer_stack_depth;
+      print->last_id = pfile->include_depth;
       print->written = CPP_WRITTEN (pfile);
     }
 

	Jakub

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]