mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2025-05-16 10:56:21 +00:00

The debug mode has been broken pretty much ever since it was shipped because it was possible to enable the debug mode in user code without actually enabling it in the dylib, leading to ODR violations that caused various kinds of failures. This commit makes the debug mode a knob that is configured when building the library and which can't be changed afterwards. This is less flexible for users, however it will actually work as intended and it will allow us, in the future, to add various kinds of checks that do not assume the same ABI as the normal library. Furthermore, this will make the debug mode more robust, which means that vendors might be more tempted to support it properly, which hasn't been the case with the current debug mode. This patch shouldn't break any user code, except folks who are building against a library that doesn't have the debug mode enabled and who try to enable the debug mode in their code. Such users will get a compile-time error explaining that this configuration isn't supported anymore. In the future, we should further increase the granularity of the debug mode checks so that we can cherry-pick which checks to enable, like we do for unspecified behavior randomization. Differential Revision: https://reviews.llvm.org/D122941
67 lines
2.4 KiB
C++
67 lines
2.4 KiB
C++
// -*- C++ -*-
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#ifndef _LIBCPP___ASSERT
|
|
#define _LIBCPP___ASSERT
|
|
|
|
#include <__availability>
|
|
#include <__config>
|
|
|
|
#if !defined(_LIBCPP_HAS_NO_PRAGMA_SYSTEM_HEADER)
|
|
# pragma GCC system_header
|
|
#endif
|
|
|
|
// This is for backwards compatibility with code that might have been enabling
|
|
// assertions through the Debug mode previously.
|
|
// TODO: In LLVM 16, make it an error to define _LIBCPP_DEBUG
|
|
#if defined(_LIBCPP_DEBUG)
|
|
# ifndef _LIBCPP_ENABLE_ASSERTIONS
|
|
# define _LIBCPP_ENABLE_ASSERTIONS 1
|
|
# endif
|
|
#endif
|
|
|
|
// Automatically enable assertions when the debug mode is enabled.
|
|
#if defined(_LIBCPP_ENABLE_DEBUG_MODE)
|
|
# ifndef _LIBCPP_ENABLE_ASSERTIONS
|
|
# define _LIBCPP_ENABLE_ASSERTIONS 1
|
|
# endif
|
|
#endif
|
|
|
|
#ifndef _LIBCPP_ENABLE_ASSERTIONS
|
|
# define _LIBCPP_ENABLE_ASSERTIONS _LIBCPP_ENABLE_ASSERTIONS_DEFAULT
|
|
#endif
|
|
|
|
#if _LIBCPP_ENABLE_ASSERTIONS != 0 && _LIBCPP_ENABLE_ASSERTIONS != 1
|
|
# error "_LIBCPP_ENABLE_ASSERTIONS must be set to 0 or 1"
|
|
#endif
|
|
|
|
#if _LIBCPP_ENABLE_ASSERTIONS
|
|
# define _LIBCPP_ASSERT(expression, message) \
|
|
(__builtin_expect(static_cast<bool>(expression), 1) ? \
|
|
(void)0 : \
|
|
::std::__libcpp_assertion_handler(__FILE__, __LINE__, #expression, message))
|
|
#elif !defined(_LIBCPP_ASSERTIONS_DISABLE_ASSUME) && __has_builtin(__builtin_assume)
|
|
# define _LIBCPP_ASSERT(expression, message) \
|
|
(_LIBCPP_DIAGNOSTIC_PUSH \
|
|
_LIBCPP_CLANG_DIAGNOSTIC_IGNORED("-Wassume") \
|
|
__builtin_assume(static_cast<bool>(expression)) \
|
|
_LIBCPP_DIAGNOSTIC_POP)
|
|
#else
|
|
# define _LIBCPP_ASSERT(expression, message) ((void)0)
|
|
#endif
|
|
|
|
_LIBCPP_BEGIN_NAMESPACE_STD
|
|
|
|
_LIBCPP_OVERRIDABLE_FUNC_VIS _LIBCPP_AVAILABILITY_ASSERTION_HANDLER
|
|
void __libcpp_assertion_handler(char const* __file, int __line, char const* __expression, char const* __message);
|
|
|
|
_LIBCPP_END_NAMESPACE_STD
|
|
|
|
#endif // _LIBCPP___ASSERT
|