diff options
Diffstat (limited to 'src/common/Debugging/Errors.cpp')
| -rw-r--r-- | src/common/Debugging/Errors.cpp | 63 |
1 files changed, 38 insertions, 25 deletions
diff --git a/src/common/Debugging/Errors.cpp b/src/common/Debugging/Errors.cpp index 162b613e12e..c333aa24ec0 100644 --- a/src/common/Debugging/Errors.cpp +++ b/src/common/Debugging/Errors.cpp @@ -17,10 +17,10 @@ #include "Errors.h" #include "StringFormat.h" -#include <cstdio> -#include <cstdlib> #include <thread> #include <cstdarg> +#include <cstdio> +#include <cstring> /** @file Errors.cpp @@ -33,73 +33,84 @@ terminates the application. */ +#if TRINITY_COMPILER == TRINITY_COMPILER_MICROSOFT +#define Unreachable() (__assume(false)) +#else +#define Unreachable() (__builtin_unreachable()) +#endif + #if TRINITY_PLATFORM == TRINITY_PLATFORM_WINDOWS #include <Windows.h> #include <intrin.h> #define Crash(message) \ ULONG_PTR execeptionArgs[] = { reinterpret_cast<ULONG_PTR>(strdup(message)), reinterpret_cast<ULONG_PTR>(_ReturnAddress()) }; \ - RaiseException(EXCEPTION_ASSERTION_FAILURE, 0, 2, execeptionArgs); + RaiseException(EXCEPTION_ASSERTION_FAILURE, 0, 2, execeptionArgs); \ + Unreachable() #else -#include <cstring> // should be easily accessible in gdb extern "C" { TC_COMMON_API char const* TrinityAssertionFailedMessage = nullptr; } #define Crash(message) \ TrinityAssertionFailedMessage = strdup(message); \ *((volatile int*)nullptr) = 0; \ - exit(1); + Unreachable() #endif namespace { - std::string FormatAssertionMessage(char const* format, va_list args) + void FormatAssertionMessageTo(std::string& formatted, char const* format, va_list args) noexcept { - std::string formatted; va_list len; va_copy(len, args); int32 length = vsnprintf(nullptr, 0, format, len); va_end(len); - formatted.resize(length); - vsnprintf(&formatted[0], length + 1, format, args); - - return formatted; + std::size_t offset = formatted.length(); + formatted.resize(offset + length); + vsnprintf(&formatted[offset], length + 1, format, args); } } namespace Trinity { - -void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message) +void Assert(char const* file, int line, char const* function, char const* message, std::string debugInfo) noexcept { - std::string formattedMessage = StringFormat("\n{}:{} in {} ASSERTION FAILED:\n {}\n", file, line, function, message) + debugInfo + '\n'; + std::string formattedMessage = StringFormat("\n{}:{} in {} ASSERTION FAILED:\n {}\n{}\n", file, line, function, message, debugInfo); fprintf(stderr, "%s", formattedMessage.c_str()); fflush(stderr); Crash(formattedMessage.c_str()); } -void Assert(char const* file, int line, char const* function, std::string debugInfo, char const* message, char const* format, ...) +void Assert(char const* file, int line, char const* function, char const* message, std::string debugInfo, char const* format, ...) noexcept { va_list args; va_start(args, format); - std::string formattedMessage = StringFormat("\n{}:{} in {} ASSERTION FAILED:\n {}\n", file, line, function, message) + FormatAssertionMessage(format, args) + '\n' + debugInfo + '\n'; + std::string formattedMessage = StringFormat("\n{}:{} in {} ASSERTION FAILED:\n {}\n", file, line, function, message); + FormatAssertionMessageTo(formattedMessage, format, args); va_end(args); + formattedMessage.append(1, '\n'); + formattedMessage.append(debugInfo); + formattedMessage.append(1, '\n'); + fprintf(stderr, "%s", formattedMessage.c_str()); fflush(stderr); Crash(formattedMessage.c_str()); } -void Fatal(char const* file, int line, char const* function, char const* message, ...) +void Fatal(char const* file, int line, char const* function, char const* message, ...) noexcept { va_list args; va_start(args, message); - std::string formattedMessage = StringFormat("\n{}:{} in {} FATAL ERROR:\n", file, line, function) + FormatAssertionMessage(message, args) + '\n'; + std::string formattedMessage = StringFormat("\n{}:{} in {} FATAL ERROR:\n", file, line, function); + FormatAssertionMessageTo(formattedMessage, message, args); va_end(args); + formattedMessage.append(1, '\n'); + fprintf(stderr, "%s", formattedMessage.c_str()); fflush(stderr); @@ -107,7 +118,7 @@ void Fatal(char const* file, int line, char const* function, char const* message Crash(formattedMessage.c_str()); } -void Error(char const* file, int line, char const* function, char const* message) +void Error(char const* file, int line, char const* function, char const* message) noexcept { std::string formattedMessage = StringFormat("\n{}:{} in {} ERROR:\n {}\n", file, line, function, message); fprintf(stderr, "%s", formattedMessage.c_str()); @@ -115,13 +126,13 @@ void Error(char const* file, int line, char const* function, char const* message Crash(formattedMessage.c_str()); } -void Warning(char const* file, int line, char const* function, char const* message) +void Warning(char const* file, int line, char const* function, char const* message) noexcept { fprintf(stderr, "\n%s:%i in %s WARNING:\n %s\n", file, line, function, message); } -void Abort(char const* file, int line, char const* function) +void Abort(char const* file, int line, char const* function) noexcept { std::string formattedMessage = StringFormat("\n{}:{} in {} ABORTED.\n", file, line, function); fprintf(stderr, "%s", formattedMessage.c_str()); @@ -129,21 +140,24 @@ void Abort(char const* file, int line, char const* function) Crash(formattedMessage.c_str()); } -void Abort(char const* file, int line, char const* function, char const* message, ...) +void Abort(char const* file, int line, char const* function, char const* message, ...) noexcept { va_list args; va_start(args, message); - std::string formattedMessage = StringFormat("\n{}:{} in {} ABORTED:\n", file, line, function) + FormatAssertionMessage(message, args) + '\n'; + std::string formattedMessage = StringFormat("\n{}:{} in {} ABORTED:\n", file, line, function); + FormatAssertionMessageTo(formattedMessage, message, args); va_end(args); + formattedMessage.append(1, '\n'); + fprintf(stderr, "%s", formattedMessage.c_str()); fflush(stderr); Crash(formattedMessage.c_str()); } -void AbortHandler(int sigval) +void AbortHandler(int sigval) noexcept { // nothing useful to log here, no way to pass args std::string formattedMessage = StringFormat("Caught signal {}\n", sigval); @@ -151,7 +165,6 @@ void AbortHandler(int sigval) fflush(stderr); Crash(formattedMessage.c_str()); } - } // namespace Trinity std::string GetDebugInfo() |
