diff mbox series

[bug#45252] gnu: libffi: Add unreleased patch to fix float128 on powerpc64le.

Message ID 8fc771beb3f0f1e2886a238e0ef9087908c98fc1.camel@free.fr
State Accepted
Headers show
Series [bug#45252] gnu: libffi: Add unreleased patch to fix float128 on powerpc64le. | expand

Checks

Context Check Description
cbaines/submitting builds success
cbaines/comparison success View comparision
cbaines/git branch success View Git branch
cbaines/applying patch fail View Laminar job
cbaines/issue success View issue

Commit Message

dftxbs3e Dec. 15, 2020, 9:32 a.m. UTC
Hello!

Based on previous discussions to apply <
https://debbugs.gnu.org/cgi/bugreport.cgi?bug=44778> on the master
branch instead I submit this new patch (attached) so that it does not
cause a world rebuild by not altering the package definition hash on
other platforms.

Thank you!

Comments

Christopher Marusich Dec. 20, 2020, 8:32 p.m. UTC | #1
Hi,

dftxbs3e <dftxbs3e@free.fr> writes:

> Based on previous discussions to apply <
> https://debbugs.gnu.org/cgi/bugreport.cgi?bug=44778> on the master
> branch instead I submit this new patch (attached) so that it does not
> cause a world rebuild by not altering the package definition hash on
> other platforms.

My understanding is as follows:

- Patch 44778, linked above, was committed on core-updates branch in
  4fff5ab24126a152b50c036b9bf8dc6f2740f094.
- The libffi patch in this patch (45252) is the same as it was in 44778,
  but the scheme code has been changed so that we can apply this patch
  to the master branch without causing a rebuild of many packages.

Is that right?

> +             '())
> +       ,@(if (string-prefix? "powerpc64le-" (or (%current-target-system)
> +                                                (%current-system)))
> +             '(#:phases (modify-phases %standard-phases
> +                          (add-after 'unpack 'apply-patch2
> +                            (lambda* (#:key inputs #:allow-other-keys)
> +                              (let ((patch (assoc-ref inputs
> +                                                      "powerpc64le-patch")))
> +                                (invoke "patch" "--batch" "-p1"
> +                                        "-i" patch))))))
>               '())))
>      (inputs
> -     (if (string-prefix? "powerpc-" (or (%current-target-system)
> +     (cond
> +      ((string-prefix? "powerpc-" (or (%current-target-system)
>                                          (%current-system)))
> -         `(("powerpc-patch" ,@(search-patches
> -                               "libffi-3.3-powerpc-fixes.patch")))
> -         '()))
> +       `(("powerpc-patch" ,@(search-patches
> +                             "libffi-3.3-powerpc-fixes.patch"))))
> +      ((string-prefix? "powerpc64le-" (or (%current-target-system)
> +                                          (%current-system)))
> +       `(("powerpc64le-patch" ,@(search-patches
> +                                 "libffi-float128-powerpc64le.patch"))))
> +      (else '())))

Looks good to me.  I'll test it locally and update here once I've
confirmed that it doesn't cause a full rebuild when applied to master.
Assuming all goes well, I intend to revert
4fff5ab24126a152b50c036b9bf8dc6f2740f094 on core-updates and apply this
patch to master.

> +++ b/gnu/packages/patches/libffi-float128-powerpc64le.patch

Based on...

https://patchwork.ozlabs.org/project/buildroot/patch/20191124090305.1015485-1-fontaine.fabrice@gmail.com/

...it sounds like upstream libffi maintainers may not have merged this
patch yet.  We should probably check with them to see when they plan to
merge it into upstream, but in the meantime there's no reason not to use
the patch if it works.  Based on what Fabrice said in that thread, it
sounds like the libffi maintainers may be a bit slow in responding to
power-related bugs.
dftxbs3e Dec. 20, 2020, 8:36 p.m. UTC | #2
On Sun, 2020-12-20 at 12:32 -0800, Chris Marusich wrote:
> Hi,
Hello!

> My understanding is as follows:
> 
> - Patch 44778, linked above, was committed on core-updates branch in
>   4fff5ab24126a152b50c036b9bf8dc6f2740f094.
> - The libffi patch in this patch (45252) is the same as it was in
> 44778,
>   but the scheme code has been changed so that we can apply this
> patch
>   to the master branch without causing a rebuild of many packages.
> 
> Is that right?

Exactly!

> Based on...
> 
> https://patchwork.ozlabs.org/project/buildroot/patch/20191124090305.1015485-1-fontaine.fabrice@gmail.com/
> 
> ...it sounds like upstream libffi maintainers may not have merged
> this
> patch yet.  We should probably check with them to see when they plan
> to
> merge it into upstream, but in the meantime there's no reason not to
> use
> the patch if it works.  Based on what Fabrice said in that thread, it
> sounds like the libffi maintainers may be a bit slow in responding to
> power-related bugs.
> 

That's not true, they've merged the patch: <
https://github.com/libffi/libffi/pull/561> - they just did not make a
release yet.

Leo
Christopher Marusich Dec. 21, 2020, 1:30 a.m. UTC | #3
Hi,

dftxbs3e <dftxbs3e@free.fr> writes:

>> Based on...
>> 
>> https://patchwork.ozlabs.org/project/buildroot/patch/20191124090305.1015485-1-fontaine.fabrice@gmail.com/
>> 
>> ...it sounds like upstream libffi maintainers may not have merged
>> this
>> patch yet.  We should probably check with them to see when they plan
>> to
>> merge it into upstream, but in the meantime there's no reason not to
>> use
>> the patch if it works.  Based on what Fabrice said in that thread, it
>> sounds like the libffi maintainers may be a bit slow in responding to
>> power-related bugs.
>> 
>
> That's not true, they've merged the patch: <
> https://github.com/libffi/libffi/pull/561> - they just did not make a
> release yet.

Ah, OK.  That's good to know!

I've committed this patch in 7eaa2f24ea77cddbb4bbc2d6a6905673a36f8f99 on
master.  I've also reverted 4fff5ab24126a152b50c036b9bf8dc6f2740f094 in
commit b50341dba9811c048bed852c0279b828c7ddba66 on core-updates.  I
think we should be good to go to try building powerpc64-linux-gnu
bootstrap-tarballs now!

I confirmed that this commit on master would not cause dependents of
libffi to be rebuilt by verifying that the derivation for one of its
dependent packages, guile, did not change before/after the change.
Mark H Weaver Dec. 22, 2020, 5:15 a.m. UTC | #4
Hi,

There's a problem with the following commit:

> commit 7eaa2f24ea77cddbb4bbc2d6a6905673a36f8f99
> Author: John Doe <dftxbs3e@free.fr>
> Date:   Tue Dec 15 10:23:44 2020 +0100
> 
>   gnu: libffi: Add unreleased patch to fix float128 on powerpc64le.
>   
>   Fixes <https://bugs.gnu.org/45252>.
>   
>   * gnu/packages/patches/libffi-float128-powerpc64le.patch: Import patch file
>   from <https://github.com/libffi/libffi/pull/561.patch>.
>   * gnu/packages/libffi.scm (libffi)[arguments]: Apply patch conditionally for
>   powerpc64le-* systems in a phase.
>   [inputs]: Add patch as input conditionally for powerpc64le-* systems.
>   * gnu/local.mk (dist_patch_DATA): Add patch file to build system.
>   
>   Signed-off-by: Chris Marusich <cmmarusich@gmail.com>

The problem is in how the 'patch' program is invoked, here:

> diff --git a/gnu/packages/libffi.scm b/gnu/packages/libffi.scm
> index d324892330..66239e0363 100644
> --- a/gnu/packages/libffi.scm
> +++ b/gnu/packages/libffi.scm
[...]
> @@ -67,13 +68,28 @@
>                                                        "powerpc-patch")))
>                                  (invoke "patch" "--batch" "-p1"
>                                          "-i" patch))))))
> +             '())
> +       ,@(if (string-prefix? "powerpc64le-" (or (%current-target-system)
> +                                                (%current-system)))
> +             '(#:phases (modify-phases %standard-phases
> +                          (add-after 'unpack 'apply-patch2
> +                            (lambda* (#:key inputs #:allow-other-keys)
> +                              (let ((patch (assoc-ref inputs
> +                                                      "powerpc64le-patch")))
> +                                (invoke "patch" "--batch" "-p1"
> +                                        "-i" patch))))))
>               '())))

When invoking 'patch' in Guix, you should *always* use "--force" instead
of "--batch".  There's a crucial difference between these two options:
If 'patch' finds that the given patch has already been applied, then
"--batch" will automatically *revert* the patch, whereas "--force" will
raise an error.  Here's the relevant section of the 'diffutils' manual:

> 10.11.2 Inhibiting Keyboard Input
> ---------------------------------
> 
> There are two ways you can prevent 'patch' from asking you any
> questions.  The '--force' ('-f') option assumes that you know what you
> are doing.  It causes 'patch' to do the following:
> 
>    * Skip patches that do not contain file names in their headers.
> 
>    * Patch files even though they have the wrong version for the
>      'Prereq:' line in the patch;
> 
>    * Assume that patches are not reversed even if they look like they
>      are.
> 
> The '--batch' ('-t') option is similar to '-f', in that it suppresses
> questions, but it makes somewhat different assumptions:
> 
>    * Skip patches that do not contain file names in their headers (the
>      same as '-f').
> 
>    * Skip patches for which the file has the wrong version for the
>      'Prereq:' line in the patch;
> 
>    * Assume that patches are reversed if they look like they are.

Now consider what will happen when we upgrade 'libffi' to a newer
version that already includes this fix.  If the Guix developer who
performs the upgrade forgets to remove this patch, the 'patch'
invocation above will start silently re-inserting the old bug.

We ran into this exact problem in the early years of Guix, and
henceforth changed all of the invocations of 'patch' to use '--force'.

Can we fix this right away, before many powerpc64le-* binaries are built
on top of it?

In any case, thanks very much for working on the powerpc64le port!

      Regards,
        Mark
Mark H Weaver Dec. 22, 2020, 6 a.m. UTC | #5
Earlier, I wrote:
> When invoking 'patch' in Guix, you should *always* use "--force" instead
> of "--batch".

(See <https://bugs.gnu.org/45252#19> for my earlier message).

Since writing the message above, I've found another problem in the same
commit (7eaa2f24ea77cddbb4bbc2d6a6905673a36f8f99): it searches for the
'patch' program in 'inputs'.  This is a mistake, because when
cross-compiling, 'inputs' will contain software compiled to run on the
target system instead of the build system.

If 'native-inputs' is not #f, we should search for the 'patch' program
in 'native-inputs' instead of 'inputs'.  Unless there's now a better way
that I don't know, I suggest adding 'native-inputs' to the list of
keyword arguments accepted by the 'lambda*', and changing 'inputs' to
"(or native-inputs inputs)" in the call to 'assoc-ref'.  Something like
this (untested):

_ ,@(if (string-prefix? "powerpc64le-" (or (%current-target-system)
__________________________________________ (%current-system)))
_______ '(#:phases (modify-phases %standard-phases
____________________ (add-after 'unpack 'apply-patch2
______________________ (lambda* (#:key inputs native-inputs
________________________________ #:allow-other-keys)
________________________ (let ((patch (assoc-ref (or native-inputs inputs)
________________________________________________ "powerpc64le-patch")))
__________________________ (invoke "patch" "--force" "-p1"
__________________________________ "-i" patch))))))
_______ '())

I see now that both of these mistakes were already present in the
"powerpc-*" case immediately above the recently-added "powerpc64le-*"
case.  The "powerpc-*" case was added earlier this year in the following
commit:

  https://git.sv.gnu.org/cgit/guix.git/commit/?id=02f5ee01c96589fc13f1e21b85b0b48100aec4e8

I'm CC'ing 'guix-devel' to raise awareness about these common mistakes,
in the hopes that reviewers will be more likely to notice them in the
future.

      Thanks,
        Mark
diff mbox series

Patch

From 05c3dc588745240fb790f9a39111be70c153d70c Mon Sep 17 00:00:00 2001
From: John Doe <dftxbs3e@free.fr>
Date: Tue, 15 Dec 2020 10:24:11 +0100
Subject: [PATCH] gnu: libffi: Add unreleased patch to fix float128 on
 powerpc64le.

* gnu/packages/patches/libffi-float128-powerpc64le.patch: Import patch
  file from <https://github.com/libffi/libffi/pull/561.patch>.
* gnu/packages/libffi.scm (libffi):
  [arguments]: Apply patch conditionally for powerpc64le-* systems in a phase.
  [inputs]: Add patch as input conditionally for powerpc64le-* systems.
* gnu/local.mk (dist_patch_DATA): Add patch file to build system.
---
 gnu/local.mk                                  |  1 +
 gnu/packages/libffi.scm                       | 25 ++++++--
 .../patches/libffi-float128-powerpc64le.patch | 58 +++++++++++++++++++
 3 files changed, 79 insertions(+), 5 deletions(-)
 create mode 100644 gnu/packages/patches/libffi-float128-powerpc64le.patch

diff --git a/gnu/local.mk b/gnu/local.mk
index 0b4cf23838..e190df0667 100644
--- a/gnu/local.mk
+++ b/gnu/local.mk
@@ -1208,6 +1208,7 @@  dist_patch_DATA =						\
   %D%/packages/patches/julia-SOURCE_DATE_EPOCH-mtime.patch	\
   %D%/packages/patches/kdbusaddons-kinit-file-name.patch	\
   %D%/packages/patches/libffi-3.3-powerpc-fixes.patch		\
+  %D%/packages/patches/libffi-float128-powerpc64le.patch	\
   %D%/packages/patches/libvirt-create-machine-cgroup.patch	\
   %D%/packages/patches/libziparchive-add-includes.patch		\
   %D%/packages/patches/localed-xorg-keyboard.patch		\
diff --git a/gnu/packages/libffi.scm b/gnu/packages/libffi.scm
index d324892330..e4bfe6731b 100644
--- a/gnu/packages/libffi.scm
+++ b/gnu/packages/libffi.scm
@@ -57,7 +57,7 @@ 
        ;; compiler.  See "ax_cc_maxopt.m4" and "ax_gcc_archflag.m4".
        #:configure-flags '("--enable-portable-binary" "--without-gcc-arch")
 
-       ;; TODO: Inline patch on next rebuild cycle.
+       ;; TODO: Inline patches on next rebuild cycle.
        ,@(if (string-prefix? "powerpc-" (or (%current-target-system)
                                             (%current-system)))
              '(#:phases (modify-phases %standard-phases
@@ -67,13 +67,28 @@ 
                                                       "powerpc-patch")))
                                 (invoke "patch" "--batch" "-p1"
                                         "-i" patch))))))
+             '())
+       ,@(if (string-prefix? "powerpc64le-" (or (%current-target-system)
+                                                (%current-system)))
+             '(#:phases (modify-phases %standard-phases
+                          (add-after 'unpack 'apply-patch2
+                            (lambda* (#:key inputs #:allow-other-keys)
+                              (let ((patch (assoc-ref inputs
+                                                      "powerpc64le-patch")))
+                                (invoke "patch" "--batch" "-p1"
+                                        "-i" patch))))))
              '())))
     (inputs
-     (if (string-prefix? "powerpc-" (or (%current-target-system)
+     (cond
+      ((string-prefix? "powerpc-" (or (%current-target-system)
                                         (%current-system)))
-         `(("powerpc-patch" ,@(search-patches
-                               "libffi-3.3-powerpc-fixes.patch")))
-         '()))
+       `(("powerpc-patch" ,@(search-patches
+                             "libffi-3.3-powerpc-fixes.patch"))))
+      ((string-prefix? "powerpc64le-" (or (%current-target-system)
+                                          (%current-system)))
+       `(("powerpc64le-patch" ,@(search-patches
+                                 "libffi-float128-powerpc64le.patch"))))
+      (else '())))
     (outputs '("out" "debug"))
     (synopsis "Foreign function call interface library")
     (description
diff --git a/gnu/packages/patches/libffi-float128-powerpc64le.patch b/gnu/packages/patches/libffi-float128-powerpc64le.patch
new file mode 100644
index 0000000000..4fd32b0102
--- /dev/null
+++ b/gnu/packages/patches/libffi-float128-powerpc64le.patch
@@ -0,0 +1,58 @@ 
+From de93adfb6f48100946bba2c3abad2a77a0cfde0b Mon Sep 17 00:00:00 2001
+From: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+Date: Sun, 24 Nov 2019 09:52:01 +0100
+Subject: [PATCH] ffi_powerpc.h: fix build failure with powerpc7
+
+This is a patch pulled down from the following:
+https://github.com/buildroot/buildroot/blob/78926f610b1411b03464152472fd430012deb9ac/package/libffi/0004-ffi_powerpc.h-fix-build-failure-with-powerpc7.patch
+
+This issue is being hit on OpenBMC code when pulling the latest
+libffi tag and building on a P8 ppc64le machine. I verified this
+patch fixes the issue we are seeing.
+
+Below is the original commit message:
+
+Sicne commit 73dd43afc8a447ba98ea02e9aad4c6898dc77fb0, build on powerpc7
+fails on:
+
+In file included from ../src/powerpc/ffi.c:33:0:
+../src/powerpc/ffi_powerpc.h:61:9: error: '_Float128' is not supported on this target
+ typedef _Float128 float128;
+         ^~~~~~~~~
+
+Fix this build failure by checking for __HAVE_FLOAT128 before using
+_Float128, as _Float128 is enabled only on specific conditions, see
+output/host/powerpc64-buildroot-linux-gnu/sysroot/usr/include/bits/floatn.h:
+
+ /* Defined to 1 if the current compiler invocation provides a
+    floating-point type with the IEEE 754 binary128 format, and this glibc
+    includes corresponding *f128 interfaces for it.  */
+ #if defined _ARCH_PWR8 && defined __LITTLE_ENDIAN__ && (_CALL_ELF == 2) \
+     && defined __FLOAT128__ && !defined __NO_LONG_DOUBLE_MATH
+ # define __HAVE_FLOAT128 1
+ #else
+ # define __HAVE_FLOAT128 0
+ #endif
+
+Fixes:
+ - http://autobuild.buildroot.org/results/5c9dd8fb3b6a128882b6250f197c80232d8a3b53
+
+Signed-off-by: Fabrice Fontaine <fontaine.fabrice@gmail.com>
+Signed-off-by: Andrew Geissler <geissonator@yahoo.com>
+---
+ src/powerpc/ffi_powerpc.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/powerpc/ffi_powerpc.h b/src/powerpc/ffi_powerpc.h
+index 8e2f2f0e..960a5c42 100644
+--- a/src/powerpc/ffi_powerpc.h
++++ b/src/powerpc/ffi_powerpc.h
+@@ -57,7 +57,7 @@ typedef union
+   double d;
+ } ffi_dblfl;
+ 
+-#if defined(__FLOAT128_TYPE__)
++#if defined(__FLOAT128_TYPE__) && defined(__HAVE_FLOAT128)
+ typedef _Float128 float128;
+ #elif defined(__FLOAT128__)
+ typedef __float128 float128;
-- 
2.29.2