diff --git a/CMake/CheckAndAddFlag.cmake b/CMake/CheckAndAddFlag.cmake index 226e570833..4fe7d5be18 100644 --- a/CMake/CheckAndAddFlag.cmake +++ b/CMake/CheckAndAddFlag.cmake @@ -21,6 +21,8 @@ function(check_and_add_flag var flag) set(genexp_config_test "1") if(ARGV2 STREQUAL "DEBUG_ONLY") set(genexp_config_test "$") + elseif(ARGV2 STREQUAL "NO_DEBINFO_ONLY") + set(genexp_config_test "$,$>>") elseif(ARGV2 STREQUAL "RELEASE_ONLY") set(genexp_config_test "$>") elseif(ARGV2) diff --git a/CMakeLists.txt b/CMakeLists.txt index c837ddd9c9..4d72091752 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -372,7 +372,7 @@ else() check_and_add_flag(VISIBILITY_INLINES_HIDDEN -fvisibility-inlines-hidden) check_and_add_flag(VISIBILITY_HIDDEN -fvisibility=hidden) - check_and_add_flag(FOMIT_FRAME_POINTER -fomit-frame-pointer RELEASE_ONLY) + check_and_add_flag(FOMIT_FRAME_POINTER -fomit-frame-pointer NO_DEBINFO_ONLY) dolphin_compile_definitions(_DEBUG DEBUG_ONLY) check_and_add_flag(GGDB -ggdb DEBUG_ONLY) diff --git a/Source/Core/Common/x64ABI.cpp b/Source/Core/Common/x64ABI.cpp index 0c4f0770ca..9f45c132a6 100644 --- a/Source/Core/Common/x64ABI.cpp +++ b/Source/Core/Common/x64ABI.cpp @@ -43,17 +43,24 @@ void XEmitter::ABI_CalculateFrameSize(BitSet32 mask, size_t rsp_alignment, size_ size_t XEmitter::ABI_PushRegistersAndAdjustStack(BitSet32 mask, size_t rsp_alignment, size_t needed_frame_size) { + mask[RSP] = false; // Stack pointer is never pushed size_t shadow, subtraction, xmm_offset; ABI_CalculateFrameSize(mask, rsp_alignment, needed_frame_size, &shadow, &subtraction, &xmm_offset); - for (int r : mask& ABI_ALL_GPRS) + if (mask[RBP]) + { + // Make a nice stack frame for any debuggers or profilers that might be looking at this + PUSH(RBP); + MOV(64, R(RBP), R(RSP)); + } + for (int r : (mask & ABI_ALL_GPRS & ~BitSet32{RBP})) PUSH((X64Reg)r); if (subtraction) SUB(64, R(RSP), subtraction >= 0x80 ? Imm32((u32)subtraction) : Imm8((u8)subtraction)); - for (int x : mask& ABI_ALL_FPRS) + for (int x : (mask & ABI_ALL_FPRS)) { MOVAPD(MDisp(RSP, (int)xmm_offset), (X64Reg)(x - 16)); xmm_offset += 16; @@ -65,11 +72,12 @@ size_t XEmitter::ABI_PushRegistersAndAdjustStack(BitSet32 mask, size_t rsp_align void XEmitter::ABI_PopRegistersAndAdjustStack(BitSet32 mask, size_t rsp_alignment, size_t needed_frame_size) { + mask[RSP] = false; // Stack pointer is never pushed size_t shadow, subtraction, xmm_offset; ABI_CalculateFrameSize(mask, rsp_alignment, needed_frame_size, &shadow, &subtraction, &xmm_offset); - for (int x : mask& ABI_ALL_FPRS) + for (int x : (mask & ABI_ALL_FPRS)) { MOVAPD((X64Reg)(x - 16), MDisp(RSP, (int)xmm_offset)); xmm_offset += 16; @@ -80,9 +88,12 @@ void XEmitter::ABI_PopRegistersAndAdjustStack(BitSet32 mask, size_t rsp_alignmen for (int r = 15; r >= 0; r--) { - if (mask[r]) + if (r != RBP && mask[r]) POP((X64Reg)r); } + // RSP is pushed first and popped last to make debuggers/profilers happy + if (mask[RBP]) + POP(RBP); } void XEmitter::MOVTwo(int bits, Gen::X64Reg dst1, Gen::X64Reg src1, s32 offset1, Gen::X64Reg dst2, diff --git a/Source/Core/VideoCommon/VertexLoaderX64.cpp b/Source/Core/VideoCommon/VertexLoaderX64.cpp index 0c049d7e64..4e96dc80c6 100644 --- a/Source/Core/VideoCommon/VertexLoaderX64.cpp +++ b/Source/Core/VideoCommon/VertexLoaderX64.cpp @@ -402,6 +402,7 @@ void VertexLoaderX64::GenerateVertexLoader() BitSet32 regs = {src_reg, dst_reg, scratch1, scratch2, scratch3, remaining_reg, skipped_reg, base_reg}; regs &= ABI_ALL_CALLEE_SAVED; + regs[RBP] = true; // Give us a stack frame ABI_PushRegistersAndAdjustStack(regs, 0); // Backup count since we're going to count it down.