Skip to content

"Cannot select" LLVM failure due to unimplemented atomics on msp430 #441

@cr1901

Description

@cr1901

Context

A few nights ago, CI started failing for some msp430 firmware I use to make sure that msp430 Rust code builds:

   Compiling rustc-std-workspace-core v1.99.0 (/usr/share/rust/.rustup/toolchains/nightly-x86_64-unknown-linux-gnu/lib/rustlib/src/rust/library/rustc-std-workspace-core)
LLVM ERROR: Cannot select: 0x7fbca0892c98: i16,ch = AtomicLoad<(load unordered (s16) from %ir.49)> 0x7fbca08313e8, 0x7fbca0893340
  0x7fbca0893340: i16,ch = CopyFromReg 0x7fbca08313e8, Register:i16 %19
    0x7fbca08a1c30: i16 = Register %19
In function: memcpy
error: could not compile `compiler_builtins`

MSP430 doesn't have meaningful atomic support, so I'm not sure why code using atomics is being generated.

Bisecting rustc

Using cargo-bisect-rustc, I found the range of commits where compilation started failing.

searched nightlies: from nightly-2021-11-18 to nightly-2021-11-19
regressed nightly: nightly-2021-11-19
searched commits: from rust-lang/rust@c9c4b5d to rust-lang/rust@cc946fc
regressed commit: rust-lang/rust@b6f580a

bisected with cargo-bisect-rustc v0.6.0

Host triple: x86_64-unknown-linux-gnu
Reproduce with:

cargo bisect-rustc --preserve-target --preserve --start=2021-11-18 --end=2021-11-19 --with-src

I further bisected manually, the actual last good commit in rust is rust-lang/rust@a3b9405 and the regression is rust-lang/rust@88f1bf7. Commit b6591c2 bumps compiler_builtins to 0.1.52.

Bisecting compiler_builtins

Using a nightly from before the failure started (see "Other Notes"), the first compile failure I get is with commit ce86d41. The error is quite similar to the one in the CI failures:

william@xubuntu-dtrain:~/Projects/toolchains/compiler-builtins$ cargo build --t[14/661]p430-none-elf -Zbuild-std=core
   Compiling compiler_builtins v0.1.49 (/home/william/Projects/toolchains/compiler-builtins)
warning: an associated function with this name may be added to the standard library in the future
 --> src/float/pow.rs:8:19
  |
8 |     let mut pow = i32::abs_diff(b, 0);
  |                   ^^^^^^^^^^^^^
  |
  = note: `#[warn(unstable_name_collisions)]` on by default
  = warning: once this associated item is added to the standard library, the ambiguity may cause an error or change in behavior!
  = note: for more information, see issue #48919 <https://github.com/rust-lang/rust/issues/48919>
  = help: call with fully qualified syntax `Int::abs_diff(...)` to keep using the current method
  = help: add `#![feature(int_abs_diff)]` to the crate attributes to enable `num::<impl i32>::abs_diff`

LLVM ERROR: Cannot select: 0x7f6cd2888208: i16,ch = AtomicLoad<(load unordered (s16) from %ir.188)> 0x7f6cd287aa28:1, 0x7f6cd287aa28, src/mem/impls.rs:65:29 @[ src/mem/impls.rs:109:13 @[ src/mem/mod.rs:25:5 ] ]
  0x7f6cd287aa28: i16,ch = load<(dereferenceable load (s16) from %ir.28)> 0x7f6cd287b270, FrameIndex:i16<24>, undef:i16, src/mem/impls.rs:65:69 @[ src/mem/impls.rs:109:13 @[ src/mem/mod.rs:25:5 ] ]
    0x7f6cd287de38: i16 = FrameIndex<24>
    0x7f6cd28427b8: i16 = undef
In function: memcpy
warning: `compiler_builtins` (lib) generated 1 warning
error: could not compile `compiler_builtins`; 1 warning emitted

I believe fixing the failure in compiler_builtins will fix the error I'm seeing when compiling rustc, and I would need to test locally. That said, I'm not sure what is causing compiler_builtins to be built anyway when I specify -Zbuild-std=core. Doesn't core have no dependencies?

Solution

I'm not sure what should be done here. Can there be a gate for targets whose maximum atomic width is 0? Although it eventually needs to be done, implementing atomic support for msp430 is unlikely right now, as I don't have the bandwidth to do it. Additionally, AIUI, Rust does not actually mandate that targets implement atomics, and that they should become noops/not available on targets without them (not just msp430).

Other Notes

Environment

rustc

