swr: fix build with mingw
[mesa.git] / src / gallium / drivers / swr / rasterizer / common / swr_assert.h
index 89ae10efb23042f1bcb28868ee24ea1e9d72e6dc..cd9854f2549943b516bc1c1060fb8a4585822160 100644 (file)
@@ -1,25 +1,25 @@
 /****************************************************************************
-* Copyright (C) 2014-2015 Intel Corporation.   All Rights Reserved.
-*
-* Permission is hereby granted, free of charge, to any person obtaining a
-* copy of this software and associated documentation files (the "Software"),
-* to deal in the Software without restriction, including without limitation
-* the rights to use, copy, modify, merge, publish, distribute, sublicense,
-* and/or sell copies of the Software, and to permit persons to whom the
-* Software is furnished to do so, subject to the following conditions:
-*
-* The above copyright notice and this permission notice (including the next
-* paragraph) shall be included in all copies or substantial portions of the
-* Software.
-*
-* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
-* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
-* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
-* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
-* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
-* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
-* IN THE SOFTWARE.
-****************************************************************************/
+ * Copyright (C) 2014-2015 Intel Corporation.   All Rights Reserved.
+ *
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice (including the next
+ * paragraph) shall be included in all copies or substantial portions of the
+ * Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
+ * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
+ * IN THE SOFTWARE.
+ ****************************************************************************/
 
 #ifndef __SWR_ASSERT_H__
 #define __SWR_ASSERT_H__
 
 // Stupid preprocessor tricks to avoid -Wall / -W4 warnings
 #if defined(_MSC_VER)
-#define _SWR_WARN_DISABLE __pragma(warning(push)) __pragma(warning(disable:4127))
+#define _SWR_WARN_DISABLE __pragma(warning(push)) __pragma(warning(disable : 4127))
 #define _SWR_WARN_RESTORE __pragma(warning(pop))
 #else // ! MSVC compiler
 #define _SWR_WARN_DISABLE
 #define _SWR_WARN_RESTORE
 #endif
 
-#define _SWR_MACRO_START do {
-#define _SWR_MACRO_END  \
-    _SWR_WARN_DISABLE   \
-    } while(0)          \
+#define _SWR_MACRO_START \
+    do                   \
+    {
+#define _SWR_MACRO_END \
+    _SWR_WARN_DISABLE  \
+    }                  \
+    while (0)          \
     _SWR_WARN_RESTORE
 
-
-#if defined(_WIN32)
-#define SWR_ASSUME(e, ...) _SWR_MACRO_START __assume(e); _SWR_MACRO_END
+#if defined(_MSC_VER)
+#define SWR_ASSUME(e, ...)        \
+    _SWR_MACRO_START __assume(e); \
+    _SWR_MACRO_END
 #elif defined(__clang__)
-#define SWR_ASSUME(e, ...) _SWR_MACRO_START __builtin_assume(e); _SWR_MACRO_END
+#define SWR_ASSUME(e, ...)                \
+    _SWR_MACRO_START __builtin_assume(e); \
+    _SWR_MACRO_END
 #elif defined(__GNUC__)
-#define SWR_ASSUME(e, ...) _SWR_MACRO_START ((e) ? ((void)0) : __builtin_unreachable()); _SWR_MACRO_END
+#define SWR_ASSUME(e, ...)                                       \
+    _SWR_MACRO_START((e) ? ((void)0) : __builtin_unreachable()); \
+    _SWR_MACRO_END
 #else
-#define SWR_ASSUME(e, ...) _SWR_MACRO_START ASSUME(e); _SWR_MACRO_END
+#define SWR_ASSUME(e, ...)      \
+    _SWR_MACRO_START ASSUME(e); \
+    _SWR_MACRO_END
 #endif
 
 #if !defined(SWR_ENABLE_ASSERTS)
 
 #else
 
