[PATCH] Inline defn's in stdio.h break gcc bootstrap on cygwin.

Christopher Faylor cgf-use-the-mailinglist-please@cygwin.com
Thu Mar 29 09:19:00 GMT 2007


On Thu, Mar 29, 2007 at 12:35:27AM +0100, Dave Korn wrote:
>
>
>    Hi Jeff, hope you had a nice break!
>
>  It's a fairly complicated story, but gcc won't currently bootstrap on
>cygwin.  It's a combination of three factors:
>
> - stdio.h uses 'static inline' to declare __sgetc_r (and the
>currently-ifdef'd-out __sputc_r).
> - gcc uses the -fkeep-inline-functions flag when bootstrapping.
> - libgcc doesn't link against libcygwin (and in any case should not contain a
>static copy of __sgetc_r in the .ctors section!)
>
>  For background, you can browse these threads:
>
>http://cygwin.com/ml/cygwin/2007-03/msg00705.html
>http://gcc.gnu.org/ml/gcc/2007-03/msg00948.html
>http://gcc.gnu.org/ml/gcc/2007-03/msg01088.html
>
>  The problem basically is that -fkeep-inline-functions causes libgcc to have
>unresolved references to _ungetc et al.  The gcc bootstrap process
>deliberately uses -fkeep-inline-functions to show up problems that would be
>caused by inline functions when bootstrapping gcc with a native (non-gcc)
>compiler, none of which match gcc's functionality of not emitting the body of
>a static inline function unless it has to.  So, the first possibility is to
>switch to using extern inline, which doesn't ever emit the function body, not
>even with -fkeep-inline-functions.  Problem is, the meaning of extern inline
>is shortly changing to be c99-compliant.  So, we end up using a feature test
>to define a macro that means "this function can be omitted if possible".  This
>fixes gcc bootstrap for cygwin.
>
>  I've tested this to the extent of building winsup and running the cygwin
>testsuite with and without the patch and verifying that it doesn't break the
>build or cause any change in the testsuite results, and verifying that the
>change makes it into the installed stdio.h after "make install".  More testing
>would be good, though.  It's not a neutral change; replacing a static inline
>with an extern inline could I guess cause link errors in some projects.
>Should it perhaps be conditionalised on __CYGWIN32__ or something?  Are there
>maybe some newlib-linux targets that might be affected by this as well?

If it is ifdef'ed, it should be #ifdef __CYGWIN__ please.  __CYGWIN32__
is violently deprecated.

cgf



More information about the Newlib mailing list