This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
Re: The gas input processing changes caused a regression for cris-elf
- From: Alexandre Oliva <aoliva at redhat dot com>
- To: Hans-Peter Nilsson <hans-peter dot nilsson at axis dot com>
- Cc: binutils at sourceware dot org
- Date: Fri, 09 Mar 2007 15:16:12 -0300
- Subject: Re: The gas input processing changes caused a regression for cris-elf
- References: <200703090944.l299iJxi027275@ignucius.se.axis.com>
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}