diff options
author | Andy Wingo <wingo@pobox.com> | 2018-06-20 11:17:13 +0200 |
---|---|---|
committer | Andy Wingo <wingo@pobox.com> | 2018-06-20 11:17:13 +0200 |
commit | d340a9709cf245cf3f12b213734f567c361d03e8 (patch) | |
tree | 24a13b60ac045b7399de872f9b964acaf7e47da2 /libguile/inline.h | |
parent | 3c48c8778466ba99acd167686a3793253b2806ef (diff) | |
download | guile-d340a9709cf245cf3f12b213734f567c361d03e8.tar.gz |
Shuffle around inline C function implementation
* libguile/__scm.h:
* libguile/inline.h (SCM_C_EXTERN_INLINE, SCM_CAN_INLINE, SCM_INLINE)
(SCM_INLINE_IMPLEMENTATION): Move definitions here, from __scm.h.
* libguile/strings.h (scm_is_string): Move implementation here, from
inline.h.
* libguile/inline.c: Add strings.h include.
* libguile/_scm.h: Remove inline.h include.
* libguile/array-handle.h:
* libguile/gc.h:
* libguile/pairs.h:
* libguile/smob.h: Add inline.h includes.
Diffstat (limited to 'libguile/inline.h')
-rw-r--r-- | libguile/inline.h | 63 |
1 files changed, 50 insertions, 13 deletions
diff --git a/libguile/inline.h b/libguile/inline.h index 999df361e..57e0ecfba 100644 --- a/libguile/inline.h +++ b/libguile/inline.h @@ -29,22 +29,59 @@ #include "libguile/__scm.h" +/* We would like gnu89 extern inline semantics, not C99 extern inline + semantics, so that we can be sure to avoid reifying definitions of + inline functions in all compilation units, which is a possibility at + low optimization levels, or if a user takes the address of an inline + function. -SCM_INLINE int scm_is_string (SCM x); + Hence the `__gnu_inline__' attribute, in accordance with: + http://gcc.gnu.org/gcc-4.3/porting_to.html . -SCM_INLINE SCM scm_cell (scm_t_bits car, scm_t_bits cdr); -SCM_INLINE SCM scm_double_cell (scm_t_bits car, scm_t_bits cbr, - scm_t_bits ccr, scm_t_bits cdr); -SCM_INLINE SCM scm_words (scm_t_bits car, scm_t_uint32 n_words); + With GCC 4.2, `__GNUC_STDC_INLINE__' is never defined (because C99 inline + semantics are not supported), but a warning is issued in C99 mode if + `__gnu_inline__' is not used. -#if SCM_CAN_INLINE || defined SCM_INLINE_C_IMPLEMENTING_INLINES -/* Either inlining, or being included from inline.c. */ + Apple's GCC build >5400 (since Xcode 3.0) doesn't support GNU inline in + C99 mode and doesn't define `__GNUC_STDC_INLINE__'. Fall back to "static + inline" in that case. */ -SCM_INLINE_IMPLEMENTATION int -scm_is_string (SCM x) -{ - return SCM_HAS_TYP7 (x, scm_tc7_string); -} +# if (defined __GNUC__) && (!(((defined __APPLE_CC__) && (__APPLE_CC__ > 5400)) && __STDC_VERSION__ >= 199901L)) +# if (defined __GNUC_STDC_INLINE__) || (__GNUC__ == 4 && __GNUC_MINOR__ == 2) +# define SCM_C_EXTERN_INLINE \ + extern __inline__ __attribute__ ((__gnu_inline__)) +# else +# define SCM_C_EXTERN_INLINE extern __inline__ +# endif +# endif +/* SCM_INLINE is a macro prepended to all public inline function + declarations. Implementations of those functions should also be in + the header file, prefixed by SCM_INLINE_IMPLEMENTATION, and protected + by SCM_CAN_INLINE. Non-inline definitions will be reified into + inline.c. See strings.h for an example usage, for scm_is_string. */ + +#if defined SCM_IMPLEMENT_INLINES +/* Reifying functions to a file, whether or not inlining is available. */ +# define SCM_CAN_INLINE 0 +# define SCM_INLINE SCM_API +# define SCM_INLINE_IMPLEMENTATION +#elif defined SCM_C_INLINE +/* Declarations when inlining is available. */ +# define SCM_CAN_INLINE 1 +# ifdef SCM_C_EXTERN_INLINE +# define SCM_INLINE SCM_C_EXTERN_INLINE +# else +/* Fall back to static inline if GNU "extern inline" is unavailable. */ +# define SCM_INLINE static SCM_C_INLINE +# endif +# define SCM_INLINE_IMPLEMENTATION SCM_INLINE +#else +/* Declarations when inlining is not available. */ +# define SCM_CAN_INLINE 0 +# define SCM_INLINE SCM_API +/* Don't define SCM_INLINE_IMPLEMENTATION; it should never be seen in + this case. */ #endif -#endif + +#endif /* SCM_INLINE_H */ |