From dedc0827d678247472ff3217ae7cd380232c9178 Mon Sep 17 00:00:00 2001 From: no92 Date: Sun, 31 Mar 2024 15:48:04 +0200 Subject: [PATCH 1/4] compiler: Add `x86_64-unknown-managarm-mlibc` target Co-authored-by: Matt Taylor Co-authored-by: Dennis Bonke --- .../src/spec/base/managarm_mlibc.rs | 17 ++++++++++++++ compiler/rustc_target/src/spec/base/mod.rs | 1 + compiler/rustc_target/src/spec/mod.rs | 2 ++ .../targets/x86_64_unknown_managarm_mlibc.rs | 22 +++++++++++++++++++ src/tools/build-manifest/src/main.rs | 1 + tests/assembly/targets/targets-elf.rs | 3 +++ tests/ui/check-cfg/well-known-values.stderr | 6 ++--- 7 files changed, 49 insertions(+), 3 deletions(-) create mode 100644 compiler/rustc_target/src/spec/base/managarm_mlibc.rs create mode 100644 compiler/rustc_target/src/spec/targets/x86_64_unknown_managarm_mlibc.rs diff --git a/compiler/rustc_target/src/spec/base/managarm_mlibc.rs b/compiler/rustc_target/src/spec/base/managarm_mlibc.rs new file mode 100644 index 0000000000000..41b2564c68353 --- /dev/null +++ b/compiler/rustc_target/src/spec/base/managarm_mlibc.rs @@ -0,0 +1,17 @@ +use crate::spec::{cvs, RelroLevel, TargetOptions}; + +pub fn opts() -> TargetOptions { + TargetOptions { + os: "managarm".to_string().into(), + env: "mlibc".to_string().into(), + dynamic_linking: true, + executables: true, + families: cvs!["unix"], + has_rpath: true, + position_independent_executables: true, + relro_level: RelroLevel::Full, + has_thread_local: true, + crt_static_respected: true, + ..Default::default() + } +} diff --git a/compiler/rustc_target/src/spec/base/mod.rs b/compiler/rustc_target/src/spec/base/mod.rs index d137aaa535858..c32dc591f06fb 100644 --- a/compiler/rustc_target/src/spec/base/mod.rs +++ b/compiler/rustc_target/src/spec/base/mod.rs @@ -17,6 +17,7 @@ pub(crate) mod linux_gnu; pub(crate) mod linux_musl; pub(crate) mod linux_ohos; pub(crate) mod linux_uclibc; +pub(crate) mod managarm_mlibc; pub(crate) mod msvc; pub(crate) mod netbsd; pub(crate) mod nto_qnx; diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs index 966da2c5eda5c..748760db24ac4 100644 --- a/compiler/rustc_target/src/spec/mod.rs +++ b/compiler/rustc_target/src/spec/mod.rs @@ -1539,6 +1539,8 @@ supported_targets! { ("aarch64-unknown-redox", aarch64_unknown_redox), ("x86_64-unknown-redox", x86_64_unknown_redox), + ("x86_64-unknown-managarm-mlibc", x86_64_unknown_managarm_mlibc), + ("i386-apple-ios", i386_apple_ios), ("x86_64-apple-ios", x86_64_apple_ios), ("aarch64-apple-ios", aarch64_apple_ios), diff --git a/compiler/rustc_target/src/spec/targets/x86_64_unknown_managarm_mlibc.rs b/compiler/rustc_target/src/spec/targets/x86_64_unknown_managarm_mlibc.rs new file mode 100644 index 0000000000000..2b9393742b09a --- /dev/null +++ b/compiler/rustc_target/src/spec/targets/x86_64_unknown_managarm_mlibc.rs @@ -0,0 +1,22 @@ +use crate::spec::{base, Cc, LinkerFlavor, Lld, StackProbeType, Target, TargetMetadata}; + +pub fn target() -> Target { + let mut base = base::managarm_mlibc::opts(); + base.cpu = "x86-64".to_string().into(); + base.max_atomic_width = Some(64); + base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]); + // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. + base.stack_probes = StackProbeType::Call; + + Target { + llvm_target: "x86_64-unknown-managarm-mlibc".to_string().into(), + pointer_width: 64, + data_layout: + "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128" + .to_string() + .into(), + arch: "x86_64".to_string().into(), + options: base, + metadata: TargetMetadata { std: Some(false), tier: Some(3), ..Default::default() }, + } +} diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs index 392a5a1196761..e3fc18f675090 100644 --- a/src/tools/build-manifest/src/main.rs +++ b/src/tools/build-manifest/src/main.rs @@ -166,6 +166,7 @@ static TARGETS: &[&str] = &[ "x86_64-unknown-linux-gnux32", "x86_64-unknown-linux-musl", "x86_64-unknown-linux-ohos", + "x86_64-unknown-managarm-mlibc", "x86_64-unknown-netbsd", "x86_64-unknown-none", "x86_64-unknown-redox", diff --git a/tests/assembly/targets/targets-elf.rs b/tests/assembly/targets/targets-elf.rs index 3563aec6d8078..a215ea1cb68a5 100644 --- a/tests/assembly/targets/targets-elf.rs +++ b/tests/assembly/targets/targets-elf.rs @@ -555,6 +555,9 @@ //@ revisions: x86_64_unknown_linux_ohos //@ [x86_64_unknown_linux_ohos] compile-flags: --target x86_64-unknown-linux-ohos //@ [x86_64_unknown_linux_ohos] needs-llvm-components: x86 +//@ revisions: x86_64_unknown_managarm_mlibc +//@ [x86_64_unknown_managarm_mlibc] compile-flags: --target x86_64-unknown-managarm-mlibc +//@ [x86_64_unknown_managarm_mlibc] needs-llvm-components: x86 //@ revisions: x86_64_unknown_netbsd //@ [x86_64_unknown_netbsd] compile-flags: --target x86_64-unknown-netbsd //@ [x86_64_unknown_netbsd] needs-llvm-components: x86 diff --git a/tests/ui/check-cfg/well-known-values.stderr b/tests/ui/check-cfg/well-known-values.stderr index cf18503b74bb9..a00072ae0f0b4 100644 --- a/tests/ui/check-cfg/well-known-values.stderr +++ b/tests/ui/check-cfg/well-known-values.stderr @@ -136,7 +136,7 @@ warning: unexpected `cfg` condition value: `_UNEXPECTED_VALUE` LL | target_env = "_UNEXPECTED_VALUE", | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: expected values for `target_env` are: ``, `gnu`, `msvc`, `musl`, `newlib`, `nto70`, `nto71`, `ohos`, `p2`, `psx`, `relibc`, `sgx`, `uclibc` + = note: expected values for `target_env` are: ``, `gnu`, `mlibc`, `msvc`, `musl`, `newlib`, `nto70`, `nto71`, `ohos`, `p2`, `psx`, `relibc`, `sgx`, `uclibc` = note: see for more information about checking conditional configuration warning: unexpected `cfg` condition value: `_UNEXPECTED_VALUE` @@ -190,7 +190,7 @@ warning: unexpected `cfg` condition value: `_UNEXPECTED_VALUE` LL | target_os = "_UNEXPECTED_VALUE", | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: expected values for `target_os` are: `aix`, `android`, `cuda`, `dragonfly`, `emscripten`, `espidf`, `freebsd`, `fuchsia`, `haiku`, `hermit`, `horizon`, `hurd`, `illumos`, `ios`, `l4re`, `linux`, `macos`, `netbsd`, `none`, `nto`, `openbsd`, `psp`, `redox`, `solaris`, `solid_asp3`, `teeos`, `tvos`, `uefi`, `unknown`, `vita`, `vxworks`, `wasi`, `watchos`, `windows`, `xous`, `zkvm` + = note: expected values for `target_os` are: `aix`, `android`, `cuda`, `dragonfly`, `emscripten`, `espidf`, `freebsd`, `fuchsia`, `haiku`, `hermit`, `horizon`, `hurd`, `illumos`, `ios`, `l4re`, `linux`, `macos`, `managarm`, `netbsd`, `none`, `nto`, `openbsd`, `psp`, `redox`, `solaris`, `solid_asp3`, `teeos`, `tvos`, `uefi`, `unknown`, `vita`, `vxworks`, `wasi`, `watchos`, `windows`, `xous`, `zkvm` = note: see for more information about checking conditional configuration warning: unexpected `cfg` condition value: `_UNEXPECTED_VALUE` @@ -263,7 +263,7 @@ LL | #[cfg(target_os = "linuz")] // testing that we suggest `linux` | | | help: there is a expected value with a similar name: `"linux"` | - = note: expected values for `target_os` are: `aix`, `android`, `cuda`, `dragonfly`, `emscripten`, `espidf`, `freebsd`, `fuchsia`, `haiku`, `hermit`, `horizon`, `hurd`, `illumos`, `ios`, `l4re`, `linux`, `macos`, `netbsd`, `none`, `nto`, `openbsd`, `psp`, `redox`, `solaris`, `solid_asp3`, `teeos`, `tvos`, `uefi`, `unknown`, `vita`, `vxworks`, `wasi`, `watchos`, `windows`, `xous`, `zkvm` + = note: expected values for `target_os` are: `aix`, `android`, `cuda`, `dragonfly`, `emscripten`, `espidf`, `freebsd`, `fuchsia`, `haiku`, `hermit`, `horizon`, `hurd`, `illumos`, `ios`, `l4re`, `linux`, `macos`, `managarm`, `netbsd`, `none`, `nto`, `openbsd`, `psp`, `redox`, `solaris`, `solid_asp3`, `teeos`, `tvos`, `uefi`, `unknown`, `vita`, `vxworks`, `wasi`, `watchos`, `windows`, `xous`, `zkvm` = note: see for more information about checking conditional configuration warning: 27 warnings emitted From eba9cc135a6436d6721882b1d2ac684e669e0545 Mon Sep 17 00:00:00 2001 From: no92 Date: Mon, 1 Apr 2024 12:45:22 +0200 Subject: [PATCH 2/4] doc: Add `*-unknown-managarm-mlibc` documentation --- src/doc/rustc/src/SUMMARY.md | 1 + src/doc/rustc/src/platform-support.md | 1 + .../rustc/src/platform-support/managarm.md | 63 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 src/doc/rustc/src/platform-support/managarm.md diff --git a/src/doc/rustc/src/SUMMARY.md b/src/doc/rustc/src/SUMMARY.md index 83acce80f969d..2cb5bb17cd129 100644 --- a/src/doc/rustc/src/SUMMARY.md +++ b/src/doc/rustc/src/SUMMARY.md @@ -58,6 +58,7 @@ - [\*-nto-qnx-\*](platform-support/nto-qnx.md) - [*-unikraft-linux-musl](platform-support/unikraft-linux-musl.md) - [*-unknown-hermit](platform-support/hermit.md) + - [\*-unknown-managarm-mlibc](platform-support/managarm.md) - [\*-unknown-netbsd\*](platform-support/netbsd.md) - [*-unknown-openbsd](platform-support/openbsd.md) - [\*-unknown-uefi](platform-support/unknown-uefi.md) diff --git a/src/doc/rustc/src/platform-support.md b/src/doc/rustc/src/platform-support.md index 75d38dd20bdeb..121355837b5b6 100644 --- a/src/doc/rustc/src/platform-support.md +++ b/src/doc/rustc/src/platform-support.md @@ -373,6 +373,7 @@ target | std | host | notes `x86_64-unknown-haiku` | ✓ | ✓ | 64-bit Haiku [`x86_64-unknown-hermit`](platform-support/hermit.md) | ✓ | | x86_64 Hermit `x86_64-unknown-l4re-uclibc` | ? | | +[`x86_64-unknown-managarm-mlibc`](platform-support/managarm.md) | | | x86_64 managarm [`x86_64-unknown-openbsd`](platform-support/openbsd.md) | ✓ | ✓ | 64-bit OpenBSD `x86_64-uwp-windows-gnu` | ✓ | | `x86_64-uwp-windows-msvc` | ✓ | | diff --git a/src/doc/rustc/src/platform-support/managarm.md b/src/doc/rustc/src/platform-support/managarm.md new file mode 100644 index 0000000000000..5fc64f77fbe37 --- /dev/null +++ b/src/doc/rustc/src/platform-support/managarm.md @@ -0,0 +1,63 @@ +# `*-unknown-managarm-mlibc` + +**Tier: 3** + +## Target Maintainers + +- [@no92](https://github.com/no92) +- [@64](https://github.com/64) +- [@Dennisbonke](https://github.com/Dennisbonke) + +## Requirements + +This target is cross-compiled. There is currently no support for `std` yet. It generates binaries in the ELF format. + +## Building the target + +For now, building a patched LLVM with [our patches located here](https://github.com/managarm/bootstrap-managarm/tree/master/patches/llvm) is necessary. + +Once that is done, set up your `config.toml` like this: + +```toml +change-id = 102579 + +[llvm] +targets = "X86" +download-ci-llvm = false + +[build] +target = ["x86_64-unknown-managarm-mlibc", "x86_64-unknown-linux-gnu"] +build-dir = "/path/to/the/build/dir" +docs = false + +[install] +prefix = "/path/to/the/prefix" +sysconfdir = "etc" + +[rust] +codegen-tests = false +deny-warnings = false + +[target.x86_64-unknown-linux-gnu] +llvm-config = "/path/to/your/llvm/bin/llvm-config" + +[target.x86_64-unknown-managarm-mlibc] +llvm-config = "/path/to/your/llvm/bin/llvm-config" +``` + +## Building Rust programs + +Build a `x86_64-managarm-gcc` using our [gcc fork](https://github.com/managarm/gcc). + +```toml +[build] +rustc = "/path/to/the/rust-prefix/bin/rustc" +target = "x86_64-unknown-managarm-mlibc" + +[target.x86_64-unknown-managarm-mlibc] +linker = "/path/to/the/managarm-gcc/bin/x86_64-managarm-gcc" +``` + +## Testing + +This target does not support running the Rust testsuite yet. From 2a74533b534f67c6dceb6f70a48eff3fe12cc152 Mon Sep 17 00:00:00 2001 From: no92 Date: Mon, 1 Apr 2024 17:34:49 +0200 Subject: [PATCH 3/4] fixup! doc: Add `*-unknown-managarm-mlibc` documentation --- src/doc/rustc/src/platform-support/managarm.md | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/doc/rustc/src/platform-support/managarm.md b/src/doc/rustc/src/platform-support/managarm.md index 5fc64f77fbe37..79cbdbb3ea27c 100644 --- a/src/doc/rustc/src/platform-support/managarm.md +++ b/src/doc/rustc/src/platform-support/managarm.md @@ -27,16 +27,6 @@ download-ci-llvm = false [build] target = ["x86_64-unknown-managarm-mlibc", "x86_64-unknown-linux-gnu"] -build-dir = "/path/to/the/build/dir" -docs = false - -[install] -prefix = "/path/to/the/prefix" -sysconfdir = "etc" - -[rust] -codegen-tests = false -deny-warnings = false [target.x86_64-unknown-linux-gnu] llvm-config = "/path/to/your/llvm/bin/llvm-config" From 6883e01ca7f47f30e7db1cb376e17d3c435c1ac0 Mon Sep 17 00:00:00 2001 From: no92 Date: Mon, 1 Apr 2024 17:35:09 +0200 Subject: [PATCH 4/4] fixup! compiler: Add `x86_64-unknown-managarm-mlibc` target --- .../src/spec/targets/x86_64_unknown_managarm_mlibc.rs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/compiler/rustc_target/src/spec/targets/x86_64_unknown_managarm_mlibc.rs b/compiler/rustc_target/src/spec/targets/x86_64_unknown_managarm_mlibc.rs index 2b9393742b09a..1ee83772aaac8 100644 --- a/compiler/rustc_target/src/spec/targets/x86_64_unknown_managarm_mlibc.rs +++ b/compiler/rustc_target/src/spec/targets/x86_64_unknown_managarm_mlibc.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string().into(); base.max_atomic_width = Some(64); base.add_pre_link_args(LinkerFlavor::Gnu(Cc::Yes, Lld::No), &["-m64"]); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::Inline; Target { llvm_target: "x86_64-unknown-managarm-mlibc".to_string().into(),