diff --git a/src/dynarmic/CMakeLists.txt b/src/dynarmic/CMakeLists.txt index bacbd7ab57..0837a502cf 100644 --- a/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/CMakeLists.txt @@ -11,34 +11,15 @@ set(dynarmic_VERSION ${dynarmic_VERSION_MAJOR}.${dynarmic_VERSION_MINOR}.${dynar project(dynarmic LANGUAGES C CXX ASM VERSION ${dynarmic_VERSION}) -# Determine if we're built as a subproject (using add_subdirectory) -# or if this is the master project. -set(MASTER_PROJECT OFF) -if (CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_SOURCE_DIR) - set(MASTER_PROJECT ON) -endif() - -if (MASTER_PROJECT) - include(CTest) -endif() - -# Dynarmic project options -option(DYNARMIC_ENABLE_CPU_FEATURE_DETECTION "Turning this off causes dynarmic to assume the host CPU doesn't support anything later than SSE3" ON) - if (OPENBSD OR DRAGONFLY OR NETBSD) set(REQUIRE_WX ON) else() set(REQUIRE_WX OFF) endif() option(DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT "Enables support for systems that require W^X" ${REQUIRE_WX}) - -option(DYNARMIC_IGNORE_ASSERTS "Ignore asserts" ON) option(DYNARMIC_TESTS_USE_UNICORN "Enable fuzzing tests against unicorn" OFF) CMAKE_DEPENDENT_OPTION(DYNARMIC_USE_LLVM "Support disassembly of jitted x86_64 code using LLVM" OFF "NOT YUZU_DISABLE_LLVM" OFF) -option(DYNARMIC_INSTALL "Install dynarmic headers and CMake files" OFF) -option(DYNARMIC_USE_BUNDLED_EXTERNALS "Use all bundled externals (useful when e.g. cross-compiling)" OFF) - # Set hard requirements for C++ set(CMAKE_CXX_STANDARD 20) set(CMAKE_CXX_STANDARD_REQUIRED ON) @@ -88,7 +69,7 @@ if (MSVC) -Wno-missing-braces) endif() else() - set(DYNARMIC_CXX_FLAGS + list(APPEND DYNARMIC_CXX_FLAGS -Wall -Wextra -Wcast-qual @@ -103,37 +84,35 @@ else() # to Address& after first checking isMEM(), and that code is inlined in a situation where # GCC knows that the variable is actually a Reg64. isMEM() will never return true for a # Reg64, but GCC doesn't know that. - list(APPEND DYNARMIC_CXX_FLAGS -Wno-array-bounds) - list(APPEND DYNARMIC_CXX_FLAGS -Wstack-usage=4096) + list(APPEND DYNARMIC_CXX_FLAGS + -Wno-array-bounds + -Wstack-usage=4096) endif() if (CXX_CLANG) - # Bracket depth determines maximum size of a fold expression in Clang since 9c9974c3ccb6. - # And this in turns limits the size of a std::array. - list(APPEND DYNARMIC_CXX_FLAGS -fbracket-depth=1024) - # Clang mistakenly blames CMake for using unused arguments during compilation - list(APPEND DYNARMIC_CXX_FLAGS -Wno-unused-command-line-argument) + list(APPEND DYNARMIC_CXX_FLAGS + # Bracket depth determines maximum size of a fold expression in Clang since 9c9974c3ccb6. + # And this in turns limits the size of a std::array. + -fbracket-depth=1024 + # Clang mistakenly blames CMake for using unused arguments during compilation + -Wno-unused-command-line-argument) endif() endif() if (NOT Boost_FOUND) find_package(Boost 1.57 REQUIRED) endif() - find_package(fmt 8 CONFIG) -if ("arm64" IN_LIST ARCHITECTURE OR DYNARMIC_TESTS) +if (ARCHITECTURE_arm64) find_package(oaknut 2.0.1 CONFIG) endif() - -if ("riscv64" IN_LIST ARCHITECTURE) +if (ARCHITECTURE_riscv64) find_package(biscuit 0.9.1 REQUIRED) endif() - -if ("loongarch64" IN_LIST ARCHITECTURE) +if (ARCHITECTURE_loongarch64) find_package(lagoon REQUIRED) endif() - -if ("x86_64" IN_LIST ARCHITECTURE) +if (ARCHITECTURE_x86_64) find_package(xbyak 7 CONFIG) endif() @@ -142,44 +121,12 @@ if (DYNARMIC_USE_LLVM) separate_arguments(LLVM_DEFINITIONS) endif() +# Dynarmic project files +add_subdirectory(src/dynarmic) if (DYNARMIC_TESTS) find_package(Catch2 3 CONFIG) if (DYNARMIC_TESTS_USE_UNICORN) find_package(Unicorn REQUIRED) endif() -endif() - -# Dynarmic project files -add_subdirectory(src/dynarmic) -if (DYNARMIC_TESTS) add_subdirectory(tests) endif() - -# -# Install -# -if (DYNARMIC_INSTALL) - include(GNUInstallDirs) - include(CMakePackageConfigHelpers) - - install(TARGETS dynarmic EXPORT dynarmicTargets) - install(EXPORT dynarmicTargets - NAMESPACE dynarmic:: - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/dynarmic" - ) - - configure_package_config_file(CMakeModules/dynarmicConfig.cmake.in - dynarmicConfig.cmake - INSTALL_DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/dynarmic" - ) - write_basic_package_version_file(dynarmicConfigVersion.cmake - COMPATIBILITY SameMajorVersion - ) - install(FILES - "${CMAKE_CURRENT_BINARY_DIR}/dynarmicConfig.cmake" - "${CMAKE_CURRENT_BINARY_DIR}/dynarmicConfigVersion.cmake" - DESTINATION "${CMAKE_INSTALL_LIBDIR}/cmake/dynarmic" - ) - - install(DIRECTORY src/dynarmic TYPE INCLUDE FILES_MATCHING PATTERN "*.h") -endif() diff --git a/src/dynarmic/CMakeModules/TargetArchitectureSpecificSources.cmake b/src/dynarmic/CMakeModules/TargetArchitectureSpecificSources.cmake deleted file mode 100644 index 7af6cc518b..0000000000 --- a/src/dynarmic/CMakeModules/TargetArchitectureSpecificSources.cmake +++ /dev/null @@ -1,29 +0,0 @@ -# SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project -# SPDX-License-Identifier: GPL-3.0-or-later - -function(target_architecture_specific_sources project arch) - if (NOT MULTIARCH_BUILD) - target_sources("${project}" PRIVATE ${ARGN}) - return() - endif() - - foreach(input_file IN LISTS ARGN) - if(input_file MATCHES ".cpp$") - if(NOT IS_ABSOLUTE ${input_file}) - set(input_file "${CMAKE_CURRENT_SOURCE_DIR}/${input_file}") - endif() - - set(output_file "${CMAKE_CURRENT_BINARY_DIR}/arch_gen/${input_file}") - add_custom_command( - OUTPUT "${output_file}" - COMMAND ${CMAKE_COMMAND} "-Darch=${arch}" - "-Dinput_file=${input_file}" - "-Doutput_file=${output_file}" - -P "${CMAKE_CURRENT_FUNCTION_LIST_DIR}/impl/TargetArchitectureSpecificSourcesWrapFile.cmake" - DEPENDS "${input_file}" - VERBATIM - ) - target_sources(${project} PRIVATE "${output_file}") - endif() - endforeach() -endfunction() diff --git a/src/dynarmic/CMakeModules/dynarmicConfig.cmake.in b/src/dynarmic/CMakeModules/dynarmicConfig.cmake.in deleted file mode 100644 index baa1db7c45..0000000000 --- a/src/dynarmic/CMakeModules/dynarmicConfig.cmake.in +++ /dev/null @@ -1,31 +0,0 @@ -@PACKAGE_INIT@ - -include(CMakeFindDependencyMacro) - -set(ARCHITECTURE "@ARCHITECTURE@") - -if (NOT @BUILD_SHARED_LIBS@) - find_dependency(Boost 1.57) - find_dependency(fmt 9) - find_dependency(mcl 0.1.12 EXACT) - - if ("arm64" IN_LIST ARCHITECTURE) - find_dependency(oaknut 2.0.1) - endif() - - if ("riscv" IN_LIST ARCHITECTURE) - find_dependency(biscuit 0.9.1) - endif() - - if ("x86_64" IN_LIST ARCHITECTURE) - find_dependency(xbyak 7) - endif() - - if (@DYNARMIC_USE_LLVM@) - find_dependency(LLVM) - endif() -endif() - -include("${CMAKE_CURRENT_LIST_DIR}/@PROJECT_NAME@Targets.cmake") - -check_required_components(@PROJECT_NAME@) diff --git a/src/dynarmic/CMakeModules/impl/TargetArchitectureSpecificSourcesWrapFile.cmake b/src/dynarmic/CMakeModules/impl/TargetArchitectureSpecificSourcesWrapFile.cmake deleted file mode 100644 index 82c6c3bae0..0000000000 --- a/src/dynarmic/CMakeModules/impl/TargetArchitectureSpecificSourcesWrapFile.cmake +++ /dev/null @@ -1,6 +0,0 @@ -# SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project -# SPDX-License-Identifier: GPL-3.0-or-later - -string(TOUPPER "${arch}" arch) -file(READ "${input_file}" f_contents) -file(WRITE "${output_file}" "#if defined(ARCHITECTURE_${arch})\n${f_contents}\n#endif\n") diff --git a/src/dynarmic/src/dynarmic/CMakeLists.txt b/src/dynarmic/src/dynarmic/CMakeLists.txt index cc1cbcbe39..af65362688 100644 --- a/src/dynarmic/src/dynarmic/CMakeLists.txt +++ b/src/dynarmic/src/dynarmic/CMakeLists.txt @@ -135,7 +135,7 @@ add_library(dynarmic STATIC interface/A64/config.h ) -if ("x86_64" IN_LIST ARCHITECTURE) +if (ARCHITECTURE_x86_64) # Newer versions of xbyak (>= 7.25.0) have stricter checks that currently # fail in dynarmic target_compile_definitions(dynarmic PRIVATE XBYAK_STRICT_CHECK_MEM_REG_SIZE=0) @@ -143,7 +143,7 @@ if ("x86_64" IN_LIST ARCHITECTURE) target_compile_definitions(dynarmic PRIVATE XBYAK_OLD_DISP_CHECK=1) target_link_libraries(dynarmic PRIVATE xbyak::xbyak) - target_architecture_specific_sources(dynarmic "x86_64" + target_sources(dynarmic PRIVATE backend/x64/abi.cpp backend/x64/abi.h backend/x64/block_of_code.cpp @@ -201,10 +201,10 @@ if ("x86_64" IN_LIST ARCHITECTURE) ) endif() -if ("arm64" IN_LIST ARCHITECTURE) +if (ARCHITECTURE_arm64) target_link_libraries(dynarmic PRIVATE merry::oaknut) - target_architecture_specific_sources(dynarmic "arm64" + target_sources(dynarmic PRIVATE backend/arm64/a32_jitstate.cpp backend/arm64/a32_jitstate.h backend/arm64/a64_jitstate.h @@ -255,7 +255,7 @@ if ("arm64" IN_LIST ARCHITECTURE) ) endif() -if ("riscv64" IN_LIST ARCHITECTURE) +if (ARCHITECTURE_riscv64) target_link_libraries(dynarmic PRIVATE biscuit::biscuit) target_sources(dynarmic PRIVATE @@ -295,7 +295,7 @@ if ("riscv64" IN_LIST ARCHITECTURE) message(WARNING "TODO: Incomplete frontend for this host architecture") endif() -if ("loongarch64" IN_LIST ARCHITECTURE) +if (ARCHITECTURE_loongarch64) target_link_libraries(dynarmic PRIVATE lagoon::lagoon) target_sources(dynarmic PRIVATE @@ -400,15 +400,9 @@ if (DYNARMIC_USE_LLVM) target_compile_definitions(dynarmic PRIVATE DYNARMIC_USE_LLVM=1 ${LLVM_DEFINITIONS}) llvm_config(dynarmic USE_SHARED armdesc armdisassembler aarch64desc aarch64disassembler x86desc x86disassembler) endif() -if (DYNARMIC_ENABLE_CPU_FEATURE_DETECTION) - target_compile_definitions(dynarmic PRIVATE DYNARMIC_ENABLE_CPU_FEATURE_DETECTION=1) -endif() if (DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT) target_compile_definitions(dynarmic PRIVATE DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT=1) endif() -if (DYNARMIC_IGNORE_ASSERTS) - target_compile_definitions(dynarmic PRIVATE MCL_IGNORE_ASSERTS=1) -endif() if (CMAKE_SYSTEM_NAME STREQUAL "Windows") target_compile_definitions(dynarmic PRIVATE FMT_USE_WINDOWS_H=0) endif() diff --git a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp index 384d6203a4..5158c0876b 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/block_of_code.cpp @@ -78,7 +78,6 @@ void ProtectMemory(const void* base, size_t size, bool is_executable) { static const HostFeature features = []() { HostFeature f{}; -#ifdef DYNARMIC_ENABLE_CPU_FEATURE_DETECTION using Cpu = Xbyak::util::Cpu; Xbyak::util::Cpu cpu_info{}; if (cpu_info.has(Cpu::tSSSE3)) f |= HostFeature::SSSE3; @@ -121,7 +120,6 @@ static const HostFeature features = []() { } } return f; -#endif }(); HostFeature GetHostFeatures() { return features; diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h index 3ac078f1d7..d9aefc5d4d 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_memory.h @@ -235,6 +235,7 @@ const void* EmitReadMemoryMov(BlockOfCode& code, int value_idx, const Xbyak::Reg code.xadd(qword[addr], Xbyak::Reg64(value_idx)); break; case 128: + ASSERT(Xbyak::Xmm(value_idx) != xmm0); code.lock(); code.cmpxchg16b(xword[addr]); if (code.HasHostFeature(HostFeature::SSE41)) { diff --git a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp index 1165abb0e4..7a6796d543 100644 --- a/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp +++ b/src/dynarmic/src/dynarmic/backend/x64/emit_x64_vector.cpp @@ -6226,9 +6226,7 @@ void EmitX64::EmitVectorZeroExtend64(EmitContext& ctx, IR::Inst* inst) { void EmitX64::EmitVectorZeroUpper(EmitContext& ctx, IR::Inst* inst) { auto args = ctx.reg_alloc.GetArgumentInfo(inst); auto const a = ctx.reg_alloc.UseScratchXmm(code, args[0]); - code.movq(a, a); // TODO: !IsLastUse - ctx.reg_alloc.DefineValue(code, inst, a); } diff --git a/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp b/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp index f1898a92ef..47e1144e31 100644 --- a/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp +++ b/src/dynarmic/src/dynarmic/common/spin_lock_x64.cpp @@ -14,12 +14,6 @@ #include "dynarmic/backend/x64/hostloc.h" #include "dynarmic/common/spin_lock.h" -#ifdef DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT -static const auto default_cg_mode = Xbyak::DontSetProtectRWE; -#else -static const auto default_cg_mode = nullptr; //Allow RWE -#endif - namespace Dynarmic { void EmitSpinLockLock(Xbyak::CodeGenerator& code, Xbyak::Reg64 ptr, Xbyak::Reg32 tmp, bool waitpkg) { @@ -78,7 +72,13 @@ namespace { struct SpinLockImpl { void Initialize() noexcept; static void GlobalInitialize() noexcept; - Xbyak::CodeGenerator code = Xbyak::CodeGenerator(4096, default_cg_mode); + Xbyak::CodeGenerator code = Xbyak::CodeGenerator(4096 +#ifdef DYNARMIC_ENABLE_NO_EXECUTE_SUPPORT + , Xbyak::DontSetProtectRWE +#else + , nullptr //Allow RWE +#endif + ); void (*lock)(volatile int*) = nullptr; void (*unlock)(volatile int*) = nullptr; }; diff --git a/src/dynarmic/src/dynarmic/frontend/decoder/decoder_detail.h b/src/dynarmic/src/dynarmic/frontend/decoder/decoder_detail.h index e383fb0262..ff27ffb3c7 100644 --- a/src/dynarmic/src/dynarmic/frontend/decoder/decoder_detail.h +++ b/src/dynarmic/src/dynarmic/frontend/decoder/decoder_detail.h @@ -91,7 +91,7 @@ struct detail { shifts[arg_index] = bit_position; } } -#if !defined(DYNARMIC_IGNORE_ASSERTS) && !defined(__ANDROID__) +#if !defined(__ANDROID__) // Avoids a MSVC ICE, and avoids Android NDK issue. DEBUG_ASSERT(std::all_of(masks.begin(), masks.end(), [](auto m) { return m != 0; })); #endif diff --git a/src/dynarmic/tests/CMakeLists.txt b/src/dynarmic/tests/CMakeLists.txt index 15a77e4b5c..9d38c8425c 100644 --- a/src/dynarmic/tests/CMakeLists.txt +++ b/src/dynarmic/tests/CMakeLists.txt @@ -44,13 +44,13 @@ if (DYNARMIC_TESTS_USE_UNICORN) ) endif() -if ("riscv" IN_LIST ARCHITECTURE) +if (ARCHITECTURE_riscv64) target_link_libraries(dynarmic_tests PRIVATE biscuit::biscuit) endif() -if ("x86_64" IN_LIST ARCHITECTURE) +if (ARCHITECTURE_x86_64) target_link_libraries(dynarmic_tests PRIVATE xbyak::xbyak) - target_architecture_specific_sources(dynarmic_tests "x86_64" + target_sources(dynarmic_tests PRIVATE x64_cpu_info.cpp native/preserve_xmm.cpp )