diff options
Diffstat (limited to 'include/iprt/assert.h')
-rw-r--r-- | include/iprt/assert.h | 123 |
1 files changed, 50 insertions, 73 deletions
diff --git a/include/iprt/assert.h b/include/iprt/assert.h index ec1631d1..8b9fba04 100644 --- a/include/iprt/assert.h +++ b/include/iprt/assert.h @@ -297,6 +297,8 @@ RT_C_DECLS_END */ #ifdef __GNUC__ # define AssertCompileNS(expr) extern int RTASSERTVAR[1] __attribute__((unused)), RTASSERTVAR[(expr) ? 1 : 0] __attribute__((unused)) +#elif defined(__IBMC__) || defined(__IBMCPP__) +# define AssertCompileNS(expr) extern int RTASSERTVAR[(expr) ? 1 : 0] #else # define AssertCompileNS(expr) typedef int RTASSERTTYPE[(expr) ? 1 : 0] #endif @@ -312,6 +314,23 @@ RT_C_DECLS_END # define AssertCompile(expr) AssertCompileNS(expr) #endif +/** @def RTASSERT_OFFSET_OF() + * A offsetof() macro suitable for compile time assertions. + * Both GCC v4 and VisualAge for C++ v3.08 has trouble using RT_OFFSETOF. + */ +#if defined(__GNUC__) +# if __GNUC__ >= 4 +# define RTASSERT_OFFSET_OF(a_Type, a_Member) __builtin_offsetof(a_Type, a_Member) +# else +# define RTASSERT_OFFSET_OF(a_Type, a_Member) RT_OFFSETOF(a_Type, a_Member) +# endif +#elif (defined(__IBMC__) || defined(__IBMCPP__)) && defined(RT_OS_OS2) +# define RTASSERT_OFFSET_OF(a_Type, a_Member) __offsetof(a_Type, a_Member) +#else +# define RTASSERT_OFFSET_OF(a_Type, a_Member) RT_OFFSETOF(a_Type, a_Member) +#endif + + /** @def AssertCompileSize * Asserts a size at compile. * @param type The type. @@ -352,18 +371,8 @@ RT_C_DECLS_END * @param member The member. * @param align The member offset alignment to assert. */ -#if defined(__GNUC__) -# if __GNUC__ >= 4 -# define AssertCompileMemberAlignment(type, member, align) \ - AssertCompile(!(__builtin_offsetof(type, member) & ((align) - 1))) -# else -# define AssertCompileMemberAlignment(type, member, align) \ - AssertCompile(!(RT_OFFSETOF(type, member) & ((align) - 1))) -# endif -#else -# define AssertCompileMemberAlignment(type, member, align) \ - AssertCompile(!(RT_OFFSETOF(type, member) & ((align) - 1))) -#endif +#define AssertCompileMemberAlignment(type, member, align) \ + AssertCompile(!(RTASSERT_OFFSET_OF(type, member) & ((align) - 1))) /** @def AssertCompileMemberOffset * Asserts an offset of a structure member at compile. @@ -371,18 +380,8 @@ RT_C_DECLS_END * @param member The member. * @param off The expected offset. */ -#if defined(__GNUC__) -# if __GNUC__ >= 4 -# define AssertCompileMemberOffset(type, member, off) \ - AssertCompile(__builtin_offsetof(type, member) == (off)) -# else -# define AssertCompileMemberOffset(type, member, off) \ - AssertCompile(RT_OFFSETOF(type, member) == (off)) -# endif -#else -# define AssertCompileMemberOffset(type, member, off) \ - AssertCompile(RT_OFFSETOF(type, member) == (off)) -#endif +#define AssertCompileMemberOffset(type, member, off) \ + AssertCompile(RTASSERT_OFFSET_OF(type, member) == (off)) /** @def AssertCompile2MemberOffsets * Asserts that two (sub-structure) members in union have the same offset. @@ -390,18 +389,8 @@ RT_C_DECLS_END * @param member1 The first member. * @param member2 The second member. */ -#if defined(__GNUC__) -# if __GNUC__ >= 4 -# define AssertCompile2MemberOffsets(type, member1, member2) \ - AssertCompile(__builtin_offsetof(type, member1) == __builtin_offsetof(type, member2)) -# else -# define AssertCompile2MemberOffsets(type, member1, member2) \ - AssertCompile(RT_OFFSETOF(type, member1) == RT_OFFSETOF(type, member2)) -# endif -#else -# define AssertCompile2MemberOffsets(type, member1, member2) \ - AssertCompile(RT_OFFSETOF(type, member1) == RT_OFFSETOF(type, member2)) -#endif +#define AssertCompile2MemberOffsets(type, member1, member2) \ + AssertCompile(RTASSERT_OFFSET_OF(type, member1) == RTASSERT_OFFSET_OF(type, member2)) /** @def AssertCompileAdjacentMembers * Asserts that two structure members are adjacent. @@ -409,18 +398,8 @@ RT_C_DECLS_END * @param member1 The first member. * @param member2 The second member. */ -#if defined(__GNUC__) -# if __GNUC__ >= 4 -# define AssertCompileAdjacentMembers(type, member1, member2) \ - AssertCompile(__builtin_offsetof(type, member1) + RT_SIZEOFMEMB(type, member1) == __builtin_offsetof(type, member2)) -# else -# define AssertCompileAdjacentMembers(type, member1, member2) \ - AssertCompile(RT_OFFSETOF(type, member1) + RT_SIZEOFMEMB(type, member1) == RT_OFFSETOF(type, member2)) -# endif -#else -# define AssertCompileAdjacentMembers(type, member1, member2) \ - AssertCompile(RT_OFFSETOF(type, member1) + RT_SIZEOFMEMB(type, member1) == RT_OFFSETOF(type, member2)) -#endif +#define AssertCompileAdjacentMembers(type, member1, member2) \ + AssertCompile(RTASSERT_OFFSET_OF(type, member1) + RT_SIZEOFMEMB(type, member1) == RTASSERT_OFFSET_OF(type, member2)) /** @def AssertCompileMembersAtSameOffset * Asserts that members of two different structures are at the same offset. @@ -429,18 +408,8 @@ RT_C_DECLS_END * @param type2 The second type. * @param member2 The second member. */ -#if defined(__GNUC__) -# if __GNUC__ >= 4 -# define AssertCompileMembersAtSameOffset(type1, member1, type2, member2) \ - AssertCompile(__builtin_offsetof(type1, member1) == __builtin_offsetof(type2, member2)) -# else -# define AssertCompileMembersAtSameOffset(type1, member1, type2, member2) \ - AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2)) -# endif -#else -# define AssertCompileMembersAtSameOffset(type1, member1, type2, member2) \ - AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2)) -#endif +#define AssertCompileMembersAtSameOffset(type1, member1, type2, member2) \ + AssertCompile(RTASSERT_OFFSET_OF(type1, member1) == RTASSERT_OFFSET_OF(type2, member2)) /** @def AssertCompileMembersSameSize * Asserts that members of two different structures have the same size. @@ -460,18 +429,9 @@ RT_C_DECLS_END * @param type2 The second type. * @param member2 The second member. */ -#if defined(__GNUC__) -# if __GNUC__ >= 4 -# define AssertCompileMembersSameSizeAndOffset(type1, member1, type2, member2) \ - AssertCompile(__builtin_offsetof(type1, member1) == __builtin_offsetof(type2, member2) && RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2)) -# else -# define AssertCompileMembersSameSizeAndOffset(type1, member1, type2, member2) \ - AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2) && RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2)) -# endif -#else -# define AssertCompileMembersSameSizeAndOffset(type1, member1, type2, member2) \ - AssertCompile(RT_OFFSETOF(type1, member1) == RT_OFFSETOF(type2, member2) && RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2)) -#endif +#define AssertCompileMembersSameSizeAndOffset(type1, member1, type2, member2) \ + AssertCompile( RTASSERT_OFFSET_OF(type1, member1) == RTASSERT_OFFSET_OF(type2, member2) \ + && RT_SIZEOFMEMB(type1, member1) == RT_SIZEOFMEMB(type2, member2)) /** @} */ @@ -504,7 +464,7 @@ RT_C_DECLS_END * @remarks This macro does not depend on RT_STRICT. */ #if defined(IN_RING0) \ - && (defined(RT_OS_DARWIN) || defined(RT_OS_SOLARIS)) + && (defined(RT_OS_DARWIN) || defined(RT_OS_HAIKU) || defined(RT_OS_SOLARIS)) # define RTAssertDoPanic() RTR0AssertPanicSystem() #else # define RTAssertDoPanic() RTAssertDebugBreak() @@ -1511,6 +1471,23 @@ RT_C_DECLS_END RTAssertPanic(); \ } while (0) +/** @def AssertLogRelMsgFailedStmt + * An assertion failed, execute @a stmt. + * + * Strict builds will hit a breakpoint, non-strict will only do LogRel. The + * statement will be executed in regardless of build type. + * + * @param a printf argument list (in parenthesis). + * @param stmt Statement to execute after raising/logging the assertion. + */ +#define AssertLogRelMsgFailedStmt(a, stmt) \ + do { \ + RTAssertLogRelMsg1((const char *)0, __LINE__, __FILE__, __PRETTY_FUNCTION__); \ + RTAssertLogRelMsg2(a); \ + RTAssertPanic(); \ + stmt; \ + } while (0) + /** @def AssertLogRelMsgFailedReturn * An assertion failed, return \a rc. * Strict builds will hit a breakpoint, non-strict will only do LogRel. |