FIX #2469: sort out our static/extern inline story
authorSimon Marlow <marlowsd@gmail.com>
Tue, 16 Sep 2008 13:22:22 +0000 (13:22 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Tue, 16 Sep 2008 13:22:22 +0000 (13:22 +0000)
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.

includes/Stable.h
includes/Stg.h

index 5acc6bc..1de78d6 100644 (file)
@@ -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 );
index 392fd2a..6cbfeb4 100644 (file)
@@ -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)
 
 # 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)