bug-binutils
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: gas really slow on long lines


From: Alan Modra
Subject: Re: gas really slow on long lines
Date: Fri, 24 Aug 2007 13:35:55 +0930
User-agent: Mutt/1.5.9i

On Thu, Aug 23, 2007 at 05:05:09PM +0200, Anders Waldenborg wrote:
> So I fired up oprofile and did some profiling. lex_got in tc-i386.c
> turned up as the main offender.
> 
> Without any deeper knowledge of the code it seems really stupid that
> lex_got checks until end of line when it is called on each expression
> on a line.

Agreed.  Even though I wrote the code in question.  :-)

> --- binutils-2.17.orig/gas/config/tc-i386.c   2006-04-07 
> 08:40:57.000000000 +0200
> +++ binutils-2.17/gas/config/tc-i386.c        2007-08-23 16:56:42.795755012 
> +0200
> @@ -3929,7 +3929,7 @@
>      return NULL;
> 
>    for (cp = input_line_pointer; *cp != '@'; cp++)
> -    if (is_end_of_line[(unsigned char) *cp])
> +    if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
>        return NULL;
> 
>    for (j = 0; j < sizeof (gotrel) / sizeof (gotrel[0]); j++)

I'm applying the following, which fixes a similar problem a little
later as well.

        * config/tc-i386.c (lex_got): Don't scan past a comma.

Index: gas/config/tc-i386.c
===================================================================
RCS file: /cvs/src/src/gas/config/tc-i386.c,v
retrieving revision 1.273
diff -u -p -r1.273 tc-i386.c
--- gas/config/tc-i386.c        17 Aug 2007 14:12:43 -0000      1.273
+++ gas/config/tc-i386.c        24 Aug 2007 01:35:02 -0000
@@ -4485,7 +4485,7 @@ lex_got (enum bfd_reloc_code_real *reloc
     return NULL;
 
   for (cp = input_line_pointer; *cp != '@'; cp++)
-    if (is_end_of_line[(unsigned char) *cp])
+    if (is_end_of_line[(unsigned char) *cp] || *cp == ',')
       return NULL;
 
   for (j = 0; j < sizeof (gotrel) / sizeof (gotrel[0]); j++)
@@ -4519,12 +4519,12 @@ lex_got (enum bfd_reloc_code_real *reloc
              first = cp - input_line_pointer;
 
              /* The second part goes from after the reloc token until
-                (and including) an end_of_line char.  Don't use strlen
-                here as the end_of_line char may not be a NUL.  */
+                (and including) an end_of_line char or comma.  */
              past_reloc = cp + 1 + len;
-             for (cp = past_reloc; !is_end_of_line[(unsigned char) *cp++]; )
-               ;
-             second = cp - past_reloc;
+             cp = past_reloc;
+             while (!is_end_of_line[(unsigned char) *cp] && *cp != ',')
+               ++cp;
+             second = cp + 1 - past_reloc;
 
              /* Allocate and copy string.  The trailing NUL shouldn't
                 be necessary, but be safe.  */


-- 
Alan Modra
Australia Development Lab, IBM




reply via email to

[Prev in Thread] Current Thread [Next in Thread]