summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--changelogs/changelog_2_0_0.md3
-rw-r--r--lib/nimbase.h31
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)