This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
Solaris 2.8 Intel: asm error when function pointer is known to be 0
- To: bug-gcc at gnu dot org
- Subject: Solaris 2.8 Intel: asm error when function pointer is known to be 0
- From: Martin Buchholz <martin at xemacs dot org>
- Date: Fri, 21 Jul 2000 12:56:58 +0900 (JST)
On Solaris 8 Intel, but not on other platforms such as Solaris 2.6
sparc, or recent Linux, or DEC OSF 4.0e, compiling a function call
through a pointer that the compiler can prove to be zero causes an
assembler error. The error below occurs only with -O1, not -O0.
If the source is changed so that zero is explictly used via a cast as
a function pointer, the error occurs even with no optimization.
Self-explanatory shell transcript follows.
(martin@solaris8i) ~/src $ cat voidfuncrash.c
int main (int argc, char *argv[])
{
void (*fun) (void) = 0;
fun ();
}
(martin@solaris8i) ~/src $ gcc -c -v -O1 voidfuncrash.c
Reading specs from /opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/specs
gcc version 2.95.2 19991024 (release)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/cpp -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95 -Dunix -D__svr4__ -D__SVR4 -Dsun -D__unix__ -D__svr4__ -D__SVR4 -D__sun__ -D__unix -D__sun -Asystem(svr4) -D__OPTIMIZE__ -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ voidfuncrash.c /var/tmp/cck44PhY.i
GNU CPP version 2.95.2 19991024 (release) (i386 System V Release 4)
#include "..." search starts here:
#include <...> search starts here:
/opt/sfw/include
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/../../../../i386-pc-solaris2.8/include
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/include
/usr/include
End of search list.
The following default directories have been omitted from the search path:
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/../../../../include/g++-3
End of omitted list.
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/cc1 /var/tmp/cck44PhY.i -quiet -dumpbase voidfuncrash.c -O1 -version -o /var/tmp/cc6bD9iO.s
GNU C version 2.95.2 19991024 (release) (i386-pc-solaris2.8) compiled by GNU C version 2.95.2 19991024 (release).
/usr/ccs/bin/as -V -Qy -s -o voidfuncrash.o /var/tmp/cc6bD9iO.s
as: Sun WorkShop 6 99/08/16
Assembler: voidfuncrash.c
"/var/tmp/cc6bD9iO.s", line 12 : Illegal PC-relative relocation
(martin@solaris8i) ~/src $ gcc -c -v -O0 voidfuncrash.c
Reading specs from /opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/specs
gcc version 2.95.2 19991024 (release)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/cpp -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95 -Dunix -D__svr4__ -D__SVR4 -Dsun -D__unix__ -D__svr4__ -D__SVR4 -D__sun__ -D__unix -D__sun -Asystem(svr4) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ voidfuncrash.c /var/tmp/ccCjwQFN.i
GNU CPP version 2.95.2 19991024 (release) (i386 System V Release 4)
#include "..." search starts here:
#include <...> search starts here:
/opt/sfw/include
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/../../../../i386-pc-solaris2.8/include
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/include
/usr/include
End of search list.
The following default directories have been omitted from the search path:
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/../../../../include/g++-3
End of omitted list.
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/cc1 /var/tmp/ccCjwQFN.i -quiet -dumpbase voidfuncrash.c -O0 -version -o /var/tmp/ccYzD0Rs.s
GNU C version 2.95.2 19991024 (release) (i386-pc-solaris2.8) compiled by GNU C version 2.95.2 19991024 (release).
/usr/ccs/bin/as -V -Qy -s -o voidfuncrash.o /var/tmp/ccYzD0Rs.s
as: Sun WorkShop 6 99/08/16
(martin@solaris8i) ~/src $ uname -a
SunOS solaris8i.m17n.org 5.8 Generic i86pc i386 i86pc
(martin@solaris8i) ~/src $ cat voidfuncrash2.c
int main (int argc, char *argv[])
{
/* This confuses me, so I understand why it confuses the compiler/assembler */
((void (*) (void)) 0) ();
}
(martin@solaris8i) ~/src $ gcc -c -v voidfuncrash2.c
Reading specs from /opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/specs
gcc version 2.95.2 19991024 (release)
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/cpp -lang-c -v -D__GNUC__=2 -D__GNUC_MINOR__=95 -Dunix -D__svr4__ -D__SVR4 -Dsun -D__unix__ -D__svr4__ -D__SVR4 -D__sun__ -D__unix -D__sun -Asystem(svr4) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ voidfuncrash2.c /var/tmp/ccb6A2r9.i
GNU CPP version 2.95.2 19991024 (release) (i386 System V Release 4)
#include "..." search starts here:
#include <...> search starts here:
/opt/sfw/include
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/../../../../i386-pc-solaris2.8/include
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/include
/usr/include
End of search list.
The following default directories have been omitted from the search path:
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/../../../../include/g++-3
End of omitted list.
/opt/sfw/lib/gcc-lib/i386-pc-solaris2.8/2.95.2/cc1 /var/tmp/ccb6A2r9.i -quiet -dumpbase voidfuncrash2.c -version -o /var/tmp/cc07HbZc.s
GNU C version 2.95.2 19991024 (release) (i386-pc-solaris2.8) compiled by GNU C version 2.95.2 19991024 (release).
/usr/ccs/bin/as -V -Qy -s -o voidfuncrash2.o /var/tmp/cc07HbZc.s
as: Sun WorkShop 6 99/08/16
Assembler: voidfuncrash2.c
"/var/tmp/cc07HbZc.s", line 12 : Illegal PC-relative relocation