william@xubuntu-dtrain:~/Projects/toolchains/compiler-builtins$ rustc -Vv
rustc 1.58.0-nightly (ff0e14829 2021-10-31)
binary: rustc
commit-hash: ff0e14829e1806ca0d4226595f7fdf3e8658758f
commit-date: 2021-10-31
host: x86_64-unknown-linux-gnu
release: 1.58.0-nightly
LLVM version: 13.0.0

cargo

william@xubuntu-dtrain:~/Projects/toolchains/compiler-builtins$ cargo -Vv
cargo 1.58.0-nightly (6c1bc24b8 2021-10-24)
release: 1.58.0
commit-hash: 6c1bc24b8b49d4bc965f67d7037906dc199c72b7
commit-date: 2021-10-24
host: x86_64-unknown-linux-gnu
libgit2: 1.3.0 (sys:0.13.23 vendored)
libcurl: 7.79.1-DEV (sys:0.4.49+curl-7.79.1 vendored ssl:OpenSSL/1.1.1l)
os: Ubuntu 20.04 (focal) [64-bit]

Circular Dependency Problems

I have to compile on msp430 using -Zbuild-std=core, since it's not built as part of a Rust release right now. Even if I have an older version of compiler_builtins checked out, using a too-recent nightly/commit causes -Zbuild-std=core to compile compiler_builtins v0.1.52 anyway as a dependency of the older compiler_builtins in a fun circular dependency!

william@xubuntu-dtrain:~/Projects/toolchains/compiler-builtins$ LD_LIBRARY_PATH[20/450]william/Projects/toolchains/build-llvm-toolchain/build-llvm/lib:/home/william/Projects/toolchains/build-llvm-toolchain/build-rust/build/x86_64-unknown-linux-gnu/stage1/lib" cargo +msp430-fix build --target=msp430-none-elf -Zbuild-std=core
   Compiling compiler_builtins v0.1.52
   Compiling core v0.0.0 (/home/william/Projects/toolchains/build-llvm-toolchain/build-rust/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/src/rust/library/core)
   Compiling compiler_builtins v0.1.49 (/home/william/Projects/toolchains/compiler-builtins)
   Compiling rustc-std-workspace-core v1.99.0 (/home/william/Projects/toolchains/build-llvm-toolchain/build-rust/build/x86_64-unknown-linux-gnu/stage1/lib/rustlib/src/rust/library/rustc-std-workspace-core)
warning: an associated function with this name may be added to the standard library in the future
 --> src/float/pow.rs:8:19
  |
8 |     let mut pow = i32::abs_diff(b, 0);
  |                   ^^^^^^^^^^^^^
  |
  = note: `#[warn(unstable_name_collisions)]` on by default
  = warning: once this associated item is added to the standard library, the ambiguity may cause an error or change in behavior!
  = note: for more information, see issue #48919 <https://github.com/rust-lang/rust/issues/48919>
  = help: call with fully qualified syntax `Int::abs_diff(...)` to keep using the current method
  = help: add `#![feature(int_abs_diff)]` to the crate attributes to enable `num::<impl i32>::abs_diff`

LLVM ERROR: Cannot select: t14: i16,ch = AtomicLoad<(load unordered (s16) from %ir.188)> t13:1, t13, /home/william/.cargo/registry/src/github.com-1ecc6299db9ec823/compiler_builtins-0.1.52/src/mem/impls.rs:65:29 @[ /home/william/.cargo/registry/src/github.com-1ecc6299db9ec823/compiler_builtins-0.1.52/src/mem/impls.rs:109:13 @[ /home/william/.cargo/registry/src/github.com-1ecc6299db9ec823/compiler_builtins-0.1.52/src/mem/mod.rs:25:5 ] ]
  t13: i16,ch = load<(dereferenceable load (s16) from %ir.28)> t12, FrameIndex:i16<24>, undef:i16, /home/william/.cargo/registry/src/github.com-1ecc6299db9ec823/compiler_builtins-0.1.52/src/mem/impls.rs:65:69 @[ /home/william/.cargo/registry/src/github.com-1ecc6299db9ec823/compiler_builtins-0.1.52/src/mem/impls.rs:109:13 @[ /home/william/.cargo/registry/src/github.com-1ecc6299db9ec823/compiler_builtins-0.1.52/src/mem/mod.rs:25:5 ] ]
    t11: i16 = FrameIndex<24>
    t5: i16 = undef
In function: memcpy
error: could not compile `compiler_builtins`
warning: build failed, waiting for other jobs to finish...
warning: `compiler_builtins` (lib) generated 1 warning
error: build failed

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions