<pre style='margin:0'>
Renee Otten (reneeotten) pushed a commit to branch master
in repository macports-ports.

</pre>
<p><a href="https://github.com/macports/macports-ports/commit/b1554ba47aa6f47b1555ef912133468dd32c25e6">https://github.com/macports/macports-ports/commit/b1554ba47aa6f47b1555ef912133468dd32c25e6</a></p>
<pre style="white-space: pre; background: #F8F8F8">The following commit(s) were added to refs/heads/master by this push:
<span style='display:block; white-space:pre;color:#404040;'>     new b1554ba47aa erlang: update to 27.1.2
</span>b1554ba47aa is described below

<span style='display:block; white-space:pre;color:#808000;'>commit b1554ba47aa6f47b1555ef912133468dd32c25e6
</span>Author: Paul Guyot <pguyot@kallisys.net>
AuthorDate: Sat Oct 19 20:59:32 2024 +0200

<span style='display:block; white-space:pre;color:#404040;'>    erlang: update to 27.1.2
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Also fix support for JIT which was disabled by default by upstream on
</span><span style='display:block; white-space:pre;color:#404040;'>    macOS/amd64 because of an annoying popup starting from Sonoma. Fix was
</span><span style='display:block; white-space:pre;color:#404040;'>    eventually provided by asmjit and this is backported here as a patch.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Also fix issue with symlinks to erlang tools that was broken with erlang 27
</span><span style='display:block; white-space:pre;color:#404040;'>    upgrade.
</span><span style='display:block; white-space:pre;color:#404040;'>    
</span><span style='display:block; white-space:pre;color:#404040;'>    Signed-off-by: Paul Guyot <pguyot@kallisys.net>
</span>---
 lang/erlang/Portfile                        |  29 +-
 lang/erlang/files/patch-asmjit-dualmap.diff | 457 ++++++++++++++++++++++++++++
 2 files changed, 473 insertions(+), 13 deletions(-)

<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/erlang/Portfile b/lang/erlang/Portfile
</span><span style='display:block; white-space:pre;color:#808080;'>index 8eaaf69f15f..64d6315a21b 100644
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>--- a/lang/erlang/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/erlang/Portfile
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -9,7 +9,7 @@ PortGroup           legacysupport 1.1
</span> legacysupport.newest_darwin_requires_legacy 10
 
 name                erlang
<span style='display:block; white-space:pre;background:#ffe0e0;'>-version             27.0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+version             27.1.2
</span> revision            0
 
 set doc_version     ${version}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -46,17 +46,17 @@ distfiles           otp_src_${version}${extract.suffix}                    \
</span>                     otp_doc_html_${doc_version}${extract.suffix}
 
 checksums           otp_src_${version}.tar.gz \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    rmd160  b3d8528389c497ee547bf94b0ad2c33cbb0290de \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sha256  56412677466b756740fb2dbf4a8019e7c7cc38f01bd30c4cac5210214cafeef6 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    size    101038198 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    rmd160  81fd4dce5ef82df0e986a0299ce27c871cb211fe \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  1772e9fa07b2b020ed5911d6ce78b251dfb6ed8509ed7de9d372e96b87251d14 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    size    101338359 \
