From 4d8fdf4e31b3d18aba064e138ace17f91bede916 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 15 Jun 2022 17:13:56 +0100 Subject: [PATCH] Use inline asm for debugbreak on linux to remove stack frames * raise() adds several stack frames in debug builds, and even an inline function will too, regardless of always_inline status. --- renderdoc/common/common.h | 13 +++++++++++++ renderdoc/os/os_specific.h | 1 - renderdoc/os/posix/posix_specific.h | 4 ---- renderdoc/os/win32/win32_specific.h | 4 ---- 4 files changed, 13 insertions(+), 9 deletions(-) diff --git a/renderdoc/common/common.h b/renderdoc/common/common.h index 488887680..cfeb48cd6 100644 --- a/renderdoc/common/common.h +++ b/renderdoc/common/common.h @@ -42,11 +42,24 @@ #include #define __PRETTY_FUNCTION_SIGNATURE__ __PRETTY_FUNCTION__ + #if ENABLED(RDOC_SWITCH) + #include #define OS_DEBUG_BREAK() abort() + +#elif ENABLED(RDOC_LINUX) + +#define OS_DEBUG_BREAK() \ + do \ + { \ + __asm__ volatile("int $0x03"); \ + } while((void)0, 0) + #else + #define OS_DEBUG_BREAK() raise(SIGTRAP) + #endif #if defined(__clang__) diff --git a/renderdoc/os/os_specific.h b/renderdoc/os/os_specific.h index b255ad007..470bafa63 100644 --- a/renderdoc/os/os_specific.h +++ b/renderdoc/os/os_specific.h @@ -464,7 +464,6 @@ void Shutdown(); namespace OSUtility { inline void ForceCrash(); -inline void DebugBreak(); bool DebuggerPresent(); enum { diff --git a/renderdoc/os/posix/posix_specific.h b/renderdoc/os/posix/posix_specific.h index 80a226416..d6a0bf786 100644 --- a/renderdoc/os/posix/posix_specific.h +++ b/renderdoc/os/posix/posix_specific.h @@ -82,10 +82,6 @@ inline void ForceCrash() { __builtin_trap(); } -inline void DebugBreak() -{ - raise(SIGTRAP); -} bool DebuggerPresent(); }; diff --git a/renderdoc/os/win32/win32_specific.h b/renderdoc/os/win32/win32_specific.h index a9506c417..aa4557122 100644 --- a/renderdoc/os/win32/win32_specific.h +++ b/renderdoc/os/win32/win32_specific.h @@ -49,10 +49,6 @@ inline void ForceCrash() { *((int *)NULL) = 0; } -inline void DebugBreak() -{ - __debugbreak(); -} inline bool DebuggerPresent() { return ::IsDebuggerPresent() == TRUE;