-bool SwrAssert(
-    bool        chkDebugger,
-    bool&       enabled,
-    const char* pExpression,
-    const char* pFileName,
-    uint32_t    lineNum,
-    const char* function,
-    const char* pFmtString = nullptr,
-    ...);
+bool SwrAssert(bool        chkDebugger,
+               bool&       enabled,
+               const char* pExpression,
+               const char* pFileName,
+               uint32_t    lineNum,
+               const char* function,
+               const char* pFmtString = nullptr,
+               ...);
 
 void SwrTrace(
-    const char* pFileName,
-    uint32_t    lineNum,
-    const char* function,
-    const char* pFmtString,
-    ...);
-
-#define _SWR_ASSERT(chkDebugger, e, ...)    \
-    _SWR_MACRO_START \
-    bool expFailed = !(e);\
-    if (expFailed) {\
-        static bool swrAssertEnabled = true;\
-        expFailed = SwrAssert(chkDebugger, swrAssertEnabled, #e, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);\
-        if (expFailed) { DEBUGBREAK; }\
-    }\
+    const char* pFileName, uint32_t lineNum, const char* function, const char* pFmtString, ...);
+
+#define _SWR_ASSERT(chkDebugger, e, ...)                                                                            \
+    _SWR_MACRO_START                                                                                                \
+    bool expFailed = !(e);                                                                                          \
+    if (expFailed)                                                                                                  \
+    {                                                                                                               \
+        static bool swrAssertEnabled = true;                                                                        \
+        expFailed                    = SwrAssert(                                                                   \
+            chkDebugger, swrAssertEnabled, #e, __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
+        if (expFailed)                                                                                              \
+        {                                                                                                           \
+            DEBUGBREAK;                                                                                             \
+        }                                                                                                           \
+    }                                                                                                               \
     _SWR_MACRO_END
 
-#define _SWR_INVALID(chkDebugger, ...)    \
-    _SWR_MACRO_START \
-    static bool swrAssertEnabled = true;\
-    bool expFailed = SwrAssert(chkDebugger, swrAssertEnabled, "", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__);\
-    if (expFailed) { DEBUGBREAK; }\
+#define _SWR_INVALID(chkDebugger, ...)                                                                     \
+    _SWR_MACRO_START                                                                                       \
+    static bool swrAssertEnabled = true;                                                                   \
+    bool        expFailed        = SwrAssert(                                                              \
+        chkDebugger, swrAssertEnabled, "", __FILE__, __LINE__, __FUNCTION__, ##__VA_ARGS__); \
+    if (expFailed)                                                                                         \
+    {                                                                                                      \
+        DEBUGBREAK;                                                                                        \
+    }                                                                                                      \
     _SWR_MACRO_END
 
-#define _SWR_TRACE(_fmtstr, ...) \
-    SwrTrace(__FILE__, __LINE__, __FUNCTION__, _fmtstr, ##__VA_ARGS__);
+#define _SWR_TRACE(_fmtstr, ...) SwrTrace(__FILE__, __LINE__, __FUNCTION__, _fmtstr, ##__VA_ARGS__);
 
 #if SWR_ENABLE_ASSERTS
-#define SWR_ASSERT(e, ...)              _SWR_ASSERT(true, e, ##__VA_ARGS__)
-#define SWR_ASSUME_ASSERT(e, ...)       SWR_ASSERT(e, ##__VA_ARGS__)
-#define SWR_TRACE(_fmtstr, ...)         _SWR_TRACE(_fmtstr, ##__VA_ARGS__)
-
-#if defined(assert)
-#undef assert
-#endif
-#define assert(exp) SWR_ASSERT(exp)
-
+#define SWR_ASSERT(e, ...) _SWR_ASSERT(true, e, ##__VA_ARGS__)
+#define SWR_ASSUME_ASSERT(e, ...) SWR_ASSERT(e, ##__VA_ARGS__)
+#define SWR_TRACE(_fmtstr, ...) _SWR_TRACE(_fmtstr, ##__VA_ARGS__)
 #endif // SWR_ENABLE_ASSERTS
 
 #if SWR_ENABLE_REL_ASSERTS
-#define SWR_REL_ASSERT(e, ...)          _SWR_ASSERT(false, e, ##__VA_ARGS__)
-#define SWR_REL_ASSUME_ASSERT(e, ...)   SWR_REL_ASSERT(e, ##__VA_ARGS__)
-#define SWR_REL_TRACE(_fmtstr, ...)     _SWR_TRACE(_fmtstr, ##__VA_ARGS__)
+#define SWR_REL_ASSERT(e, ...) _SWR_ASSERT(false, e, ##__VA_ARGS__)
+#define SWR_REL_ASSUME_ASSERT(e, ...) SWR_REL_ASSERT(e, ##__VA_ARGS__)
+#define SWR_REL_TRACE(_fmtstr, ...) _SWR_TRACE(_fmtstr, ##__VA_ARGS__)
 
 // SWR_INVALID is always enabled
-#define SWR_INVALID(fmtStr, ...)                _SWR_INVALID(false, fmtStr, ##__VA_ARGS__)
-#endif
+// Funky handling to allow 0 arguments with g++/gcc
+// This is needed because you can't "swallow commas" with ##_VA_ARGS__ unless
+// there is a first argument to the macro.  So having a macro that can optionally
+// accept 0 arguments is tricky.
+#define _SWR_INVALID_0() _SWR_INVALID(false)
+#define _SWR_INVALID_1(...) _SWR_INVALID(false, ##__VA_ARGS__)
+#define _SWR_INVALID_VARGS_(_10, _9, _8, _7, _6, _5, _4, _3, _2, _1, N, ...) N
+#define _SWR_INVALID_VARGS(...) _SWR_INVALID_VARGS_(__VA_ARGS__, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1)
+#define _SWR_INVALID_VARGS_0() 1, 2, 3, 4, 5, 6, 7, 9, 9, 10
+#define _SWR_INVALID_CONCAT_(a, b) a##b
+#define _SWR_INVALID_CONCAT(a, b) _SWR_INVALID_CONCAT_(a, b)
+#define SWR_INVALID(...)                                                                       \
+    _SWR_INVALID_CONCAT(_SWR_INVALID_, _SWR_INVALID_VARGS(_SWR_INVALID_VARGS_0 __VA_ARGS__())) \
+    (__VA_ARGS__)
+
+#define SWR_STATIC_ASSERT(expression, ...) \
+    static_assert((expression), "Failed:\n    " #expression "\n    " __VA_ARGS__);
+
+#endif // SWR_ENABLE_REL_ASSERTS
 
 #endif // C++
 
 #endif // SWR_ENABLE_ASSERTS || SWR_ENABLE_REL_ASSERTS
 
 // Needed to allow passing bitfield members to sizeof() in disabled asserts
-template<typename T>
-static bool SwrSizeofWorkaround(T) {return false;}
+template <typename T>
+static bool SwrSizeofWorkaround(T)
+{
+    return false;
+}
 
 #if !SWR_ENABLE_ASSERTS
-#define SWR_ASSERT(e, ...)              _SWR_MACRO_START (void)sizeof(SwrSizeofWorkaround(e)); _SWR_MACRO_END
-#define SWR_ASSUME_ASSERT(e, ...)       SWR_ASSUME(e, ##__VA_ARGS__)
-#define SWR_TRACE(_fmtstr, ...)         _SWR_MACRO_START (void)(0); _SWR_MACRO_END
+#define SWR_ASSERT(e, ...)                                 \
+    _SWR_MACRO_START(void) sizeof(SwrSizeofWorkaround(e)); \
+    _SWR_MACRO_END
+#define SWR_ASSUME_ASSERT(e, ...) SWR_ASSUME(e, ##__VA_ARGS__)
+#define SWR_TRACE(_fmtstr, ...) \
+    _SWR_MACRO_START(void)(0);  \
+    _SWR_MACRO_END
 #endif
 
 #if !SWR_ENABLE_REL_ASSERTS
-#define SWR_REL_ASSERT(e, ...)          _SWR_MACRO_START (void)sizeof(SwrSizeofWorkaround(e)); _SWR_MACRO_END
-#define SWR_INVALID(...)                _SWR_MACRO_START (void)(0); _SWR_MACRO_END
-#define SWR_REL_ASSUME_ASSERT(e, ...)   SWR_ASSUME(e, ##__VA_ARGS__)
-#define SWR_REL_TRACE(_fmtstr, ...)     _SWR_MACRO_START (void)(0); _SWR_MACRO_END
+#define SWR_REL_ASSERT(e, ...)                             \
+    _SWR_MACRO_START(void) sizeof(SwrSizeofWorkaround(e)); \
+    _SWR_MACRO_END
+#define SWR_INVALID(...)       \
+    _SWR_MACRO_START(void)(0); \
+    _SWR_MACRO_END
+#define SWR_REL_ASSUME_ASSERT(e, ...) SWR_ASSUME(e, ##__VA_ARGS__)
+#define SWR_REL_TRACE(_fmtstr, ...) \
+    _SWR_MACRO_START(void)(0);      \
+    _SWR_MACRO_END
+#define SWR_STATIC_ASSERT(e, ...)                           \
+    _SWR_MACRO_START(void)  sizeof(SwrSizeofWorkaround(e)); \
+    _SWR_MACRO_END
 #endif
 
 #if defined(_MSC_VER)
@@ -199,4 +239,4 @@ static bool SwrSizeofWorkaround(T) {return false;}
 
 #define SWR_NOT_IMPL SWR_INVALID("%s not implemented", SWR_FUNCTION_DECL)
 
-#endif//__SWR_ASSERT_H__
+#endif //__SWR_ASSERT_H__