Use rust-lld
instead of avr-gcc
as the linker
This fixes the [build error] caused by the `avr-gcc` (used as linker) not being available in the Rust CI. This is a viable solution, which shows the wrong/right behavior and, since no functions from `libgcc` are called, does not produce errors. This was discussed [here]. Another small problem is, that `lld` doesn't link the correct startup-code by default. This is not a problem for this test (since it does not actually use anything the startup code is needed for (no variables, no stack, no interrupts)), but this causes the `main`-function to be removed by the default flag `--gc-sections`. Therefore the `rmake`-driver also adds the linker flag `--entry=main` to mark the `main`-function as the entry point and thus preventing it from getting removed. The code would work on a real AVR device. [build error]: https://github.com/rust-lang/rust/pull/131755#issuecomment-2415127952 [here]: https://github.com/rust-lang/rust/pull/131755#issuecomment-2416469675
This commit is contained in:
parent
bb8db13892
commit
a35ed2f9eb
@ -1,4 +1,5 @@
|
|||||||
//@ needs-llvm-components: avr
|
//@ needs-llvm-components: avr
|
||||||
|
//@ needs-rust-lld
|
||||||
//! Regression test for #129301/llvm-project#106722 within `rustc`.
|
//! Regression test for #129301/llvm-project#106722 within `rustc`.
|
||||||
//!
|
//!
|
||||||
//! Some LLVM-versions had wrong offsets in the local labels, causing the first
|
//! Some LLVM-versions had wrong offsets in the local labels, causing the first
|
||||||
@ -17,6 +18,13 @@ fn main() {
|
|||||||
.opt_level("s")
|
.opt_level("s")
|
||||||
.panic("abort")
|
.panic("abort")
|
||||||
.target("avr-unknown-gnu-atmega328")
|
.target("avr-unknown-gnu-atmega328")
|
||||||
|
// normally one links with `avr-gcc`, but this is not available in CI,
|
||||||
|
// hence this test diverges from the default behavior to enable linking
|
||||||
|
// at all, which is necessary for the test (to resolve the labels). To
|
||||||
|
// not depend on a special linker script, the main-function is marked as
|
||||||
|
// the entry function, causing the linker to not remove it.
|
||||||
|
.linker("rust-lld")
|
||||||
|
.link_arg("--entry=main")
|
||||||
.output("compiled")
|
.output("compiled")
|
||||||
.run();
|
.run();
|
||||||
|
|
||||||
@ -35,6 +43,7 @@ fn main() {
|
|||||||
// fore the relative jump has an impact on the label offset. Old versions
|
// fore the relative jump has an impact on the label offset. Old versions
|
||||||
// of the Rust compiler did produce a label `rjmp .-4` (misses the first
|
// of the Rust compiler did produce a label `rjmp .-4` (misses the first
|
||||||
// instruction in the loop).
|
// instruction in the loop).
|
||||||
|
assert!(disassembly.contains("<main>"), "no main function in output");
|
||||||
disassembly
|
disassembly
|
||||||
.trim()
|
.trim()
|
||||||
.lines()
|
.lines()
|
||||||
|
Loading…
Reference in New Issue
Block a user