Cheats: Prevent inlining of memory functions

Clang is way too eager here and inlines the whole thing hundreds of
times within CheatList::Apply().
This commit is contained in:
Stenzek 2024-09-09 18:53:51 +10:00
parent 66c7682c89
commit 56a14db113
No known key found for this signature in database
2 changed files with 13 additions and 6 deletions

View file

@ -10,7 +10,6 @@
#include <type_traits> #include <type_traits>
// Force inline helper // Force inline helper
#ifndef ALWAYS_INLINE
#if defined(_MSC_VER) #if defined(_MSC_VER)
#define ALWAYS_INLINE __forceinline #define ALWAYS_INLINE __forceinline
#elif defined(__GNUC__) || defined(__clang__) #elif defined(__GNUC__) || defined(__clang__)
@ -18,7 +17,6 @@
#else #else
#define ALWAYS_INLINE inline #define ALWAYS_INLINE inline
#endif #endif
#endif
// Force inline in non-debug helper // Force inline in non-debug helper
#ifdef _DEBUG #ifdef _DEBUG
@ -27,6 +25,15 @@
#define ALWAYS_INLINE_RELEASE ALWAYS_INLINE #define ALWAYS_INLINE_RELEASE ALWAYS_INLINE
#endif #endif
// Prevent inlining
#if defined(_MSC_VER)
#define NEVER_INLINE __declspec(noinline)
#elif defined(__GNUC__) || defined(__clang__)
#define NEVER_INLINE __attribute__((noinline))
#else
#define NEVER_INLINE
#endif
// unreferenced parameter macro // unreferenced parameter macro
#ifndef UNREFERENCED_VARIABLE #ifndef UNREFERENCED_VARIABLE
#if defined(__GNUC__) || defined(__clang__) || defined(__EMSCRIPTEN__) #if defined(__GNUC__) || defined(__clang__) || defined(__EMSCRIPTEN__)

View file

@ -44,7 +44,7 @@ static bool IsValidScanAddress(PhysicalMemoryAddress address)
} }
template<typename T> template<typename T>
static T DoMemoryRead(VirtualMemoryAddress address) NEVER_INLINE static T DoMemoryRead(VirtualMemoryAddress address)
{ {
using UnsignedType = typename std::make_unsigned_t<T>; using UnsignedType = typename std::make_unsigned_t<T>;
static_assert(std::is_same_v<UnsignedType, u8> || std::is_same_v<UnsignedType, u16> || static_assert(std::is_same_v<UnsignedType, u8> || std::is_same_v<UnsignedType, u16> ||
@ -60,7 +60,7 @@ static T DoMemoryRead(VirtualMemoryAddress address)
} }
template<typename T> template<typename T>
static void DoMemoryWrite(PhysicalMemoryAddress address, T value) NEVER_INLINE static void DoMemoryWrite(PhysicalMemoryAddress address, T value)
{ {
using UnsignedType = typename std::make_unsigned_t<T>; using UnsignedType = typename std::make_unsigned_t<T>;
static_assert(std::is_same_v<UnsignedType, u8> || std::is_same_v<UnsignedType, u16> || static_assert(std::is_same_v<UnsignedType, u8> || std::is_same_v<UnsignedType, u16> ||
@ -74,7 +74,7 @@ static void DoMemoryWrite(PhysicalMemoryAddress address, T value)
CPU::SafeWriteMemoryWord(address, value); CPU::SafeWriteMemoryWord(address, value);
} }
static u32 GetControllerButtonBits() NEVER_INLINE static u32 GetControllerButtonBits()
{ {
static constexpr std::array<u16, 16> button_mapping = {{ static constexpr std::array<u16, 16> button_mapping = {{
0x0100, // Select 0x0100, // Select
@ -115,7 +115,7 @@ static u32 GetControllerButtonBits()
return translated_bits; return translated_bits;
} }
static u32 GetControllerAnalogBits() NEVER_INLINE static u32 GetControllerAnalogBits()
{ {
// 0x010000 - Right Thumb Up // 0x010000 - Right Thumb Up
// 0x020000 - Right Thumb Right // 0x020000 - Right Thumb Right