Add llvm assertions trap and no strings (#6838)
Add option LLVM_ASSERTIONS_NO_STRINGS When defined, drop the stringized expression, __FILE__, and __FUNCTION__ strings passed to llvm_assert. This dramatically reduces the binary size, which is useful when enabling assertions in a non-debug build. Add option LLVM_ASSERTIONS_TRAP When enabled, this forces asserts to always trap. Currently, on Windows asserts calls RaiseException, while they trap on non-Windows. This option makes the assertion behaviour consistent across platforms.
This commit is contained in:
Родитель
71d6766881
Коммит
91b348912b
|
@ -325,6 +325,9 @@ else()
|
||||||
option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
|
option(LLVM_ENABLE_ASSERTIONS "Enable assertions" ON)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
option(LLVM_ASSERTIONS_TRAP "Force assertions to always trap, rather than the default unspecified behavior (e.g. RaiseException on Windows)" OFF)
|
||||||
|
option(LLVM_ASSERTIONS_NO_STRINGS "Make assertion macro drops strings to reduce binary size" OFF)
|
||||||
|
|
||||||
set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
|
set(LLVM_ABI_BREAKING_CHECKS "WITH_ASSERTS" CACHE STRING
|
||||||
"Enable abi-breaking checks. Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
|
"Enable abi-breaking checks. Can be WITH_ASSERTS, FORCE_ON or FORCE_OFF.")
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,13 @@ if( LLVM_ENABLE_ASSERTIONS )
|
||||||
"${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
|
"${flags_var_to_scrub}" "${${flags_var_to_scrub}}")
|
||||||
endforeach()
|
endforeach()
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (LLVM_ASSERTIONS_TRAP)
|
||||||
|
add_definitions( -DLLVM_ASSERTIONS_TRAP )
|
||||||
|
endif()
|
||||||
|
if (LLVM_ASSERTIONS_NO_STRINGS)
|
||||||
|
add_definitions( -DLLVM_ASSERTIONS_NO_STRINGS )
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
# Disable assertions in Debug builds
|
# Disable assertions in Debug builds
|
||||||
if( uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
|
if( uppercase_CMAKE_BUILD_TYPE STREQUAL "DEBUG" )
|
||||||
|
|
|
@ -37,8 +37,15 @@ void llvm_assert(const char *Message, const char *File, unsigned Line,
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// If LLVM_ASSERTIONS_NO_STRINGS is defined, pass empty strings to llvm_assert
|
||||||
|
// to reduce binary size.
|
||||||
|
#ifdef LLVM_ASSERTIONS_NO_STRINGS
|
||||||
|
#define assert(Expression) \
|
||||||
|
((void)((!!(Expression)) || (llvm_assert("", "", 0, ""), 0)))
|
||||||
|
#else
|
||||||
#define assert(Expression) \
|
#define assert(Expression) \
|
||||||
((void)((!!(Expression)) || \
|
((void)((!!(Expression)) || \
|
||||||
(llvm_assert(#Expression, __FILE__, __LINE__, __FUNCTION__), 0)))
|
(llvm_assert(#Expression, __FILE__, __LINE__, __FUNCTION__), 0)))
|
||||||
|
#endif
|
||||||
|
|
||||||
#endif /* NDEBUG */
|
#endif /* NDEBUG */
|
||||||
|
|
|
@ -8,29 +8,37 @@
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
#include "assert.h"
|
#include "assert.h"
|
||||||
|
#include "llvm/Support/Compiler.h"
|
||||||
|
#include "llvm/Support/raw_ostream.h"
|
||||||
|
namespace {
|
||||||
|
void llvm_assert_trap(const char *_Message, const char *_File, unsigned _Line,
|
||||||
|
const char *_Function) {
|
||||||
|
llvm::errs() << "Error: assert(" << _Message << ")\nFile:\n"
|
||||||
|
<< _File << "(" << _Line << ")\nFunc:\t" << _Function << "\n";
|
||||||
|
LLVM_BUILTIN_TRAP;
|
||||||
|
}
|
||||||
|
} // namespace
|
||||||
|
|
||||||
#ifdef _WIN32
|
#ifdef _WIN32
|
||||||
|
|
||||||
#include "dxc/Support/Global.h"
|
#include "dxc/Support/Global.h"
|
||||||
#include "windows.h"
|
#include "windows.h"
|
||||||
|
|
||||||
void llvm_assert(const char *Message, const char *File, unsigned Line,
|
void llvm_assert(const char *Message, const char *File, unsigned Line,
|
||||||
const char *Function) {
|
const char *Function) {
|
||||||
|
#ifdef LLVM_ASSERTIONS_TRAP
|
||||||
|
llvm_assert_trap(Message, File, Line, Function);
|
||||||
|
#else
|
||||||
OutputDebugFormatA("Error: assert(%s)\nFile:\n%s(%d)\nFunc:\t%s\n", Message,
|
OutputDebugFormatA("Error: assert(%s)\nFile:\n%s(%d)\nFunc:\t%s\n", Message,
|
||||||
File, Line, Function);
|
File, Line, Function);
|
||||||
RaiseException(STATUS_LLVM_ASSERT, 0, 0, 0);
|
RaiseException(STATUS_LLVM_ASSERT, 0, 0, 0);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#else
|
#else /* _WIN32 */
|
||||||
|
|
||||||
#include "llvm/Support/Compiler.h"
|
|
||||||
#include "llvm/Support/raw_ostream.h"
|
|
||||||
|
|
||||||
void llvm_assert(const char *Message, const char *File, unsigned Line,
|
void llvm_assert(const char *Message, const char *File, unsigned Line,
|
||||||
const char *Function) {
|
const char *Function) {
|
||||||
llvm::errs() << "Error: assert(" << Message << ")\nFile:\n"
|
llvm_assert_trap(Message, File, Line, Function);
|
||||||
<< File << "(" << Line << ")\nFunc:\t" << Function << "\n";
|
|
||||||
LLVM_BUILTIN_TRAP;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif /* _WIN32 */
|
||||||
|
|
Загрузка…
Ссылка в новой задаче