Further Cortex-M3 core related macros.
[bertos.git] / bertos / cfg / compiler.h
index 7357f43f69789bdb380192795a18e5fc59121c6e..477094d224de1a3e39bd21b31e25b18c5be61b03 100644 (file)
                #define DEPRECATED  __attribute__((__deprecated__))
        #endif
 
+       #if GNUC_PREREQ(4,5)
+               #define UNREACHABLE() __builtin_unreachable()
+       #endif
+
        #ifndef __cplusplus
                #define ASSERT_TYPE_EQUAL(var1, var2) \
                        STATIC_ASSERT(__builtin_types_compatible_p(typeof(var1), typeof(var2)))
 #define MEMORY_BARRIER         /* nothing */
 #warning No memory barrier defined for select compiler. If you use the kernel check it.
 #endif
+#ifndef UNREACHABLE
+#define UNREACHABLE() for (;;)
+#endif
 
 
 /* Misc definitions */
@@ -441,7 +448,7 @@ typedef unsigned char page_t;    /**< Type for banked memory pages. */
        #if CPU_X86
                /* 32bit or 64bit (32bit for _WIN64). */
                typedef long ssize_t;
-       #elif CPU_ARM
+       #elif CPU_ARM || CPU_CM3
                typedef int ssize_t;
        #elif CPU_AVR
                /* 16bit (missing in avr-libc's sys/types.h). */
@@ -490,6 +497,16 @@ typedef unsigned char page_t;    /**< Type for banked memory pages. */
         */
        #define countof(a)  (sizeof(a) / sizeof(*(a)))
 #endif
+#ifndef alignof
+       /**
+        * Return the alignment in memory of a generic data type.
+        *
+        * \note We need to worry about alignment when allocating memory that
+        * will be used later by unknown objects (e.g., malloc()) or, more
+        * generally, whenever creating generic container types.
+        */
+       #define alignof(type) offsetof(struct { char c; type member; }, member)
+#endif
 
 /**
  * Cast a member of a structure out to the containing structure.
@@ -500,12 +517,12 @@ typedef unsigned char page_t;    /**< Type for banked memory pages. */
  */
 #if COMPILER_TYPEOF && COMPILER_STATEMENT_EXPRESSIONS
        #define containerof(ptr, type, member) ({ \
-               const typeof( ((type *)0)->member ) *_mptr = (ptr); /* type check */ \
-               (type *)((char *)_mptr - offsetof(type, member)); \
+               typeof( ((type *)0)->member ) *_mptr = (ptr); /* type check */ \
+               (type *)(void *)((char *)_mptr - offsetof(type, member)); \
        })
 #else
        #define containerof(ptr, type, member) \
-               ( (type *)((char *)(ptr) - offsetof(type, member)) )
+               ( (type *)(void *)((char *)(ptr) - offsetof(type, member)) )
 #endif
 
 /** Issue a compilation error if the \a condition is false */