</span>                     otp_doc_man_${doc_version}.tar.gz \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    rmd160  14a6963ba477eabdd3e27324afa839686b07c364 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sha256  95a2ea0e22ea4b7d58e74df145b52e2c85b642434391c814300824204a107c38 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    size    1764909 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    rmd160  9bae6ac9e6cdb09e0f1e7de8acfa504513f7c271 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  76f01e6833d841e614929a2b7426b0b08b32daae985ee3e81f2dedb17d367048 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    size    45065 \
</span>                     otp_doc_html_${doc_version}.tar.gz \
<span style='display:block; white-space:pre;background:#ffe0e0;'>-                    rmd160  a769c4f2f72019e00978a60a1ac002cd993a81f7 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    sha256  69c926bbf1b3fed93f361317a481910dae98f9700f58765b36c4875044bcc9d7 \
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-                    size    29506649
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    rmd160  a9c21d599f5de594a67b5005234c23c773634f7f \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    sha256  a46eea48eab01404eddd649f044bd30f5e4fb432df94be26345410590d1c3f53 \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+                    size    29910123
</span> 
 worksrcdir          otp_src_${version}
 
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -83,9 +83,8 @@ post-destroot   {
</span>     system "tar -C ${destroot}${prefix}/lib/erlang -zxvf [shellescape ${distpath}/otp_doc_html_${doc_version}${extract.suffix}]"
     system "tar -C ${destroot}${prefix}/lib/erlang -zxvf [shellescape ${distpath}/otp_doc_man_${doc_version}${extract.suffix}]"
 
<span style='display:block; white-space:pre;background:#ffe0e0;'>-    set erts_dir            erts-12.2
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set erl_interface_dir   erl_interface-5.1
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>-    set wx_dir              wx-2.1.1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set erts_dir            [glob -tails -directory ${destroot}${prefix}/lib/erlang/lib/ erts-*]
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    set erl_interface_dir   [glob -tails -directory ${destroot}${prefix}/lib/erlang/lib/ erl_interface-*]
</span> 
     foreach x {dialyzer ear ecc elink epmd erl erlc escript run_erl start to_erl typer} {
         delete ${destroot}${prefix}/bin/${x}
<span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -120,6 +119,10 @@ platform darwin {
</span>         # also "-framework Appkit"?
         configure.ldflags-append -framework CoreFoundation
     }
<span style='display:block; white-space:pre;background:#e0ffe0;'>+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # asmjit fix for Sonoma annoying popup with JIT on amd64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    # Upstream didn't want to include it yet
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    patchfiles-append           patch-asmjit-dualmap.diff
</span> }
 
 # FIXME: allow building with wxGTK on older systems.
<span style='display:block; white-space:pre;color:#808080;'>diff --git a/lang/erlang/files/patch-asmjit-dualmap.diff b/lang/erlang/files/patch-asmjit-dualmap.diff
</span>new file mode 100644
<span style='display:block; white-space:pre;color:#808080;'>index 00000000000..062079718e9
</span><span style='display:block; white-space:pre;background:#ffe0e0;'>--- /dev/null
</span><span style='display:block; white-space:pre;background:#e0e0ff;'>+++ b/lang/erlang/files/patch-asmjit-dualmap.diff
</span><span style='display:block; white-space:pre;background:#e0e0e0;'>@@ -0,0 +1,457 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --color=auto -ru erts/emulator/asmjit/core/globals.cpp asmjit.patched/core/globals.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- erts/emulator/asmjit/core/globals.cpp  2024-10-17 10:41:53
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ asmjit.patched/core/globals.cpp        2024-10-19 09:24:53
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -87,6 +87,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     "ExpressionOverflow\0"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     "FailedToOpenAnonymousMemory\0"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     "FailedToOpenFile\0"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    "ProtectionFailure\0"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     "<Unknown>\0";
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   static const uint16_t sErrorIndex[] = {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -94,7 +95,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     247, 264, 283, 298, 314, 333, 352, 370, 392, 410, 429, 444, 460, 474, 488,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     508, 533, 551, 573, 595, 612, 629, 645, 661, 677, 694, 709, 724, 744, 764,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     784, 817, 837, 852, 869, 888, 909, 929, 943, 964, 978, 996, 1012, 1028, 1047,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    1073, 1088, 1104, 1119, 1134, 1164, 1188, 1207, 1235, 1252
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    1073, 1088, 1104, 1119, 1134, 1164, 1188, 1207, 1235, 1252, 1270
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // @EnumStringEnd@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --color=auto -ru erts/emulator/asmjit/core/globals.h asmjit.patched/core/globals.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- erts/emulator/asmjit/core/globals.h    2024-10-17 10:41:53
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ asmjit.patched/core/globals.h  2024-10-19 09:24:53
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -330,6 +330,10 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //! \note This is a generic error that is used by internal filesystem API.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   kErrorFailedToOpenFile,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  //! Protection failure can be returned from a virtual memory allocator or when trying to change memory access
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  //! permissions.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  kErrorProtectionFailure,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // @EnumValuesEnd@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //! Count of AsmJit error codes.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --color=auto -ru erts/emulator/asmjit/core/virtmem.cpp asmjit.patched/core/virtmem.cpp
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- erts/emulator/asmjit/core/virtmem.cpp  2024-10-17 10:41:53
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ asmjit.patched/core/virtmem.cpp        2024-10-19 09:24:53
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -76,8 +76,6 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     #define MAP_ANONYMOUS MAP_ANON
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  #define ASMJIT_ANONYMOUS_MEMORY_USE_FD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   // Android NDK doesn't provide `shm_open()` and `shm_unlink()`.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   #if !defined(__BIONIC__) && !defined(ASMJIT_NO_SHM_OPEN)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     #define ASMJIT_HAS_SHM_OPEN
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -89,18 +87,60 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     #define ASMJIT_VM_SHM_DETECT 1
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  #if defined(__APPLE__) && TARGET_OS_OSX && ASMJIT_ARCH_ARM >= 64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    #define ASMJIT_HAS_PTHREAD_JIT_WRITE_PROTECT_NP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  #if defined(__APPLE__) && TARGET_OS_OSX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    #if ASMJIT_ARCH_X86 != 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      #define ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    #if ASMJIT_ARCH_ARM >= 64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      #define ASMJIT_HAS_PTHREAD_JIT_WRITE_PROTECT_NP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  #if defined(__APPLE__) && ASMJIT_ARCH_X86 == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    #define ASMJIT_NO_DUAL_MAPPING
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   #if defined(__NetBSD__) && defined(MAP_REMAPDUP) && defined(PROT_MPROTECT)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    #undef ASMJIT_ANONYMOUS_MEMORY_USE_FD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     #define ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  #if !defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP) && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      !defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP) && \
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      !defined(ASMJIT_NO_DUAL_MAPPING)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    #define ASMJIT_ANONYMOUS_MEMORY_USE_FD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include <atomic>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/mach.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include <mach/mach_time.h>
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++extern "C" {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#ifdef mig_external
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++mig_external
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++extern
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++kern_return_t mach_vm_remap(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  vm_map_t target_task,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  mach_vm_address_t *target_address,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  mach_vm_size_t size,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  mach_vm_offset_t mask,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  int flags,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  vm_map_t src_task,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  mach_vm_address_t src_address,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  boolean_t copy,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  vm_prot_t *cur_protection,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  vm_prot_t *max_protection,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  vm_inherit_t inheritance
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++} // {extern "C"}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASMJIT_BEGIN_SUB_NAMESPACE(VirtMem)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Virtual Memory Utilities
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -141,6 +181,11 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return ::GetLargePageMinimum();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static bool hasDualMappingSupport() noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // TODO: This assumption works on X86 platforms, this may not work on AArch64.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Returns windows-specific protectFlags from \ref MemoryFlags.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static DWORD protectFlagsFromMemoryFlags(MemoryFlags memoryFlags) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   DWORD protectFlags;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -165,7 +210,12 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static HardenedRuntimeFlags getHardenedRuntimeFlags() noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  return HardenedRuntimeFlags::kNone;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  HardenedRuntimeFlags flags = HardenedRuntimeFlags::kNone;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (hasDualMappingSupport())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    flags |= HardenedRuntimeFlags::kDualMapping;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return flags;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Error alloc(void** p, size_t size, MemoryFlags memoryFlags) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -703,8 +753,8 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Detects whether MAP_JIT is available.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static inline bool hasMapJitSupport() noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if defined(__APPLE__) && TARGET_OS_OSX && ASMJIT_ARCH_ARM >= 64
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  // OSX on AArch64 always uses hardened runtime + MAP_JIT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(__APPLE__) && TARGET_OS_OSX && ASMJIT_ARCH_X86 == 0
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  // Apple platforms always use hardened runtime + MAP_JIT on non-x86 hardware:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //   - https://developer.apple.com/documentation/apple_silicon/porting_just-in-time_compilers_to_apple_silicon
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #elif defined(__APPLE__) && TARGET_OS_OSX
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -746,6 +796,14 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static inline bool hasDualMappingSupport() noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(ASMJIT_NO_DUAL_MAPPING)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return false;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return true;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static HardenedRuntimeFlags getHardenedRuntimeFlags() noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   HardenedRuntimeFlags flags = HardenedRuntimeFlags::kNone;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -755,6 +813,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (hasMapJitSupport())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     flags |= HardenedRuntimeFlags::kMapJit;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (hasDualMappingSupport())
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    flags |= HardenedRuntimeFlags::kDualMapping;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return flags;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -828,6 +889,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // Virtual Memory [Posix] - Dual Mapping
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ // =====================================
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if !defined(ASMJIT_NO_DUAL_MAPPING)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static Error unmapDualMapping(DualMapping* dm, size_t size) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Error err1 = unmapMemory(dm->rx, size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   Error err2 = kErrorOk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -843,6 +905,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   dm->rw = nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return kErrorOk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // !ASMJIT_NO_DUAL_MAPPING
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #if defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ static Error allocDualMappingUsingRemapdup(DualMapping* dmOut, size_t size, MemoryFlags memoryFlags) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -875,16 +938,105 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags memoryFlags) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  dm->rx = nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  dm->rw = nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static Error asmjitErrorFromKernResult(kern_return_t result) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  switch (result) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case KERN_PROTECTION_FAILURE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return DebugUtils::errored(kErrorProtectionFailure);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case KERN_NO_SPACE:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return DebugUtils::errored(kErrorOutOfMemory);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    case KERN_INVALID_ARGUMENT:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return DebugUtils::errored(kErrorInvalidArgument);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    default:
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      return DebugUtils::errored(kErrorInvalidState);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  if (off_t(size) <= 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-    return DebugUtils::errored(size == 0 ? kErrorInvalidArgument : kErrorTooLarge);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static Error allocDualMappingUsingMachVmRemap(DualMapping* dmOut, size_t size, MemoryFlags memoryFlags) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  DualMapping dm {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  return allocDualMappingUsingRemapdup(dm, size, memoryFlags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-#elif defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  MemoryFlags mmapFlags = MemoryFlags::kAccessReadWrite | (memoryFlags & MemoryFlags::kMapShared);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ASMJIT_PROPAGATE(mapMemory(&dm.rx, size, mmapFlags));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  vm_prot_t curProt;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  vm_prot_t maxProt;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  int rwProtectFlags = VM_PROT_READ | VM_PROT_WRITE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  int rxProtectFlags = VM_PROT_READ;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (Support::test(memoryFlags, MemoryFlags::kAccessExecute))
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    rxProtectFlags |= VM_PROT_EXECUTE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  kern_return_t result {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  do {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    vm_map_t task = mach_task_self();
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    mach_vm_address_t remappedAddr {};
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(VM_FLAGS_RANDOM_ADDR)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int remapFlags = VM_FLAGS_ANYWHERE | VM_FLAGS_RANDOM_ADDR;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    int remapFlags = VM_FLAGS_ANYWHERE;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // Try to remap the existing memory into a different address.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    result = mach_vm_remap(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      task,                       // target_task
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      &remappedAddr,              // target_address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      size,                       // size
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      0,                          // mask
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      remapFlags,                 // flags
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      task,                       // src_task
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      (mach_vm_address_t)dm.rx,   // src_address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      false,                      // copy
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      &curProt,                   // cur_protection
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      &maxProt,                   // max_protection
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      VM_INHERIT_DEFAULT);        // inheritance
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    if (result != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    dm.rw = (void*)remappedAddr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // Now, try to change permissions of both map regions into RW and RX. The vm_protect()
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // API is used twice as we also want to set maximum permissions, so nobody would be
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    // allowed to change the RX region back to RW or RWX (if RWX is allowed).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    uint32_t i;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    for (i = 0; i < 2; i++) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      bool setMaximum = (i == 0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      result = vm_protect(
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        task,                       // target_task
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        (vm_address_t)dm.rx,        // address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        size,                       // size
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        setMaximum,                 // set_maximum
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        rxProtectFlags);            // new_protection
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (result != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      result = vm_protect(task,     // target_task
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        (vm_address_t)dm.rw,        // address
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        size,                       // size
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        setMaximum,                 // set_maximum
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        rwProtectFlags);            // new_protection
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++      if (result != KERN_SUCCESS)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++        break;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  } while (0);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (result != KERN_SUCCESS) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    unmapDualMapping(&dm, size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return DebugUtils::errored(asmjitErrorFromKernResult(result));
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  *dmOut = dm;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return kErrorOk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++static Error allocDualMappingUsingFile(DualMapping* dm, size_t size, MemoryFlags memoryFlags) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   bool preferTmpOverDevShm = Support::test(memoryFlags, MemoryFlags::kMappingPreferTmp);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   if (!preferTmpOverDevShm) {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+     AnonymousMemoryStrategy strategy;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -910,13 +1062,39 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   dm->rx = ptr[0];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   dm->rw = ptr[1];
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return kErrorOk;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // ASMJIT_ANONYMOUS_MEMORY_USE_FD
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++Error allocDualMapping(DualMapping* dm, size_t size, MemoryFlags memoryFlags) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  dm->rx = nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  dm->rw = nullptr;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(ASMJIT_NO_DUAL_MAPPING)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  DebugUtils::unused(size, memoryFlags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return DebugUtils::errored(kErrorFeatureNotEnabled);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  #error "[asmjit] VirtMem::allocDualMapping() doesn't have implementation for the target OS and compiler"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  if (off_t(size) <= 0)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++    return DebugUtils::errored(size == 0 ? kErrorInvalidArgument : kErrorTooLarge);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(ASMJIT_ANONYMOUS_MEMORY_USE_REMAPDUP)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return allocDualMappingUsingRemapdup(dm, size, memoryFlags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(ASMJIT_ANONYMOUS_MEMORY_USE_MACH_VM_REMAP)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return allocDualMappingUsingMachVmRemap(dm, size, memoryFlags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#elif defined(ASMJIT_ANONYMOUS_MEMORY_USE_FD)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return allocDualMappingUsingFile(dm, size, memoryFlags);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  #error "[asmjit] VirtMem::allocDualMapping() doesn't have implementation for the target OS or architecture"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // ASMJIT_NO_DUAL_MAPPING
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ Error releaseDualMapping(DualMapping* dm, size_t size) noexcept {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#if defined(ASMJIT_NO_DUAL_MAPPING)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  DebugUtils::unused(dm, size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  return DebugUtils::errored(kErrorFeatureNotEnabled);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   return unmapDualMapping(dm, size);
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#endif // ASMJIT_NO_DUAL_MAPPING
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #endif
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -1017,8 +1195,9 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   INFO("VirtMem::hardenedRuntimeInfo():");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   INFO("  flags:");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  INFO("    kEnabled: %s", Support::test(hardenedFlags, VirtMem::HardenedRuntimeFlags::kEnabled) ? "true" : "false");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  INFO("    kMapJit: %s", Support::test(hardenedFlags, VirtMem::HardenedRuntimeFlags::kMapJit) ? "true" : "false");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  INFO("    kEnabled: %s"    , Support::test(hardenedFlags, VirtMem::HardenedRuntimeFlags::kEnabled    ) ? "true" : "false");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  INFO("    kMapJit: %s"     , Support::test(hardenedFlags, VirtMem::HardenedRuntimeFlags::kMapJit     ) ? "true" : "false");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  INFO("    kDualMapping: %s", Support::test(hardenedFlags, VirtMem::HardenedRuntimeFlags::kDualMapping) ? "true" : "false");
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASMJIT_END_NAMESPACE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --color=auto -ru erts/emulator/asmjit/core/virtmem.h asmjit.patched/core/virtmem.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- erts/emulator/asmjit/core/virtmem.h    2024-10-17 10:41:53
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ asmjit.patched/core/virtmem.h  2024-10-19 09:24:53
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -10,6 +10,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #ifndef ASMJIT_NO_JIT
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ #include "../core/globals.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++#include "../core/support.h"
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASMJIT_BEGIN_NAMESPACE
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -215,15 +216,31 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //! architecture.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   kEnabled = 0x00000001u,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  //! Read+Write+Execute can only be allocated with MAP_JIT flag (Apple specific, only available on OSX).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  kMapJit = 0x00000002u
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  //! Read+Write+Execute can only be allocated with MAP_JIT flag (Apple specific, only available on Apple platforms).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  kMapJit = 0x00000002u,
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  //! Read+Write+Execute can be allocated with dual mapping approach (one region with RW and the other with RX).
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  kDualMapping = 0x00000004u
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ ASMJIT_DEFINE_ENUM_FLAGS(HardenedRuntimeFlags)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //! Hardened runtime information.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ struct HardenedRuntimeInfo {
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  //! \name Members
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  //! \{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   //! Hardened runtime flags.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   HardenedRuntimeFlags flags;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  //! \}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  //! \name Accessors
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  //! \{
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  //! Tests whether the hardened runtime `flag` is set.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ASMJIT_INLINE_NODEBUG bool hasFlag(HardenedRuntimeFlags flag) const noexcept { return Support::test(flags, flag); }
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  //! \}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ };
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ //! Returns runtime features provided by the OS.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+diff --color=auto -ru erts/emulator/asmjit/x86/x86emitter.h asmjit.patched/x86/x86emitter.h
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- erts/emulator/asmjit/x86/x86emitter.h  2024-10-17 10:41:53
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ asmjit.patched/x86/x86emitter.h        2024-10-19 09:24:53
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -2827,7 +2827,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_3x(vpand, Vpand, Vec, Vec, Mem)                          // AVX+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_3x(vpandd, Vpandd, Vec, Vec, Vec)                        //      AVX512_F{kz|b32}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_3x(vpandd, Vpandd, Vec, Vec, Mem)                        //      AVX512_F{kz|b32}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ASMJIT_INST_3x(vpandn, Vpandn, Vec, Vec, Vec)                        // AV+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ASMJIT_INST_3x(vpandn, Vpandn, Vec, Vec, Vec)                        // AVX+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_3x(vpandn, Vpandn, Vec, Vec, Mem)                        // AVX+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_3x(vpandnd, Vpandnd, Vec, Vec, Vec)                      //      AVX512_F{kz|b32}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_3x(vpandnd, Vpandnd, Vec, Vec, Mem)                      //      AVX512_F{kz|b32}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -3186,7 +3186,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_2x(vpopcntq, Vpopcntq, Vec, Mem)                         //      AVX512_VPOPCNTDQ{kz|b64}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_2x(vpopcntw, Vpopcntw, Vec, Vec)                         //      AVX512_BITALG{kz|b32}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_2x(vpopcntw, Vpopcntw, Vec, Mem)                         //      AVX512_BITALG{kz|b32}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-  ASMJIT_INST_3x(vpor, Vpor, Vec, Vec, Vec)                            // AV+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++  ASMJIT_INST_3x(vpor, Vpor, Vec, Vec, Vec)                            // AVX+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_3x(vpor, Vpor, Vec, Vec, Mem)                            // AVX+
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_3x(vpord, Vpord, Vec, Vec, Vec)                          //      AVX512_F{kz|b32}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+   ASMJIT_INST_3x(vpord, Vpord, Vec, Vec, Mem)                          //      AVX512_F{kz|b32}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+--- erts/configure 2024-10-19 20:50:46
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++++ erts/configure 2024-10-19 20:51:39
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+@@ -25482,32 +25482,7 @@
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+ 
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+    case "$ARCH" in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         amd64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           case "$OPSYS" in
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              darwin)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                # macOS Sonoma introduced some very annoying popups when
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                # dual-mapping memory through the documented APIs, and we did
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                # not wish to start using undocumented functionality in a patch
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                # release, so we have disabled the JIT by default on this
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                # platform.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                # The previous version, macOS Ventura, does not have the
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                # annoying popups, so it is still possible to explicitly
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                # enable the JIT.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                #
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                # The ARM JIT is unaffected because it uses per-thread
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                # permissions instead of dual-mapped memory.
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                if test ${enable_jit} = yes; then
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  JIT_ARCH=x86
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                else
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  enable_jit=no
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                  { printf "%s\n" "$as_me:${as_lineno-$LINENO}: WARNING: JIT disabled due to annoying popus on x86 Macs with Sononma" >&5
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-printf "%s\n" "$as_me: WARNING: JIT disabled due to annoying popus on x86 Macs with Sononma" >&2;}
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                fi
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                ;;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-              *)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                JIT_ARCH=x86
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-                ;;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+-           esac
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>++           JIT_ARCH=x86
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            ;;
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+         arm64)
</span><span style='display:block; white-space:pre;background:#e0ffe0;'>+            case "$OPSYS" in
</span></pre><pre style='margin:0'>

</pre>