970917 EH problem in sparc with -O

Teemu Torma tot@trema.com
Thu Sep 18 02:56:00 GMT 1997


If the following program is compiled with optimization turned on,
throwing an exception will cause an infinite loop to exceptions.
The compiler has Jason's `--pc' patch installed.

It works just fine in 970910 with or without sjlj exceptions.

Without -O:

$ gcc eh.cc
$ ./a.out 
2: Throwing
2: Got level 2
1: Got level 2
0: Got level 2

With -O:

$ gcc -O eh.cc
$ ./a.out
2: Throwing
2: Got level 2
2: Got level 2
2: Got level 2
2: Got level 2
... and so on.

eh.cc ----------------------------------------------------------------------
#include <stdio.h>
#include <exception>

static void
eh_terminate ()
{
  printf ("CALLING TERMINATE\n");
  exit (0);
}

void
eh_test (int level)
{
  try
    {
      if (level < 2)
	eh_test (level + 1);
      else
	{
	  printf ("%d: Throwing\n", level);
	  throw (level);
	}
    }
  catch (int &x)
    {
      printf ("%d: Got level %d\n",
	      level, x);

      if (level > 0)
	throw;
    }
}

main ()
{
  set_terminate (&eh_terminate);
  eh_test (0);
}
----------------------------------------------------------------------
$ gcc -v -O eh.cc
Reading specs from /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.08/specs
gcc version egcs-2.90.08 970917 (gcc2-970802 experimental)
 /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.08/cpp -lang-c++ -v -undef -D__GNUC__=2 -D__GNUG__=2 -D__cplusplus -D__GNUC_MINOR__=90 -Dsun -Dsparc -Dunix -D__svr4__ -D__SVR4 -D__GCC_NEW_VARARGS__ -D__sun__ -D__sparc__ -D__unix__ -D__svr4__ -D__SVR4 -D__GCC_NEW_VARARGS__ -D__sun -D__sparc -D__unix -Asystem(unix) -Asystem(svr4) -Acpu(sparc) -Amachine(sparc) -D__EXCEPTIONS -D__OPTIMIZE__ eh.cc /var/tmp/cca003pe.ii
GNU CPP version egcs-2.90.08 970917 (gcc2-970802 experimental) (sparc)
#include "..." search starts here:
#include <...> search starts here:
 /usr/gnu/lib/g++-include
 /usr/local/include
 /usr/gnu/sparc-sun-solaris2.5.1/include
 /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.08/include
 /usr/include
End of search list.
 /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.08/cc1plus /var/tmp/cca003pe.ii -quiet -dumpbase eh.cc -O -version -o /var/tmp/cca003pe.s
GNU C++ version egcs-2.90.08 970917 (gcc2-970802 experimental) (sparc-sun-solaris2.5.1) compiled by GNU C version egcs-2.90.08 970917 (gcc2-970802 experimental).
 /usr/ccs/bin/as -V -Qy -s -o /var/tmp/cca003pe1.o /var/tmp/cca003pe.s
/usr/ccs/bin/as: SC4.2 dev 30 Nov 1995
 /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.08/ld -V -Y P,/usr/ccs/lib:/usr/lib -Qy /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.08/crt1.o /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.08/crti.o /usr/ccs/lib/values-Xa.o /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.08/crtbegin.o -L/usr/gnu/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.08 -L/usr/ccs/bin -L/usr/ccs/lib -L/usr/gnu/lib /var/tmp/cca003pe1.o -lgcc -lc -lgcc /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.08/crtend.o /usr/gnu/lib/gcc-lib/sparc-sun-solaris2.5.1/egcs-2.90.08/crtn.o
ld: Software Generation Utilities (SGU) SunOS/ELF (LK-2.0 (S/I) - versioning)
----------------------------------------------------------------------

Teemu



More information about the Gcc mailing list