This is the mail archive of the cygwin-developers@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: gcc4 and local statics


Christopher Faylor wrote:

> This stores a in a static location, initialized to 27.  It doesn't produce
> any special code for thread safety.  This actually makes some sense when
> assigning a constant to a static.  The constant isn't going to change and
> the static is always going to occupy one place in memory.

That's a good point, if a lot of these statics are initialized that way
then this might be a bunch of fuss over nothing.

> This, OTOH, did produce the type of code that you mentioned:

In fact the only way I had any clue about what was going on was after
looking at the disassembly of 'static int granularity = whatever ();'
and saying to myself, "okay what the heck is this __cxa_guard BS and
what has it got to do with this simple function call?".

> There is still the issue of real class constructors, of course.  Those
> are a little harder to track down than the use of ' static int foo =
> something;' but I wouldn't expect them to be very prevalent in cygwin
> either.

Here's a fun one:

int bar ();

int
foo ()
{
  static int i = bar ();

  printf ("rut-roh!\n");
}

int
bar ()
{
  static int j = foo ();
}

int
main ()
{
  foo ();
}

In gcc3, you get infinite recursion until the stack is gone and then
segv (or just crash.)

In gcc4, using the __cxa_guards in libstd++, this produces:

terminate called after throwing an instance of
'__gnu_cxx::recursive_init'
  what():  N9__gnu_cxx14recursive_initE
Aborted (core dumped)

Brian


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