This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

Solaris 2.8 Intel: asm error when function pointer is known to be 0


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


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]