c/4529 (150 lines testcase)

Ralf Berger gotan@gmx.net
Fri Oct 12 12:56:00 GMT 2001


The following reply was made to PR c/4529; it has been noted by GNATS.

From: Ralf Berger <gotan@gmx.net>
To: gcc-gnats@gcc.gnu.org, gcc-prs@gcc.gnu.org, ltuikov@yahoo.com,
	gcc-bugs@gcc.gnu.org, nobody@gcc.gnu.org
Cc:  
Subject: Re: c/4529 (150 lines testcase)
Date: Fri, 12 Oct 2001 21:50:39 +0200

 This is a multi-part message in MIME format.
 --------------010905030804010709090104
 Content-Type: text/plain; charset=us-ascii; format=flowed
 Content-Transfer-Encoding: 7bit
 
 http://gcc.gnu.org/cgi-bin/gnatsweb.pl?cmd=view&pr=4529&database=gcc
 
 Hi, i had the same Problem with the gcc3.0.1 (rpm from Mandrake: 
 gcc3.0-3.0.1-1mdk) also
 when compiling the 8139too module. I cut the preprocessed file to a 
 testcase of 150 lines
 (containing no includes). The file compiled with -O1 (as opposed to -O2) 
 or when ommitting
 -fomit-frame-pointer. The original 8139too.c module also compiled with 
 -O3, i believe the
 compiler was then able to cut out the critical branch (i removed some 
 if-branches which apparently
 had nothing to do with the error in the testcase). I think the error has 
 something to do with
 inlining.
 
 A compile with
 
 gcc -I/usr/src/linux-2.4.10-ac12/include -Wall -Wstrict-prototypes 
 -Wno-trigraphs -O2 -fomit-frame-pointer -v -c -o 8139too3.o 8139too3.c
 
 results in:
 
 $ make
 gcc -I/usr/src/linux-2.4.10-ac12/include -Wall -Wstrict-prototypes 
 -Wno-trigraphs -O2 -fomit-frame-pointer -v -c -o 8139too3.o 8139too3.c
 Reading specs from /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.0.1/specs
 Configured with: ../configure --prefix=/usr --mandir=/usr/share/man 
 --infodir=/usr/share/info --enable-shared --enable-threads=posix 
 --disable-checking --enable-long-long --enable-cstdio=stdio 
 --enable-clocale=generic --enable-languages=c,c++,f77,objc,java 
 --program-suffix=-3.0.1 --enable-objc-gc --host=i586-mandrake-linux-gnu
 Thread model: posix
 gcc version 3.0.1
  /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.0.1/cc1 -lang-c -v 
 -I/usr/src/linux-2.4.10-ac12/include -D__GNUC__=3 -D__GNUC_MINOR__=0 
 -D__GNUC_PATCHLEVEL__=1 -D__ELF__ -Dunix -Dlinux -D__ELF__ -D__unix__ 
 -D__linux__ -D__unix -D__linux -Asystem=posix -D__OPTIMIZE__ 
 -D__STDC_HOSTED__=1 -Wall -Wstrict-prototypes -Wno-trigraphs -Acpu=i386 
 -Amachine=i386 -Di386 -D__i386 -D__i386__ -D__tune_i586__ 
 -D__tune_pentium__ 8139too3.c -quiet -dumpbase 8139too3.c -O2 -Wall 
 -Wstrict-prototypes -Wno-trigraphs -version -fomit-frame-pointer -o 
 /home/ralf/tmp/ccQ5Q1vf.s
 GNU CPP version 3.0.1 (cpplib) (i386 Linux/ELF)
 GNU C version 3.0.1 (i586-mandrake-linux-gnu)
     compiled by GNU C version 3.0.1.
 ignoring nonexistent directory "/usr/i586-mandrake-linux-gnu/include"
 #include "..." search starts here:
 #include <...> search starts here:
  /usr/src/linux-2.4.10-ac12/include
  /usr/local/include
  /usr/lib/gcc-lib/i586-mandrake-linux-gnu/3.0.1/include
  /usr/include
 End of search list.
 8139too3.c: In function `netdev_ethtool_ioctl':
 8139too3.c:151: Unrecognizable insn:
 (insn/i 219 450 447 (parallel[
             (set (reg:SI 6 ebp)
                 (asm_operands:SI ("addl %3,%1; sbbl %0,%0; cmpl %1,%4; 
 sbbl $0,%0") ("=&r") 0[
                         (reg/v:SI 1 edx [101])
                         (mem:SI (plus:SI (reg/f:SI 6 ebp)
                                 (const_int -156 [0xffffff64])) 0)
                         (mem/s:SI (reg/f:SI 0 eax [104]) 3)
                     ]
                     [
                         (asm_input:SI ("1"))
                         (asm_input:SI ("g"))
                         (asm_input:SI ("g"))
                     ]  ("8139too3.c") 76))
             (set (reg/v:SI 1 edx [101])
                 (asm_operands:SI ("addl %3,%1; sbbl %0,%0; cmpl %1,%4; 
 sbbl $0,%0") ("=r") 1[
                         (reg/v:SI 1 edx [101])
                         (mem:SI (plus:SI (reg/f:SI 6 ebp)
                                 (const_int -156 [0xffffff64])) 0)
                         (mem/s:SI (reg/f:SI 0 eax [104]) 3)
                     ]
                     [
                         (asm_input:SI ("1"))
                         (asm_input:SI ("g"))
                         (asm_input:SI ("g"))
                     ]  ("8139too3.c") 76))
             (clobber (reg:QI 19 dirflag))
             (clobber (reg:QI 18 fpsr))
             (clobber (reg:QI 17 flags))
         ] ) -1 (insn_list 214 (insn_list 218 (nil)))
     (nil))
 8139too3.c:151: Internal compiler error in reload_cse_simplify_operands, 
 at reload1.c:8355
 Please submit a full bug report,
 with preprocessed source if appropriate.
 See <URL: https://qa.mandrakesoft.com/ > for instructions.
 make: *** [8139too3.o] Fehler 1
 
 
 --------------010905030804010709090104
 Content-Type: text/plain;
  name="8139too3.c"
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline;
  filename="8139too3.c"
 
 typedef unsigned int size_t;
 typedef unsigned int u32;
 
 void memset_generic(void *, char, unsigned long);
 
 static inline char * strcpy(char * dest,const char *src)
 {
   int d0, d1, d2;
 __asm__ __volatile__(
 	"1:\tlodsb\n\tstosb\n\ttestb %%al,%%al\n\tjne 1b"
         : "=&S" (d0), "=&D" (d1), "=&a" (d2)
         :"0" (src),"1" (dest) 
 	: "memory"
 	);
  return dest;
 }
 
 struct task_struct {
   unsigned long seg;
 };
 extern struct task_struct * foo_task_struct;
 
 struct ethtool_cmd {
         u32 cmd;
 };
 
 struct ethtool_drvinfo {
         u32 cmd;
         char driver[32];
 };
 
 struct ethtool_wolinfo {
         u32 cmd;
 };
 
 int foo(void *to, const void *from, unsigned long);
 
 static inline unsigned long
 __constant_copy_to_user(void *to, const void *from, unsigned long n)
 {
   if (
       ({ 
 	unsigned long flag,sum; 
 	asm(
 	    "addl %3,%1; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" 
 	    :"=&r" (flag), "=r" (sum) 
 	    :"1" (to),"g" ((int)(n)),"g" (foo_task_struct->seg)); 
 	flag; 
       }) == 0  )
     { 
       int __d0, __d1; 
 __asm__ __volatile__( 
 		     "0: rep; movsl\n" 
 		     "1:\n"
                      ".section .fixup,\"ax\"\n" 
 		     "2: shl $2,%0\njmp 1b\n" 
 		     ".previous\n" 
 		     ".section __ex_table,\"a\"\n" 
 		     "	.align 4\n" 
 		     "	.long 0b,2b\n" 
 		     ".previous" 
 		     : "=c"(n), "=&S" (__d0), "=&D" (__d1) 
 		     : "1"(from), "2"(to), "0"(n/4) 
 		     : "memory"
 		     ); 
     }
   return n;
 }
 
 static inline unsigned long
 __constant_copy_from_user(void *to, const void *from, unsigned long n)
 {
   if (      
       ({ 
 	unsigned long flag,sum; 
 	asm("addl %3,%1; sbbl %0,%0; cmpl %1,%4; sbbl $0,%0" 
 	    :"=&r" (flag), "=r" (sum) 
 	    :"1" (from),"g" ((int)(n)),"g" (foo_task_struct->seg)); 
 	flag; 
       }) == 0
       )
     do { 
       int __d0, __d1; 
 __asm__ __volatile__( 
 		     "0: rep; movsl\n" 
 		     "1:\n" 
 		     ".section .fixup,\"ax\"\n" 
 		     "2: pushl %0\n" 
 		     "	 pushl %%eax\n" 
 		     "	 xorl %%eax,%%eax\n" 
 		     "	 rep; "
 		     "   stosl\n" 
 		     "	 popl %%eax\n" 
 		     "	 popl %0\n" 
 		     "	 shl $2,%0\n" 
 		     "	 jmp 1b\n" 
 		     ".previous\n" 
 		     ".section __ex_table,\"a\"\n" 
 		     "	.align 4\n" 
 		     "	.long 0b,2b\n" 
 		     ".previous" 
 		     : "=c"(n), "=&S" (__d0), "=&D" (__d1) 
 		     : "1"(from), "2"(to), "0"(n/4) 
 		     : "memory"); 
     } 
     while (0);
   else
     memset_generic(to,0,n);
   return n;
 }
 
 void netdev_get_eset (struct ethtool_cmd *eset);
 
 int netdev_ethtool_ioctl (void *useraddr, u32 ethcmd)
 {
   switch (ethcmd) {
   case 0x00000001:
     {
       struct ethtool_cmd eset = { 0x00000001 };
       netdev_get_eset (&eset);
       if (__constant_copy_to_user(useraddr,&eset,sizeof (eset)) )
 	return -14;
       return 0;
     }
   case 0x00000003:
     {
       struct ethtool_drvinfo info = { 0x00000003 };
       strcpy (info.driver, "8139too");
       if (__constant_copy_to_user(useraddr,&info,sizeof (info)) )
 	return -14;
       return 0;
     }
   case 0x00000005:
     {
       struct ethtool_wolinfo wol = { 0x00000005 };
       if (__constant_copy_to_user(useraddr,&wol,sizeof (wol)) )
 	return -14;
       return 0;
     }
   case 0x00000006:
     {
       struct ethtool_wolinfo wol;
       if (__constant_copy_from_user(&wol,useraddr,sizeof (wol)) )
 	return -14;
       return 0;
     }
   default:
     break;
   }
   return -95;
 }
 
 --------------010905030804010709090104--
 



More information about the Gcc-prs mailing list