c/3609: Cann't boot kernel-2.4.6 with CVS gcc-3.0.1

sirl@gcc.gnu.org sirl@gcc.gnu.org
Thu Jul 12 04:39:00 GMT 2001

Synopsis: Cann't boot kernel-2.4.6 with CVS gcc-3.0.1

State-Changed-From-To: feedback->analyzed
State-Changed-By: sirl
State-Changed-When: Thu Jul 12 04:39:45 2001
    I have the same problem and tracked it down to a misoptimization of the
    strcpy function.
    This code:
    strcpy(namep, (*((typeof(&("linux,phandle")))((unsigned
    long)(&("linux,phandle")) + offset))));
    gets misoptimized to:
    memcpy(namep, (*((typeof(&("linux,phandle")))((unsigned
    long)(&("linux,phandle")) + offset))), offset - sizeof("linux,phandle"));
    Note the length of the memcpy! 
    Inspection of the assembly shows that it happens both on powerpc-linux-gnu
    and x86-linux-gnu independent of -fstrict-aliasing and -fno-builtins.
    gcc-2.95 compiles this just fine, so this is a regression.
    extern char * strcpy(char *,const char *);
    extern unsigned long reloc_offset(void);
    void inspect_node(void)
    char *namep;
    unsigned long offset = reloc_offset();
    strcpy(namep, (*((typeof(&("linux,phandle")))((unsigned
    long)(&("linux,phandle")) + offset))));


More information about the Gcc-bugs mailing list