Merge pull request #6130 from degasus/better_assert_handling

common: Move assert failure handling into a cpp file.
This commit is contained in:
bunnei 2021-04-07 13:35:41 -07:00 committed by GitHub
commit 3173a53db9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 20 additions and 6 deletions

View File

@ -97,6 +97,7 @@ add_custom_command(OUTPUT scm_rev.cpp
add_library(common STATIC add_library(common STATIC
algorithm.h algorithm.h
alignment.h alignment.h
assert.cpp
assert.h assert.h
atomic_ops.h atomic_ops.h
detached_tasks.cpp detached_tasks.cpp

11
src/common/assert.cpp Normal file
View File

@ -0,0 +1,11 @@
// Copyright 2021 yuzu Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#include "common/assert.h"
#include "common/common_funcs.h"
void assert_handle_failure() {
Crash();
}

View File

@ -4,10 +4,13 @@
#pragma once #pragma once
#include <cstdlib>
#include "common/common_funcs.h"
#include "common/logging/log.h" #include "common/logging/log.h"
// Sometimes we want to try to continue even after hitting an assert.
// However touching this file yields a global recompilation as this header is included almost
// everywhere. So let's just move the handling of the failed assert to a single cpp file.
void assert_handle_failure();
// For asserts we'd like to keep all the junk executed when an assert happens away from the // For asserts we'd like to keep all the junk executed when an assert happens away from the
// important code in the function. One way of doing this is to put all the relevant code inside a // important code in the function. One way of doing this is to put all the relevant code inside a
// lambda and force the compiler to not inline it. Unfortunately, MSVC seems to have no syntax to // lambda and force the compiler to not inline it. Unfortunately, MSVC seems to have no syntax to
@ -17,15 +20,14 @@
// enough for our purposes. // enough for our purposes.
template <typename Fn> template <typename Fn>
#if defined(_MSC_VER) #if defined(_MSC_VER)
[[msvc::noinline, noreturn]] [[msvc::noinline]]
#elif defined(__GNUC__) #elif defined(__GNUC__)
[[gnu::cold, gnu::noinline, noreturn]] [[gnu::cold, gnu::noinline]]
#endif #endif
static void static void
assert_noinline_call(const Fn& fn) { assert_noinline_call(const Fn& fn) {
fn(); fn();
Crash(); assert_handle_failure();
exit(1); // Keeps GCC's mouth shut about this actually returning
} }
#define ASSERT(_a_) \ #define ASSERT(_a_) \