From 26c20b50a52c121bcdda21a16b4b0f85e2c2b0c6 Mon Sep 17 00:00:00 2001
From: Kevin Mihelich <kevin@archlinuxarm.org>
Date: Sun, 19 Apr 2020 16:44:48 +0000
Subject: [PATCH] community/ldc to 1.20.1-3

---
 community/ldc/PKGBUILD                        | 23 +++++---
 .../ldc/fix-llvm_prefetch-for-LLVM-10.patch   | 55 +++++++++++++++++++
 2 files changed, 69 insertions(+), 9 deletions(-)
 create mode 100644 community/ldc/fix-llvm_prefetch-for-LLVM-10.patch

diff --git a/community/ldc/PKGBUILD b/community/ldc/PKGBUILD
index 4c38dc9a7..163813dac 100644
--- a/community/ldc/PKGBUILD
+++ b/community/ldc/PKGBUILD
@@ -13,9 +13,9 @@ groups=('dlang' 'dlang-ldc')
 pkgver=1.20.1
 _pkgcommit=96437a25c28a2a6fbeb36dc6a46b600e56021051
 _dversion=2.090.1
-_clangversion=9.0.1 # related to where ldc2 looks for compiler-rt sanitizers
+_clangversion=10.0.0 # related to where ldc2 looks for compiler-rt sanitizers
 epoch=2
-pkgrel=1
+pkgrel=3
 pkgdesc="A D Compiler based on the LLVM Compiler Infrastructure including D runtime and libphobos2"
 arch=('x86_64')
 url="https://github.com/ldc-developers/ldc"
@@ -24,25 +24,30 @@ makedepends=('git' 'cmake' 'llvm' 'ldc')
 
 source=(
     "git+https://github.com/ldc-developers/ldc#commit=$_pkgcommit"
-    "git+https://github.com/ldc-developers/druntime.git"
-    "git+https://github.com/ldc-developers/phobos.git"
-    "git+https://github.com/ldc-developers/dmd-testsuite.git"
+    "ldc-druntime::git+https://github.com/ldc-developers/druntime.git"
+    "ldc-phobos::git+https://github.com/ldc-developers/phobos.git"
+    "ldc-testsuite::git+https://github.com/ldc-developers/dmd-testsuite.git"
+    "fix-llvm_prefetch-for-LLVM-10.patch"
 )
 
 sha256sums=('SKIP'
             'SKIP'
             'SKIP'
-            'SKIP')
+            'SKIP'
+            'f123e482402416d262739a21de4c156cc37912c0f796f9d2239607a173680e28')
 
 prepare() {
     cd "$srcdir/ldc"
 
     git submodule init
-    git config submodule.druntime.url "$srcdir/druntime"
-    git config submodule.phobos.url "$srcdir/phobos"
-    git config submodule.tests/d2/dmd-testsuite.url "$srcdir/dmd-testsuite"
+    git config submodule.druntime.url "$srcdir/ldc-druntime"
+    git config submodule.phobos.url "$srcdir/ldc-phobos"
+    git config submodule.tests/d2/dmd-testsuite.url "$srcdir/ldc-testsuite"
     git submodule update
 
+    # https://github.com/ldc-developers/ldc/issues/3397
+    patch -Np1 -d runtime/druntime <../fix-llvm_prefetch-for-LLVM-10.patch
+
     # Set version used for path construction in getFullClangCompilerRTLibPath()
     sed -i "s/ldc::llvm_version_base/\"$_clangversion\"/" driver/linker-gcc.cpp
 }
diff --git a/community/ldc/fix-llvm_prefetch-for-LLVM-10.patch b/community/ldc/fix-llvm_prefetch-for-LLVM-10.patch
new file mode 100644
index 000000000..5f8365c33
--- /dev/null
+++ b/community/ldc/fix-llvm_prefetch-for-LLVM-10.patch
@@ -0,0 +1,55 @@
+diff --git a/src/core/simd.d b/src/core/simd.d
+index c27dc4c1..7641c8a9 100644
+--- a/src/core/simd.d
++++ b/src/core/simd.d
+@@ -84,6 +84,20 @@ version (LDC)
+         enum dataCache = 1;
+         llvm_prefetch(address, writeFetch, locality, dataCache);
+     }
++
++    unittest
++    {
++        float[4] data = [ 0.5, 1, 1.5, 2 ];
++        auto ptr = &data[0];
++
++        prefetch!(false, 0)(ptr);
++        auto v = loadUnaligned!float4(ptr);
++        v *= 2;
++        storeUnaligned!float4(v, ptr);
++
++        float[4] expected = [ 1, 2, 3, 4 ];
++        assert(data == expected);
++    }
+ }
+ else version (D_SIMD)
+ {
+diff --git a/src/ldc/intrinsics.di b/src/ldc/intrinsics.di
+index 914cd5e1..091b2aac 100644
+--- a/src/ldc/intrinsics.di
++++ b/src/ldc/intrinsics.di
+@@ -129,6 +129,14 @@ pragma(LDC_intrinsic, "llvm.stacksave")
+ pragma(LDC_intrinsic, "llvm.stackrestore")
+     void llvm_stackrestore(void* ptr);
+ 
++version(INTRINSICS_FROM_1000)
++{
++    private enum llvm_prefetch_fullname = "llvm.prefetch.p0i8";
++}
++else
++{
++    private enum llvm_prefetch_fullname = "llvm.prefetch";
++}
+ /// The 'llvm.prefetch' intrinsic is a hint to the code generator to insert a
+ /// prefetch instruction if supported; otherwise, it is a noop. Prefetches have
+ /// no effect on the behavior of the program but can change its performance
+@@ -139,8 +147,8 @@ pragma(LDC_intrinsic, "llvm.stackrestore")
+ /// keep in cache. The cache type specifies whether the prefetch is performed on
+ /// the data (1) or instruction (0) cache. The rw, locality and cache type
+ /// arguments must be constant integers.
+-pragma(LDC_intrinsic, "llvm.prefetch")
+-    void llvm_prefetch(void* ptr, uint rw, uint locality, uint cachetype) pure @safe;
++pragma(LDC_intrinsic, llvm_prefetch_fullname)
++    void llvm_prefetch(const(void)* ptr, uint rw, uint locality, uint cachetype) pure @safe;
+ 
+ /// The 'llvm.pcmarker' intrinsic is a method to export a Program Counter (PC)
+ /// in a region of code to simulators and other tools. The method is target