diff options
-rw-r--r-- | changelogs/changelog_2_0_0.md | 3 | ||||
-rw-r--r-- | lib/nimbase.h | 31 |
2 files changed, 23 insertions, 11 deletions
diff --git a/changelogs/changelog_2_0_0.md b/changelogs/changelog_2_0_0.md index 31c495a69..00c20f397 100644 --- a/changelogs/changelog_2_0_0.md +++ b/changelogs/changelog_2_0_0.md @@ -253,6 +253,9 @@ declared when they are not available on the backend. Previously it would call `doAssert false` at runtime despite the condition being compile-time. +- Pragma `{.inline.}` generates `__forceinline` if `__has_attribute(__forceinline)` for GCC and Clang. + + ## Standard library additions and changes [//]: # "Changes:" diff --git a/lib/nimbase.h b/lib/nimbase.h index 3a1289b6f..1b9268881 100644 --- a/lib/nimbase.h +++ b/lib/nimbase.h @@ -84,20 +84,29 @@ __AVR__ # define __DECLSPEC_SUPPORTED 1 #endif -/* calling convention mess ----------------------------------------------- */ -#if defined(__GNUC__) || defined(__TINYC__) - /* these should support C99's inline */ -# define N_INLINE(rettype, name) inline rettype name -#elif defined(__BORLANDC__) || defined(_MSC_VER) -/* Borland's compiler is really STRANGE here; note that the __fastcall - keyword cannot be before the return type, but __inline cannot be after - the return type, so we do not handle this mess in the code generator - but rather here. */ + +/* Calling conventions and inline attributes for the supported C compilers */ +#if defined(__GNUC__) || defined(__clang__) /* GCC and Clang */ +# if __has_attribute(__forceinline) +# define N_INLINE(rettype, name) __attribute__((__forceinline)) rettype name +# else +# define N_INLINE(rettype, name) inline rettype name +# endif +#elif defined(_MSC_VER) /* MSVC */ +# if _MSC_VER > 1200 +# define N_INLINE(rettype, name) __forceinline rettype name +# else +# define N_INLINE(rettype, name) inline rettype name +# endif +#elif defined(__TINYC__) || defined(__BORLANDC__) /* TinyC and BorlandC */ # define N_INLINE(rettype, name) __inline rettype name -#else /* others are less picky: */ -# define N_INLINE(rettype, name) rettype __inline name +#elif defined(__AVR__) /* Atmel Advanced Virtual RISC */ +# define N_INLINE(rettype, name) inline rettype name +#else /* Unsupported C compilers */ +# define N_INLINE(rettype, name) rettype name #endif + #define N_INLINE_PTR(rettype, name) rettype (*name) #if defined(__cplusplus) |