This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: The gas input processing changes caused a regression for cris-elf


On Mar  9, 2007, Hans-Peter Nilsson <hans-peter.nilsson@axis.com> wrote:

> Hi Alex, looks like another good deed of yours being punished: :-)

:-)

I guess I should have been far more conservative in my patch, since
regular comments might very well look like # <line> lines, and by the
time we realize they're not, we're already committed to that parsing.

Here's a patch that removes one more state from the state machine,
accepts comments that appear to be #line"file" directives with at most
warnings about unsupported flag numbers.  I might be talked into
taking even those out.

A cross to cris-elf now passes the gas testsuite.

Ok to install?

 difor gas/ChangeLog
from  Alexandre Oliva  <aoliva@redhat.com>

	* app.c (do_scrub_chars): Recognize comments after # line "file".
	* read.c (get_linefile_number): New.
	(s_app_line): Accept ill-formed .linefile lines as comments.

Index: trunk/gas/app.c
===================================================================
--- trunk.orig/gas/app.c	2007-03-09 04:14:07.000000000 -0300
+++ trunk/gas/app.c	2007-03-09 14:43:22.000000000 -0300
@@ -355,7 +355,7 @@ do_scrub_chars (int (*get) (char *, int)
 	  5: parsing a string, then go to old-state
 	  6: putting out \ escape in a "d string.
 	  7: no longer used
-	  8: After putting out a .appfile string, flush until newline.
+	  8: no longer used
 	  9: After seeing symbol char in state 3 (keep 1white after symchar)
 	 10: After seeing whitespace in state 9 (keep white before symchar)
 	 11: After seeing a symbol character in state 0 (eg a label definition)
@@ -514,7 +514,7 @@ do_scrub_chars (int (*get) (char *, int)
 		  PUT (ch);
 		  quotechar = ch;
 		  state = 5;
-		  old_state = 8;
+		  old_state = 3;
 		}
 	      else
 		{
@@ -635,16 +635,6 @@ do_scrub_chars (int (*get) (char *, int)
 	  PUT (ch);
 	  continue;
 
-	case 8:
-	  do
-	    if ((ch = GET ()) == EOF)
-	      goto fromeof;
-	    else
-	      PUT (ch);
-	  while (ch != '\n');
-	  state = 0;
-	  continue;
-
 #ifdef DOUBLEBAR_PARALLEL
 	case 13:
 	  ch = GET ();
Index: trunk/gas/read.c
===================================================================
--- trunk.orig/gas/read.c	2007-03-09 14:32:39.000000000 -0300
+++ trunk/gas/read.c	2007-03-09 15:13:39.000000000 -0300
@@ -1698,6 +1698,19 @@ s_app_file (int appfile)
     }
 }
 
+static int
+get_linefile_number (int *flag)
+{
+  SKIP_WHITESPACE ();
+
+  if (*input_line_pointer < '0' || *input_line_pointer > '9')
+    return 0;
+
+  *flag = get_absolute_expression ();
+
+  return 1;
+}
+
 /* Handle the .appline pseudo-op.  This is automatically generated by
    do_scrub_chars when a preprocessor # line comment is seen.  This
    default definition may be overridden by the object or CPU specific
@@ -1706,10 +1719,19 @@ s_app_file (int appfile)
 void
 s_app_line (int appline)
 {
+  char *file = NULL;
   int l;
 
   /* The given number is that of the next line.  */
-  l = get_absolute_expression () - 1;
+  if (appline)
+    l = get_absolute_expression ();
+  else if (!get_linefile_number (&l))
+    {
+      ignore_rest_of_line ();
+      return;
+    }
+
+  l--;
 
   if (l < -1)
     /* Some of the back ends can't deal with non-positive line numbers.
@@ -1726,18 +1748,20 @@ s_app_line (int appline)
   else
     {
       int flags = 0;
-      char *file = NULL;
       int length = 0;
 
       if (!appline)
 	{
-	  file = demand_copy_string (&length);
+	  SKIP_WHITESPACE ();
+
+	  if (*input_line_pointer == '"')
+	    file = demand_copy_string (&length);
 
 	  if (file)
 	    {
 	      int this_flag;
 
-	      while ((this_flag = get_absolute_expression ()))
+	      while (get_linefile_number (&this_flag))
 		switch (this_flag)
 		  {
 		    /* From GCC's cpp documentation:
@@ -1772,16 +1796,25 @@ s_app_line (int appline)
 			     this_flag);
 		    break;
 		  }
+
+	      if (!is_end_of_line[(unsigned char)*input_line_pointer])
+		file = 0;
 	    }
 	}
 
-      new_logical_line_flags (file, l, flags);
+      if (appline || file)
+	{
+	  new_logical_line_flags (file, l, flags);
 #ifdef LISTING
-      if (listing)
-	listing_source_line (l);
+	  if (listing)
+	    listing_source_line (l);
 #endif
+	}
     }
-  demand_empty_rest_of_line ();
+  if (appline || file)
+    demand_empty_rest_of_line ();
+  else
+    ignore_rest_of_line ();
 }
 
 /* Handle the .end pseudo-op.  Actually, the real work is done in
-- 
Alexandre Oliva         http://www.lsd.ic.unicamp.br/~oliva/
FSF Latin America Board Member         http://www.fsfla.org/
Red Hat Compiler Engineer   aoliva@{redhat.com, gcc.gnu.org}
Free Software Evangelist  oliva@{lsd.ic.unicamp.br, gnu.org}

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