Subject: Re: [bug#31025] [core-updates] LLVM 6.0

From: Marius Bakke <[email-masked]>
Date: Wed, 04 Apr 2018 16:55:03 +0200

Ludovic Courtès <[email-masked]> writes:

> Hello!
>
> Marius Bakke <[email-masked]> skribis:
>
>> This is an update for LLVM and Clang.  I haven't yet found a package
>> that actually works with this new version; the consumers I've tested
>> does not support LLVM >4.
>>
>> However they can keep using the old version, and if there turns out to
>> be a problem with 6.0 we can fix it later since there are no dependents.
>
> Sounds good!
>
>> From 28e48a152c99c4c0911c794dd449c4df5ed193f5 Mon Sep 17 00:00:00 2001
>> From: Marius Bakke <[email-masked]>
>> Date: Sat, 31 Mar 2018 22:04:44 +0200
>> Subject: [PATCH] gnu: llvm, clang: Update to 6.0.0.
>>
>> * gnu/packages/llvm.scm (llvm, clang-runtime, clang): Update to 6.0.0.
>> (clang-from-llvm)(patches): Set to empty list.
>> [arguments]: Set CLANG_RESOURCE_DIR in #:configure-flags.  Adjust
>> substitutions depending on major version.
>> (llvm-3.8, clang-runtime-3.8, clang-3.8): New public variables.
>> (clang-3.7, clang-3.6, clang-3.5)(patches): Add 'clang-3.5-libc-search-path.patch'.
>> (clang-3.9.1)(patches): Add 'clang-3.8-libc-search-path.patch'.
>> * gnu/packages/patches/clang-6.0-libc-search-path.patch: New file.
>> * gnu/packages/patches/clang-libc-search-path.patch: Rename to ...
>> * gnu/packages/patches/clang-3.5-libc-search-path.patch: ... this.
>> * gnu/local.mk (dist_patch_DATA): Adjust accordingly.
>>
>> Add CLANG_RESOURCE_DIR (not sure if needed).
>
> Hmm?

Oops, squashing error.  It turns out that was not needed and removed in
the updated patch below.

The updated patch fixes another problem: in 3.8 (the current "clang"
variable) and 3.9, the getDriver.ResourceDir substitution was actually
ineffective, so "clang-runtime" would never be referenced.

> Does this change the derivation of ‘llvm’ proper?  If not, this could
> even go to ‘master’.

LLVM is unaffected by this patch, only "clang" is changed.  So I believe
master is fine indeed.

However as it stands, many packages would break since the "clang"
variable changes from 3.8 to 6.0.  I'll test out each dependent and
see if they can be updated or change back to 3.8/3.9 for those.

I'm busy today, but can probably commit this tomorrow.  Meanwhile, how
does the updated patch look?

FWIW I've managed to build much of Chromium 65 with this new Clang; it
still fails, but I at least get further than with GCC 5 :-/

From f070313904415cdb486a07215ae3c5011d468573 Mon Sep 17 00:00:00 2001
From: Marius Bakke <[email-masked]>
Date: Sat, 31 Mar 2018 22:04:44 +0200
Subject: [PATCH] gnu: llvm, clang: Update to 6.0.0.

* gnu/packages/llvm.scm (llvm, clang-runtime, clang): Update to 6.0.0.
(clang-from-llvm)(patches): Set to empty list.
[arguments]: Adjust substitutions depending on major version.
(llvm-3.8, clang-runtime-3.8, clang-3.8): New public variables.
(clang-3.7, clang-3.6, clang-3.5)(patches): Add 'clang-3.5-libc-search-path.patch'.
(clang-3.9.1)(patches): Add 'clang-3.8-libc-search-path.patch'.
* gnu/packages/patches/clang-6.0-libc-search-path.patch: New file.
* gnu/packages/patches/clang-libc-search-path.patch: Rename to ...
* gnu/packages/patches/clang-3.5-libc-search-path.patch: ... this.
* gnu/local.mk (dist_patch_DATA): Adjust accordingly.
---
 gnu/local.mk                                  |   3 +-
 gnu/packages/llvm.scm                         | 109 +++++++++++++-----
 ...patch => clang-3.5-libc-search-path.patch} |   0
 .../patches/clang-6.0-libc-search-path.patch  |  67 +++++++++++
 4 files changed, 151 insertions(+), 28 deletions(-)
 rename gnu/packages/patches/{clang-libc-search-path.patch => clang-3.5-libc-search-path.patch} (100%)
 create mode 100644 gnu/packages/patches/clang-6.0-libc-search-path.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 270aee26b..91668fc29 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -593,8 +593,9 @@ dist_patch_DATA =						\
   %D%/packages/patches/chmlib-inttypes.patch			\
   %D%/packages/patches/chromium-gcc5.patch			\
   %D%/packages/patches/chromium-remove-default-history.patch	\
