From: Simon Marlow Date: Tue, 16 Sep 2008 13:22:22 +0000 (+0000) Subject: FIX #2469: sort out our static/extern inline story X-Git-Url: http://git.megacz.com/?p=ghc-hetmet.git;a=commitdiff_plain;h=f3052008e4fcd72681b12dfef551d0499eddf6a7 FIX #2469: sort out our static/extern inline story gcc has changed the meaning of "extern inline" when certain flags are on (e.g. --std=gnu99), and this broke our use of it in the header files. --- diff --git a/includes/Stable.h b/includes/Stable.h index 5acc6bc..1de78d6 100644 --- a/includes/Stable.h +++ b/includes/Stable.h @@ -20,7 +20,7 @@ External C Interface -------------------------------------------------------------------------- */ -extern StgPtr deRefStablePtr(StgStablePtr stable_ptr); +EXTERN_INLINE StgPtr deRefStablePtr(StgStablePtr stable_ptr); extern void freeStablePtr(StgStablePtr sp); extern StgStablePtr splitStablePtr(StgStablePtr sp); extern StgStablePtr getStablePtr(StgPtr p); @@ -40,19 +40,12 @@ extern DLL_IMPORT_RTS snEntry *stable_ptr_table; extern void freeStablePtr(StgStablePtr sp); -#if defined(__GNUC__) -# ifndef RTS_STABLE_C -extern inline -# endif +EXTERN_INLINE StgPtr deRefStablePtr(StgStablePtr sp) { ASSERT(stable_ptr_table[(StgWord)sp].ref > 0); return stable_ptr_table[(StgWord)sp].addr; } -#else -/* No support for 'extern inline' */ -extern StgPtr deRefStablePtr(StgStablePtr sp); -#endif extern void initStablePtrTable ( void ); extern void exitStablePtrTable ( void ); diff --git a/includes/Stg.h b/includes/Stg.h index 392fd2a..6cbfeb4 100644 --- a/includes/Stg.h +++ b/includes/Stg.h @@ -81,7 +81,8 @@ * 'Portable' inlining: * INLINE_HEADER is for inline functions in header files (macros) * STATIC_INLINE is for inline functions in source files - * EXTERN_INLINE is for functions that we want to inline sometimes + * EXTERN_INLINE is for functions that we want to inline sometimes + * (we also compile a static version of the function; see Inlines.c) */ #if defined(__GNUC__) || defined( __INTEL_COMPILER) @@ -89,11 +90,24 @@ # define INLINE_ME inline # define STATIC_INLINE INLINE_HEADER -# if defined(KEEP_INLINES) -# define EXTERN_INLINE inline -# else -# define EXTERN_INLINE extern inline -# endif +// The special "extern inline" behaviour is now only supported by gcc +// when _GNUC_GNU_INLINE__ is defined, and you have to use +// __attribute__((gnu_inline)). So when we don't have this, we use +// ordinary static inline. +// +#if defined(__GNUC_GNU_INLINE__) +# if defined(KEEP_INLINES) +# define EXTERN_INLINE inline +# else +# define EXTERN_INLINE extern inline __attribute__((gnu_inline)) +# endif +#else +# if defined(KEEP_INLINES) +# define EXTERN_INLINE +# else +# define EXTERN_INLINE INLINE_HEADER +# endif +#endif #elif defined(_MSC_VER)