From 97d8d9e53f4249791f7179ad415ad7c863658ca5 Mon Sep 17 00:00:00 2001 From: Moritz Angermann Date: Wed, 15 Oct 2025 08:01:41 +0800 Subject: [PATCH 1/2] Fix building with more recent android sdk/ndks This requires the atomic type fix (backport), as well as some mucking around with hadrian, which failes to properly account for static libraries. --- compiler/ghc/default.nix | 20 + overlays/bootstrap.nix | 2 + ...c9927fae3369fc4ecff68f80c4cb32eea757.patch | 832 ++++++++++++++++++ 3 files changed, 854 insertions(+) create mode 100644 overlays/patches/ghc/7db8c9927fae3369fc4ecff68f80c4cb32eea757.patch diff --git a/compiler/ghc/default.nix b/compiler/ghc/default.nix index ff3e75c8cb..bde42abe30 100644 --- a/compiler/ghc/default.nix +++ b/compiler/ghc/default.nix @@ -967,6 +967,26 @@ haskell-nix.haskellLib.makeCompilerDeps (stdenv.mkDerivation (rec { ''; buildPhase = '' runHook preBuild + '' + lib.optionalString (!enableShared && targetPlatform.isAndroid && targetPlatform.isAarch64) + # This is rather idiotic, but we need to create the dynamic (.so) files because + # hadrian expects them in the src/Rules/Rts.hs:160 or thereabout. + '' + mkdir -p _build/stage1/lib/aarch64-android-ghc-${ghc-version}/ + touch _build/stage1/lib/aarch64-android-ghc-${ghc-version}/libHSrts-1.0.2_thr_debug-ghc${ghc-version}.so + touch _build/stage1/lib/aarch64-android-ghc-${ghc-version}/libHSrts-1.0.2_thr-ghc${ghc-version}.so + touch _build/stage1/lib/aarch64-android-ghc-${ghc-version}/libHSrts-1.0.2_debug-ghc${ghc-version}.so + touch _build/stage1/lib/aarch64-android-ghc-${ghc-version}/libHSrts-1.0.2-ghc${ghc-version}.so + '' + lib.optionalString (!enableShared && targetPlatform.isAndroid && targetPlatform.isAarch32) + # This is rather idiotic, but we need to create the dynamic (.so) files because + # hadrian expects them in the src/Rules/Rts.hs:160 or thereabout. + '' + mkdir -p _build/stage1/lib/arm-android-ghc-${ghc-version}/ + touch _build/stage1/lib/arm-android-ghc-${ghc-version}/libHSrts-1.0.2_thr_debug-ghc${ghc-version}.so + touch _build/stage1/lib/arm-android-ghc-${ghc-version}/libHSrts-1.0.2_thr-ghc${ghc-version}.so + touch _build/stage1/lib/arm-android-ghc-${ghc-version}/libHSrts-1.0.2_debug-ghc${ghc-version}.so + touch _build/stage1/lib/arm-android-ghc-${ghc-version}/libHSrts-1.0.2-ghc${ghc-version}.so + '' + + '' ${hadrian}/bin/hadrian ${hadrianArgs} '' + lib.optionalString (installStage1 && !stdenv.targetPlatform.isGhcjs && builtins.compareVersions ghc-version "9.8" < 0) '' ${hadrian}/bin/hadrian ${hadrianArgs} stage1:lib:libiserv diff --git a/overlays/bootstrap.nix b/overlays/bootstrap.nix index 26f4f5fc4d..eb402a058a 100644 --- a/overlays/bootstrap.nix +++ b/overlays/bootstrap.nix @@ -333,6 +333,8 @@ in { ++ onAndroid (from "9.6" ./patches/ghc/ghc-9.6-COMPAT_R_ARM_PREL31.patch) ++ onAndroid (from "9.10" ./patches/ghc/ghc-9.10-ignore-libc.patch) + # unbreak modern clang with proper _atomic declarations. + ++ onAndroid (fromUntil "9.6" "9.12" ./patches/ghc/7db8c9927fae3369fc4ecff68f80c4cb32eea757.patch) ++ onGhcjs (from "9.12" ./patches/ghc/ghc-9.12-ghcjs-rts-mem-heap8.patch) # Fix for `fatal error: 'rts/Types.h' file not found` when building `primitive` diff --git a/overlays/patches/ghc/7db8c9927fae3369fc4ecff68f80c4cb32eea757.patch b/overlays/patches/ghc/7db8c9927fae3369fc4ecff68f80c4cb32eea757.patch new file mode 100644 index 0000000000..742bbba4e7 --- /dev/null +++ b/overlays/patches/ghc/7db8c9927fae3369fc4ecff68f80c4cb32eea757.patch @@ -0,0 +1,832 @@ +From 7db8c9927fae3369fc4ecff68f80c4cb32eea757 Mon Sep 17 00:00:00 2001 +From: Cheng Shao +Date: Tue, 12 Mar 2024 17:31:24 +0000 +Subject: [PATCH] rts: fix clang compilation on aarch64 + +This patch fixes function prototypes in ARMOutlineAtomicsSymbols.h +which causes "error: address argument to atomic operation must be a +pointer to _Atomic type" when compiling with clang on aarch64. +--- + rts/ARMOutlineAtomicsSymbols.h | 464 ++++++++++++++++----------------- + 1 file changed, 232 insertions(+), 232 deletions(-) + +diff --git a/rts/ARMOutlineAtomicsSymbols.h b/rts/ARMOutlineAtomicsSymbols.h +index c8a78b532fa9..5d73b8b246fb 100644 +--- a/rts/ARMOutlineAtomicsSymbols.h ++++ b/rts/ARMOutlineAtomicsSymbols.h +@@ -10,583 +10,583 @@ + #include + #include + +-uint8_t ghc___aarch64_cas1_relax(uint8_t old, uint8_t new, uint8_t* p); +-uint8_t ghc___aarch64_cas1_relax(uint8_t old, uint8_t new, uint8_t* p) { ++uint8_t ghc___aarch64_cas1_relax(uint8_t old, uint8_t new, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_cas1_relax(uint8_t old, uint8_t new, _Atomic uint8_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_relaxed, memory_order_relaxed); return old; + } + +-uint8_t ghc___aarch64_cas1_acq(uint8_t old, uint8_t new, uint8_t* p); +-uint8_t ghc___aarch64_cas1_acq(uint8_t old, uint8_t new, uint8_t* p) { ++uint8_t ghc___aarch64_cas1_acq(uint8_t old, uint8_t new, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_cas1_acq(uint8_t old, uint8_t new, _Atomic uint8_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_acquire, memory_order_acquire); return old; + } + +-uint8_t ghc___aarch64_cas1_acq_rel(uint8_t old, uint8_t new, uint8_t* p); +-uint8_t ghc___aarch64_cas1_acq_rel(uint8_t old, uint8_t new, uint8_t* p) { ++uint8_t ghc___aarch64_cas1_acq_rel(uint8_t old, uint8_t new, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_cas1_acq_rel(uint8_t old, uint8_t new, _Atomic uint8_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_acq_rel, memory_order_acquire); return old; + } + +-uint8_t ghc___aarch64_cas1_sync(uint8_t old, uint8_t new, uint8_t* p); +-uint8_t ghc___aarch64_cas1_sync(uint8_t old, uint8_t new, uint8_t* p) { ++uint8_t ghc___aarch64_cas1_sync(uint8_t old, uint8_t new, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_cas1_sync(uint8_t old, uint8_t new, _Atomic uint8_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_seq_cst, memory_order_seq_cst); return old; + } + +-uint16_t ghc___aarch64_cas2_relax(uint16_t old, uint16_t new, uint16_t* p); +-uint16_t ghc___aarch64_cas2_relax(uint16_t old, uint16_t new, uint16_t* p) { ++uint16_t ghc___aarch64_cas2_relax(uint16_t old, uint16_t new, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_cas2_relax(uint16_t old, uint16_t new, _Atomic uint16_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_relaxed, memory_order_relaxed); return old; + } + +-uint16_t ghc___aarch64_cas2_acq(uint16_t old, uint16_t new, uint16_t* p); +-uint16_t ghc___aarch64_cas2_acq(uint16_t old, uint16_t new, uint16_t* p) { ++uint16_t ghc___aarch64_cas2_acq(uint16_t old, uint16_t new, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_cas2_acq(uint16_t old, uint16_t new, _Atomic uint16_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_acquire, memory_order_acquire); return old; + } + +-uint16_t ghc___aarch64_cas2_acq_rel(uint16_t old, uint16_t new, uint16_t* p); +-uint16_t ghc___aarch64_cas2_acq_rel(uint16_t old, uint16_t new, uint16_t* p) { ++uint16_t ghc___aarch64_cas2_acq_rel(uint16_t old, uint16_t new, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_cas2_acq_rel(uint16_t old, uint16_t new, _Atomic uint16_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_acq_rel, memory_order_acquire); return old; + } + +-uint16_t ghc___aarch64_cas2_sync(uint16_t old, uint16_t new, uint16_t* p); +-uint16_t ghc___aarch64_cas2_sync(uint16_t old, uint16_t new, uint16_t* p) { ++uint16_t ghc___aarch64_cas2_sync(uint16_t old, uint16_t new, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_cas2_sync(uint16_t old, uint16_t new, _Atomic uint16_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_seq_cst, memory_order_seq_cst); return old; + } + +-uint32_t ghc___aarch64_cas4_relax(uint32_t old, uint32_t new, uint32_t* p); +-uint32_t ghc___aarch64_cas4_relax(uint32_t old, uint32_t new, uint32_t* p) { ++uint32_t ghc___aarch64_cas4_relax(uint32_t old, uint32_t new, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_cas4_relax(uint32_t old, uint32_t new, _Atomic uint32_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_relaxed, memory_order_relaxed); return old; + } + +-uint32_t ghc___aarch64_cas4_acq(uint32_t old, uint32_t new, uint32_t* p); +-uint32_t ghc___aarch64_cas4_acq(uint32_t old, uint32_t new, uint32_t* p) { ++uint32_t ghc___aarch64_cas4_acq(uint32_t old, uint32_t new, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_cas4_acq(uint32_t old, uint32_t new, _Atomic uint32_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_acquire, memory_order_acquire); return old; + } + +-uint32_t ghc___aarch64_cas4_acq_rel(uint32_t old, uint32_t new, uint32_t* p); +-uint32_t ghc___aarch64_cas4_acq_rel(uint32_t old, uint32_t new, uint32_t* p) { ++uint32_t ghc___aarch64_cas4_acq_rel(uint32_t old, uint32_t new, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_cas4_acq_rel(uint32_t old, uint32_t new, _Atomic uint32_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_acq_rel, memory_order_acquire); return old; + } + +-uint32_t ghc___aarch64_cas4_sync(uint32_t old, uint32_t new, uint32_t* p); +-uint32_t ghc___aarch64_cas4_sync(uint32_t old, uint32_t new, uint32_t* p) { ++uint32_t ghc___aarch64_cas4_sync(uint32_t old, uint32_t new, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_cas4_sync(uint32_t old, uint32_t new, _Atomic uint32_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_seq_cst, memory_order_seq_cst); return old; + } + +-uint64_t ghc___aarch64_cas8_relax(uint64_t old, uint64_t new, uint64_t* p); +-uint64_t ghc___aarch64_cas8_relax(uint64_t old, uint64_t new, uint64_t* p) { ++uint64_t ghc___aarch64_cas8_relax(uint64_t old, uint64_t new, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_cas8_relax(uint64_t old, uint64_t new, _Atomic uint64_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_relaxed, memory_order_relaxed); return old; + } + +-uint64_t ghc___aarch64_cas8_acq(uint64_t old, uint64_t new, uint64_t* p); +-uint64_t ghc___aarch64_cas8_acq(uint64_t old, uint64_t new, uint64_t* p) { ++uint64_t ghc___aarch64_cas8_acq(uint64_t old, uint64_t new, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_cas8_acq(uint64_t old, uint64_t new, _Atomic uint64_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_acquire, memory_order_acquire); return old; + } + +-uint64_t ghc___aarch64_cas8_acq_rel(uint64_t old, uint64_t new, uint64_t* p); +-uint64_t ghc___aarch64_cas8_acq_rel(uint64_t old, uint64_t new, uint64_t* p) { ++uint64_t ghc___aarch64_cas8_acq_rel(uint64_t old, uint64_t new, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_cas8_acq_rel(uint64_t old, uint64_t new, _Atomic uint64_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_acq_rel, memory_order_acquire); return old; + } + +-uint64_t ghc___aarch64_cas8_sync(uint64_t old, uint64_t new, uint64_t* p); +-uint64_t ghc___aarch64_cas8_sync(uint64_t old, uint64_t new, uint64_t* p) { ++uint64_t ghc___aarch64_cas8_sync(uint64_t old, uint64_t new, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_cas8_sync(uint64_t old, uint64_t new, _Atomic uint64_t* p) { + atomic_compare_exchange_strong_explicit(p, &old, new, memory_order_seq_cst, memory_order_seq_cst); return old; + } + +-uint8_t ghc___aarch64_swp1_relax(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_swp1_relax(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_swp1_relax(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_swp1_relax(uint8_t v, _Atomic uint8_t* p) { + return atomic_exchange_explicit(p, v, memory_order_relaxed); + } + +-uint8_t ghc___aarch64_swp1_acq(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_swp1_acq(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_swp1_acq(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_swp1_acq(uint8_t v, _Atomic uint8_t* p) { + return atomic_exchange_explicit(p, v, memory_order_acquire); + } + +-uint8_t ghc___aarch64_swp1_rel(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_swp1_rel(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_swp1_rel(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_swp1_rel(uint8_t v, _Atomic uint8_t* p) { + return atomic_exchange_explicit(p, v, memory_order_release); + } + +-uint8_t ghc___aarch64_swp1_acq_rel(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_swp1_acq_rel(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_swp1_acq_rel(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_swp1_acq_rel(uint8_t v, _Atomic uint8_t* p) { + return atomic_exchange_explicit(p, v, memory_order_acq_rel); + } + +-uint8_t ghc___aarch64_swp1_sync(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_swp1_sync(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_swp1_sync(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_swp1_sync(uint8_t v, _Atomic uint8_t* p) { + return atomic_exchange_explicit(p, v, memory_order_seq_cst); + } + +-uint16_t ghc___aarch64_swp2_relax(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_swp2_relax(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_swp2_relax(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_swp2_relax(uint16_t v, _Atomic uint16_t* p) { + return atomic_exchange_explicit(p, v, memory_order_relaxed); + } + +-uint16_t ghc___aarch64_swp2_acq(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_swp2_acq(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_swp2_acq(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_swp2_acq(uint16_t v, _Atomic uint16_t* p) { + return atomic_exchange_explicit(p, v, memory_order_acquire); + } + +-uint16_t ghc___aarch64_swp2_rel(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_swp2_rel(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_swp2_rel(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_swp2_rel(uint16_t v, _Atomic uint16_t* p) { + return atomic_exchange_explicit(p, v, memory_order_release); + } + +-uint16_t ghc___aarch64_swp2_acq_rel(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_swp2_acq_rel(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_swp2_acq_rel(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_swp2_acq_rel(uint16_t v, _Atomic uint16_t* p) { + return atomic_exchange_explicit(p, v, memory_order_acq_rel); + } + +-uint16_t ghc___aarch64_swp2_sync(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_swp2_sync(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_swp2_sync(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_swp2_sync(uint16_t v, _Atomic uint16_t* p) { + return atomic_exchange_explicit(p, v, memory_order_seq_cst); + } + +-uint32_t ghc___aarch64_swp4_relax(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_swp4_relax(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_swp4_relax(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_swp4_relax(uint32_t v, _Atomic uint32_t* p) { + return atomic_exchange_explicit(p, v, memory_order_relaxed); + } + +-uint32_t ghc___aarch64_swp4_acq(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_swp4_acq(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_swp4_acq(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_swp4_acq(uint32_t v, _Atomic uint32_t* p) { + return atomic_exchange_explicit(p, v, memory_order_acquire); + } + +-uint32_t ghc___aarch64_swp4_rel(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_swp4_rel(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_swp4_rel(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_swp4_rel(uint32_t v, _Atomic uint32_t* p) { + return atomic_exchange_explicit(p, v, memory_order_release); + } + +-uint32_t ghc___aarch64_swp4_acq_rel(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_swp4_acq_rel(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_swp4_acq_rel(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_swp4_acq_rel(uint32_t v, _Atomic uint32_t* p) { + return atomic_exchange_explicit(p, v, memory_order_acq_rel); + } + +-uint32_t ghc___aarch64_swp4_sync(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_swp4_sync(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_swp4_sync(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_swp4_sync(uint32_t v, _Atomic uint32_t* p) { + return atomic_exchange_explicit(p, v, memory_order_seq_cst); + } + +-uint64_t ghc___aarch64_swp8_relax(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_swp8_relax(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_swp8_relax(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_swp8_relax(uint64_t v, _Atomic uint64_t* p) { + return atomic_exchange_explicit(p, v, memory_order_relaxed); + } + +-uint64_t ghc___aarch64_swp8_acq(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_swp8_acq(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_swp8_acq(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_swp8_acq(uint64_t v, _Atomic uint64_t* p) { + return atomic_exchange_explicit(p, v, memory_order_acquire); + } + +-uint64_t ghc___aarch64_swp8_rel(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_swp8_rel(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_swp8_rel(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_swp8_rel(uint64_t v, _Atomic uint64_t* p) { + return atomic_exchange_explicit(p, v, memory_order_release); + } + +-uint64_t ghc___aarch64_swp8_acq_rel(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_swp8_acq_rel(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_swp8_acq_rel(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_swp8_acq_rel(uint64_t v, _Atomic uint64_t* p) { + return atomic_exchange_explicit(p, v, memory_order_acq_rel); + } + +-uint64_t ghc___aarch64_swp8_sync(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_swp8_sync(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_swp8_sync(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_swp8_sync(uint64_t v, _Atomic uint64_t* p) { + return atomic_exchange_explicit(p, v, memory_order_seq_cst); + } + +-uint8_t ghc___aarch64_ldadd1_relax(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldadd1_relax(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldadd1_relax(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldadd1_relax(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_relaxed); + } + +-uint8_t ghc___aarch64_ldadd1_acq(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldadd1_acq(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldadd1_acq(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldadd1_acq(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_acquire); + } + +-uint8_t ghc___aarch64_ldadd1_rel(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldadd1_rel(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldadd1_rel(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldadd1_rel(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_release); + } + +-uint8_t ghc___aarch64_ldadd1_acq_rel(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldadd1_acq_rel(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldadd1_acq_rel(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldadd1_acq_rel(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_acq_rel); + } + +-uint8_t ghc___aarch64_ldadd1_sync(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldadd1_sync(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldadd1_sync(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldadd1_sync(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_seq_cst); + } + +-uint16_t ghc___aarch64_ldadd2_relax(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldadd2_relax(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldadd2_relax(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldadd2_relax(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_relaxed); + } + +-uint16_t ghc___aarch64_ldadd2_acq(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldadd2_acq(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldadd2_acq(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldadd2_acq(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_acquire); + } + +-uint16_t ghc___aarch64_ldadd2_rel(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldadd2_rel(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldadd2_rel(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldadd2_rel(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_release); + } + +-uint16_t ghc___aarch64_ldadd2_acq_rel(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldadd2_acq_rel(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldadd2_acq_rel(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldadd2_acq_rel(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_acq_rel); + } + +-uint16_t ghc___aarch64_ldadd2_sync(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldadd2_sync(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldadd2_sync(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldadd2_sync(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_seq_cst); + } + +-uint32_t ghc___aarch64_ldadd4_relax(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldadd4_relax(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldadd4_relax(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldadd4_relax(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_relaxed); + } + +-uint32_t ghc___aarch64_ldadd4_acq(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldadd4_acq(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldadd4_acq(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldadd4_acq(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_acquire); + } + +-uint32_t ghc___aarch64_ldadd4_rel(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldadd4_rel(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldadd4_rel(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldadd4_rel(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_release); + } + +-uint32_t ghc___aarch64_ldadd4_acq_rel(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldadd4_acq_rel(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldadd4_acq_rel(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldadd4_acq_rel(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_acq_rel); + } + +-uint32_t ghc___aarch64_ldadd4_sync(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldadd4_sync(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldadd4_sync(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldadd4_sync(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_seq_cst); + } + +-uint64_t ghc___aarch64_ldadd8_relax(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldadd8_relax(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldadd8_relax(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldadd8_relax(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_relaxed); + } + +-uint64_t ghc___aarch64_ldadd8_acq(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldadd8_acq(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldadd8_acq(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldadd8_acq(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_acquire); + } + +-uint64_t ghc___aarch64_ldadd8_rel(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldadd8_rel(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldadd8_rel(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldadd8_rel(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_release); + } + +-uint64_t ghc___aarch64_ldadd8_acq_rel(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldadd8_acq_rel(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldadd8_acq_rel(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldadd8_acq_rel(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_acq_rel); + } + +-uint64_t ghc___aarch64_ldadd8_sync(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldadd8_sync(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldadd8_sync(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldadd8_sync(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_add_explicit(p, v, memory_order_seq_cst); + } + +-uint8_t ghc___aarch64_ldclr1_relax(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldclr1_relax(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldclr1_relax(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldclr1_relax(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_relaxed); + } + +-uint8_t ghc___aarch64_ldclr1_acq(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldclr1_acq(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldclr1_acq(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldclr1_acq(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_acquire); + } + +-uint8_t ghc___aarch64_ldclr1_rel(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldclr1_rel(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldclr1_rel(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldclr1_rel(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_release); + } + +-uint8_t ghc___aarch64_ldclr1_acq_rel(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldclr1_acq_rel(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldclr1_acq_rel(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldclr1_acq_rel(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_acq_rel); + } + +-uint8_t ghc___aarch64_ldclr1_sync(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldclr1_sync(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldclr1_sync(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldclr1_sync(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_seq_cst); + } + +-uint16_t ghc___aarch64_ldclr2_relax(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldclr2_relax(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldclr2_relax(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldclr2_relax(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_relaxed); + } + +-uint16_t ghc___aarch64_ldclr2_acq(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldclr2_acq(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldclr2_acq(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldclr2_acq(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_acquire); + } + +-uint16_t ghc___aarch64_ldclr2_rel(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldclr2_rel(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldclr2_rel(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldclr2_rel(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_release); + } + +-uint16_t ghc___aarch64_ldclr2_acq_rel(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldclr2_acq_rel(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldclr2_acq_rel(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldclr2_acq_rel(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_acq_rel); + } + +-uint16_t ghc___aarch64_ldclr2_sync(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldclr2_sync(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldclr2_sync(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldclr2_sync(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_seq_cst); + } + +-uint32_t ghc___aarch64_ldclr4_relax(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldclr4_relax(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldclr4_relax(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldclr4_relax(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_relaxed); + } + +-uint32_t ghc___aarch64_ldclr4_acq(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldclr4_acq(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldclr4_acq(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldclr4_acq(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_acquire); + } + +-uint32_t ghc___aarch64_ldclr4_rel(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldclr4_rel(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldclr4_rel(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldclr4_rel(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_release); + } + +-uint32_t ghc___aarch64_ldclr4_acq_rel(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldclr4_acq_rel(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldclr4_acq_rel(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldclr4_acq_rel(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_acq_rel); + } + +-uint32_t ghc___aarch64_ldclr4_sync(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldclr4_sync(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldclr4_sync(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldclr4_sync(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_seq_cst); + } + +-uint64_t ghc___aarch64_ldclr8_relax(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldclr8_relax(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldclr8_relax(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldclr8_relax(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_relaxed); + } + +-uint64_t ghc___aarch64_ldclr8_acq(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldclr8_acq(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldclr8_acq(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldclr8_acq(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_acquire); + } + +-uint64_t ghc___aarch64_ldclr8_rel(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldclr8_rel(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldclr8_rel(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldclr8_rel(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_release); + } + +-uint64_t ghc___aarch64_ldclr8_acq_rel(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldclr8_acq_rel(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldclr8_acq_rel(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldclr8_acq_rel(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_acq_rel); + } + +-uint64_t ghc___aarch64_ldclr8_sync(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldclr8_sync(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldclr8_sync(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldclr8_sync(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_and_explicit(p, v, memory_order_seq_cst); + } + +-uint8_t ghc___aarch64_ldeor1_relax(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldeor1_relax(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldeor1_relax(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldeor1_relax(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_relaxed); + } + +-uint8_t ghc___aarch64_ldeor1_acq(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldeor1_acq(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldeor1_acq(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldeor1_acq(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_acquire); + } + +-uint8_t ghc___aarch64_ldeor1_rel(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldeor1_rel(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldeor1_rel(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldeor1_rel(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_release); + } + +-uint8_t ghc___aarch64_ldeor1_acq_rel(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldeor1_acq_rel(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldeor1_acq_rel(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldeor1_acq_rel(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_acq_rel); + } + +-uint8_t ghc___aarch64_ldeor1_sync(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldeor1_sync(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldeor1_sync(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldeor1_sync(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_seq_cst); + } + +-uint16_t ghc___aarch64_ldeor2_relax(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldeor2_relax(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldeor2_relax(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldeor2_relax(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_relaxed); + } + +-uint16_t ghc___aarch64_ldeor2_acq(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldeor2_acq(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldeor2_acq(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldeor2_acq(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_acquire); + } + +-uint16_t ghc___aarch64_ldeor2_rel(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldeor2_rel(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldeor2_rel(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldeor2_rel(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_release); + } + +-uint16_t ghc___aarch64_ldeor2_acq_rel(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldeor2_acq_rel(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldeor2_acq_rel(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldeor2_acq_rel(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_acq_rel); + } + +-uint16_t ghc___aarch64_ldeor2_sync(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldeor2_sync(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldeor2_sync(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldeor2_sync(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_seq_cst); + } + +-uint32_t ghc___aarch64_ldeor4_relax(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldeor4_relax(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldeor4_relax(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldeor4_relax(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_relaxed); + } + +-uint32_t ghc___aarch64_ldeor4_acq(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldeor4_acq(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldeor4_acq(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldeor4_acq(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_acquire); + } + +-uint32_t ghc___aarch64_ldeor4_rel(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldeor4_rel(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldeor4_rel(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldeor4_rel(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_release); + } + +-uint32_t ghc___aarch64_ldeor4_acq_rel(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldeor4_acq_rel(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldeor4_acq_rel(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldeor4_acq_rel(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_acq_rel); + } + +-uint32_t ghc___aarch64_ldeor4_sync(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldeor4_sync(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldeor4_sync(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldeor4_sync(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_seq_cst); + } + +-uint64_t ghc___aarch64_ldeor8_relax(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldeor8_relax(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldeor8_relax(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldeor8_relax(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_relaxed); + } + +-uint64_t ghc___aarch64_ldeor8_acq(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldeor8_acq(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldeor8_acq(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldeor8_acq(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_acquire); + } + +-uint64_t ghc___aarch64_ldeor8_rel(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldeor8_rel(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldeor8_rel(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldeor8_rel(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_release); + } + +-uint64_t ghc___aarch64_ldeor8_acq_rel(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldeor8_acq_rel(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldeor8_acq_rel(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldeor8_acq_rel(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_acq_rel); + } + +-uint64_t ghc___aarch64_ldeor8_sync(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldeor8_sync(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldeor8_sync(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldeor8_sync(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_xor_explicit(p, v, memory_order_seq_cst); + } + +-uint8_t ghc___aarch64_ldset1_relax(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldset1_relax(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldset1_relax(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldset1_relax(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_relaxed); + } + +-uint8_t ghc___aarch64_ldset1_acq(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldset1_acq(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldset1_acq(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldset1_acq(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_acquire); + } + +-uint8_t ghc___aarch64_ldset1_rel(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldset1_rel(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldset1_rel(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldset1_rel(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_release); + } + +-uint8_t ghc___aarch64_ldset1_acq_rel(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldset1_acq_rel(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldset1_acq_rel(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldset1_acq_rel(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_acq_rel); + } + +-uint8_t ghc___aarch64_ldset1_sync(uint8_t v, uint8_t* p); +-uint8_t ghc___aarch64_ldset1_sync(uint8_t v, uint8_t* p) { ++uint8_t ghc___aarch64_ldset1_sync(uint8_t v, _Atomic uint8_t* p); ++uint8_t ghc___aarch64_ldset1_sync(uint8_t v, _Atomic uint8_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_seq_cst); + } + +-uint16_t ghc___aarch64_ldset2_relax(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldset2_relax(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldset2_relax(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldset2_relax(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_relaxed); + } + +-uint16_t ghc___aarch64_ldset2_acq(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldset2_acq(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldset2_acq(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldset2_acq(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_acquire); + } + +-uint16_t ghc___aarch64_ldset2_rel(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldset2_rel(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldset2_rel(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldset2_rel(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_release); + } + +-uint16_t ghc___aarch64_ldset2_acq_rel(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldset2_acq_rel(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldset2_acq_rel(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldset2_acq_rel(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_acq_rel); + } + +-uint16_t ghc___aarch64_ldset2_sync(uint16_t v, uint16_t* p); +-uint16_t ghc___aarch64_ldset2_sync(uint16_t v, uint16_t* p) { ++uint16_t ghc___aarch64_ldset2_sync(uint16_t v, _Atomic uint16_t* p); ++uint16_t ghc___aarch64_ldset2_sync(uint16_t v, _Atomic uint16_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_seq_cst); + } + +-uint32_t ghc___aarch64_ldset4_relax(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldset4_relax(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldset4_relax(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldset4_relax(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_relaxed); + } + +-uint32_t ghc___aarch64_ldset4_acq(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldset4_acq(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldset4_acq(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldset4_acq(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_acquire); + } + +-uint32_t ghc___aarch64_ldset4_rel(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldset4_rel(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldset4_rel(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldset4_rel(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_release); + } + +-uint32_t ghc___aarch64_ldset4_acq_rel(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldset4_acq_rel(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldset4_acq_rel(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldset4_acq_rel(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_acq_rel); + } + +-uint32_t ghc___aarch64_ldset4_sync(uint32_t v, uint32_t* p); +-uint32_t ghc___aarch64_ldset4_sync(uint32_t v, uint32_t* p) { ++uint32_t ghc___aarch64_ldset4_sync(uint32_t v, _Atomic uint32_t* p); ++uint32_t ghc___aarch64_ldset4_sync(uint32_t v, _Atomic uint32_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_seq_cst); + } + +-uint64_t ghc___aarch64_ldset8_relax(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldset8_relax(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldset8_relax(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldset8_relax(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_relaxed); + } + +-uint64_t ghc___aarch64_ldset8_acq(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldset8_acq(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldset8_acq(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldset8_acq(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_acquire); + } + +-uint64_t ghc___aarch64_ldset8_rel(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldset8_rel(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldset8_rel(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldset8_rel(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_release); + } + +-uint64_t ghc___aarch64_ldset8_acq_rel(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldset8_acq_rel(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldset8_acq_rel(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldset8_acq_rel(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_acq_rel); + } + +-uint64_t ghc___aarch64_ldset8_sync(uint64_t v, uint64_t* p); +-uint64_t ghc___aarch64_ldset8_sync(uint64_t v, uint64_t* p) { ++uint64_t ghc___aarch64_ldset8_sync(uint64_t v, _Atomic uint64_t* p); ++uint64_t ghc___aarch64_ldset8_sync(uint64_t v, _Atomic uint64_t* p) { + return atomic_fetch_or_explicit(p, v, memory_order_seq_cst); + } + From 9373393c6bd3d6e70ee30dcca3b89ded3f531ddb Mon Sep 17 00:00:00 2001 From: Hamish Mackenzie Date: Thu, 23 Oct 2025 11:12:26 +1300 Subject: [PATCH 2/2] Fix patch upper bound --- overlays/bootstrap.nix | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/overlays/bootstrap.nix b/overlays/bootstrap.nix index ed17a66310..2da240b20f 100644 --- a/overlays/bootstrap.nix +++ b/overlays/bootstrap.nix @@ -336,7 +336,7 @@ in { ++ onAndroid (from "9.6" ./patches/ghc/ghc-9.6-COMPAT_R_ARM_PREL31.patch) ++ onAndroid (from "9.10" ./patches/ghc/ghc-9.10-ignore-libc.patch) # unbreak modern clang with proper _atomic declarations. - ++ onAndroid (fromUntil "9.6" "9.12" ./patches/ghc/7db8c9927fae3369fc4ecff68f80c4cb32eea757.patch) + ++ onAndroid (fromUntil "9.6" "9.6.5" ./patches/ghc/7db8c9927fae3369fc4ecff68f80c4cb32eea757.patch) ++ onGhcjs (from "9.12" ./patches/ghc/ghc-9.12-ghcjs-rts-mem-heap8.patch) # Fix for `fatal error: 'rts/Types.h' file not found` when building `primitive`