-  %D%/packages/patches/clang-libc-search-path.patch		\
+  %D%/packages/patches/clang-3.5-libc-search-path.patch		\
   %D%/packages/patches/clang-3.8-libc-search-path.patch		\
+  %D%/packages/patches/clang-6.0-libc-search-path.patch		\
   %D%/packages/patches/clang-runtime-asan-build-fixes.patch	\
   %D%/packages/patches/clang-runtime-esan-build-fixes.patch	\
   %D%/packages/patches/classpath-aarch64-support.patch		\
diff --git a/gnu/packages/llvm.scm b/gnu/packages/llvm.scm
index 2dddbc436..98592ad09 100644
--- a/gnu/packages/llvm.scm
+++ b/gnu/packages/llvm.scm
@@ -5,6 +5,7 @@
 ;;; Copyright © 2016 Dennis Mungai <[email-masked]>
 ;;; Copyright © 2016 Ricardo Wurmus <[email-masked]>
 ;;; Copyright © 2017 Roel Janssen <[email-masked]>
+;;; Copyright © 2018 Marius Bakke <[email-masked]>
 ;;;
 ;;; This file is part of GNU Guix.
 ;;;
@@ -40,7 +41,7 @@
 (define-public llvm
   (package
     (name "llvm")
-    (version "3.8.1")
+    (version "6.0.0")
     (source
      (origin
       (method url-fetch)
@@ -48,7 +49,7 @@
                           version "/llvm-" version ".src.tar.xz"))
       (sha256
        (base32
-        "1ybmnid4pw2hxn12ax5qa5kl1ldfns0njg8533y3mzslvd5cx0kf"))))
+        "0224xvfg6h40y5lrbnb9qaq3grmdc5rg00xq03s1wxjfbf8krx8z"))))
     (build-system cmake-build-system)
     (native-inputs
      `(("python" ,python-2) ;bytes->str conversion in clang>=3.7 needs python-2
@@ -131,7 +132,7 @@ compiler.  In LLVM this library is called \"compiler-rt\".")
     (supported-systems (delete "mips64el-linux" %supported-systems))))
 
 (define* (clang-from-llvm llvm clang-runtime hash
-                          #:key (patches '("clang-libc-search-path.patch")))
+                          #:key (patches '()))
   (package
     (name "clang")
     (version (package-version llvm))
@@ -176,22 +177,50 @@ compiler.  In LLVM this library is called \"compiler-rt\".")
                    (lambda* (#:key inputs #:allow-other-keys)
                      (let ((libc (assoc-ref inputs "libc"))
                            (compiler-rt (assoc-ref inputs "clang-runtime")))
-                       (substitute* "lib/Driver/Tools.cpp"
-                         ;; Patch the 'getLinuxDynamicLinker' function to that
-                         ;; it uses the right dynamic linker file name.
-                         (("/lib64/ld-linux-x86-64.so.2")
-                          (string-append libc
-                                         ,(glibc-dynamic-linker)))
-
-                         ;; Link to libclang_rt files from clang-runtime.
-                         (("TC\\.getDriver\\(\\)\\.ResourceDir")
-                          (string-append "\"" compiler-rt "\"")))
-
-                       ;; Same for libc's libdir, to allow crt1.o & co. to be
-                       ;; found.
-                       (substitute* "lib/Driver/ToolChains.cpp"
-                         (("@GLIBC_LIBDIR@")
-                          (string-append libc "/lib")))))))))
+                       (case (string->number ,(version-major
+                                               (package-version clang-runtime)))
+                         ((6)
+                          ;; Link to libclang_rt files from clang-runtime.
+                          (substitute* "lib/Driver/ToolChain.cpp"
+                            (("getDriver\\(\\)\\.ResourceDir")
+                             (string-append "\"" compiler-rt "\"")))
+
+                          ;; Make "LibDir" refer to <glibc>/lib so that it
+                          ;; uses the right dynamic linker file name.
+                          (substitute* "lib/Driver/ToolChains/Linux.cpp"
+                            (("(^[[:blank:]]+LibDir = ).*" _ declaration)
+                             (string-append declaration "\"" libc "/lib\";\n"))
+
+                            ;; Make sure libc's libdir is on the search path, to
+                            ;; allow crt1.o & co. to be found.
+                            (("@GLIBC_LIBDIR@")
+                             (string-append libc "/lib"))))
+                         ((3)
+                          (substitute* "lib/Driver/Tools.cpp"
+                            ;; Patch the 'getLinuxDynamicLinker' function so that
+                            ;; it uses the right dynamic linker file name.
+                            (("/lib64/ld-linux-x86-64.so.2")
+                             (string-append libc
+                                            ,(glibc-dynamic-linker))))
+
+                          ;; Link to libclang_rt files from clang-runtime.
+                          ;; This substitution needed slight adjustment in 3.8.
+                          (if (< 3.8 (string->number ,(version-major+minor
+                                                       (package-version
+                                                        clang-runtime))))
+                              (substitute* "lib/Driver/Tools.cpp"
+                                (("TC\\.getDriver\\(\\)\\.ResourceDir")
+                                 (string-append "\"" compiler-rt "\"")))
+                              (substitute* "lib/Driver/ToolChain.cpp"
+                                (("getDriver\\(\\)\\.ResourceDir")
+                                 (string-append "\"" compiler-rt "\""))))
+
+                          ;; Make sure libc's libdir is on the search path, to
+                          ;; allow crt1.o & co. to be found.
+                          (substitute* "lib/Driver/ToolChains.cpp"
+                            (("@GLIBC_LIBDIR@")
+                             (string-append libc "/lib")))))
+                       #t))))))
 
     ;; Clang supports the same environment variables as GCC.
     (native-search-paths
@@ -214,13 +243,12 @@ code analysis tools.")
 (define-public clang-runtime
   (clang-runtime-from-llvm
    llvm
-   "0p0y85c7izndbpg2l816z7z7558axq11d5pwkm4h11sdw7d13w0d"
-   '("clang-runtime-asan-build-fixes.patch")))
+   "16m7rvh3w6vq10iwkjrr1nn293djld3xm62l5zasisaprx117k6h"))
 
 (define-public clang
   (clang-from-llvm llvm clang-runtime
-                   "1prc72xmkgx8wrzmrr337776676nhsp1qd3mw2bvb22bzdnq7lsc"
-                   #:patches '("clang-3.8-libc-search-path.patch")))
+                   "0cnznvfyl3hgbg8gj58pmwf0pvd2sv5k3ccbivy6q6ggv7c6szg0"
+                   #:patches '("clang-6.0-libc-search-path.patch")))
 
 (define-public llvm-3.9.1
   (package (inherit llvm)
@@ -245,7 +273,31 @@ code analysis tools.")
 (define-public clang-3.9.1
   (clang-from-llvm llvm-3.9.1 clang-runtime-3.9.1
                    "0qsyyb40iwifhhlx9a3drf8z6ni6zwyk3bvh0kx2gs6yjsxwxi76"
-                   #:patches '()))
+                   #:patches '("clang-3.8-libc-search-path.patch")))
+
+(define-public llvm-3.8
+  (package (inherit llvm)
+    (name "llvm")
+    (version "3.8.1")
+    (source
+     (origin
+      (method url-fetch)
+      (uri (string-append "https://llvm.org/releases/"
+                          version "/llvm-" version ".src.tar.xz"))
+      (sha256
+       (base32
+        "1ybmnid4pw2hxn12ax5qa5kl1ldfns0njg8533y3mzslvd5cx0kf"))))))
+
+(define-public clang-runtime-3.8
+  (clang-runtime-from-llvm
+   llvm-3.8
+   "0p0y85c7izndbpg2l816z7z7558axq11d5pwkm4h11sdw7d13w0d"
+   '("clang-runtime-asan-build-fixes.patch")))
+
+(define-public clang-3.8
+  (clang-from-llvm llvm-3.8 clang-runtime-3.8
+                   "1prc72xmkgx8wrzmrr337776676nhsp1qd3mw2bvb22bzdnq7lsc"
+                   #:patches '("clang-3.8-libc-search-path.patch")))
 
 (define-public llvm-3.7
   (package (inherit llvm)
@@ -267,7 +319,8 @@ code analysis tools.")
 
 (define-public clang-3.7
   (clang-from-llvm llvm-3.7 clang-runtime-3.7
-                   "0x065d0w9b51xvdjxwfzjxng0gzpbx45fgiaxpap45ragi61dqjn"))
+                   "0x065d0w9b51xvdjxwfzjxng0gzpbx45fgiaxpap45ragi61dqjn"
+                   #:patches '("clang-3.5-libc-search-path.patch")))
 
 (define-public llvm-3.6
   (package (inherit llvm)
@@ -289,7 +342,8 @@ code analysis tools.")
 
 (define-public clang-3.6
   (clang-from-llvm llvm-3.6 clang-runtime-3.6
-                   "1wwr8s6lzr324hv4s1k6na4j5zv6n9kdhi14s4kb9b13d93814df"))
+                   "1wwr8s6lzr324hv4s1k6na4j5zv6n9kdhi14s4kb9b13d93814df"
+                   #:patches '("clang-3.5-libc-search-path.patch")))
 
 (define-public llvm-3.5
   (package (inherit llvm)
@@ -313,7 +367,8 @@ code analysis tools.")
 
 (define-public clang-3.5
   (clang-from-llvm llvm-3.5 clang-runtime-3.5
-                   "0846h8vn3zlc00jkmvrmy88gc6ql6014c02l4jv78fpvfigmgssg"))
+                   "0846h8vn3zlc00jkmvrmy88gc6ql6014c02l4jv78fpvfigmgssg"
+                   #:patches '("clang-3.5-libc-search-path.patch")))
 
 (define-public llvm-for-extempore
   (package (inherit llvm-3.7)
diff --git a/gnu/packages/patches/clang-libc-search-path.patch b/gnu/packages/patches/clang-3.5-libc-search-path.patch
similarity index 100%
rename from gnu/packages/patches/clang-libc-search-path.patch
rename to gnu/packages/patches/clang-3.5-libc-search-path.patch
diff --git a/gnu/packages/patches/clang-6.0-libc-search-path.patch b/gnu/packages/patches/clang-6.0-libc-search-path.patch
new file mode 100644
index 000000000..a62e8063c
--- /dev/null
+++ b/gnu/packages/patches/clang-6.0-libc-search-path.patch
@@ -0,0 +1,67 @@
+Clang attempts to guess file names based on the OS and distro (yes!),
+but unfortunately, that doesn't work for us.
+
+This patch makes it easy to insert libc's $libdir so that Clang passes the
+correct absolute file name of crt1.o etc. to 'ld'.  It also disables all
+the distro-specific stuff and removes the hard-coded FHS directory names
+to make sure Clang also works on non-GuixSD systems.
+
+--- cfe-6.0.0.src/lib/Driver/ToolChains/Linux.cpp
++++ cfe-6.0.0.src/lib/Driver/ToolChains/Linux.cpp
+@@ -207,7 +207,9 @@
+   PPaths.push_back(Twine(GCCInstallation.getParentLibPath() + "/../" +
+                          GCCInstallation.getTriple().str() + "/bin")
+                        .str());
+-
++  // Comment out the distro-specific tweaks so that they don't bite when
++  // using Guix on a foreign distro.
++#if 0
+   Distro Distro(D.getVFS());
+ 
+   if (Distro.IsAlpineLinux()) {
+@@ -255,6 +257,7 @@
+ 
+   if (IsAndroid || Distro.IsOpenSUSE())
+     ExtraOpts.push_back("--enable-new-dtags");
++#endif
+ 
+   // The selection of paths to try here is designed to match the patterns which
+   // the GCC driver itself uses, as this is part of the GCC-compatible driver.
+@@ -329,14 +332,12 @@
+     addPathIfExists(D, D.Dir + "/../" + OSLibDir, Paths);
+   }
+ 
+-  addPathIfExists(D, SysRoot + "/lib/" + MultiarchTriple, Paths);
+-  addPathIfExists(D, SysRoot + "/lib/../" + OSLibDir, Paths);
+-  addPathIfExists(D, SysRoot + "/usr/lib/" + MultiarchTriple, Paths);
+-  addPathIfExists(D, SysRoot + "/usr/lib/../" + OSLibDir, Paths);
+-
+   // Try walking via the GCC triple path in case of biarch or multiarch GCC
+   // installations with strange symlinks.
+   if (GCCInstallation.isValid()) {
++    // The following code would end up adding things like
++    // "/usr/lib/x86_64-unknown-linux-gnu/../../lib64" to the search path.
++#if 0
+     addPathIfExists(D,
+                     SysRoot + "/usr/lib/" + GCCInstallation.getTriple().str() +
+                         "/../../" + OSLibDir,
+@@ -349,6 +350,7 @@
+                              BiarchSibling.gccSuffix(),
+                       Paths);
+     }
++#endif
+ 
+     // See comments above on the multilib variant for details of why this is
+     // included even from outside the sysroot.
+@@ -373,8 +375,9 @@
+   if (StringRef(D.Dir).startswith(SysRoot))
+     addPathIfExists(D, D.Dir + "/../lib", Paths);
+ 
+-  addPathIfExists(D, SysRoot + "/lib", Paths);
+-  addPathIfExists(D, SysRoot + "/usr/lib", Paths);
++  // Add libc's lib/ directory to the search path, so that crt1.o, crti.o,
++  // and friends can be found.
++  addPathIfExists(D, "@GLIBC_LIBDIR@", Paths);
+ }
+ 
+ bool Linux::HasNativeLLVMSupport() const { return true; }
-- 
2.17.0