X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=bertos%2Fcfg%2Fcompiler.h;h=bd60c6e79b74f534688c4816526126f835cb2ef7;hb=b8a137380f022b894587295607cc4dc3f0e7fb00;hp=052565cfa7175110dcbf1bd108cadb44e5600aec;hpb=4cc44c9888a0336b9d01121ec0b7ad95f4a76195;p=bertos.git diff --git a/bertos/cfg/compiler.h b/bertos/cfg/compiler.h index 052565cf..bd60c6e7 100644 --- a/bertos/cfg/compiler.h +++ b/bertos/cfg/compiler.h @@ -190,6 +190,10 @@ #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))) @@ -283,7 +287,6 @@ #ifndef UNUSED_ARG #define UNUSED_ARG(type,arg) type arg #endif -#define UNUSED UNUSED_ARG /* OBSOLETE */ #ifndef UNUSED_VAR #define UNUSED_VAR(type,name) type name #endif @@ -324,6 +327,9 @@ #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 */ @@ -491,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. @@ -501,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 */