Closed skydig closed 2 years ago
What cpu are you trying to run it on? I suspect your cpu doesn't support an atomic instruction LLVM emits.
@bjorn3 its P1010 how to disable atomic support?
It seems to be running an e500 cpu core produced by nxp which according to the reference manual supports atonic instructions. Could you use the disassemble command in gdb to show the exact crashing instruction? As for disabling atomic usage you need to change the target spec or provide a custom one in json format. Also note that any library that depends on atomics will not compile in that case. We don't emulate them using a lock if they are unavailable.
@bjorn3 thanks, i paste assemble code, this line => 0x2060d610 <+892>: lwsync make system crash
Program received signal SIGILL, Illegal instruction.
0x2060d610 in core::sync::atomic::atomic_compare_exchange::hdd78233f59efc1d2 ()
at /usr/share/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/sync/atomic.rs:2643
2643 in /usr/share/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/sync/atomic.rs
(gdb) disassemble
Dump of assembler code for function _ZN4core4sync6atomic23atomic_compare_exchange17hdd78233f59efc1d2E:
0x2060d294 <+0>: mflr r0
0x2060d298 <+4>: stw r0,4(r1)
0x2060d29c <+8>: stwu r1,-208(r1)
0x2060d2a0 <+12>: stw r30,200(r1)
0x2060d2a4 <+16>: stw r5,64(r1)
0x2060d2a8 <+20>: stw r4,68(r1)
0x2060d2ac <+24>: stw r3,72(r1)
0x2060d2b0 <+28>: bl 0x2060d2b4 <_ZN4core4sync6atomic23atomic_compare_exchange17hdd78233f59efc1d2E+32>
0x2060d2b4 <+32>: mflr r30
0x2060d2b8 <+36>: lwz r8,-36(r30)
0x2060d2bc <+40>: add r30,r8,r30
0x2060d2c0 <+44>: stw r3,176(r1)
0x2060d2c4 <+48>: stw r4,180(r1)
0x2060d2c8 <+52>: stw r5,184(r1)
0x2060d2cc <+56>: stb r6,190(r1)
0x2060d2d0 <+60>: stb r7,191(r1)
0x2060d2d4 <+64>: stb r6,96(r1)
0x2060d2d8 <+68>: stb r7,97(r1)
0x2060d2dc <+72>: lbz r3,96(r1)
0x2060d2e0 <+76>: stw r3,76(r1)
---Type
0x2060d3c4 <+304>: lwz r3,68(r1)
0x2060d3c8 <+308>: lwz r4,72(r1)
0x2060d3cc <+312>: lwarx r4,0,r4
0x2060d3d0 <+316>: stw r4,44(r1)
0x2060d3d4 <+320>: cmpw r3,r4
0x2060d3d8 <+324>: bne 0x2060d3f0 <_ZN4core4sync6atomic23atomic_compare_exchange17hdd78233f59efc1d2E+348>
0x2060d3dc <+328>: lwz r3,64(r1)
0x2060d3e0 <+332>: lwz r4,72(r1)
0x2060d3e4 <+336>: stwcx. r3,0,r4
0x2060d3e8 <+340>: bne 0x2060d3c4 <_ZN4core4sync6atomic23atomic_compare_exchange17hdd78233f59efc1d2E+304>
0x2060d3ec <+344>: b 0x2060d3fc <_ZN4core4sync6atomic23atomic_compare_exchange17hdd78233f59efc1d2E+360>
---Type
0x2060d424 <+400>: lwz r3,68(r1)
0x2060d428 <+404>: lwz r4,72(r1)
0x2060d42c <+408>: lwarx r4,0,r4
0x2060d430 <+412>: stw r4,40(r1)
0x2060d434 <+416>: cmpw r3,r4
0x2060d438 <+420>: bne 0x2060d450 <_ZN4core4sync6atomic23atomic_compare_exchange17hdd78233f59efc1d2E+444>
0x2060d43c <+424>: lwz r3,64(r1)
0x2060d440 <+428>: lwz r4,72(r1)
---Type
0x2060d484 <+496>: lwz r3,68(r1)
0x2060d488 <+500>: lwz r4,72(r1)
0x2060d48c <+504>: lwarx r4,0,r4
0x2060d490 <+508>: stw r4,36(r1)
---Type
Looks like the e500 cpu doesn't support lwsync and needs the sync instruction instead. Does it work if you use RUSTFLAGS="-Ctarget-cpu=e500
? According to https://reviews.llvm.org/D76614 that should cause LLVM to use sync instead of lwsync.
I have a similar problem (or maybe the same?), but the disassembly seems to differ (I haven't used gdb much, so I'm not entirely sure I understand how to read it). I'm on a Synology DS213+ NAS with a FREESCALE QorIQ P1022 CPU (ppc e500 variant iirc).
It is possible the gdb version you are using doesn't know how to disassemble lwsync. I don't know exactly what the encoded version of it is though.
It is possible the gdb version you are using doesn't know how to disassemble lwsync. I don't know exactly what the encoded version of it is though.
Seems likely. I have GNU gdb (GDB) 8.0.1, which is the latest version available in the package manager (using optware-ng), but apparently quite old.
@bjorn3 thanks using RUSTFLAGS="-Ctarget-cpu=e500" , generated bin file has no lwsync instruction now( I use objdump to check), but with sync instruction. when I have chance to run generated bin under target, I will tell you the result
I tried building with RUSTFLAGS="-Ctarget-cpu=e500"
, and my example now works. :tada:
@bjorn3 thanks using RUSTFLAGS="-Ctarget-cpu=e500" , generated bin file has no lwsync instruction now( I use objdump to check), but with sync instruction. when I have chance to run generated bin under target, I will tell you the result
@mortenlj congratulations
@bjorn3 I tested under target, "-Ctarget-cpu=e500" works. this issue can be closed.
@bjorn3 I tested under target, "-Ctarget-cpu=e500" works. this issue can be closed.
@mortenlj I'm on a Synology DS213+ NAS with a FREESCALE QorIQ P1022 CPU (ppc e500 variant iirc).
Having the exact same problem, qoriq
support on Synology NAS. Did you have to build tier 3 powerpc-unknown-linux-gnuspe
target support first? Or did it worked out using tier 2 powerpc-unknown-linux-gnu
with -Ctarget-cpu=e500
build flag?
Having the exact same problem, qoriq support on Synology NAS. Did you have to build tier 3 powerpc-unknown-linux-gnuspe target support first? Or did it worked out using tier 2 powerpc-unknown-linux-gnu with -Ctarget-cpu=e500 build flag?
I build the tier 3 support first, using the synology toolchain (downloadable from some synology support site)
You can see the buildscript here (using Earthly): https://github.com/mortenlj/mqtt2file/blob/main/Earthfile
@mortenlj thnx for the hint!
I build the tier 3 support first, using the synology toolchain (downloadable from some synology support site)
I'm a SynoCommunity maintainer and we're using spksrc framework to build Synology compatible packages. In turns it does use the various synology toolchain matching arch & version.
You can see the buildscript here (using Earthly): https://github.com/mortenlj/mqtt2file/blob/main/Earthfile
First time I hear about it and will certainly have a look. But I wonder, do you hapen to have traces or logs of what it actually does behind the scene that I could manually reproduce to integrate into the framework. Later on I could potentially look into migrating things to earthly... I mean, I was able to build stage1, stage2 working out also but it fails at building the toolchain later on.
But I wonder, do you hapen to have traces or logs of what it actually does behind the scene that I could manually reproduce to integrate into the framework.
Earthly is mostly just Docker on steroids, there is nothing magical happening behind the scenes. If you follow the imports at the top, you get the definitions of the various DO
commands and BUILD
targets, where you can see that it is just a bunch of env-variables and RUN
commands.
Hi all, I know this thread is closed and I did opened-up a distinct one but I can't get to build a working powerpc gnuspe toolchain. It does build succesfully but the resulting library includes lwsync
entries in it (i.e. build/host/stage1/lib/rustlib/powerpc-unknown-linux-gnuspe/lib/libstd-3dce48a1eefa0292.so
)
My configuration is as follow:
profile = "compiler"
[build]
target = ["x86_64-unknown-linux-gnu", "powerpc-unknown-linux-gnuspe"]
build-stage = 1
doc-stage = 2
docs = false
docs-minification = false
compiler-docs = false
[rust]
channel = "stable"
lto = "off"
[llvm]
download-ci-llvm = "if-unchanged"
[install]
[dist]
[target.x86_64-unknown-linux-gnu]
[target.powerpc-unknown-linux-gnuspe]
cc = "/home/spksrc/qoriq-debug-update/spksrc/toolchain/syno-qoriq-6.2.4/work/powerpc-e500v2-linux-gnuspe/bin/powerpc-e500v2-linux-g
nuspe-gcc"
cxx = "/home/spksrc/qoriq-debug-update/spksrc/toolchain/syno-qoriq-6.2.4/work/powerpc-e500v2-linux-gnuspe/bin/powerpc-e500v2-linux-
gnuspe-g++"
ar = "/home/spksrc/qoriq-debug-update/spksrc/toolchain/syno-qoriq-6.2.4/work/powerpc-e500v2-linux-gnuspe/bin/powerpc-e500v2-linux-g
nuspe-ar"
ranlib = "/home/spksrc/qoriq-debug-update/spksrc/toolchain/syno-qoriq-6.2.4/work/powerpc-e500v2-linux-gnuspe/bin/powerpc-e500v2-lin
ux-gnuspe-ranlib"
linker = "/home/spksrc/qoriq-debug-update/spksrc/toolchain/syno-qoriq-6.2.4/work/powerpc-e500v2-linux-gnuspe/bin/powerpc-e500v2-lin
ux-gnuspe-gcc"
And the build call is this:
(cd /home/spksrc/qoriq-debug-update/spksrc/toolchain/syno-qoriq-6.2.4/work/rust && \
CFLAGS_powerpc_unknown_linux_gnuspe="-mcpu=8548 -mhard-float -mfloat-gprs=double" && \
CXXFLAGS_powerpc_unknown_linux_gnuspe="-mcpu=8548 -mhard-float -mfloat-gprs=double" && \
LDFLAGS_powerpc_unknown_linux_gnuspe="--sysroot=/home/spksrc/qoriq-debug-update/spksrc/toolchain/syno-qoriq-6.2.4/work/powerpc-e500v2-linux-gnuspe/powerpc-e500v2-linux-gnuspe/sysroot" && \
RUSTFLAGS="-Ctarget-cpu=e500" && \
RUST_BACKTRACE=full && \
./x build --config /home/spksrc/qoriq-debug-update/spksrc/toolchain/syno-qoriq-6.2.4/work/qoriq.toml)
Help would be really much appreciated.
@alexcrichton I use following command to build std for powerpc gnuspe,
cargo build -Z build-std --target=powerpc-unknown-linux-gnuspe
and run under target, crash is as following,
Program received signal SIGILL, Illegal instruction. 0x204f2610 in core::sync::atomic::atomic_compare_exchange::hdd78233f59efc1d2 () at /usr/share/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/sync/atomic.rs:2643 2643 /usr/share/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/sync/atomic.rs: No such file or directory. in /usr/share/rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/core/src/sync/atomic.rs (gdb) quit
please help
thanks