Add release-mode CHECK() macro, replace usages of abort()
Bug: None
Change-Id: I34dfb7215128268d44412b3cf230b62dc3f2fdb9
Reviewed-on: https://dawn-review.googlesource.com/c/dawn/+/149102
Auto-Submit: Kai Ninomiya <kainino@chromium.org>
Kokoro: Kokoro <noreply+kokoro@google.com>
Commit-Queue: Kai Ninomiya <kainino@chromium.org>
Reviewed-by: Austin Eng <enga@chromium.org>
diff --git a/src/dawn/common/Assert.h b/src/dawn/common/Assert.h
index 435e958..d141705 100644
--- a/src/dawn/common/Assert.h
+++ b/src/dawn/common/Assert.h
@@ -15,6 +15,8 @@
#ifndef SRC_DAWN_COMMON_ASSERT_H_
#define SRC_DAWN_COMMON_ASSERT_H_
+#include <cstdlib>
+
#include "dawn/common/Compiler.h"
// Dawn asserts to be used instead of the regular C stdlib assert function (if you don't use assert
@@ -41,35 +43,62 @@
// expect of an assert and in release it tries to give hints to make the compiler generate better
// code.
#if defined(DAWN_ENABLE_ASSERTS)
+
+#define DAWN_CHECK_CALLSITE_HELPER(file, func, line, condition) \
+ do { \
+ if (!(condition)) { \
+ ::dawn::HandleAssertionFailure(file, func, line, #condition); \
+ abort(); \
+ } \
+ } while (DAWN_ASSERT_LOOP_CONDITION)
+
#define DAWN_ASSERT_CALLSITE_HELPER(file, func, line, condition) \
do { \
if (!(condition)) { \
::dawn::HandleAssertionFailure(file, func, line, #condition); \
} \
} while (DAWN_ASSERT_LOOP_CONDITION)
-#else
+
+#else // defined(DAWN_ENABLE_ASSERTS)
+
+#define DAWN_CHECK_CALLSITE_HELPER(file, func, line, condition) \
+ do { \
+ if (!(condition)) { \
+ abort(); \
+ } \
+ } while (DAWN_ASSERT_LOOP_CONDITION)
+
#if DAWN_COMPILER_IS(MSVC)
#define DAWN_ASSERT_CALLSITE_HELPER(file, func, line, condition) __assume(condition)
#elif DAWN_COMPILER_IS(CLANG) && defined(__builtin_assume)
#define DAWN_ASSERT_CALLSITE_HELPER(file, func, line, condition) __builtin_assume(condition)
-#else
+#else // DAWN_COMPILER_IS(*)
#define DAWN_ASSERT_CALLSITE_HELPER(file, func, line, condition) \
do { \
DAWN_UNUSED(sizeof(condition)); \
} while (DAWN_ASSERT_LOOP_CONDITION)
-#endif
-#endif
+#endif // DAWN_COMPILER_IS(*)
+#endif // defined(DAWN_ENABLE_ASSERTS)
+
+// Debug-only assert (similar to Chromium DCHECK).
+// In release, this provides optimization hints to the compiler.
#define DAWN_ASSERT(condition) DAWN_ASSERT_CALLSITE_HELPER(__FILE__, __func__, __LINE__, condition)
+// Debug-only assert-false (similar to Chromium NOTREACHED).
+// In release, this provides optimization hints to the compiler.
#define DAWN_UNREACHABLE() \
do { \
DAWN_ASSERT(DAWN_ASSERT_LOOP_CONDITION && "Unreachable code hit"); \
DAWN_BUILTIN_UNREACHABLE(); \
} while (DAWN_ASSERT_LOOP_CONDITION)
+// Release-mode assert (similar to Chromium CHECK).
+// First does a debug-mode assert for better a better debugging experience, then hard-aborts.
+#define DAWN_CHECK(condition) DAWN_CHECK_CALLSITE_HELPER(__FILE__, __func__, __LINE__, condition)
#if !defined(DAWN_SKIP_ASSERT_SHORTHANDS)
#define ASSERT DAWN_ASSERT
#define UNREACHABLE DAWN_UNREACHABLE
+#define CHECK DAWN_CHECK
#endif
namespace dawn {
diff --git a/src/dawn/common/Mutex.cpp b/src/dawn/common/Mutex.cpp
index b8b891f..6dd4c76 100644
--- a/src/dawn/common/Mutex.cpp
+++ b/src/dawn/common/Mutex.cpp
@@ -43,7 +43,7 @@
return mOwner.load(std::memory_order_acquire) == std::this_thread::get_id();
#else
// This is not supported.
- abort();
+ CHECK(false);
#endif
}
} // namespace dawn