Skip to content

Commit 5a74ce8

Browse files
Rollup merge of #144551 - neuschaefer:a64be-musl, r=davidtwco
Add aarch64_be-unknown-linux-musl target This PR adds a target definition for big-endian Aarch64 with musl-libc. cc `@Gelbpunkt`
2 parents 9bb7d17 + 199e54c commit 5a74ce8

File tree

6 files changed

+95
-0
lines changed

6 files changed

+95
-0
lines changed

compiler/rustc_target/src/spec/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1954,6 +1954,7 @@ supported_targets! {
19541954
("armv7-unknown-linux-musleabihf", armv7_unknown_linux_musleabihf),
19551955
("aarch64-unknown-linux-gnu", aarch64_unknown_linux_gnu),
19561956
("aarch64-unknown-linux-musl", aarch64_unknown_linux_musl),
1957+
("aarch64_be-unknown-linux-musl", aarch64_be_unknown_linux_musl),
19571958
("x86_64-unknown-linux-musl", x86_64_unknown_linux_musl),
19581959
("i686-unknown-linux-musl", i686_unknown_linux_musl),
19591960
("i586-unknown-linux-musl", i586_unknown_linux_musl),
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
use rustc_abi::Endian;
2+
3+
use crate::spec::{
4+
FramePointer, SanitizerSet, StackProbeType, Target, TargetMetadata, TargetOptions, base,
5+
};
6+
7+
pub(crate) fn target() -> Target {
8+
let mut base = base::linux_musl::opts();
9+
base.max_atomic_width = Some(128);
10+
base.supports_xray = true;
11+
base.features = "+v8a,+outline-atomics".into();
12+
base.stack_probes = StackProbeType::Inline;
13+
base.supported_sanitizers = SanitizerSet::ADDRESS
14+
| SanitizerSet::CFI
15+
| SanitizerSet::LEAK
16+
| SanitizerSet::MEMORY
17+
| SanitizerSet::THREAD;
18+
19+
Target {
20+
llvm_target: "aarch64_be-unknown-linux-musl".into(),
21+
metadata: TargetMetadata {
22+
description: Some("ARM64 Linux (big-endian) with musl-libc 1.2.5".into()),
23+
tier: Some(3),
24+
host_tools: Some(false),
25+
std: Some(true),
26+
},
27+
pointer_width: 64,
28+
data_layout: "E-m:e-p270:32:32-p271:32:32-p272:64:64-i8:8:32-i16:16:32-i64:64-i128:128-n32:64-S128-Fn32".into(),
29+
arch: "aarch64".into(),
30+
options: TargetOptions {
31+
// the AAPCS64 expects use of non-leaf frame pointers per
32+
// https://github.com/ARM-software/abi-aa/blob/4492d1570eb70c8fd146623e0db65b2d241f12e7/aapcs64/aapcs64.rst#the-frame-pointer
33+
// and we tend to encounter interesting bugs in AArch64 unwinding code if we do not
34+
frame_pointer: FramePointer::NonLeaf,
35+
mcount: "\u{1}_mcount".into(),
36+
endian: Endian::Big,
37+
..base
38+
},
39+
}
40+
}

src/doc/rustc/src/SUMMARY.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
- [aarch64-nintendo-switch-freestanding](platform-support/aarch64-nintendo-switch-freestanding.md)
5050
- [aarch64-unknown-linux-musl](platform-support/aarch64-unknown-linux-musl.md)
5151
- [aarch64_be-unknown-none-softfloat](platform-support/aarch64_be-unknown-none-softfloat.md)
52+
- [aarch64_be-unknown-linux-musl](platform-support/aarch64_be-unknown-linux-musl.md)
5253
- [amdgcn-amd-amdhsa](platform-support/amdgcn-amd-amdhsa.md)
5354
- [armeb-unknown-linux-gnueabi](platform-support/armeb-unknown-linux-gnueabi.md)
5455
- [arm-none-eabi](platform-support/arm-none-eabi.md)

src/doc/rustc/src/platform-support.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,6 +273,7 @@ target | std | host | notes
273273
[`aarch64_be-unknown-hermit`](platform-support/hermit.md) | ✓ | | ARM64 Hermit (big-endian)
274274
`aarch64_be-unknown-linux-gnu` | ✓ | ✓ | ARM64 Linux (big-endian)
275275
`aarch64_be-unknown-linux-gnu_ilp32` | ✓ | ✓ | ARM64 Linux (big-endian, ILP32 ABI)
276+
[`aarch64_be-unknown-linux-musl`](platform-support/aarch64_be-unknown-linux-musl.md) | ✓ | ✓ | ARM64 Linux (big-endian) with musl-libc 1.2.5
276277
[`aarch64_be-unknown-netbsd`](platform-support/netbsd.md) | ✓ | ✓ | ARM64 NetBSD (big-endian)
277278
[`aarch64_be-unknown-none-softfloat`](platform-support/aarch64_be-unknown-none-softfloat.md) | * | | Bare big-endian ARM64, softfloat
278279
[`amdgcn-amd-amdhsa`](platform-support/amdgcn-amd-amdhsa.md) | * | | `-Ctarget-cpu=gfx...` to specify [the AMD GPU] to compile for
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# aarch64_be-unknown-linux-musl
2+
3+
**Tier: 3**
4+
5+
ARM64 Linux (big-endian) with musl-libc.
6+
7+
## Target maintainers
8+
9+
[@neuschaefer](https://github.com/neuschaefer)
10+
[@Gelbpunkt](https://github.com/Gelbpunkt)
11+
12+
## Requirements
13+
14+
The target requires a `aarch64_be-*-linux-musl` toolchain, which likely has to
15+
be built from source because this is a rare combination. [Buildroot] provides
16+
a way of doing so:
17+
18+
- select _Target options__Target Architecture__AArch64 (big endian)_
19+
- select _Toolchain__C library__musl_
20+
- select _Toolchain__Enable C++ support_
21+
22+
Host tools are supported.
23+
24+
[Buildroot]: https://buildroot.org/
25+
26+
27+
## Building the target
28+
29+
The target can be enabled in bootstrap.toml:
30+
31+
```toml
32+
[build]
33+
target = ["aarch64_be-unknown-linux-musl"]
34+
35+
[target.aarch64_be-unknown-linux-musl]
36+
cc = "/path/to/buildroot/host/bin/aarch64_be-buildroot-linux-musl-cc"
37+
cxx = "/path/to/buildroot/host/bin/aarch64_be-buildroot-linux-musl-c++"
38+
linker = "/path/to/buildroot/host/bin/aarch64_be-buildroot-linux-musl-cc"
39+
ar = "/path/to/buildroot/host/bin/aarch64_be-buildroot-linux-musl-ar"
40+
ranlib = "/path/to/buildroot/host/bin/aarch64_be-buildroot-linux-musl-ranlib"
41+
musl-root = "/path/to/buildroot/staging"
42+
runner = "qemu-aarch64_be -L /path/to/buildroot/target"
43+
crt-static = "/path/to/buildroot/target"
44+
```
45+
46+
47+
## Testing
48+
49+
Binaries can be run under `qemu-aarch64_be` or under a big-endian Linux kernel.

tests/assembly-llvm/targets/targets-elf.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
//@ revisions: aarch64_be_unknown_linux_gnu_ilp32
1111
//@ [aarch64_be_unknown_linux_gnu_ilp32] compile-flags: --target aarch64_be-unknown-linux-gnu_ilp32
1212
//@ [aarch64_be_unknown_linux_gnu_ilp32] needs-llvm-components: aarch64
13+
//@ revisions: aarch64_be_unknown_linux_musl
14+
//@ [aarch64_be_unknown_linux_musl] compile-flags: --target aarch64_be-unknown-linux-musl
15+
//@ [aarch64_be_unknown_linux_musl] needs-llvm-components: aarch64
1316
//@ revisions: aarch64_be_unknown_netbsd
1417
//@ [aarch64_be_unknown_netbsd] compile-flags: --target aarch64_be-unknown-netbsd
1518
//@ [aarch64_be_unknown_netbsd] needs-llvm-components: aarch64

0 commit comments

Comments
 (0)