diff mbox series

[1/1] erlang: support builds when gcc __atomic_* exist

Message ID 20210508222419.586915-1-fhunleth@troodon-software.com
State Accepted
Headers show
Series [1/1] erlang: support builds when gcc __atomic_* exist | expand

Commit Message

Frank Hunleth May 8, 2021, 10:24 p.m. UTC
While Erlang will use it's own atomic operations, it can also use gcc
__atomic_* builtins. This is now listed in Erlang's HOWTO/INSTALL.md.

This change was necessary on RISC-V, since Erlang didn't have a built-in
implementation, but it was able to use gcc's __atomic_* functions.

Signed-off-by: Frank Hunleth <fhunleth@troodon-software.com>
---
 package/erlang/Config.in | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

Comments

Thomas Petazzoni July 28, 2021, 9:35 p.m. UTC | #1
On Sat,  8 May 2021 18:24:19 -0400
Frank Hunleth <fhunleth@troodon-software.com> wrote:

> While Erlang will use it's own atomic operations, it can also use gcc
> __atomic_* builtins. This is now listed in Erlang's HOWTO/INSTALL.md.
> 
> This change was necessary on RISC-V, since Erlang didn't have a built-in
> implementation, but it was able to use gcc's __atomic_* functions.
> 
> Signed-off-by: Frank Hunleth <fhunleth@troodon-software.com>
> ---
>  package/erlang/Config.in | 6 ++++--
>  1 file changed, 4 insertions(+), 2 deletions(-)

Thanks Frank for the patch. I have applied to master. However, I think
the patch may be incomplete. Indeed, on some CPU architectures, the
atomic intrinsics are implemented in a separate library provided by
gcc, called libatomic, and one need to link against it to use those
intrinsics.

Could you try to do a build of Erlang on SPARCv8 for example ?

I suppose it will fail, and if it does, could you add some logic in
erlang.mk to link against libatomic when BR2_TOOLCHAIN_HAS_LIBATOMIC=y
(of course assuming the Erlang build system doesn't do that by itself,
of course).

Thanks!

Thomas
Frank Hunleth Aug. 2, 2021, 12:46 p.m. UTC | #2
Hi Thomas,

On Wed, Jul 28, 2021 at 5:35 PM Thomas Petazzoni
<thomas.petazzoni@bootlin.com> wrote:
>
> On Sat,  8 May 2021 18:24:19 -0400
> Frank Hunleth <fhunleth@troodon-software.com> wrote:
>
> > While Erlang will use it's own atomic operations, it can also use gcc
> > __atomic_* builtins. This is now listed in Erlang's HOWTO/INSTALL.md.
> >
> > This change was necessary on RISC-V, since Erlang didn't have a built-in
> > implementation, but it was able to use gcc's __atomic_* functions.
> >
> > Signed-off-by: Frank Hunleth <fhunleth@troodon-software.com>
> > ---
> >  package/erlang/Config.in | 6 ++++--
> >  1 file changed, 4 insertions(+), 2 deletions(-)
>
> Thanks Frank for the patch. I have applied to master. However, I think
> the patch may be incomplete. Indeed, on some CPU architectures, the
> atomic intrinsics are implemented in a separate library provided by
> gcc, called libatomic, and one need to link against it to use those
> intrinsics.
>
> Could you try to do a build of Erlang on SPARCv8 for example ?
>
> I suppose it will fail, and if it does, could you add some logic in
> erlang.mk to link against libatomic when BR2_TOOLCHAIN_HAS_LIBATOMIC=y
> (of course assuming the Erlang build system doesn't do that by itself,
> of course).

As you expected, a SPARCv8 build fails. I updated erlang.mk to pass
linker flags to link to libatomic, but still received errors. The
errors were of type:

/tmp/cc1Mog0n.s:230: Error: Architecture mismatch on "cas [%g3],%g2,%g1".
/tmp/cc1Mog0n.s:230: (Requires v9|v9a|v9b|v9c|v9d|v9e|v9v|v9m|m8;
requested architecture is v8.)

I ran out of time this morning to track this down (sorry), but it's
sounding like Erlang is doing something that's not causing function
calls into libatomic.

Right now, I'm thinking that trying to be more generic about what
platforms Erlang supports may not be worth it. I.e., change this:

        default y if BR2_i386 || BR2_x86_64 || BR2_powerpc || \
                BR2_sparc_v9 || BR2_arm || BR2_aarch64 || BR2_mipsel || \
                BR2_TOOLCHAIN_HAS_ATOMIC

to

        default y if BR2_i386 || BR2_x86_64 || BR2_powerpc || \
                BR2_sparc_v9 || BR2_arm || BR2_aarch64 || BR2_mipsel || \
                BR2_RISCV_64

What do you think?

Thanks,
Frank

Thanks,
Frank
Thomas Petazzoni Aug. 2, 2021, 12:55 p.m. UTC | #3
On Mon, 2 Aug 2021 08:46:37 -0400
Frank Hunleth <fhunleth@troodon-software.com> wrote:

> As you expected, a SPARCv8 build fails. I updated erlang.mk to pass
> linker flags to link to libatomic, but still received errors. The
> errors were of type:
> 
> /tmp/cc1Mog0n.s:230: Error: Architecture mismatch on "cas [%g3],%g2,%g1".
> /tmp/cc1Mog0n.s:230: (Requires v9|v9a|v9b|v9c|v9d|v9e|v9v|v9m|m8;
> requested architecture is v8.)
> 
> I ran out of time this morning to track this down (sorry), but it's
> sounding like Erlang is doing something that's not causing function
> calls into libatomic.
> 
> Right now, I'm thinking that trying to be more generic about what
> platforms Erlang supports may not be worth it. I.e., change this:
> 
>         default y if BR2_i386 || BR2_x86_64 || BR2_powerpc || \
>                 BR2_sparc_v9 || BR2_arm || BR2_aarch64 || BR2_mipsel || \
>                 BR2_TOOLCHAIN_HAS_ATOMIC
> 
> to
> 
>         default y if BR2_i386 || BR2_x86_64 || BR2_powerpc || \
>                 BR2_sparc_v9 || BR2_arm || BR2_aarch64 || BR2_mipsel || \
>                 BR2_RISCV_64
> 
> What do you think?

I'm fine with that. Note that it's also causing problems on other CPU
architectures:

  http://autobuild.buildroot.net/?reason=erlang%

You will however see that even on ARM64 there are some failures in
erlang-jiffy.

Best regards,

Thomas
diff mbox series

Patch

diff --git a/package/erlang/Config.in b/package/erlang/Config.in
index ab87eab6ff..b6b100f38b 100644
--- a/package/erlang/Config.in
+++ b/package/erlang/Config.in
@@ -6,9 +6,11 @@  config BR2_PACKAGE_HOST_ERLANG_ARCH_SUPPORTS
 config BR2_PACKAGE_ERLANG_ARCH_SUPPORTS
 	bool
 	# see HOWTO/INSTALL.md for Erlang's supported platforms
-	# when using its native atomic ops implementation
+	# when using its native atomic ops implementation or gcc's
+	# __atomic_* builtins
 	default y if BR2_i386 || BR2_x86_64 || BR2_powerpc || \
-		BR2_sparc_v9 || BR2_arm || BR2_aarch64 || BR2_mipsel
+		BR2_sparc_v9 || BR2_arm || BR2_aarch64 || BR2_mipsel || \
+		BR2_TOOLCHAIN_HAS_ATOMIC
 	# erlang needs host-erlang
 	depends on BR2_PACKAGE_HOST_ERLANG_ARCH_SUPPORTS