gcc C++ optimizer problem
David Garfield x1688
garfield@verdi.iisd.sra.com
Fri Jun 23 10:45:00 GMT 2000
I appear to have found a bug in the optimizer. The body of function B1::fn
disappears when optimized.
+ cat a.cpp
class A {
class B {
public:
virtual int fn(void) = 0;
};
public:
A(int);
B *b;
int use(void);
};
A::A(int)
{
class B1 : public B {
int fn(void) { return 3; }
};
b = new B1;
}
int A::use(void)
{
return b->fn();
}
int main(int, char**){}
+ gcc -v
Reading specs from /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/specs
gcc version 2.95.2 19991024 (release)
+ gcc -v -o a -O1 a.cpp
Reading specs from /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/specs
gcc version 2.95.2 19991024 (release)
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/cpp -lang-c++ -v -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__EXCEPTIONS -D__OPTIMIZE__ -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -Di586 -Dpentium -D__i586 -D__i586__ -D__pentium -D__pentium__ a.cpp /tmp/ccJEI69n.ii
GNU CPP version 2.95.2 19991024 (release) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/../../../../include/g++-3
/usr/local/include
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/../../../../i586-mandrake-linux/include
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/include
/usr/include
End of search list.
The following default directories have been omitted from the search path:
End of omitted list.
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/cc1plus /tmp/ccJEI69n.ii -quiet -dumpbase a.cc -O1 -version -o /tmp/cccaPBhD.s
GNU C++ version 2.95.2 19991024 (release) (i586-mandrake-linux) compiled by GNU C version 2.95.2 19991024 (release).
as -V -Qy -o /tmp/ccx1GOKS.o /tmp/cccaPBhD.s
GNU assembler version 2.9.5 (i686-pc-linux-gnu) using BFD version 2.9.5.0.16
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/crtbegin.o -L/users/garfield/lib -L/usr/local/lib -L/usr/X11R6/lib -L/usr/lib/X11 -L/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2 -L/usr/i586-mandrake-linux/lib /tmp/ccx1GOKS.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/crtend.o /usr/lib/crtn.o
/tmp/ccx1GOKS.o(.gnu.linkonce.d.__vt_Q31A7__1Ai.0_2B1+0x8): undefined reference to `fn__Q31A7__1Ai.0_2B1.3'
collect2: ld returned 1 exit status
+ gcc -v -o a -O0 a.cpp
Reading specs from /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/specs
gcc version 2.95.2 19991024 (release)
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/cpp -lang-c++ -v -D__GNUC__=2 -D__GNUG__=2 -D__GNUC_MINOR__=95 -D__cplusplus -D__ELF__ -Dunix -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__linux__ -D__unix -D__linux -Asystem(posix) -D__EXCEPTIONS -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -Di586 -Dpentium -D__i586 -D__i586__ -D__pentium -D__pentium__ a.cpp /tmp/cclAGgXy.ii
GNU CPP version 2.95.2 19991024 (release) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/../../../../include/g++-3
/usr/local/include
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/../../../../i586-mandrake-linux/include
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/include
/usr/include
End of search list.
The following default directories have been omitted from the search path:
End of omitted list.
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/cc1plus /tmp/cclAGgXy.ii -quiet -dumpbase a.cc -O0 -version -o /tmp/cc2AHfTY.s
GNU C++ version 2.95.2 19991024 (release) (i586-mandrake-linux) compiled by GNU C version 2.95.2 19991024 (release).
as -V -Qy -o /tmp/ccPuJNBr.o /tmp/cc2AHfTY.s
GNU assembler version 2.9.5 (i686-pc-linux-gnu) using BFD version 2.9.5.0.16
/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o a /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/crtbegin.o -L/users/garfield/lib -L/usr/local/lib -L/usr/X11R6/lib -L/usr/lib/X11 -L/usr/lib/gcc-lib/i586-mandrake-linux/2.95.2 -L/usr/i586-mandrake-linux/lib /tmp/ccPuJNBr.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i586-mandrake-linux/2.95.2/crtend.o /usr/lib/crtn.o
My compiler is the one include in the Mandrake 7.0 x86 distribution.
I have omitted the .ii file because I didn't use any preprocessor features.
This bug also appeared in some older versions on different platforms:
$ gcc -v
Reading specs from /vol/tools/pkg/egcs-1.1.2/lib/gcc-lib/sparc-sun-solaris2.6/egcs-2.91.66/specs
gcc version egcs-2.91.66 19990314 (egcs-1.1.2 release)
$ gcc -O0 a.cpp
$ gcc -O1 a.cpp
Undefined first referenced
symbol in file
fn__Q31A7__1Ai.0_2B1.2 /var/tmp/ccSaQ2Jo.o
ld: fatal: Symbol referencing errors. No output written to a.out
collect2: ld returned 1 exit status
$
More information about the Gcc-bugs
mailing list