add support to the IAR Embedded Workbench(TM) compiler
[bertos.git] / bertos / cfg / compiler.h
index 3a2f34c2c429f159bbc02f2d95c55a24457d6169..0d401bcc42e27ba14997b4f1f8b73682050aad3b 100644 (file)
        #pragma c99 on
 #endif
 
-#if defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)
-       #define COMPILER_C99      1
-#else
-       #define COMPILER_C99      0
+#if defined(__STDC_VERSION__)
+    #if (__STDC_VERSION__ == 199409L) // IAR
+           #define COMPILER_C99      1  // not true, because partial C99, avoid miscompilation
+    #elif (__STDC_VERSION__ >= 199901L) // GCC
+           #define COMPILER_C99      1
+    #else
+           #define COMPILER_C99      0
+    #endif
 #endif
 
 
 
        #pragma language=extended
 
-       #if CPU_ARM
+       /* IAR iccarm specific functions */
+       #include <intrinsics.h>
+       #pragma diag_suppress=Pe940
+       #pragma inline = forced
+
+       #define MEMORY_BARRIER          asm("")
+
+       #if CPU_ARM || CPU_CM3
 
                #define COMPILER_VARIADIC_MACROS 1
 
                #define INTERRUPT(x)  __irq __arm void x (void)
                #define INLINE        static inline
+               #define NAKED
 
                /* Include some standard C89/C99 stuff */
                #include <stddef.h>
        #endif
 
        /**
-        * Force compiler to realod context variable.
+        * Force compiler to reload context variable.
         */
        #define MEMORY_BARRIER           asm volatile ("" : : : "memory")
 
@@ -619,6 +631,10 @@ typedef struct Signal
  * a refetch from memory. This also forbid from reordering successing instances
  * of ACCESS_SAFE().
  */
+#ifdef __ICCARM__
+#define ACCESS_SAFE(x) x
+#else
 #define ACCESS_SAFE(x) (*(volatile typeof(x) *)&(x))
+#endif
 
 #endif /* BERTOS_COMPILER_H */