From 655ed37983d90bb411ab2d877066b8f2f2198157 Mon Sep 17 00:00:00 2001 From: Skyler Saleh Date: Sat, 19 Jun 2021 10:05:35 -0700 Subject: [PATCH 1/2] Unit Tests: Added W^X Support for PowerPC test --- .../Core/PowerPC/JitArm64/ConvertSingleDouble.cpp | 2 ++ Source/UnitTests/Core/PowerPC/JitArm64/FPRF.cpp | 2 ++ Source/UnitTests/Core/PowerPC/JitArm64/Fres.cpp | 2 ++ Source/UnitTests/Core/PowerPC/JitArm64/Frsqrte.cpp | 2 ++ Source/UnitTests/Core/PowerPC/JitArm64/MovI2R.cpp | 14 ++++++++++---- 5 files changed, 18 insertions(+), 4 deletions(-) diff --git a/Source/UnitTests/Core/PowerPC/JitArm64/ConvertSingleDouble.cpp b/Source/UnitTests/Core/PowerPC/JitArm64/ConvertSingleDouble.cpp index e0b67b15bf..02b088a9cc 100644 --- a/Source/UnitTests/Core/PowerPC/JitArm64/ConvertSingleDouble.cpp +++ b/Source/UnitTests/Core/PowerPC/JitArm64/ConvertSingleDouble.cpp @@ -33,6 +33,8 @@ class TestConversion : private JitArm64 public: TestConversion() { + const Common::ScopedJITPageWriteAndNoExecute enable_jit_page_writes; + AllocCodeSpace(4096); AddChildCodeSpace(&farcode, 2048); diff --git a/Source/UnitTests/Core/PowerPC/JitArm64/FPRF.cpp b/Source/UnitTests/Core/PowerPC/JitArm64/FPRF.cpp index ef82fa6d1b..7bbdffdf64 100644 --- a/Source/UnitTests/Core/PowerPC/JitArm64/FPRF.cpp +++ b/Source/UnitTests/Core/PowerPC/JitArm64/FPRF.cpp @@ -26,6 +26,8 @@ class TestFPRF : public JitArm64 public: TestFPRF() { + const Common::ScopedJITPageWriteAndNoExecute enable_jit_page_writes; + AllocCodeSpace(4096); const u8* raw_fprf_single = GetCodePtr(); diff --git a/Source/UnitTests/Core/PowerPC/JitArm64/Fres.cpp b/Source/UnitTests/Core/PowerPC/JitArm64/Fres.cpp index 027a3ac89f..ad41e0a8db 100644 --- a/Source/UnitTests/Core/PowerPC/JitArm64/Fres.cpp +++ b/Source/UnitTests/Core/PowerPC/JitArm64/Fres.cpp @@ -24,6 +24,8 @@ class TestFres : public JitArm64 public: TestFres() { + const Common::ScopedJITPageWriteAndNoExecute enable_jit_page_writes; + AllocCodeSpace(4096); const u8* raw_fres = GetCodePtr(); diff --git a/Source/UnitTests/Core/PowerPC/JitArm64/Frsqrte.cpp b/Source/UnitTests/Core/PowerPC/JitArm64/Frsqrte.cpp index 749b147dcb..7677b2709e 100644 --- a/Source/UnitTests/Core/PowerPC/JitArm64/Frsqrte.cpp +++ b/Source/UnitTests/Core/PowerPC/JitArm64/Frsqrte.cpp @@ -24,6 +24,8 @@ class TestFrsqrte : public JitArm64 public: TestFrsqrte() { + const Common::ScopedJITPageWriteAndNoExecute enable_jit_page_writes; + AllocCodeSpace(4096); const u8* raw_frsqrte = GetCodePtr(); diff --git a/Source/UnitTests/Core/PowerPC/JitArm64/MovI2R.cpp b/Source/UnitTests/Core/PowerPC/JitArm64/MovI2R.cpp index 8313a7be79..4677286eda 100644 --- a/Source/UnitTests/Core/PowerPC/JitArm64/MovI2R.cpp +++ b/Source/UnitTests/Core/PowerPC/JitArm64/MovI2R.cpp @@ -26,8 +26,11 @@ public: ResetCodePtr(); const u8* fn = GetCodePtr(); - MOVI2R(ARM64Reg::W0, value); - RET(); + { + const Common::ScopedJITPageWriteAndNoExecute enable_jit_page_writes; + MOVI2R(ARM64Reg::W0, value); + RET(); + } FlushIcacheSection(const_cast(fn), const_cast(GetCodePtr())); @@ -40,8 +43,11 @@ public: ResetCodePtr(); const u8* fn = GetCodePtr(); - MOVI2R(ARM64Reg::X0, value); - RET(); + { + const Common::ScopedJITPageWriteAndNoExecute enable_jit_page_writes; + MOVI2R(ARM64Reg::X0, value); + RET(); + } FlushIcacheSection(const_cast(fn), const_cast(GetCodePtr())); From 1203c2378192acb8cf67ccf731d40f1f954de7a6 Mon Sep 17 00:00:00 2001 From: Skyler Saleh Date: Sat, 19 Jun 2021 10:06:47 -0700 Subject: [PATCH 2/2] Apple M1: Support for unit testing universal builds --- BuildMacOSUniversalBinary.py | 39 +++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/BuildMacOSUniversalBinary.py b/BuildMacOSUniversalBinary.py index ea6f83d077..569594e2a5 100755 --- a/BuildMacOSUniversalBinary.py +++ b/BuildMacOSUniversalBinary.py @@ -70,6 +70,8 @@ DEFAULT_CONFIG = { "generator": "Unix Makefiles", "build_type": "Release", + "run_unit_tests": False, + } # Architectures to build for. This is explicity left out of the command line @@ -114,6 +116,9 @@ def parse_args(conf=DEFAULT_CONFIG): help="Path to .entitlements file for code signing", default=conf["entitlements"]) + parser.add_argument("--run_unit_tests", action="store_true", + default=conf["run_unit_tests"]) + parser.add_argument( "--codesign", help="Code signing identity to use to sign the applications", @@ -323,8 +328,40 @@ def build(config): "--verbose=2", path]) + print("Built Universal Binary successfully!") + + # Build and run unit tests for each architecture + unit_test_results = {} + if config["run_unit_tests"]: + for arch in ARCHITECTURES: + if not os.path.exists(arch): + os.mkdir(arch) + + print("Building and running unit tests for: {arch}") + unit_test_results[arch] = \ + subprocess.call(["cmake", "--build", ".", + "--config", config["build_type"], + "--target", "unittests", + "--parallel", f"{threads}"], cwd=arch) + + passed_unit_tests = True + for a in unit_test_results: + code = unit_test_results[a] + passed = code == 0 + + status_string = "PASSED" + if not passed: + passed_unit_tests = False + status_string = f"FAILED ({code})" + + print(a + " Unit Tests: " + status_string) + + if not passed_unit_tests: + exit(-1) + + print("Passed all unit tests") + if __name__ == "__main__": conf = parse_args() build(conf) - print("Built Universal Binary successfully!")